Android O/P wifi 架构:

android10 wifi android10 wifi架构_android10 wifi

android O和Pwifi的代码框架变化很小,主要在于框架的逻辑控制上。根据上图提供的架构可以了解下整个wifi的代码分层和结构

 

WiFi Setings:

代码路径:packages/apps/Settings/src/com/android/settings/wifi

部分文件

android10 wifi android10 wifi架构_java_02

此路径是手机的设置app和wifi设置操作相关的代码,wifi的操作都是从此处的代码开始运行。

eg:wifi的打开:从wifisettings -> WifiEnabler -> frameworks

 

APP ---Frameworks通信--->aidl

app到framework层通过aidl通信

eg:WifiManager -> WifiService

 

                            

android10 wifi android10 wifi架构_java_03

 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