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-"android.hardware.wifi@1.0_hal":包含了该目录下所有的hal文件
genrule-"android.hardware.wifi@1.0_genc++":使用上面的filegroup作为src编译出对应的cpp文件
genrule-"android.hardware.wifi@1.0_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