Android16 wifi启动后自动连接的第一个wifi分析和修改
Android16 wifi启动后自动连接的第一个wifi分析和修改
文章目录
- Android16 wifi启动后自动连接的第一个wifi分析和修改
- 一、前言
- 二、实现分析
- 1、AI建议
- (1)优先级设置
- (2)设置Wifi优先级的值代码实现:
- 2、源码分析
- (1)自动连接的整体逻辑大概可分为 4 个阶段:
- (2)系统代码位置参考(AOSP)
- (3)总结关系与流程
- 3、系统应用实现具体功能
- (1)应用开发要求:
- (2)主要逻辑:
- (3)主要代码:
- ①广播监听代码:
- ②获取扫描的wifi列表:
- ③获取已保存的wifi列表:
- ④获取当前连接的wifi名称:
- ⑤判断当前wifi是否开启:
- ⑥判断当前wifi是否开启
- ⑦判断Wifi名称是否相等
- ⑧连接某一个Wifi的具体代码
- ⑨ autoConnectWifi 的主要逻辑
- (4)局限性和相关拓展:
- 三、其他
- 1、小结
- 2、打开Wifi后默认连接Wifi的发现
- (1)wifi默认连接规律
- (2)wifi配置信息
- 3、Android13 命令启用WLAN详细日志分析
一、前言
Android有些场景需要开机后连接具体名称某个wifi,如何实现?
一顿分析了源码发现好像不太行,估计没有完全分析到位,源码有点复杂;
因为它不是链路的,是条件触发的,所以流程不太好追。
尝试了几个AI的修改建议,都是不行的,源码完全对不上,设置优先级无效。
虽然不能从系统层面很好实现这个功能,但是也是有办法的大致满足要求的,有兴趣的看看。
二、实现分析
下面实现Wifi开启后自动连接某个已保存的具体名称的Wifi。
1、AI建议
系统源码修改的方式,我搜了好几个都是没用的,并且源码基本都是不对应的;
下面是系统应用中的修改建议。
(1)优先级设置
Android 系统根据以下因素综合排序已保存的网络:
-
priority 值:范围为 0-1,000,000,数值越高优先级越高。最近连接过的网络会被动态赋予更高优先级。
-
信号强度:扫描到的网络按信号强弱排序,同时优先选择 WPA/WPA2/WPA3 加密网络(安全性高于 WEP)。
-
连接历史:用户手动连接的网络会被保存,并根据连接频率调整优先级。
优先级的值可以设置看看,信号强度是扫描获取的,连接历史是手动触发的;
(2)设置Wifi优先级的值代码实现:
需要在系统签名应用中验证下面代码的实现。
//方式一:设置priority 优先级的值
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> configs = wifiManager.getConfiguredNetworks();
for (WifiConfiguration config : configs) {if (config.SSID.contains("目标网络名称")) {config.priority = 1000; // 设置高优先级wifiManager.updateNetwork(config);wifiManager.enableNetwork(config.networkId, true);break;}
}//方式二,Android14新特性 WifiNetworkSuggestion
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder().setSsid("目标网络名称").setWpa2Passphrase("密码").setPriority(100).build();
wifiManager.addNetworkSuggestions(Collections.singletonList(suggestion));
验证结果:
1、方式一设置priority属性后,重新获取所有已保存的Wifi的priority都是0;
2、方式二虽然重新获取是已保存的值,但是并没有作用;
3、所以说方式一和方式二的修改方式都是不行的;
2、源码分析
(1)自动连接的整体逻辑大概可分为 4 个阶段:
- 触发扫描:WiFi 开启后,系统触发主动扫描,获取周围可用网络列表;
- 网络匹配:将扫描到的网络(
ScanResult
)与已保存的配置(WifiConfiguration
,来自WifiConfigStore
)匹配; - 优先级排序:对匹配成功的可用网络,基于优先级、信号强度、连接历史等因素排序;
- 连接尝试:按排序结果,从最优网络开始尝试连接,失败则降级尝试下一个。
上面这个是理论流程,但是很难找到具体代码位置。反正AI搜索到的是没一个对的。
(2)系统代码位置参考(AOSP)
-
Wifi启动:
packages/modules/Wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
-
网络匹配:
packages/modules/Wifi/service/java/com/android/server/wifi/WifiConfigManager.java
-
优先级排序:
packages/modules/Wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
//关键评分过程:
packages/modules/Wifi/service/java/com/android/server/wifi/WifiNetworkSelector.java
-
连接管理:
packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java
分析到 WifiNetworkSelector.java 的逻辑确认比较像评分的过程,但是具体逻辑比较扭,没分析完成。
评分过程有几个非常容易混淆的对象:
WifiCandidates:
在设备扫描到多个 WiFi 网络(如已保存的网络、开放网络)时,WifiCandidates 汇总这些网络,
作为后续 “选择最优网络连接” 的数据源,简化网络选择流程的逻辑管理。WifiCandidates.Candidate:
作为网络的 “原始数据载体”,为后续评分提供基础信息。
例如,一个 Candidate 可能包含 “SSID 为 "HomeWiFi"、BSSID 为 "aa:bb:cc:dd:ee:ff"、RSSI 为 - 60dBm、安全类型为 WPA2-PSK” 等信息WifiCandidates.CandidateScorer:
实现网络选择的 “智能决策”。不同的 CandidateScorer 可对应不同的评分逻辑(如优先信号强度、优先安全等级、优先历史连接稳定性等),
系统可根据场景选择合适的评分器,确保选择最优网络。WifiCandidates.ScoredCandidate:
作为 “评分后的数据单元”,方便 WifiCandidates 对所有候选网络按分数排序,
最终选择得分最高的网络进行连接,直接支撑网络选择的决策结果。
上面这几个对象里面还有不同的数据,就很容易搞乱。
(3)总结关系与流程
1、 设备扫描到 WiFi 网络后,将每个网络封装为 `Candidate`;
2、 `WifiCandidates` 收集所有 `Candidate`,并通过 `CandidateScorer` 对每个 `Candidate` 评分;
3、 评分结果被封装为 `ScoredCandidate`,`WifiCandidates` 对其排序;
4、 系统选择得分最高的 `ScoredCandidate` 对应的网络进行连接,提升 WiFi 连接体验(如优先连接信号好、更安全的网络)。
在WifiNetworkSelector 好几个地方加过判断选择具体Wifi名称的连接逻辑,但是实际不可行。
所以暂时没招了,看了一周没啥头绪,先放弃吧,有兴趣的可以自行研究看看。
本文的内容不仅仅针对Android16,其实Android13都是差不多的,虽然有些差异,就难搞。
系统层面无法满足这个要求,其实应用也是可以实现这个功能的;
并且修改系统源码是会有风险的,在自定义系统应用的后台服务添加判断逻辑比较容易修改并且影响较少。
下面是系统签名应用实现自动连接某个Wifi的主要逻辑。
3、系统应用实现具体功能
(1)应用开发要求:
背景:系统签名应用(因为没有权限搞不了);
界面显示:显示已保存的几个Wifi,可选择其中一个为默认连接的wifi;
后台实现:开机后或者开关wifi后,自动判断默认连接的wifi是否在扫描列表存在,如果存在就进行连接。
(2)主要逻辑:
1、设置默认连接的wifi名称为prop属性,可以全局获取和设置;
2、监听广播:开机广播、Wifi开关、网络变化广播;
3、广播回调后,调用连接wifi的工具类方法;
4、工具类方法内:判断当前连接的wifi是否为默认连接的wifi名称,如果是,不用任何操作;
5、如果当前连接的wifi不是当前选择的默认连接的wifi,扫描wifi,
判断默认wifi是否在连接列表,如果不在列表中不用任何操作;
6、判断默认wifi在连接列表,连接默认设置的wifi即可。
看起来比较简单,实际上还需要获取保存的wifi列表和扫描到的wifi列表。
(3)主要代码:
①广播监听代码:
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {final String action = intent.getAction();DebugLog.info("action = " + action);initHandler();switch (action) {case NET_CHANGE_ACTION: //网络变化,打印ipbreak;case ACTION_BOOT_COMPLETED: //开机广播 break;case ACTION_WIFI_STATE_CHANGED: //wifi开关//1 disabled,2 disabling,3 enable,4 enabling,5 unknown int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);break;if (wifiState == WifiManager.WIFI_STATE_ENABLED) {mHandler.removeMessages(MSG_AUTO_CONNECT);mHandler.sendEmptyMessageDelayed(MSG_AUTO_CONNECT, MSG_AUTO_CONNECT_SWITCH_DELAYED);}case ACTION_WIFI_CONNECT_STATE_CHANGED: //wifi连接状态改变break;}}};//广播后调用的 封装类和封装方法 WifiAutoConnectUtil.autoConnectWifi();
因为广播有时候回调比较多,所以最好做延时操作,比如5秒后再判断进行连接wifi,并且去除之前的message;
开机广播和网络变化、wifi连接变化 根据实际需求判断是否自动连接wifi。
②获取扫描的wifi列表:
//获取扫描到的wifipublic static List<ScanResult> getScanWifiList(Context context) {WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);//获取已保存的wifi列表boolean startScan = wifiManager.startScan();try {Thread.sleep(5000); //为啥要等一下?因为不等一下是扫不到的。} catch (InterruptedException e) {e.printStackTrace();}List<ScanResult> scanResults = wifiManager.getScanResults();//这里只是调试的时候,提前打印看看for (int index = 0; index < scanResults.size(); index++) {if (scanResults.get(index).SSID.contains("xm") || scanResults.get(index).SSID.contains("VPN")) {DebugLog.debug("getScanResults " + scanResults.get(index).SSID);}}return scanResults;}
获取扫描wifi列表,必须本应用进行扫描后,才能获取到;
比如设置应用打开wifi,进入扫描模式,其他应用是获取不到扫描列表的;
上面扫描后需要延迟一下再获取,否则无法获取到列表,可以延迟3-10秒;
③获取已保存的wifi列表:
//获取已保存的wifipublic static List<WifiConfiguration> getWifiConfigurationList(Context context) {WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();return configuredNetworks;}
④获取当前连接的wifi名称:
public static String getCurrentConnectedWifiName(Context context) {// 1. 获取WifiManager实例WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);// 2. 获取当前连接的WiFi信息WifiInfo wifiInfo = wifiManager.getConnectionInfo();if (wifiInfo == null) return "";// 3. 获取SSID(WiFi名称),注意:可能带双引号(如"HomeWiFi")String ssid = wifiInfo.getSSID(); //也可能为null或者unKnownreturn ssid;}
⑤判断当前wifi是否开启:
public static boolean isWifiConnected(Context context) {ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();if (mNetworkInfo != null) {NetworkInfo.State state = mNetworkInfo.getState();if (state == NetworkInfo.State.CONNECTED) {DebugLog.debug("cur wifi is connect! ");return true;}}return false;}
⑥判断当前wifi是否开启
public static boolean isWifiEnabled(Context context) {WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);return wifiManager.isWifiEnabled();}
⑦判断Wifi名称是否相等
//判断wifi名称是否相等,WifiConfiguration 的wifi名称SSID是自带双引号的,扫描到的Wifi名称没有双引号!public static boolean isWifiNameEquals(String wifiName, String ssid) {wifiName = wifiName.replace("\"", "");ssid = ssid.replace("\"", "");return wifiName.equals(ssid);}
⑧连接某一个Wifi的具体代码
//连接某一个wifipublic static boolean connectWifi(Context context, WifiConfiguration config) {WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);DebugLog.debug("config = " + config);WifiManager.ActionListener connectListener = new WifiManager.ActionListener() {@Overridepublic void onSuccess() {DebugLog.debug("mConnectListener");}@Overridepublic void onFailure(int reason) {DebugLog.error("onFailure reason = " + reason);}};wifiManager.connect(config, connectListener);return true;}
上面就是用到的主要封装类方法,在autoConnectWifi 里面有逻辑的调用即可。
⑨ autoConnectWifi 的主要逻辑
boolean mDefaultWifi = SystemProperties.get("persist.debug.wifi_name");//实现自动连接wifi//1、判断是否已连接wifi//2、判断当前是否有连接到wifi//3、遍历已保存的wifi 选择连接某个wifipublic static void autoConnectWifi(Context context) {DebugLog.debug("autoConnectWifi!");if (isWifiEnabled(context)) { //Wifi开启才进行下面操作。if (isWifiNameEquals(mDefaultWifi, getCurrentConnectedWifiName(context))) {DebugLog.debug("default wifi is Connected! no need connect wifi.");return;}//获取当前扫描到的Wifi列表,会有延时List<ScanResult> scanResults= getScanWifiList(context);//已保存的wifiList<WifiConfiguration> wifiConfigurationList = getWifiConfigurationList(context);for (int index = 0; index < wifiConfigurationList.size(); index++) {WifiConfiguration config = wifiConfigurationList.get(index);for (int index2 = 0; index2 < scanResults.size(); index2++) {if (isWifiNameEquals(config.SSID, scanResults.get(index2).SSID) && isWifiNameEquals(config.SSID, mDefaultWifi)) {connectWifi(context, config);}}try {Thread.sleep(10*1000);} catch (InterruptedException e) {e.printStackTrace();}//延时后打印连接情况,要不要都可以,也可以做循环判断连接。boolean wifiConnected = isWifiConnected(context);DebugLog.debug("wifiConnected = " + wifiConnected);if (!isWifiEnabled(context) || wifiConnected) {DebugLog.debug("not need auto connected wifi !");break;}}} else {DebugLog.error("wifi is not Enable! no auto connect wifi.");}}
上面操作是需要在子线程执行,Handler的子线程也可以;
上面的逻辑仅供参考,具体情况需要具体修改。
(4)局限性和相关拓展:
局限性:
1、上面只判断Wifi名称,万一有重名的呢?
可以同时记录Wifi名称和wif的mac地址,进行规避解决。
2、如果打开Wifi后,马上连接上了其他Wifi名称,会出现等待一会后再连接上默认Wifi;
这个没啥好说的,因为没修改系统源码逻辑,总归会有点小插曲,最总效果是没问题的。
相关拓展:
1、可以修改为默认可选多个Wifi名称,其中一个可被扫描到就进行连接;
需要修改具体连接判断的逻辑;
2、可以修改成默认连接某个未连接的Wifi;
需要修改具体连接判断的逻辑;需要提供Wifi名称和密码,合成 WifiConfiguration 对象就可以进行连接;
上面代码并不是很难,因为没有讲啥源码内容。
主要是应用上的逻辑判断处理。
三、其他
1、小结
本文未完成源码上连接具体名称某个wifi功能实现;
主要讲解系统应用后台实现了连接具体名称某个wifi的主要过程。
2、打开Wifi后默认连接Wifi的发现
(1)wifi默认连接规律
如果啥都不修改,通过验证发现打开Wifi后自动连接某个Wifi的规律如下:
1、默认连接上次连接的Wifi,前提是上次连接的Wifi可被扫描到;
2、如果上次连接的Wifi已经不可扫描到,默认连接信号好的Wifi。
(2)wifi配置信息
wifi连接的配置信息保存的位置:
/data/misc/apexdata/com.android.wifi/WifiConfigStore.xml
里面包含了已连接的wifi和已保存的wifi信息,
以及其他wif配置,比如:某个wifi是否自动重连、 “启动WLAN详细日志记录功能”状态 。
下面是完整的 WifiConfigStore.xml 文件的信息:
保存的wifi有:NO-BUG、VPN_5G、xm5G(无密码),目前连接是是NO-BUG;
信息还是比较多的,如果不知道看啥,可以跟着我的数值一直往下看看主要相关信息:
console:/data/misc/apexdata/com.android.wifi # cat WifiConfigStore.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<WifiConfigStoreData>
<int name="Version" value="3" />
<WifiCarrierInfoStoreManagerDataStores>
<map name="MergedCarrierNetworkOffloadMap" />
<map name="UnmergedCarrierNetworkOffloadMap" />
<boolean name="AutoJoinFlippedOnOobPseudonymEnabled" value="false" />
</WifiCarrierInfoStoreManagerDataStores>
<NetworkList> //1、list ,对应多个保存的wifi<Network> //2、对应某个保存的wifi,NO-BUG
<WifiConfiguration>
<string name="ConfigKey">"NO-BUG"WPA_PSK</string> //3、NO-BUG:wifi 名称和加密类型
<string name="SSID">"NO-BUG"</string> //4、NO-BUG:wifi 名称
<string name="PreSharedKey">"qwertyuiop"</string> //5、NO-BUG:wifi密码
<null name="WEPKeys" />
<int name="WEPTxKeyIndex" value="0" />
<boolean name="HiddenSSID" value="false" />
<boolean name="RequirePMF" value="false" />
<byte-array name="AllowedKeyMgmt" num="1">02</byte-array>
<byte-array name="AllowedProtocols" num="1">03</byte-array>
<byte-array name="AllowedAuthAlgos" num="0"></byte-array>
<byte-array name="AllowedGroupCiphers" num="1">0f</byte-array>
<byte-array name="AllowedPairwiseCiphers" num="1">06</byte-array>
<byte-array name="AllowedGroupMgmtCiphers" num="0"></byte-array>
<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
<boolean name="Shared" value="true" />
<boolean name="AutoJoinEnabled" value="true" />
<int name="Priority" value="0" /> //6、NO-BUG:优先级,已经没啥用了。
<int name="DeletionPriority" value="0" />
<int name="NumRebootsSinceLastUse" value="0" />
<boolean name="RepeaterEnabled" value="false" />
<boolean name="EnableWifi7" value="true" />
<SecurityParamsList>
<SecurityParams>
<int name="SecurityType" value="2" /> //7、NO-BUG:wifi密码类型
<boolean name="IsEnabled" value="true" />
<boolean name="SaeIsH2eOnlyMode" value="false" />
<boolean name="SaeIsPkOnlyMode" value="false" />
<boolean name="IsAddedByAutoUpgrade" value="false" />
<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
</SecurityParams>
<SecurityParams>
<int name="SecurityType" value="4" />
<boolean name="IsEnabled" value="true" />
<boolean name="SaeIsH2eOnlyMode" value="false" />
<boolean name="SaeIsPkOnlyMode" value="false" />
<boolean name="IsAddedByAutoUpgrade" value="true" />
<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
</SecurityParams>
</SecurityParamsList>
<boolean name="SendDhcpHostname" value="true" />
<boolean name="Trusted" value="true" />
<boolean name="IsRestricted" value="false" />
<boolean name="OemPaid" value="false" />
<boolean name="OemPrivate" value="false" />
<boolean name="CarrierMerged" value="false" />
<null name="BSSID" />
<int name="Status" value="0" />
<null name="FQDN" />
<null name="ProviderFriendlyName" />
<null name="LinkedNetworksList" />
<string name="DefaultGwMacAddress">ec:41:18:98:08:15</string>
<boolean name="ValidatedInternetAccess" value="true" />
<boolean name="NoInternetAccessExpected" value="false" />
<boolean name="MeteredHint" value="false" />
<int name="MeteredOverride" value="0" />
<boolean name="UseExternalScores" value="false" />
<int name="CreatorUid" value="1000" />
<string name="CreatorName">android.uid.system:1000</string>
<int name="LastUpdateUid" value="1000" />
<string name="LastUpdateName">android.uid.system:1000</string>
<int name="LastConnectUid" value="1000" />
<boolean name="IsLegacyPasspointConfig" value="false" />
<long-array name="RoamingConsortiumOIs" num="0" />
<string name="RandomizedMacAddress">ba:09:dc:d4:86:26</string>
<int name="MacRandomizationSetting" value="0" />
<int name="CarrierId" value="-1" />
<boolean name="IsMostRecentlyConnected" value="true" />
<int name="SubscriptionId" value="-1" />
<byte-array name="DppPrivateEcKey" num="0"></byte-array>
<byte-array name="DppConnector" num="0"></byte-array>
<byte-array name="DppCSignKey" num="0"></byte-array>
<byte-array name="DppNetAccessKey" num="0"></byte-array>
</WifiConfiguration>
<NetworkStatus> //8、NO-BUG:网络连接状态看不出啥,但是其他已保存的wifi,会添加 NO-BUG,标明是最近连接的
<string name="SelectionStatus">NETWORK_SELECTION_ENABLED</string> //9、NO-BUG:原生的网络校验
<string name="DisableReason">NETWORK_SELECTION_ENABLE</string>
<null name="ConnectChoice" /> //10、NO-BUG:其他已保存的wifi,会变成 NO-BUG
<int name="ConnectChoiceRssi" value="0" />
<boolean name="HasEverConnected" value="true" />
<boolean name="CaptivePortalNeverDetected" value="true" />
<boolean name="HasEverValidatedInternetAccess" value="true" />
</NetworkStatus>
<IpConfiguration>
<string name="IpAssignment">DHCP</string> //11、NO-BUG:静态ip情况。
<string name="ProxySettings">NONE</string> //12、NO-BUG:代理情况。
</IpConfiguration>
</Network><Network> //13、对应某个保存的wifi,VPN_5G
<WifiConfiguration>
<string name="ConfigKey">"VPN_5G"WPA_PSK</string> //14、VPN_5G:wifi名称和密码类型
<string name="SSID">"VPN_5G"</string>
<string name="PreSharedKey">"ktc123123"</string>
<null name="WEPKeys" />
<int name="WEPTxKeyIndex" value="0" />
<boolean name="HiddenSSID" value="false" />
<boolean name="RequirePMF" value="false" />
<byte-array name="AllowedKeyMgmt" num="1">02</byte-array>
<byte-array name="AllowedProtocols" num="1">03</byte-array>
<byte-array name="AllowedAuthAlgos" num="0"></byte-array>
<byte-array name="AllowedGroupCiphers" num="1">0f</byte-array>
<byte-array name="AllowedPairwiseCiphers" num="1">06</byte-array>
<byte-array name="AllowedGroupMgmtCiphers" num="0"></byte-array>
<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
<boolean name="Shared" value="true" />
<boolean name="AutoJoinEnabled" value="true" />
<int name="Priority" value="0" />
<int name="DeletionPriority" value="0" />
<int name="NumRebootsSinceLastUse" value="0" />
<boolean name="RepeaterEnabled" value="false" />
<boolean name="EnableWifi7" value="true" />
<SecurityParamsList>
<SecurityParams>
<int name="SecurityType" value="2" />
<boolean name="IsEnabled" value="true" />
<boolean name="SaeIsH2eOnlyMode" value="false" />
<boolean name="SaeIsPkOnlyMode" value="false" />
<boolean name="IsAddedByAutoUpgrade" value="false" />
<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
</SecurityParams>
<SecurityParams>
<int name="SecurityType" value="4" />
<boolean name="IsEnabled" value="true" />
<boolean name="SaeIsH2eOnlyMode" value="false" />
<boolean name="SaeIsPkOnlyMode" value="false" />
<boolean name="IsAddedByAutoUpgrade" value="true" />
<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
</SecurityParams>
</SecurityParamsList>
<boolean name="SendDhcpHostname" value="true" />
<boolean name="Trusted" value="true" />
<boolean name="IsRestricted" value="false" />
<boolean name="OemPaid" value="false" />
<boolean name="OemPrivate" value="false" />
<boolean name="CarrierMerged" value="false" />
<null name="BSSID" />
<int name="Status" value="2" />
<null name="FQDN" />
<null name="ProviderFriendlyName" />
<null name="LinkedNetworksList" />
<string name="DefaultGwMacAddress">f8:6f:b0:71:28:5f</string>
<boolean name="ValidatedInternetAccess" value="true" />
<boolean name="NoInternetAccessExpected" value="false" />
<boolean name="MeteredHint" value="false" />
<int name="MeteredOverride" value="0" />
<boolean name="UseExternalScores" value="false" />
<int name="CreatorUid" value="1000" />
<string name="CreatorName">android.uid.system:1000</string>
<int name="LastUpdateUid" value="1000" />
<string name="LastUpdateName">android.uid.system:1000</string>
<int name="LastConnectUid" value="1000" />
<boolean name="IsLegacyPasspointConfig" value="false" />
<long-array name="RoamingConsortiumOIs" num="0" />
<string name="RandomizedMacAddress">32:58:9f:1d:b0:48</string>
<int name="MacRandomizationSetting" value="0" />
<int name="CarrierId" value="-1" />
<boolean name="IsMostRecentlyConnected" value="true" />
<int name="SubscriptionId" value="-1" />
<byte-array name="DppPrivateEcKey" num="0"></byte-array>
<byte-array name="DppConnector" num="0"></byte-array>
<byte-array name="DppCSignKey" num="0"></byte-array>
<byte-array name="DppNetAccessKey" num="0"></byte-array>
</WifiConfiguration>
<NetworkStatus> //15、VPN_5G:网络连接的状态
<string name="SelectionStatus">NETWORK_SELECTION_ENABLED</string>
<string name="DisableReason">NETWORK_SELECTION_ENABLE</string>
<string name="ConnectChoice">"NO-BUG"WPA_PSK</string> //16、VPN_5G:ConnectChoice为当前连接的wifi名称
<int name="ConnectChoiceRssi" value="-62" />
<boolean name="HasEverConnected" value="true" />
<boolean name="CaptivePortalNeverDetected" value="true" />
<boolean name="HasEverValidatedInternetAccess" value="true" />
</NetworkStatus>
<IpConfiguration>
<string name="IpAssignment">DHCP</string>
<string name="ProxySettings">NONE</string>
</IpConfiguration>
</Network><Network> //17、对应某个保存的wifi,xm5G
<WifiConfiguration>
<string name="ConfigKey">"xm5G"NONE</string> //18、xm5G:wifi名称和密码类型,无密码
<string name="SSID">"xm5G"</string>
<null name="PreSharedKey" /> //19、xm5G:无密码
<null name="WEPKeys" />
<int name="WEPTxKeyIndex" value="0" />
<boolean name="HiddenSSID" value="false" />
<boolean name="RequirePMF" value="false" />
<byte-array name="AllowedKeyMgmt" num="1">01</byte-array>
<byte-array name="AllowedProtocols" num="1">03</byte-array>
<byte-array name="AllowedAuthAlgos" num="0"></byte-array>
<byte-array name="AllowedGroupCiphers" num="0"></byte-array>
<byte-array name="AllowedPairwiseCiphers" num="0"></byte-array>
<byte-array name="AllowedGroupMgmtCiphers" num="0"></byte-array>
<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
<boolean name="Shared" value="true" />
<boolean name="AutoJoinEnabled" value="true" />
<int name="Priority" value="0" />
<int name="DeletionPriority" value="0" />
<int name="NumRebootsSinceLastUse" value="1" />
<boolean name="RepeaterEnabled" value="false" />
<boolean name="EnableWifi7" value="true" />
<SecurityParamsList>
<SecurityParams>
<int name="SecurityType" value="0" />
<boolean name="IsEnabled" value="true" />
<boolean name="SaeIsH2eOnlyMode" value="false" />
<boolean name="SaeIsPkOnlyMode" value="false" />
<boolean name="IsAddedByAutoUpgrade" value="false" />
<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
</SecurityParams>
<SecurityParams>
<int name="SecurityType" value="6" />
<boolean name="IsEnabled" value="true" />
<boolean name="SaeIsH2eOnlyMode" value="false" />
<boolean name="SaeIsPkOnlyMode" value="false" />
<boolean name="IsAddedByAutoUpgrade" value="true" />
<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
</SecurityParams>
</SecurityParamsList>
<boolean name="SendDhcpHostname" value="true" />
<boolean name="Trusted" value="true" />
<boolean name="IsRestricted" value="false" />
<boolean name="OemPaid" value="false" />
<boolean name="OemPrivate" value="false" />
<boolean name="CarrierMerged" value="false" />
<null name="BSSID" />
<int name="Status" value="2" />
<null name="FQDN" />
<null name="ProviderFriendlyName" />
<null name="LinkedNetworksList" />
<string name="DefaultGwMacAddress">8c:53:c3:53:c6:57</string>
<boolean name="ValidatedInternetAccess" value="true" />
<boolean name="NoInternetAccessExpected" value="false" />
<boolean name="MeteredHint" value="false" />
<int name="MeteredOverride" value="0" />
<boolean name="UseExternalScores" value="false" />
<int name="CreatorUid" value="1000" />
<string name="CreatorName">android.uid.system:1000</string>
<int name="LastUpdateUid" value="1000" />
<string name="LastUpdateName">android.uid.system:1000</string>
<int name="LastConnectUid" value="1000" />
<boolean name="IsLegacyPasspointConfig" value="false" />
<long-array name="RoamingConsortiumOIs" num="0" />
<string name="RandomizedMacAddress">c6:87:fb:3d:0c:e6</string>
<int name="MacRandomizationSetting" value="0" />
<int name="CarrierId" value="-1" />
<boolean name="IsMostRecentlyConnected" value="true" />
<int name="SubscriptionId" value="-1" />
<byte-array name="DppPrivateEcKey" num="0"></byte-array>
<byte-array name="DppConnector" num="0"></byte-array>
<byte-array name="DppCSignKey" num="0"></byte-array>
<byte-array name="DppNetAccessKey" num="0"></byte-array>
</WifiConfiguration>
<NetworkStatus>
<string name="SelectionStatus">NETWORK_SELECTION_ENABLED</string>
<string name="DisableReason">NETWORK_SELECTION_ENABLE</string>
<string name="ConnectChoice">"NO-BUG"WPA_PSK</string> //20、xm5G:ConnectChoice为当前连接的wifi名称
<int name="ConnectChoiceRssi" value="-62" />
<boolean name="HasEverConnected" value="true" />
<boolean name="CaptivePortalNeverDetected" value="true" />
<boolean name="HasEverValidatedInternetAccess" value="true" />
</NetworkStatus>
<IpConfiguration>
<string name="IpAssignment">DHCP</string>
<string name="ProxySettings">NONE</string>
</IpConfiguration>
</Network>
</NetworkList>//21、下面是其他配置
<MacAddressMap>
<map name="MacMapEntry" />
</MacAddressMap>
<Settings>
<map name="Values">
<int name="wifi_native_supported_sta_bands" value="3" />
<boolean name="wifi_p2p_pending_factory_reset" value="false" />
<null name="wifi_p2p_device_name" />
<boolean name="wifi_scan_always_enabled" value="true" />
<string name="wifi_sta_factory_mac_address">54:78:c9:89:30:d6</string>
<string name="wifi_static_chip_info">[{"chipId":0,"chipCapabilities":5435817984,"availableModes":[{"id":3,"availableCombinations":[{"limits":[{"maxIfaces":1,"types":[0]},{"maxIfaces":1,"types":[1]},{"maxIfaces":1,"types":[3]}]}]}]}]</string>
<boolean name="wifi_scan_throttle_enabled" value="true" />
<boolean name="wifi_verbose_logging_enabled" value="false" /> //22、wifi详细日志是否打开
<boolean name="wifi_wiphy_11be_supported" value="false" />
<string name="wifi_available_soft_ap_freqs_mhz">[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,5180,5200,5220,5240,5765]</string>
<string name="wifi_last_country_code">US</string> //23、当前国家码
<long name="wifi_native_supported_features" value="116391869900985373" />
<int name="supplicant_hal_aidl_service_version" value="2" />
</map>
</Settings>
<PasspointConfigData>
<long name="ProviderIndex" value="0" />
</PasspointConfigData>
<RoamingPolicies>
<map name="DeviceAdminPolicies" />
<map name="NonAdminPolicies" />
</RoamingPolicies>
</WifiConfigStoreData>
console:/data/misc/apexdata/com.android.wifi #
console:/data/misc/apexdata/com.android.wifi #
上面配置文件主要能看到:
1、所有已保存的wifi;
2、当前已连接的wifi或者上次连接的wifi;
3、wifi的代理和静态ip情况;
4、各个wifi的名称和密码;
5、wifi详细日志是否打开
6、当前wifi的国家码
所以wifi打开后,自动连接的就是已保存的wifi的ConnectChoice的名称。
所以如果想修改系统源码里面,默认连接某个已保存的wifi可以设置 ConnectChoice 为指定的wifi名称;
这个估计也是要分析wifi配置保存的流程,有兴趣的可以试试。
另外wifi的密码在Android系统目前是没有api获取直接获取的,如果需要获取密码可以从配置文件中解析读取。
3、Android13 命令启用WLAN详细日志分析
Android 如果遇到wifi问题,比如无法联网,连接wifi失败,热点异常等问题;
如果查看wifi相关日志未发现具体异常,可以通过更加详细的wifi日志,
如果是想分享更具体的wifi连接过程是可以打开这个“启用WLAN详细日志”开关的。
详情:https://blog.csdn.net/wenzhi20102321/article/details/151860143