DHCP Server创建
DHCP Server依赖于 NetworkStack 服务,因此先分析 NetworkStack 服务的创建和启动。
//frameworks/base/services/java/com/android/server/SystemServer.java
t.traceBegin("StartNetworkStack");
try {
NetworkStackClient.getInstance().start();
} catch (Throwable e) {
reportWtf("starting Network Stack", e);
}
t.traceEnd();
在 SystemServer 中调用 NetworkStackClient 单例的 start 方法启动 NetworkStack 服务。
//frameworks/base/services/net/java/android/net/NetworkStackClient.java
public void start() {
mDependencies.getConnectivityModuleConnector().startModuleService(
INetworkStackConnector.class.getName(), PERMISSION_MAINLINE_NETWORK_STACK,
new NetworkStackConnection());
log("Network stack service start requested");
}
start 方法中通过 ConnectivityModuleConnector 的 startModuleService 方法来启动服务。
//frameworks/base/services/net/java/android/net/ConnectivityModuleConnector.java
public void startModuleService(@NonNull String serviceIntentBaseAction,
@NonNull String servicePermissionName,
@NonNull ModuleServiceCallback callback) {
//获取Intent对象
if (!mContext.bindServiceAsUser(intent,
new ModuleServiceConnection(packageName, callback),
Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.SYSTEM)) {
//...
}
}
//packages/modules/NetworkStack/src/com/android/server/NetworkStackService.java
public static synchronized IBinder makeConnector(Context context) {
if (sConnector == null) {
sConnector = new NetworkStackConnector(context);
}
return sConnector;
}
@Override
public IBinder onBind(Intent intent) {
return makeConnector(this);
}
//frameworks/base/services/net/java/android/net/NetworkStackClient.java
private class NetworkStackConnection
implements ConnectivityModuleConnector.ModuleServiceCallback {
@Override
public void onModuleServiceConnected(IBinder service) {
logi("Network stack service connected");
registerNetworkStackService(service);
}
}
private void registerNetworkStackService(@NonNull IBinder service) {
final INetworkStackConnector connector = INetworkStackConnector.Stub.asInterface(service);
mDependencies.addToServiceManager(service);
//....
}
startModuleService 方法通过 bindServiceAsUser 来启动服务,此时 NetworkStackService 的 onBind 方法被调用,返回 IBinder 给服务代理端,此时服务代理端的 registerNetworkStackService 被调用,成功注册服务。
//packages/modules/NetworkStack/src/com/android/server/NetworkStackService.java
public static class NetworkStackConnector
extends INetworkStackConnector.Stub
implements NetworkStackServiceManager {
@Override
public void makeDhcpServer(@NonNull String ifName,
@NonNull DhcpServingParamsParcel params,
@NonNull IDhcpServerCallbacks cb) throws RemoteException {
//...
}
}
通过调用 NetworkStackConnector 中的 makeDhcpServer 方法可创建 DHCP Server。
接下来分析 makeDhcpServer的具体调用者 : Tethering服务
//frameworks/base/services/java/com/android/server/SystemServer.java
t.traceBegin("StartTethering");
try {
ConnectivityModuleConnector.getInstance().startModuleService(
TETHERING_CONNECTOR_CLASS,
PERMISSION_MAINLINE_NETWORK_STACK, service -> {
ServiceManager.addService(Context.TETHERING_SERVICE, service,