在《创世记(一)——Zygote进程的启动》之Step10 ZygoteInit::startSystemServer(…)中,Zygote启动system进程,并执行ZygoteInit::handleSystemServerProcess(…)函数作为该进程入口。接下来就一次函数为起点继续分析。
Step1 ZygoteInit::handleSystemServerProcess(…)
1 | // frameworks/base/core/java/com/android/internal/os/ZygoteInit.java:415 |
Step2 RuntimeInit::zygoteInit(…)
1 | // frameworks/base/core/java/com/android/internal/os/RuntimeInit.java:269 |
参见《创世记(一)——Zygote进程的启动》之Step10 ,在函数ZygoteInit::startSystemServer(…)中以硬编码的形式组织system的启动参数,其中args.startClass=”com.android.server.SystemServer”。
Step3 RuntimeInit::invokeStaticMain(…)
1 | // frameworks/base/core/java/com/android/internal/os/RuntimeInit.java:198 |
函数尾部的注释说的很明白,异常是在《创世记(一)——Zygote进程的启动》之Step8 ,ZygoteInit::main
函数中捕获和执行,这个异常是com.android.server.SystemServer::main
函数,捕获该异常后将执行此函数。这个手法是为了清除所有堆栈,使system进程认为函数com.android.server.SystemServer::main
是进程执行的起点。
Step4 SystemServer::main(…)
1 | // frameworks/base/services/java/com/android/server/SystemServer.java |
Step5 SystemServer::startBootstrapServices()
在这里可以找到很多熟悉的Service启动1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24// frameworks/base/services/java/com/android/server/SystemServer.java:322
private void startBootstrapServices() {
...
// Activity manager runs the show.
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
...
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
...
mSystemServiceManager.startService(LightsService.class);
...
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
...
mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
...
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
...
startSensorService();
}
总结
本节system进程的启动只是前一节Zygote进程启动的一个环节,system进程的主要作用就是启动了若干系统服务,如ActivityManagerService、PackageManagerService等。启动完毕之后返回到Zygote进程的ZygoteInit::main(…)函数 ,将等待处理来自ActivityManagerService启动新进程的请求。
system进程的启动过程如下: