AndroidQ Wifi打开流程(一)
作者:互联网
目录
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