【Android】(十) TetheringService

1 TetheringService 注册

//frameworks/base/services/java/com/android/server/SystemServer.java
t.traceBegin("StartTethering");
try {
    // TODO: hide implementation details, b/146312721.
    ConnectivityModuleConnector.getInstance().startModuleService(
            TETHERING_CONNECTOR_CLASS,
            PERMISSION_MAINLINE_NETWORK_STACK, service -> {
                ServiceManager.addService(Context.TETHERING_SERVICE, service,
                        false /* allowIsolated */,
                        DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL);
            });
} catch (Throwable e) {
    reportWtf("starting Tethering", e);
}
t.traceEnd();

//packages/modules/Connectivity/Tethering/src/com/android/networkstack/tethering/TetheringService.java
public void onCreate() {
    final TetheringDependencies deps = makeTetheringDependencies();
    // The Tethering object needs a fully functional context to start, so this can't be done
    // in the constructor.
    mConnector = new TetheringConnector(makeTethering(deps), TetheringService.this);

    mSettingsShim = SettingsShimImpl.newInstance();
}

/**
 * Make a reference to Tethering object.
 */
@VisibleForTesting
public Tethering makeTethering(TetheringDependencies deps) {
    return new Tethering(deps);
}

在 SystemServer 中启动了 TetheringService 服务,TetheringService 中创建了服务对应的 Binder 对象,并创建了 Tethering 对象。

2 开启热点

//packages/apps/Settings/src/com/android/settings/TetherEnabler.java
public void startTethering(int choice) {
    //...
    mConnectivityManager.startTethering(choice, true /* showProvisioningUi */,
            mOnStartTetheringCallback, mMainThreadHandler);
}

//packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java
public void startTethering(int type, boolean showProvisioningUi,
        final OnStartTetheringCallback callback, Handler handler) {
    //...
    getTetheringManager().startTethering(request, executor, tetheringCallback);
}

//packages/modules/Connectivity/Tethering/common/TetheringLib/src/android/net/TetheringManager.java
public void startTethering(@NonNull final TetheringRequest request,
        @NonNull final Executor executor, @NonNull final StartTetheringCallback callback) {
    //...
    getConnector(c -> c.startTethering(request.getParcel(), callerPkg,
            getAttributionTag(), listener));
}

//packages/modules/Connectivity/Tethering/src/com/android/networkstack/tethering/TetheringService.java
public void startTethering(TetheringRequestParcel request, String callerPkg,
        String callingAttributionTag, IIntResultListener listener) {
    //...
    mTethering.startTethering(request, listener);
}

//packages/modules/Connectivity/Tethering/src/com/android/networkstack/tethering/Tethering.java
void startTethering(final TetheringRequestParcel request, final IIntResultListener listener) {
    mHandler.post(() -> {
        //...
        enableTetheringInternal(request.tetheringType, true /* enabled */, listener);
    });
}

从点击事件开始,经过一系列调用,最终调用到 Tethering 的 startTethering 函数中,向消息队列中添加一个 Executor,其中执行了 enableTetheringInternal。

//packages/modules/Connectivity/Tethering/src/com/android/networkstack/tethering/Tethering.java
private void enableTetheringInternal(int type, boolean enable,
        final IIntResultListener listener) {
    int result = TETHER_ERROR_NO_ERROR;
    switch (type) {
        case TETHERING_WIFI:
            result = setWifiTethering(enable);
            break;
        //...
        case TETHERING_ETHERNET:
            result = setEthernetTethering(enable);
            break;
        //...
    }
    // The result of Bluetooth tethering will be sent by #setBluetoothTethering.
    if (type != TETHERING_BLUETOOTH) {
        sendTetherResult(listener, result, type);
    }
}

private int setWifiTethering(final boolean enable) {
    try {
        final WifiManager mgr = getWifiManager();
        //...
        if ((enable && mgr.startTetheredHotspot(null /* use existing softap config */))
                || (!enable && mgr.stopSoftAp())) {
            mWifiTetherRequested = enable;
            return TETHER_ERROR_NO_ERROR;
        }
    //...
}

根据传入的参数是 TETHERING_WIFI 还是 TETHERING_ETHERNET来确定开启哪种共享。接下来主要分析 WIFI 的情况。获取 WifiManager,来开启或者关闭 Wifi 热点。

//packages/modules/Wifi/framework/java/android/net/wifi/WifiManager.java
public boolean startTetheredHotspot(@Nullable 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值