• 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 /* 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地址范围等参数修改

  • 相关阅读:
    【C++】STL:string类
    Spring MVC框架看这篇就够了
    异常检测 | MATLAB实现基于支持向量机和孤立森林的数据异常检测(结合t-SNE降维和DBSCAN聚类)
    人工智能基础知识
    看到一本Spring源码笔记,里面的源码竟如此通俗易懂,原来是阿里产的
    C++学习第十课--构造函数详解、explicit与初始化列表笔记
    如何评价GPT-4o?
    【Java SE】封装的详解
    uni app 钓鱼小游戏
    PC威信 3.7.5 测试HOOK接口
  • 原文地址:https://blog.csdn.net/LILI007/article/details/125413138