SystemServer
老生常谈了,也不是啥重点,不过懂的话还是很有用的。这东西用来创建和管理系统服务,同时也可以管理我们的应用进程
关于他们的源码分析,并不能只看他自己,需要从zygote开始查看,然后还要辅助app进程的启动来理解
源码
从Zygote到SystemServer的准备过程源码
- 从ZygoteInit.main开始看起
main方法主要做的事情是:
- 初始化zygote进程
- 创建socket连接,等待应用进程创建和SystemServer进程创建
- 创建SystemServer进程
- forkSystemServer做了什么
这个方法主要做的事情是,孵化SystemServer进程,并且在孵化成功后关闭SystemServer和Zygote之间的socket连接。
- zygoteServer.runSelectLoop是如何等待socket连接的
这部分代码我理解的很浅薄,只能把关键的部分结合其它博主的文章标记一下
- 3中的handleSystemServerProcess方法是如何工作的
- RuntimeInit.applicationInit方法后的逻辑调用
RuntimeInit.applicationInit-> RuntimeInit._findStaticMain,所以我们查看一下_RuntimeInit.findStaticMain方法
需要说明的是这个findStaticMain方法返回的MethodAndArgCall最终会返回到ZygoteInit.main方法中,然后再mian方法中调用caller.run,这样我们的SystemServer货值ActivityThread的main函数就调用起来了
简单展览一下MethodAndArgsCall:
上一步我们已经知道了SystemServer.main方法是如何被调用的了,那么下一节就看看SystemServer.main方法吧
SystemServer源码
- 首先单纯的new了一个SystemServer然后调用run方法
- run方法
- 查看如何启动SystemServer中的系统服务类
我们通过startCoreServices来看看我们是如何启动系统服务的
- SystemServiceManager.startService
- SystemServiceManager.startService(SystemService)
- 结束
我们发现查看SystemServer源码,大头竟然是zygote源码,好尴尬。 补充:还有startServiceFromJar也是一种启动系统服务的方法
关于init进程、Zygote进程、SystemServer进程、App进程
- init进程是linux的所有进程的父进程,通过解析init.rc可以解析出zygote进程。手机开机后linux在加载完内核后,会启动init进程
- Zygote是所有java进程的父进程,app进程都是通过zygote孵化出来的
- SystemServer是zygote孵化的第一个进程,他用来管理系统服务
- 为什么使用zygote fork进程,因为zygote会把已经运行的虚拟机的代码和内存信息共享,起到一个预加载资源和类的作用,从而缩短启动时间
总结
SystemServer的启动一般需要从Zygote的启动说起来。Zygote的初始化是在ZygoteInit类的main方法中开始的。在main方法中Zygote初始化自己的相关配置,然后会创建一个ZygoteServer,ZygoteServer中会创建一个死循环,死循环内部会维护socket连接,这个连接是用来等待SystemServer和应用的创建请求的。在我们创建SystemServer的过程中会进行Zygote的底层环境的创建,同时会根据我们SystemServer的类名反射获取SystemServer的实例,并且反射获取SystemServer.mian方法的Method。然后会将这个Method包装成一个MethodAndArgsCall,这个MethodAndArgsCall是一个实现了Runnable接口的类,我们会把MethodAndArgsCall的对象实例返回给ZygoteInit.mian中的forkSystemServer方法调用,然后调用MethodAndArgsCall.run方法。run方法中会反射执行SystemServer.main方法,这样流程就走到了SystemServer的启动流程之中。
现在开始说SystemServer的启动。SystemServer的启动是从SystemServer.main方法开始的,方法内部也会维护一个Loop事件循环队列,当然了最重要的工作是启动系统服务。SystemServer内部会创建一个SystemServerManager,SystemServerManager会根据系统服务的类名或者Class启动系统服务。并且将server实例添加到系统服务列表中(可以通过这个列表中的系统服务引用调用系统服务),然后会调用系统服务SystemServer.onStart方法启动系统服务。
其它
为什么zygote和SystemServer通信用Socket
- zygote比SystemServer先启动,而Binder是SystemServer来管理的,所以他没有Binder可以用来注册
- 有人可能说可以等SystemServer创建完成后再让zygote来创建Binder连接,但是我说这样就没必要了,创建连接不还是要使用一种方式实现两个进程间通信才能创建Binder吗,对吧。多次一举
- 这个socket所有者是root,保证了安全性