栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android 11 热点(softap)流程分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android 11 热点(softap)流程分析

最近在做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 , 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 ))
                        || (!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地址范围等参数修改

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992037.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号