客户有个需求是,要把一台手机连接的wifi信息,以及其他配置信息一同导入到另一台手机中,然后生效。其他系统配置信息例如系统密码,usb调试等,比较容易做到。但wifi列表的话,是保存在/data/misc/wifi/wpa_supplicant.conf文件中。用cat命令查看,可以看到network={...}的信息,就是系统保存的wifi账号密码,可以保存所有连接过的wifi信息
但是很遗憾的是,这个wpa_supplicant.conf文件是归属于wifi所有的,所以我们不能通过读写和拷贝这个文件
原想在上层Settings工程中,通过追踪系统源码,查看在设置-wifi里是如何保存系统wifi的,但是发现要在Settings获取WifiConfiguration对象的preSharedKey,即wifi密码时返回的是*,而且保存wifi的配置也很麻烦。所以就在frameworks中搜索
/data/misc/wifi/wpa_supplicant.conf,在frameworks/opt\net\wifi\service\java\com\android\server\wifi\WifiConfigStore中找到了读取这个文件的代码。
这说明了在WifiConfigStore中有权限可以读取这个文件,那么我们在其他系统应用中可以发广播,在这里读取文件,通过广播把读取到的wifi配置信息回传回去。
在frameworks/opt\net\wifi\service\java\com\android\server\wifi\WifiStateMachine中有WifiConfigStore的实例,而且这个文件中有注册监听广播的地方,我们可以直接copy,注册自己的广播
这样我们就拿到了wifi的账号密码的所有列表。然后就是导入另一台设备中了。
在WifiConfigStore没看到写wpa_supplicant.conf这个文件的操作,而且这个文件除了network以外还有设备自身的其他信息,所以选择是截取除network外的其他信息,与通过广播传进来的需要导入的network信息拼接在一起,删除wpa_supplicant.conf文件,重新将这些信息写入新的wpa_supplicant.conf文件。通过cat命令看的确剩下了,但重启之后发现wifi打不开了,原因是因为我们通过代码写的wpa_supplicant.conf文件,文件归属于System,而不在属于wifi,所以读取不了这个文件,wifi就打不开了。
所以要修改这个文件的权限,重启的时候让他变为wifi所有的文件。
修改 \MTK6755\system\core\rootdir\init.rc
修改 \MTK6755\device\mediatek\mt6755\meta_init.rc
这样重启的时候就会重新将wpa_supplicant.conf文件修改为wifi所有,效果也实现了