目录
WifiStateMachinePrime.java(状态机前处理机制)
WIFI初始化流程
WifiService 和WifiMonitor 是整个模块的核心,我们必须围绕这两个服务端进行。
WifiService : 负责启动关闭wpa_supplicant、WifiMonitor监视线程和把命令下发给wpa_supplicant
WifiMonitor: 负责从wpa_supplicant 接收事件通知。
也就是说WifiService负责wifi整个流程的控制,而WifiMonitor负责监视底层的事件。
SystemServer
SystemServer
--->run
--->startOtherServices //Start services
---> mSystemServiceManager.startService(WIFI_SERVICE_CLASS)
// WIFI_SERVICE_CLASS = com.android.server.wifi.WifiService
WifiService
WifiService //public final class WifiService extends SystemService
--->new WifiServiceImpl //WifiService构造函数中会new一个WifiServiceImpl
onBootPhase
---> mImpl.checkAndStartWifi() //随后跳转到WifiServiceImpl
WifiServiceImpl
WifiServiceImpl
/*
WifiServiceImpl内部的主要成员:
WifiStateMachine
WifiStateMachinePrime
WifiController
ScanRequestProxy
WifiCountryCode
WifiSettingsStore
WifiApConfigStore
*/
等待 SystemService.PHASE_SYSTEM_SERVICES_READY的时候,
会调用 WifiServiceImpl#checkAndStartWifi(), 获取Wi-Fi开关,持久化存储的值
存在SettingsProvider中 "wifi_on" Settings.Global.getInt(cr, Settings.Global.WIFI_ON) , 如果上次Wi-Fi是开着的,则调用setWifiEnabled,走Wi-Fi打开流程
如果有需求要求默认每次开机WiFi都要打开,可以在WifiServiceImpl.checkAndStartWifi中添加修改,强制每次都去打开,如下:
WIFI打开流程:
流程图1:
手机在WiFi设置界面点下WiFi按钮打开后WiFi启动的业务流程
流程图2:
总代码路径:
WIfiEnabler->WifiManager->WifiService->WifiServiceImpl->WIfiStateMachinePrime->WIfiStateMachine->WifiNative
WifiSettings.java
onStart()
--->createWifiEnabler()
--->onWifiStateChanged(mWifiManager.getWifiState())
在wifisettings activity的onStart函数中,创建一个WifiEnabler对象,用于实现wifi开关功能
WifiEnabler.java
/packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java
WifiEnabler实现了SwitchWidgetController.OnSwitchChangeListener接口,所以重写了SwitchToggled方法。
WifiEnabler开关SwitchToggled中会调用WifiManager.setWifiEnabled方法
WifiManager.java
getSystemService(WifiManager.class) //获取WIFI的服务
WifiManager.setWifiEnabled() //设置wifi开启
WifiManager通过Binder机制与WifiServiceImpl进行通讯,以AIDL接口调用WifiService方法, WiFiManager.aidl中提供了setWifiEnabled()接口
WifiServiceImpl.java
WifiServiceImpl
方法中进行了大量的实例化对象来管理WIFI的各个功能,
mTrafficPoller,用来查询流量统计信息比通知给客户端的。
mWifiStateMachine ,Wifi状态机,它定义了wifi的很多状态,通过消息驱动状态的转变。
mPowerManager ,用于wifi的电源管理。
WifiStateMachineHandler,用于发送和处理wifi状态机相关的消息。
mWifiController,是另一个状态机,它和mWifiStateMachine 不同,mWifiStateMachine 表述wif具体的状态,比如supplicant启动/关闭状态,driver启动/关闭状态等,mWifiController 则更高一级的控制wifi设备的开关状态,wifi热点的开关状态等。 在状态机中的消息处理中完成驱动的加载或者启动supplicant等
setWifiEnabled
--->enforceChangePermission 判断调用的进程是否有权限。想要开关wifi需要CHANGE_WIFI_STATE 权限
--->isAirplaneModeOn 判断飞行模式
--->handleWifiToggled 保存wifi操作
--->WifiController发送CMD_WIFI_TOGGLED消息
WifiController.java
StaDisabledState
--->processMessage
--->case CMD_WIFI_TOGGLED
--->transitionTo(mDeviceActiveState)
DeviceActiveState
--->mWifiStateMachinePrime.enterClientMode() //调用WifiStateMachinePrime的java方法
WifiStateMachinePrime.java(状态机前处理机制)
wifiService不在直接与WifiStateMachine交互,而是通过WifiStateMachinePrime进行处理,再送往WifiStateMachine,中间多了一层ClientModeManager,在这里面进行初始化wpa_supplicant工作
enterClientMode
--->changeMode(ModeStateMachine.CMD_START_CLIENT_MODE)
//向ModeStateMachine发送了ModeStateMachine.CMD_START_CLIENT_MODE
---> mModeStateMachine.sendMessage(newMode)
PromMessgae
--->checkForAndHandleModeChange(Message message)
--->mClientModeActiveState //转向ClientModeActiveState状态
ClientModeActiveState
--->enter()
--->mManager.start() //跳转到 ClientModeManager的start方法
进入ClientModeActiveState,执行enter()函数,WifiInjector创建一个 ClientModeManager,并start
ClientModeManager.java
ClientModeStateMachine也是个状态机,它有两个状态
--->start()
--->sendMessage(ClientModeStateMachine.CMD_START) //会跳转到IdeleState(初始化默认是IdeleState)
--->IdeleState
-àprocessMessage
--->mWifiNative.setupInterfaceForClientMode()
// setupInterfaceForClientMode方法startHal
--->enableSupplicant()
--->transitionTo(mSupplicantStartingState)
WifiMonitor.java
WifiStateMachine.java
WifiNative.java
setupInterfaceForClinetMode()
--->startHal()
--->startSupplicant()
--->setupInterfaceForClientMode()
--->mWifiMonitor.startMonitoring(iface.name)
在其中做了HAL部分的启动(包含check驱动是否已经准备ok,HAL部分是否成功启动),之后再进行wpa_supplicant进程的启动,状态检测进程的启动startMonitoring
WifiMonitor.startMonitoring()成功后WifiMonitor会向WifiStateMachine发送一个代表socket通信建立成功的消息:SUP_CONNECTION_EVENT
ClientModeManager.java
在ClientModeManager中进行状态的更新,广播WiFi状态改变消息
updataWifiState
WifiEnabler.java
系统设置在WifiEnabler中会监听WiFi的状态
BroadcastReceiver
onReceive
WificondControl.java
setupInterfaceForClientMode?
--->mWificond.createClientinterface()
wificond
service.cpp
--->createClentinterface()
WIFI关闭流程:
WifiManager.java---> WifiServiceImpl.java--->--->--->
WifiController.java
在WifiController中收到CMD_WIFI_TOGGLED消息,
从StaEnabledState切换到mStaDisabledState(不存在,则启用wifi_scan_always_enabled)
---> mWifiStateMachinePrime.disableWifi()
WifiStateMachinePrime.java
WifiStateMachinePrime.disableWifi()
--->changeMode(ModeStateMachine.CMD_DISABLE_WIFI)
//发送消息CMD_DISABLE_WIFI,ClientModeActiveState切换到WifiDisabled
ClientModeActiveState的exit()函数,调用ModeActiveState的exit()
WifiDisabledState extends ModeActiveState
ModeActiveState
--->exit
--->mManager.stop //最终会将wifi最新状态设置到WifiStateMachine
ClientModeManager.java
ClientModeManager中也会从StartedState切换到IdleState,在启exit()函数中调用mWifiNative.teardownInterface。
WifiNactive中后续则会调用到
mWifiMonitor.stopMonitoring(),
stopSupplicantIfNecessary(),stopHalAndWificondIfNecessary(),
//去停止监测,停止wpa_supplicant,停止hal服务等
WIFI连接流程:
WifiSettings.java
可以看到点击连接以后,如果config不为null,则先保存网络,再进行连接,所以即使连接失败,此网络依然在已保存网络列表里
WifiManager.java
先看connect是怎么实现的,save的过程最后再看。具体实现还是在service,wifimanager只是一个桥梁
connect
---> connectInternal
--->mService.connect
WifiServiceImpl.java
wifiservice会判断uid的权限,然后这里会判断staid,因为android11上层是支持了双wifi的,就是连接俩个AP,当然具体功能还要厂商自己实现,双AP具体可以看Android11 wifi开启流程,这里开启wifi时就会分配staid。这里如果是AP1则是正常流程走ClientModeImpl,如果是AP2则会走QtiClientModeImpl
connect
---> staId
---> qtiClientModeImpl.connect / mClientModeImpl.connect
ClientModeImpl.java
首先是调用WifiConfigManager.addOrUpdateNetwork来更新网络配置。
如果保存成功则发送广播。然后检查网络权限等等各项操作结束以后,发送消息CMD_CONNECT_NETWORK
WIFI SCAN流程
下发扫描流程:
扫描结果上报流程:
上述两图主要借鉴:
Andriod P Wifi scan及scan_results显示流程_ElectronR的博客-CSDN博客_android wifiscan
原文链接:
【Android 12.0】Android S WiFi启动业务流程分析(UML图)_极音战歌的博客-CSDN博客_android wifi流程图
Android WiFi 打开关闭流程_想好叫啥再改的博客-CSDN博客_android 关闭wifi