Android解决WifiManager.removeNetwork()失败--赋予app系统权限去删除保存的wifi

首先,我们的安卓设备已经root过了,我们的app是要做成系统app的。

直接删除wifi会失败

一般的,删除保存的wifi代码是这样的

 WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
 List configs = wifiManager.getConfiguredNetworks();
 for (WifiConfiguration config : configs) {
     boolean result = wifiManager.removeNetwork(config.networkId);
       forgetWifi(wifiManager, config.networkId);
       removeWifi(wifiManager, config.networkId);
       deleteWifiConfig();
     LogUtil.log("remove network. networkId=%d, ssid=%s,result=%b", config.networkId, config.SSID, result);
 }

removeNetwork这个方法点进去,可以看到谷歌这么说,

 Applications are not allowed to remove networks created by other applications.

至于我们添加的网络为什么会变成别人的,这我还没搞明白,反正每次重装apk,之前保存的网络就删不掉了。

解决方案->把app变成系统app,并赋予system权限

步骤:

1) 修改清单文件


 

因为删除保存的wifi是要检查权限的,如果UID是systemUID,会直接通过权限检查。

2) 打一个包,app-debug.apk。
3) 进行系统签名。
  • 在源码里下载或从我给的链接下载
    platform.x509.pem、platform.pk8、signapk.jar
    我的下载链接:

https://download.csdn.net/download/weixin_36001685/11827441
源码地址
https://www.androidos.net.cn/

文件位置
platform.x509.pem、platform.pk8:

…/build/target/product/security

signapk.jar:

…/out/host/linux-x86/framework

signapk源码路径:

…/build/tools/signapk

  • 对app-debug.apk进行签名。签名命令

java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apk

4) 拷贝到安卓设备里。
adb push D:\WorkSpace\app-debug-new.apk /mnt/sdcard
5) 打开安卓设备界面,打开有root权限的文件管理器,我用的是Total Commander,下载地址

https://download.csdn.net/download/weixin_36001685/11782914

6) 剪切/mnt/sdcard/app-debug.apk,粘贴到/system/app目录下。
7) 使用Total Commander赋予app-debug.apk权限744。
8) 重启安卓设备。

重启成功后可以看到app已经安装了。如果没有安装好,再用Total Commander进去看/system/app/app-debug.apk是否拥有744权限。
至此,该app可以为所欲为了。

系统签名参考
https://www.jianshu.com/p/47265c8899b5

其它可能的方案

  1. 删除保存的wifi或许可以通过hook检查权限的方法来实现?我弄了好久,没搞成功。
  2. 删除WiFi还可以通过直接删除文件

/data/misc/wifi/wpa_supplicant.conf

来实现。但是很遗憾,我通过Total Command可以删除该文件,但是通过代码删除却总是报错权限拒绝。即使用adb shell ,su进去删除也是权限拒绝。最后放弃。

你可能感兴趣的:(android)