#############################################
本文为极度寒冰原创,转载请注明出处
#############################################
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中的各个关键进程进行详细的分析。
时间: 2024-10-15 04:35:57