其他分享
首页 > 其他分享> > AndroidQ Wifi打开流程(一)

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权限

WifiServiceImpl.java

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

 

WifiController.java

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

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

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

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

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

WifiInjector对象

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

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

WifiInjector对象

WifiController.java

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

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

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

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

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

 

 

 

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

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

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

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

ActiveModeWarden.java

 

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

ClientModeManager.java

因为ClientModeManager集成子ActiveModeManager。

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

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

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

 

 

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

 

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

启动vendor hal、supplicant。

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

SupplicantStaIfaceHal.java

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

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

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

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

ClientModeStateMachine状态机变成IdleState状态。

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

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

WifiController状态机:

ModeStateMachine状态机:

ModeStateMachine是ActiveModeWarden中的内部类。

ClientModeStateMachine状态机:

 ClientModeStateMachine是ClientModeManager中的内部类。

马小橙 发布了19 篇原创文章 · 获赞 7 · 访问量 1万+ 私信 关注

标签:状态,java,流程,Wifi,AndroidQ,状态机,interface,ClientModeManager,WifiController
来源: https://blog.csdn.net/Atlas12345/article/details/104435065