一、概述
最近在看android wifi framework 的源码,发现在最新android版本上,wifi 代码改动很大,网上关于最新的android代码分析较少,因此打算出一系列关于wifi framework的文章。
本篇文章主要讲解,wifi 配置信息存储的位置,以及加载的时机,包括以下几部分:
- wifi配置信息在android14 上存储的位置。
- wifi 配置信息xml什么时机加载到内存当中的(从Zygote开始),以及首次上电的情况。
- 代码分析,弄明白其中的函数调用关系。
- 简单画了函数之间的调用关系。
二、 wifi配置信息在android14 上存储的位置
android14 版本,wifi的配置信息存在下面的路径:
/data/misc/apexdata/com.android.wifi
其默认有两个xml文件,一个对应是一般的wifi,另一个对应的是ap,内容如下:
# /data/misc/apexdata/com.android.wifi/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="true" />
</WifiCarrierInfoStoreManagerDataStores>
<NetworkList />
<MacAddressMap>
<map name="MacMapEntry" />
</MacAddressMap>
<Settings>
<map name="Values">
<string name="wifi_available_soft_ap_freqs_mhz">[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462]</string>
<string name="wifi_last_country_code">US</string>
<string name="wifi_static_chip_info">[{
"chipId":0,"chipCapabilities":0,"availableModes":[{
"id":0,"availableCombinations":[{
"limits":[{
"maxIfaces":1,"types":[0]},{
"maxIfaces":1,"types":[3]}]}]},{
"id":1,"availableCombinations":[{
"limits":[{
"maxIfaces":1,"types":[1]}]}]}]}]</string>
</map>
</Settings>
<PasspointConfigData>
<long name="ProviderIndex" value="0" />
</PasspointConfigData>
</WifiConfigStoreData>
# /data/misc/apexdata/com.android.wifi/WifiConfigStoreSoftAp.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<WifiConfigStoreData>
<int name="Version" value="3" />
<SoftAp>
<string name="WifiSsid">"AndroidAP_6906"</string>
<boolean name="HiddenSSID" value="false" />
<int name="SecurityType" value="1" />
<string name="Passphrase">s3yspgxk7rw9vb6</string>
<int name="MaxNumberOfClients" value="0" />
<boolean name="ClientControlByUser" value="false" />
<boolean name="AutoShutdownEnabled" value="true" />
<long name="ShutdownTimeoutMillis" value="-1" />
<BlockedClientList />
<AllowedClientList />
<boolean name="BridgedModeOpportunisticShutdownEnabled" value="true" />
<int name="MacRandomizationSetting" value="2" />
<BandChannelMap>
<BandChannel>
<int name="Band" value="1" />
<int name="Channel" value="0" />
</BandChannel>
</BandChannelMap>
<boolean name="80211axEnabled" value="true" />
<boolean name="UserConfiguration" value="false" />
<long name="BridgedModeOpportunisticShutdownTimeoutMillis" value="-1" />
<VendorElements />
<boolean name="80211beEnabled" value="true" />
<string name="PersistentRandomizedMacAddress">ba:dd:19:c6:a5:b9</string>
</SoftAp>
</WifiConfigStoreData>
三、wifi 配置信息xml什么时机加载到内存当中的
WifiConfigStoreSoftAp.xml和WifiConfigStore.xml是在系统上电时加载的。
系统启动后,SystemServer 会调用WifiServiceImpl.java类中的checkAndStartWifi函数,checkAndStartWifi 函数会判断本次系统启动,是否需要开启wifi功能,后续会分析wifi开启流程,先留个位置~
四、代码分析
系统启动后,就会判断是否需要自动开启wifi,因此wifi的配置信息读取工作也是在系统启动后就进行的。
接下来,我们分析这部分代码。这部分分两大类:
- Zygote是如何启动SystemServer进程的,当然,这部分只是简单描述一下,后续会出一篇专门的篇张进行讲解。
- 如何读取xml文件,以及初次上电无法获取xml时又该如何应对。
1、Zygote是如何启动SystemServer进程的
init进程启动后,就会启动Zygote进程。下面分析Zygote如何启动SystemServer进程的。从Zygote的main函数说起,代码分析如下:
//这里只保留关键函数
//frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
864 public static void main(String[] argv) {
...
//注意看,这里fork一个systemServer进程
955 Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
...
984 }