目录
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);
2.2:进入到ConnectivityManager.java中
frameworks/base/core/java/android/net/ConnectivityManager.java
这里提供binder通讯调用到了ConnectivityService服务
2.3:进入到ConnectivityService的startTethering函数。
frameworks/base/services/core/java/com/android/server/ConnectivityService.java
Tethering.java中,函数的调用顺序如下:
startTethering—>enableTetheringInternal—>setWifiTethering,在setWifiTethering中,调用了WifiManager的startSoftAp函数。
2.4:这里又是一个binder通讯,进入到WifiServiceImpl.java的startSoftAp函数
在这里调用了startSoftApInternal函数,然后向WifiController的状态机发送了CMD_SET_AP消息。
2.5:WifiController 状态机CMD_SET_AP消息
默认进入的是DefaultState状态,处理CMD_SET_AP。
在这里,处理结果是调用WifiStateMachinePrime的enterSoftAPMode方法。在WifiStateMachinePrime中,创建了SoftApManager对象,并且调用了start方法。
并且启动
在这里真正的创建了热点的状态机
热点的状态比较简单,就这几个
到处,热点的状态机流程创建完毕。
热点的开启流程现在就完全转到了SoftApStateMachine中去了。
IdleState状态中处理如下
在startSoftAp里,调用了WifiNative.java的startSoftAp方法。然后切换状态
startSoftAp:
主要是调用WificondControl.java的startHostapd方法。
在这里可以看到创建了IApInterface 对象,然后调用了他的startHostapd方法。而IApInterface 是由ap_interface_impl.cpp实现的。
进入到hostapd_manager.cpp里调用了StartHostapd方法。