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