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进入StaEnabledState状态的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中的内部类。

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

 

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Android 11的WiFi打开函数调用流程图如下: 1. 点击设备的“设置”按钮,进入系统设置界面。 2. 在设置界面中找到“网络和互联网”的选项,点击进入。 3. 在网络和互联网界面中,找到并点击“WiFi”选项。 4. 进入WiFi设置界面后,点击“开启WiFi”按钮。 5. 设备调用系统的WiFi管理模块,开始执行WiFi打开流程。 6. WiFi管理模块首先检查设备的WiFi芯片状态,如果芯片已经关闭,则需要先打开WiFi芯片。 7. 如果WiFi芯片已经打开,则WiFi管理模块开始搜索可用的WiFi网络。 8. 当找到可用的WiFi网络时,WiFi管理模块会尝试连接到该网络。 9. 连接到WiFi网络后,设备会获取该网络的IP地址和其他网络相关信息。 10. 设备将WiFi连接状态设置为已连接,并通知系统和应用程序。 11. 如果WiFi连接失败或者没有可用的WiFi网络WiFi管理模块将会关闭WiFi芯片并返回WiFi打开失败的信息。 以上就是Android 11的WiFi打开函数调用流程图。在实际执行中,可能还会有一些其他细节和错误处理逻辑,但总体而言,这个流程可以帮助用户打开设备的WiFi功能并连接到可用的WiFi网络。 ### 回答2: Android 11中的WiFi打开函数调用流程图如下: 1. 首先,应用程序通过调用WiFiManager类的getSystemService()方法获取系统的WiFi服务实例。 2. 接下来,应用程序通过调用WiFiManager类的setWifiEnabled()方法来打开WiFi功能。 3. WiFiManager类会将该请求传递给系统服务,即WifiService类。 4. WifiService类会通过调用WifiController类的方法来处理WiFi打开请求。 5. WifiController类会检查当前设备的权限和状态,以确定是否允许打开WiFi。 6. 如果设备具有足够的权限并且当前设备处于正确状态,则WifiController类会继续处理打开WiFi请求。 7. WifiController类会与驱动程序进行通信,以控制硬件设备的操作,从而打开WiFi。 8. 一旦WiFi硬件设备成功打开WifiController类会通知WifiService类。 9. WifiService类随后会通知应用程序,指示WiFi已成功打开。 10. 最后,应用程序可以进一步使用WiFi功能,如连接到可用的WiFi网络。 请注意,Android 11中的WiFi打开函数调用流程可能会因设备和系统定制而有所不同。上述流程图仅为概述,具体实现可能会有所差异。 ### 回答3: Android 11中的Wi-Fi打开函数调用流程图如下: 1. 应用程序调用Wi-Fi Manager类的`setWifiEnabled(true)`方法,用于打开Wi-Fi功能。 2. Wi-Fi Manager类将此请求发送给系统服务。 3. 系统服务接收到请求后,检查当前设备是否具有足够的权限来打开Wi-Fi。如果权限不足,服务将拒绝请求,并向应用程序返回相应的错误代码。 4. 如果应用程序具有足够的权限,系统服务将检查与Wi-Fi硬件驱动程序的通信是否正常。如果存在通信问题,服务将返回相应的错误代码。 5. 如果无任何问题,系统服务将向Wi-Fi硬件驱动程序发送打开Wi-Fi的指令。 6. Wi-Fi硬件驱动程序接收到指令后,控制Wi-Fi芯片打开相应的电路和无线射频器。 7. 一旦Wi-Fi硬件处于打开状态,驱动程序将返回成功的消息给系统服务。 8. 系统服务收到成功消息后,将其传递给Wi-Fi Manager类。 9. Wi-Fi Manager类会更新其内部状态,表示Wi-Fi已成功打开。 10. Wi-Fi Manager类将成功的消息返回给应用程序,通知其Wi-Fi已成功打开。 11. 应用程序可以通过检查Wi-Fi Manager类的状态来确认Wi-Fi是否已打开。 总的来说,Android 11中的Wi-Fi打开函数调用流程主要涉及应用程序调用Wi-Fi Manager类的方法,将请求传递给系统服务,然后由系统服务与Wi-Fi硬件驱动程序进行通信以打开Wi-Fi。最后,成功的消息将传递回应用程序,并更新Wi-Fi Manager类的内部状态。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值