最近在做Android 11中热点的功能,主要是网络共享,一个是usb网络共享,一个是热点网络共享,本文只是记录热点分享的流程.
一. settings 里面打开热点的接口跟原来类似
packages/apps/Settings/src/com/android/settings/TetherSettings.java: startTethering() {
......
mCm.startTethering(choice, true, mStartTetheringCallback, mHandler);
}
其中mCm为系统服务ConnectivityManager.
mCm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE).
上层调用比较简单,就是调用startTethering()方法,然后会通过系统服务ConnectivityManager在进行framework层的打开.
二. ConnectivityManager系统服务
ConnectivityManager系统服务代码位于:
frameworks/base/core/java/android/net/ConnectivityManager.java : startTethering(..){
....
mTetheringManager.startTethering(request, executor, tetheringCallback);
}
会调用 mTetheringManager.startTethering()方法.mTetheringManager位于
frameworks/base/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java :startTethering(..){
.....
getConnector(c -> c.startTethering(request.getParcel(), callerPkg, listener));
}
然后通过getConnector会调用到
frameworks/base/packages/Tethering/src/com/android/networkstack/tethering/TetheringService.java: startTethering(..){
.....
mTethering.startTethering(request, listener);
}
然后通过会调用到
frameworks/base/packages/Tethering/src/com/android/networkstack/tethering/Tethering.java: startTethering(...){
.....
enableTetheringInternal(request.tetheringType, true /* enabled */, listener);
}
enableTetheringInternal函数会根据type类型不同,打开不同的热点,本文只讨论wifi softap,所以看setWifiTethering(enable);
enableTetheringInternal(...){
switch (type) {
case TETHERING_WIFI:
result = setWifiTethering(enable);
break;
case TETHERING_USB:
result = setUsbTethering(enable);
break;
case TETHERING_BLUETOOTH:
setBluetoothTethering(enable, listener);
break;
case TETHERING_NCM:
result = setNcmTethering(enable);
break;
case TETHERING_ETHERNET:
result = setEthernetTethering(enable);
break;
}
setWifiTethering函数实现如下,调用wifimanager类里面的startTetheredHotspot
setWifiTethering(..){
if ((enable && mgr.startTetheredHotspot(null /* use existing softap config */))
|| (!enable && mgr.stopSoftAp())) {
}
调用frameworks/base/wifi/java/android/net/wifi/WifiManager.java :startTetheredHotspot(...){
return mService.startTetheredHotspot(softApConfig);
}
通过aidl调用frameworksopt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java:startTetheredHotspot(..){
if (!startSoftApInternal(new SoftApModeConfiguration(
WifiManager.IFACE_IP_MODE_TETHERED, softApConfig,
mTetheredSoftApTracker.getSoftApCapability()))) {
mTetheredSoftApTracker.setFailedWhileEnabling();
return false;
}
}
调用startSoftApInternal函数.
startSoftApInternal(){
mActiveModeWarden.startSoftAp(apConfig);
}
调用frameworksopt/opt/net/wifi/service/java/com/android/server/wifi/ActiveModeWarden.java:startSoftAp(..){
mWifiController.sendMessage(WifiController.CMD_SET_AP, 1, 0, softApConfig);
}
然后进行消息处理
public boolean processMessageFiltered(Message msg) {
case CMD_SET_AP:
// note: CMD_SET_AP is handled/dropped in ECM mode - will not start here
if (msg.arg1 == 1) {
startSoftApModeManager((SoftApModeConfiguration) msg.obj);
transitionTo(mEnabledState);
}
}
startSoftApModeManager(){
ActiveModeManager manager =
mWifiInjector.makeSoftApManager(listener, callback, softApConfig);
}
然后调用到
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiInjector.java:makeSoftApManager(..){
return new SoftApManager(...);
}
然后调用到
frameworks/opt/net/wifi/service/java/com/android/server/wifi/SoftApManager.java: startSoftAp(..) {
if (!mWifiNative.startSoftAp(mApInterfaceName,
localConfigBuilder.build(), mSoftApListener)) {
Log.e(TAG, "Soft AP start failed");
return ERROR_GENERIC;
}
}
然后调用到
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java: startSoftAp(){
}
下一篇写hal层的分析,以及修改信道,ip地址范围等参数修改