AndroidQ Wifi打开流程(一)

目录

 

WifiManager.java

WifiServiceImpl.java

WifiController.java

WifiController.java

ActiveModeWarden.java

ClientModeManager.java

SupplicantStaIfaceHal.java

WifiController状态机:

ModeStateMachine状态机:

ClientModeStateMachine状态机:


WifiManager.java

该文件是操作wifi的入口。WifiManager::setWIfiEnabled(true)打开wifi开关。调用该方法需要申请android.Manifest.permission#CHANGE_WIFI_STATE权限

AndroidQ Wifi打开流程(一)_第1张图片

WifiServiceImpl.java

调到WifiServiceImpl.java中的setWifiEnabled()方法。进行一些权限和接口调用限制的审查。审查过了之后,再发送CMD_WIFI_TOGGLED消息出去。

AndroidQ Wifi打开流程(一)_第2张图片

 

AndroidQ Wifi打开流程(一)_第3张图片

WifiController.java

在WifiController.java中接收到CMD_WIFI_TOGGLED消息后,进行下一步处理。先说一下WifiController这个类。

由这个类的开头就可以看出来里面一定是维护了一套状态机。

AndroidQ Wifi打开流程(一)_第4张图片

那它里面里面维护了几个状态呢?可以看出来有5个状态,这个待后面慢慢分析。

先关注一下WifiController对象在什么时刻创建的,以及从它的第一个状态分析Wifi打开的过程。

WifiController对象是在WifiServiceImpl.java中维护的,

WifiInjector对象

AndroidQ Wifi打开流程(一)_第5张图片

先关注一下WifiController对象在什么时刻创建的,以及从它的第一个状态分析Wifi打开的过程。

WifiController对象是在WifiServiceImpl.java中维护的,

WifiInjector对象

AndroidQ Wifi打开流程(一)_第6张图片

AndroidQ Wifi打开流程(一)_第7张图片

WifiController.java

我们再回到了WifiController中。WifiController的第一个状态机是什么呢?显然我们应该先去它的构造方法中去找一下。。

先是将5个状态“加进来”。找了一圈,没找到其第一个状态是啥呢?再往下看,有一个start()方法,O(∩_∩)O哈哈~

AndroidQ Wifi打开流程(一)_第8张图片

AndroidQ Wifi打开流程(一)_第9张图片

AndroidQ Wifi打开流程(一)_第10张图片

由上面的第二个图,可以看出来WifiController的初始状态是有由一个条件来进行决定的。我们以该条件为false为例,来继续接下来的梳理。

先来看一下WifiController进入mStaDisabledState后,首先干了一下什么。

AndroidQ Wifi打开流程(一)_第11张图片

前面提到了,在WifiServiceImple.java中会发送一个CMD_WIFI_TOGGLED消息处理,而此时的WifiController处于mStaDisabledState状态,即该消息应该在mStaDisabledState状态下进行处理。的确,我们在该状态的中找到了处理的地方。

首先要保证Supplicant重启间隔时间大于500ms,满足该条件后,就切换到mStaEnabledState状态。

AndroidQ Wifi打开流程(一)_第12张图片

AndroidQ Wifi打开流程(一)_第13张图片

看一下WifiController进入StaEnabledState状态的enter()方法搞了什么。将设备切到client mode。

AndroidQ Wifi打开流程(一)_第14张图片

这个ActiveModeWardent中维护的mode有几种呢?通过查看代码,可以看到至少有:

client mode,scan mode only,wifi hotspot模式。

ActiveModeWarden.java

 

在enter()方法中,调用了enter()方法,该方式实例化了ActiveModeManager对象mManager,ActiveModeManager是个interface,调用mManager的start()实际调到了ClientModeManager中的start()。

AndroidQ Wifi打开流程(一)_第15张图片

ClientModeManager.java

因为ClientModeManager集成子ActiveModeManager。

AndroidQ Wifi打开流程(一)_第16张图片

再来看一下ClientModeManager中的start()方法。

ClientModeManager中处理CMD_START消息的地方。首先,发送了一个广播用于通知监听者wifi开关状态的变化。然后调用了WifiNative的setUpInterfaceForClientInConnectivityMode(InterfaceCallback)方法,同时利用该方法注册了一个接口,接收底层返回来的interface状态变化

。setUpInterfaceForClientInConnectivityMode()的返回值表示interface的名字,例如wlan0。

 

AndroidQ Wifi打开流程(一)_第17张图片

 

先看一下这个回调,mWifiNativeInterfaceCallback回调会接收到interface的销毁、up和down的状态通知。

 

AndroidQ Wifi打开流程(一)_第18张图片

再接着看一下WifiNative中的setUpInterfaceForClientInConnectivityMode()方法,这个方法可干了不少事情。

启动vendor hal、supplicant。

AndroidQ Wifi打开流程(一)_第19张图片

先进一步看一下supplicant的启动。

AndroidQ Wifi打开流程(一)_第20张图片

SupplicantStaIfaceHal.java

有两种方式启动Supplicant,好像都是用的第二种:利用init进程来启动。我们通常需要在init*rc文件中设置好wpa_supplicant。关于如何设置wpa_supplicant,我们不再这里进行分析。

AndroidQ Wifi打开流程(一)_第21张图片

接着看ClientModeStateMachine状态转变成StartedState时做了什么。先来判断一下interface是否启动了,并区别发送对应的广播出去。

AndroidQ Wifi打开流程(一)_第22张图片

WifiNative::isInterfaceUp(String)方法返回false。

AndroidQ Wifi打开流程(一)_第23张图片

如果打开interface失败了,则发送一个CMD_INTERFACE_DOWN消息出去。看到在该消息处理中,先发送了广播通知监听者。

AndroidQ Wifi打开流程(一)_第24张图片

ClientModeStateMachine状态机变成IdleState状态。

AndroidQ Wifi打开流程(一)_第25张图片

至此,AndroidQ wifi打开流程基本梳理完成。

下面简单罗列一下上面提到的几个状态机。

WifiController状态机:

ModeStateMachine状态机:

ModeStateMachine是ActiveModeWarden中的内部类。

ClientModeStateMachine状态机:

 ClientModeStateMachine是ClientModeManager中的内部类。

如果感觉本文对您有益,请辛苦点个赞吧~
欢迎扫码关注个人公众号或者微信搜索wanwuhulianjishu(万物互联技术) 

AndroidQ Wifi打开流程(一)_第26张图片

 

你可能感兴趣的:(物联技术)