本文分析主要基于android 10代碼,分析framework中wifi enable的原理。
android WIFI框架如下圖:

android wifi struct.png
分析framework中wifi相關(guān)鏈接控制的原理,由于wifi相關(guān)代碼有多處比如:
frameworks/base/wifi/java/android/net/wifi/
frameworks/opt/net/wifi/service/java/com/android/server/wifi/
frameworks/base/core/java/android/net/
這種manager service牽扯到多個,代碼在多處,一下進入代碼分析比較困難,比較迅速的方法是從aidl進程間通信入手,抓到aidl接口就抓到了C/S模型的主要脈絡(luò),順藤摸瓜,后面的分析也就簡單了。以wifi為例,wifi的進程間通信的aidl文件有如下三個。
IWifiScanner.aidl
interface IWifiScanner
{
Messenger getMessenger();
Bundle getAvailableChannels(int band, String packageName, String featureId);
}
IWifiManager.aidl
IWifiConnectedNetworkScorer.aidl
通過這三個aidl,可以看出,wifi掃描有個servcie,wifi管理有個service,wifi連接后打分也有個aidl。
WifiScanningService和WifiService繼承SystemService,由SystemService啟動。
上面三個service對應(yīng)的manager分別是 WifiManager.java WifiScanner.java 其中WifiManager.java實現(xiàn)了IWifiConnectedNetworkScorer.aidl。
從上面可以看出,在frameworks/base/wifi/java/android/net/wifi/文件夾下的接口主要是上層的封裝供上層調(diào)用使用。
而frameworks/opt/net/wifi/service/java/com/android/server/wifi/下的接口主要是wifi在framework層的實現(xiàn)。
下面以wifi enable為例,看一下如何一步一步實現(xiàn)的。

wifi_manager.png