参考自:
Android 进阶解密
网易课程
Zygote 服务启动 SystemServer
在 ZygoteInit 的 main 函数中
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
public static void main(String argv[]) {
....
startSystemServer(...)
....
}
startSystemServer 函数
startSystemServer 函数会 fork 出当前 Zygote 的进程空间,并在该进程空间下启动 SystemServer,由于 fork 时同样获得了 Zygote Server 的 Socket ,但这个 Socket 对 SystemServer 来说是没有用的,所以关闭它。
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids,
parsedArgs.debugFlags,
null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
if (pid == 0) {
if (hasSecondZygote(abiList)) {
waitForSecondaryZygote(socketName);
}
zygoteServer.closeServerSocket();
handleSystemServerProcess(parsedArgs);
}
handleSystemServerProcess
handleSystemServerProcess 函数会调用 ZygoteInit 函数
....
ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
....
ZygoteInit 的 nativeZygoteInit 函数对应 AndroidRuntime 的 jni 函数,负责创建 Binder 线程池,让 SystemServer 可以和其他进程进行通信。
RuntimeInit.applicationInit 函数真正调用 SystemServer 的 main 函数
public static final void zygoteInit(int targetSdkVersion, String[] argv,
ClassLoader classLoader) throws Zygote.MethodAndArgsCaller {
.....
ZygoteInit.nativeZygoteInit();
RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
}
SystemServer 的 main 函数
frameworks/base/services/java/com/android/server/SystemServer.java
SystemServer 的 run 方法主要做了以下几个事情
- 创建 Looper 消息循环体
- 创建系统的 context
- 创建 SystemServerManager
- 启动引导服务
- 启动核心服务
- 启动其他服务
public static void main(String[] args) {
new SystemServer().run();
}
SystemServer.run
Looper.prepareMainLooper();
Looper.getMainLooper().setSlowLogThresholdMs(SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
// Initialize the system context.
createSystemContext();
// Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);
startBootstrapServices();
startCoreServices();
startOtherServices();
SystemServiceManager 负责启动和管理服务
- 首先将要启动的 Service 放入集合中管理
- 根据反射调用到 Service 并执行服务的 onStart 方法
基本上所有的服务都是 SystemServer 的子类,都具备 onStart 方法。
private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
public void startService(@NonNull final SystemService service) {
// Register it.
mServices.add(service);
// Start it.
long time = SystemClock.elapsedRealtime();
try {
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + service.getClass().getName()
+ ": onStart threw an exception", ex);
}
warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}
总结
- SystemServer 是由 Zygote 服务启动的,在创建 SystemServer 的时候会创建 Binder 线程池,然后 fork 出一个进程,在这个新的进程环境下启动 SystemServer,调用 SystemServer 的 main 函数。
- SystemServer 的 main 函数触发后,会创建 Looper 消息循环,创建 context,同时启动系统服务,引导服务以及其他服务