SystemServer也是系统的一个重要的守护进程,从SystemServer的进程中,我们看到了系统的各种关键的Service的启动。
另外,根据前面的zygote的分析,我们知道了systemServer在android的启动过程中是肯定要启动的。
因为在init.rc里面,已经指定了要start-system-server = true.
那么在zygote中,我们看到了如下的code
if (startSystemServer) { // 如果startSystemServer为true的话,我们会启动systemServer
startSystemServer(abiList, socketName);
}
我们看到执行了startSystemServer的函数,那么我们来看一下这个函数的实现。
603 int pid;
604
605 try {
606 parsedArgs = new ZygoteConnection.Arguments(args);
607 ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
608 ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);
609
610 /* Request to fork the system server process */
611 pid = Zygote.forkSystemServer( // 从这边我们可以看到,systemServer是由Zygote给孵化出来的一个子进程
612 parsedArgs.uid, parsedArgs.gid,
613 parsedArgs.gids,
614 parsedArgs.debugFlags,
615 null,
616 parsedArgs.permittedCapabilities,
617 parsedArgs.effectiveCapabilities);
618 } catch (IllegalArgumentException ex) {
619 throw new RuntimeException(ex);
620 }
621
622 /* For child process */
623 if (pid == 0) { // 在孵化出来的子进程里面
624 if (hasSecondZygote(abiList)) {
625 waitForSecondaryZygote(socketName);
626 }
627
628 handleSystemServerProcess(parsedArgs); // 会执行到handleSystemServerProcess的操作
629 }
通过上面的内容,我们可以很容易的知道,在system的启动过程中,是由zygote分裂出来的一个子进程进行处理的。
然后在子进程里面,执行handSystemServerProcess进行接下来的操作。
那么,handSystemServerProcess是在做什么呢?
这个过程我们用一个流程图来代替吧
相信这个流程图可以很清晰的表明system的启动过程,在invokeStaticMain函数后,我们进入到了systemServer的main函数中。
169 public static void main(String[] args) {
170 new SystemServer().run();
171 }
这边就很简单易懂了。
在run函数中,通过下面的一些方法,去启动起来系统的其他关键进程。
252 // Start services.
253 try {
254 startBootstrapServices();
255 startCoreServices();
256 startOtherServices();
257 } catch (Throwable ex) {
258 Slog.e("System", "******************************************");
259 Slog.e("System", "************ Failure starting system services", ex);
260 throw ex;
261 }
而我们在接下来,会对系统framework中的各个关键进程进行详细的分析。