temp1

目录

WIFI初始化流程

SystemServer

WifiService

WifiServiceImpl

WIFI打开流程:

流程图1:

流程图2:

WifiSettings.java

WifiEnabler.java

WifiManager.java

WifiServiceImpl.java

WifiController.java

WifiStateMachinePrime.java(状态机前处理机制)

ClientModeManager.java

WifiNative.java

ClientModeManager.java

WifiEnabler.java

WIFI关闭流程:

WifiController.java

WifiStateMachinePrime.java

ClientModeManager.java

WIFI连接流程:

WIFI SCAN流程

下发扫描流程:

扫描结果上报流程:


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 activityonStart函数中,创建一个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() //调用WifiStateMachinePrimejava方法

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()  //跳转到 ClientModeManagerstart方法

进入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驱动是否已经准备okHAL部分是否成功启动),之后再进行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_WIFIClientModeActiveState切换到WifiDisabled

ClientModeActiveStateexit()函数,调用ModeActiveStateexit()

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的过程最后再看。具体实现还是在servicewifimanager只是一个桥梁

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

 Andriod7.0之wifi开启流程(含流程框图及流程图)_ElectronR的博客-CSDN博客_wifi流程图

Android11 WiFi连接流程梳理_二十岁了还没有去过星巴克的博客-CSDN博客_android wifi连接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值