本文分析主要基于android 10代码,分析framework中wifi enable的原理。
android WIFI框架如下图:
android wifi struct.png
分析framework中wifi相关链接控制的原理,由于wifi相关代码有多处比如:
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模型的主要脉络,顺藤摸瓜,后面的分析也就简单了。以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对应的manager分别是 WifiManager.java WifiScanner.java 其中WifiManager.java实现了IWifiConnectedNetworkScorer.aidl。
从上面可以看出,在frameworks/base/wifi/java/android/net/wifi/文件夹下的接口主要是上层的封装供上层调用使用。
而frameworks/opt/net/wifi/service/java/com/android/server/wifi/下的接口主要是wifi在framework层的实现。
下面以wifi enable为例,看一下如何一步一步实现的。
wifi_manager.png