目录

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生成的虚拟网卡即可

9 android 获取热点 安卓热点怎么打开热点_9 android 获取热点

对于硬件模块已经支持公模的,比如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);

9 android 获取热点 安卓热点怎么打开热点_android_02

9 android 获取热点 安卓热点怎么打开热点_java_03

2.2:进入到ConnectivityManager.java中

frameworks/base/core/java/android/net/ConnectivityManager.java

 

9 android 获取热点 安卓热点怎么打开热点_9 android 获取热点_04

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

 2.3:进入到ConnectivityService的startTethering函数。

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

 

9 android 获取热点 安卓热点怎么打开热点_android_05

Tethering.java中,函数的调用顺序如下:

startTethering—>enableTetheringInternal—>setWifiTethering,在setWifiTethering中,调用了WifiManager的startSoftAp函数。

9 android 获取热点 安卓热点怎么打开热点_java_06

9 android 获取热点 安卓热点怎么打开热点_java_07

9 android 获取热点 安卓热点怎么打开热点_启动流程_08

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

9 android 获取热点 安卓热点怎么打开热点_java_09

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

 

9 android 获取热点 安卓热点怎么打开热点_android_10

2.5:WifiController 状态机CMD_SET_AP消息 

9 android 获取热点 安卓热点怎么打开热点_9 android 获取热点_11

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

 

9 android 获取热点 安卓热点怎么打开热点_java_12

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

 

9 android 获取热点 安卓热点怎么打开热点_9 android 获取热点_13

9 android 获取热点 安卓热点怎么打开热点_启动流程_14

并且启动

9 android 获取热点 安卓热点怎么打开热点_9 android 获取热点_15

 

9 android 获取热点 安卓热点怎么打开热点_android_16

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

9 android 获取热点 安卓热点怎么打开热点_android_17

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

 

9 android 获取热点 安卓热点怎么打开热点_状态机_18

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

热点的开启流程现在就完全转到了SoftApStateMachine中去了。

IdleState状态中处理如下

9 android 获取热点 安卓热点怎么打开热点_启动流程_19

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

 

9 android 获取热点 安卓热点怎么打开热点_9 android 获取热点_20

startSoftAp:

9 android 获取热点 安卓热点怎么打开热点_状态机_21

主要是调用WificondControl.java的startHostapd方法。

9 android 获取热点 安卓热点怎么打开热点_android_22

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

9 android 获取热点 安卓热点怎么打开热点_启动流程_23

进入到hostapd_manager.cpp里调用了StartHostapd方法。

9 android 获取热点 安卓热点怎么打开热点_状态机_24