Android 热点开启流程

目录

1:前言

2:热点的启动流程

2.1:设置启动热点

2.2:进入到ConnectivityManager.java中

 2.3:进入到ConnectivityService的startTethering函数。

2.4:这里又是一个binder通讯,进入到WifiServiceImpl.java的startSoftAp函数 

2.5:WifiController 状态机CMD_SET_AP消息 


1:前言


    从Android 8.0 开始,Android已经支持了wifi和Ap 双状态机,只是在8.0当中没有完完全全剥离开。需要开发者去找到相应的地方启动热点的状态机或者创建热点状态机。
而在Android9.0当中,Android9.0中对热点做了较大改动,将热点很大程度从Wifi中完完全全剥离出来了,并且完成了对wifi和ap双状态机的启动。
Android9.0中对于硬件不支持双wifi的模块,比如rtl8188系列,需要打开并发模式的宏。然后修改虚拟网卡,绑定到insmod ko生成的虚拟网卡即可

对于硬件模块已经支持公模的,比如mt7668 8812 8822系列,直接支持双wifi。

2:热点的启动流程


        只有去分析和追踪了热点的启动流程,才能找到Android9.0当中双wifi做了什么动作,为什么支持了双wifi,另外我们需要修改一些什么东西来支持。


2.1:设置启动热点


   在8.0和9.0当中,启动热点的接口改成了ConnectivityManager 这个类来管理。
启动:ConnectivityManager. startTethering 接口,并且要提供回调
mCm.startTethering(TETHERING_WIFI, true, mStartTetheringCallback, mHandler);
关闭接口:mCm.stopTethering(TETHERING_WIFI);

Android 热点开启流程_第1张图片

Android 热点开启流程_第2张图片

2.2:进入到ConnectivityManager.java中


frameworks/base/core/java/android/net/ConnectivityManager.java
 Android 热点开启流程_第3张图片

这里提供binder通讯调用到了ConnectivityService服务

 2.3:进入到ConnectivityService的startTethering函数。


frameworks/base/services/core/java/com/android/server/ConnectivityService.java

 Android 热点开启流程_第4张图片

Tethering.java中,函数的调用顺序如下:
startTethering—>enableTetheringInternal—>setWifiTethering,在setWifiTethering中,调用了WifiManager的startSoftAp函数。
Android 热点开启流程_第5张图片

Android 热点开启流程_第6张图片

Android 热点开启流程_第7张图片

2.4:这里又是一个binder通讯,进入到WifiServiceImpl.java的startSoftAp函数 

Android 热点开启流程_第8张图片

在这里调用了startSoftApInternal函数,然后向WifiController的状态机发送了CMD_SET_AP消息。

 Android 热点开启流程_第9张图片

2.5:WifiController 状态机CMD_SET_AP消息 

默认进入的是DefaultState状态,处理CMD_SET_AP。 

 Android 热点开启流程_第10张图片

在这里,处理结果是调用WifiStateMachinePrime的enterSoftAPMode方法。在WifiStateMachinePrime中,创建了SoftApManager对象,并且调用了start方法。

 Android 热点开启流程_第11张图片

Android 热点开启流程_第12张图片

并且启动 Android 热点开启流程_第13张图片

在这里真正的创建了热点的状态机

Android 热点开启流程_第14张图片

热点的状态比较简单,就这几个 

 Android 热点开启流程_第15张图片

到处,热点的状态机流程创建完毕。

热点的开启流程现在就完全转到了SoftApStateMachine中去了。
IdleState状态中处理如下
Android 热点开启流程_第16张图片

在startSoftAp里,调用了WifiNative.java的startSoftAp方法。然后切换状态 

 

startSoftAp:

Android 热点开启流程_第17张图片

主要是调用WificondControl.java的startHostapd方法。Android 热点开启流程_第18张图片

在这里可以看到创建了IApInterface 对象,然后调用了他的startHostapd方法。而IApInterface 是由ap_interface_impl.cpp实现的。

Android 热点开启流程_第19张图片

进入到hostapd_manager.cpp里调用了StartHostapd方法。Android 热点开启流程_第20张图片 

你可能感兴趣的:(Android系统,WIFI,android)