问题描述
使用Android设备,已经连接过的WIFI不会自动重连,且显示已保存
问题分析
显示已保存说明连接的WIFI信息已经保存,Android 11连接的WIFI信息保存在该文件/data/misc/apexdata/com.android/wifi/WifiConfigStore.xml,查看发现不能自动重连的WIFI会有NETWORK_SELECTION_PERMANENTLY_DISABLED
此项配置,正常的为NETWORK_SELECTION_ENABLED
<string name="SelectionStatus">NETWORK_SELECTION_PERMANENTLY_DISABLED</string>
<string name="DisableReason">NETWORK_SELECTION_DISABLED_NO_INTERNET_PERMANENT</string>
正常的:
<string name="SelectionStatus">NETWORK_SELECTION_ENABLED</string>
<string name="DisableReason">NETWORK_SELECTION_ENABLE</string>
经分析:此版本的WIFI由于没有通过校验会显示网络连接受限,导致保存连接的WiFi的信息有此配置,所以不会自动连接,只要解决显示网络连接受限的问题,即修改HTTPS校验网址可解决WIFI不自动重连的问题。
相关源码
保存的WIFI信息文件示例
frameworks/base/wifi/java/android/net/wifi/migration_samples/
WIFI信息保存路径
AOSP Path in Android 10: /data/misc/wifi/WifiConfigStore.xml
AOSP Path in Android 11: /data/misc/apexdata/com.android/wifi/WifiConfigStore.xml
自动连接机制
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
网络评估:handleScanResults
是否网络选择:isNetworkSelectionNeeded
扫描结果评估:SavedNetworkEvaluator
WIFI保存
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConfigStore.java
关键方法:
loadFromStore()
createFile()
read()
write()
StoreData()
拓展
网上查到的关于断电时WIFI学习未来得及保存下来时,一般WIFI信息的保存是在空闲时间,一般不会立即写入flash中,也会导致不自动重连,解决方案是加个sync
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java
private void fileSync(){
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("sync");
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "fileSync");
}
public boolean saveConfig() {
boolean ret;
ret = doBooleanCommand("SAVE_CONFIG");
//add fileSync
fileSync();
return ret;
}