SystemServer 进程启动流程。
1. zygote forkSystemServer
1.1 ZygoteInit.main()
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
1 | // ZygoteInit.java |
forkSystemServer 在 fork system_server 进程后,如果是父进程(Zygote 进程),则返回 null,如果是 system_server 进程,则返回一个 Runnable
1.2 forkSystemServer()
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
1 | // ZygoteInit.java |
- 通过
ZygoteArguments
对 args[] 数组参数进行解析; - 通过
Zygote.forkSystemServer()
来 forksystem_server
进程,在system_server
进程(返回的 pid == 0)中调用handleSystemServerProcess
得到一个 runnable;
1.3 handleSystemServerProcess()
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
1 | // ZygoteInit.java |
把第二步 ZygoteArguments
解析后的 mRemainingArgs
再传到 ZygoteInit.zygoteInit()
函数中;
1.4 zygoteInit()
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
1 | // ZygoteInit.java |
因为 app_main() 中 runtime.start() 的 runtime 是 AndroidRuntime 的子类 AppRuntime,runtime.start() -> ZygoteInit.main() -> forkSystemserver() -> 子进程 handleSystemServerProcess() -> zygoteInit(),com_android_internal_os_ZygoteInit_nativeZygoteInit 调用 AndroidRuntime.h.onZygoteInit(),AppRuntime 覆盖了父类 AndroidRuntime.onZygoteInit(),所以最后执行 AppRuntime.onZygoteInit()
1 | // AndroidRuntime.cpp |
所以最终 system_server 打开驱动,进行 mmap() 映射,启动 binder 线程池。
1.5 applicationInit()
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
1 | protected static Runnable applicationInit(int targetSdkVersion, long[] disabledCompatChanges, |
- 通过
Arguments()
对第三步传入的parsedArgs.mRemainingArgs
解析,得到 args.startClass,即com.android.server.SystemServer
; - 调用
findStaticMain()
函数;
1.6 findStaticMain()
1 | protected static Runnable findStaticMain(String className, String[] argv, |
findStaticMain()
主要工作是通过反射机制找到对应 className(SystemServer) 的 main 方法,但是并未执行;
1.7 MethodAndArgsCaller()
1 | static class MethodAndArgsCaller implements Runnable { |
SystemServer 的 main 方法在 MethodAndArgsCaller
的 run()
中被 invoke ,在上一步中的 findStaticMain
函数返回了一个 MethodAndArgsCaller
对象,即是一个 runnable,ZygoteInit.main()
中的 r.run()
即调用了 MethodAndArgsCaller.run()
,invoke 启动 SystemServer.java 的 main 函数;
1.9 总结
ZygoteInit.forkSystemServer()
函数的作用就是 fork 出 system_server
进程,并在 system_server
进程中获取一个找到 frameworks/base/services/java/com/android/server/SystemServer.java main 方法的 runnable,然后通过 r.run() 去执行 SystemServer.java 的 main 方法,启动 android 系统中大量的服务。
2. SystemServer 启动
2.1 SystemServer.main()
1 | // SystemServer.java |
在 SystemServer 的 run() 方法中,主要做了如下工作:
- 设置 SystemServer 的 binder 线程池的数量为 31,默认是 15,这里的数量不包含 binder 主线程;
- 准备 Looper;
- 初始化 SystemContext;
- 创建 SystemServiceManager,用来管理系统服务的创建、启动和生命周期管理;
- 启动引导服务、核心服务以及其他服务;
- 进入 Looper 循环;
启动了三类服务:引导服务、核心服务、其他服务,比如 AMS/PMS/PKMS 等都在引导服务中启动,WMS 在其他服务中启动,这些服务都继承自 SystemServices,且都添加到 binder 的大管家 ServiceManager 进程中管理。