Zygote进程是怎么启动的?
首先Init进程是Linux进程启动后用户空间的第一个进程,然后去加载inti.rc配置文件,看需要加载哪些服务,Zygote就是其中之一。还有ServiceManager进程。 父进程fork出子进程,如果子进程挂了,那么父进程会收到子进程发送过来的SIGCHLD信号,进而做处理。比如Zygote进程挂了,那么Init进程就收到SIGCHLD信号,继而重启Zygote进程。
Zygote的作用是什么?
1.孵化应用进程。
2.启动systemserver进程。因为启动systemserver进程的时候需要Zygote里面的一些资源,比如常用类,JNI函数,主题资源,共享库等,这样可以避免重复加载资源,提升性能。
Zygote进程启动之后做了什么?
1.Zygote的native层:启动Android虚拟机,注册Android的JNI函数,进入Java层。
2.Zygote的Java层:预加载资源(包括主题资源,共享库等),fork出SystemServer,然后进入loop循环.
Zygote注意事项:
Zygote的IPC没有采用Binder机制,而是Socket,所以我们应用的Binder机制不是从Zygote继承过来的,而是应用程序创建之后自己启动的Binder机制。
孵化应用进程为什么不交给SystemServer来做,而让Zygote来做?
因为SystemServer主要用来提供系统服务,比如AMS,PMS等,如果SystemServer直接孵化应用进程的话,应用进程也会继承这些并不需要的服务,同时职责也变得混乱。
Zygote的IPC通信机制为什么不采用Binder机制?如果这样做有什么问题?
1.Zygote与IPC通信对象systemServer或应用进程为父子关系,使用socket更合适,反而使用binder机制反而复杂繁琐。
2.如果这样做,Zygote和systemServer都有binder机制,会导致相关资源冲突,比如描述符,映射内存。
Zygote工作流程图如下:
Android系统启动流程?
init.rc里面需要加载的进程有zygote,servicemanager,surfaceflinger和media等。主要需要了解zygote的启动流程,如上。还要了解systemserver的启动流程。下面来看看systemserver启动流程。
zygote启动systemserver进程后,在systemserver进程中初始化相关系统服务AMS,PMS,包括启动bind线程。因为systemserver里面的系统服务需要与我们的应用进程通信,而通信就是通过bind机制。还包括调用Java类的入口函数main(),在main()函数里面加载loop,共享库,创建上下文等。
系统服务是怎么启动的?
把系统服务的binder注册到serviceManager里面,通过这种方式发布系统服务。系统服务跑在什么线程?bind线程。
systemServer启动系统服务时怎么解决相互依赖?
分批启动,分阶段启动。
如何使用系统服务?
通过getSystemService(name)方法获取ServiceFetcher,并调用其getService方法。
如何注册系统服务?
通过调用