Android O/P wifi 架構:
android O和Pwifi的代碼框架變化很小,主要在於框架的邏輯控制上。根據上圖提供的架構可以瞭解下整個wifi的代碼分層和結構
WiFi Setings:
代碼路徑:packages/apps/Settings/src/com/android/settings/wifi
部分文件
此路徑是手機的設置app和wifi設置操作相關的代碼,wifi的操作都是從此處的代碼開始運行。
eg:wifi的打開:從wifisettings -> WifiEnabler -> frameworks
APP ---Frameworks通信--->aidl
app到framework層通過aidl通信
eg:WifiManager -> WifiService
IWifiManager, IWifiManager.Stub, IWifiManager.Stub.Proxy都由IWifiManger.aidl生成
WifiManager:系統爲app提供的接口。
Context.getSystemService(Context.WIFI_SERVICE)返回的實際對象類型是IWifiManager.Stub.Proxy
IWifiManager.Stub.Proxy的實例:app端的代理,將WifiManager的方法的參數序列到parcel,經Binder發送給system_server進程
WiFi Frameworks
代碼路徑:
Frameworks/base/wifi/java/android/net/wifiFrameworks/base/wifi/java/android/net/wifi wifi相關的包
WifiInfo.java
WifiScanner.java
IWifiManager.aidl--aidl文件會自動生成相關的java代碼,用於binder通信
WifiManager.java
......
Frameworks/opt/net/wifi/service/java/com/android/server/wifi/ wifi相關的服務
WifiService.java
WifiController.java
WifiServiceImpl.java
WifiNative.java
ClientModeImpl.java
......
Wifi_Framework----wifistateMachine
wifi狀態機是framework控制wifi的核心,對wifi的狀態的改動都要經過一個或者幾個狀態機,最後下發指令到HAL層。
HIDL and HAL
從frameworks層到HAl層,之間必須通過一種通信機制纔可以讓代碼流程從java到C/C++
早起版本通過jni:
java聲明native方法->javah -jni命令導出JNI的.h頭文件->實現native方法->編譯本地代碼爲*.so的庫文件。(native依賴於so庫)
adroid Q -> HIDL
HIDL:文件路徑:hardware/interfaces/wifi/1.3/
wifi_chip
wifi_mode_controller
wifi_legacy_hal
HIDL的功能就是爲了java可以直接調用到c/c++,wifi的framework層動用的Iwifi的類,Iwifi.hal文件定義了未實現的接口。
對應目錄下的Android.bp :
filegroup-"[email protected]_hal":包含了該目錄下所有的hal文件
genrule-"[email protected]_genc++":使用上面的filegroup作爲src編譯出對應的cpp文件
genrule-"[email protected]_genc++_headers":使用上面的filegroup作爲src編譯出對應的.h文件
HAL
hal層主要是運行在用戶空間對supplicant等一些工具接口的統一封裝,以便HIDL通信調用
文件路徑:
frameworks/opt/net/wifi/libwifi_hal/
主要文件3個:
driver_tool .cpp
hal_tool.cpp
wifi_hal_commom.cpp
wpa_supplicant
路徑:external/wpa_supplecant_8/
該項目內包含兩個互相相關的開源項目wpa_supplicant和hostapd,它們將會生成兩個可執行文件:wpa_supplicant和hostapd,分別爲STA模式和AP模式時的守護進程。
除此之外,還會生成用於測試的wpa_cli,hostapd_cli,以及WIFI HAL依賴的wpa_client.so,具體可以到Android.mk中找到
wpa_supplicant通過NETLINK socket與內核通信。
wpa_supplicant項目支持多種驅動編程接口,在Android上使用的是nl80211;
nl80211是新的802.11netlink接口公共頭,與cfg80211一同組成了Wireless-Extensions的替代方案。
cfg80211是Linux 802.11配置API, nl80211用於配置cfg80211設備,同時用於內核到用戶空間的通信。
wireless module(in kernel)
代碼位於:
kernel/net/wireless
nl80211.c 中的 nl80211_init 使用genl_register_family_with_ops 註冊了響應應用程序的struct genl_ops nl80211_ops[], 該數組定義了響應NETLINK消息的函數。
nl80211_init 在 cfg80211_init 內被調用,cfg80211_init是被subsys_initcall註冊的子系統初始化程序,被編譯爲cfg80211.ko。
wlan driver
代碼位於:
vendor/qcom/opensource/wlan/prima
模塊初始化(module_init),模塊退出(module_exit):
CORE/HDD/src/wlan_hdd_main.c