1.zygote理解
- zygote的作用: 1.启动systemserver 2.孵化新的应用进程
- zygote的启动流程: 手机系统启动后,Linux内核进行加载,加载完成后会启动init进程,init进程会启动servicemanager,孵化守护进程,然后解析init.rc孵化zygote进程并注册socker等待消息传递和预加载系统资源等然后孵化Systemserver,Systemserver启动后会注册一个loop供IPC通信
2. 为什么zygote和systemserver通信采用socker,而没有采用binder呢?如果采用binder的话会出现什么问题?
第一点,我们假设采用的是binder调用的话,首先zygote要启动binder机制,需要打开binder驱动,获得一个描述符,再通过mmap进行内存映射,还要注册binder线程,还要创建一个binder对象注册到ServiceManager,另外AMS向zygote发起创建应用进程请求的话,要先从ServiceManager查询zygote的binder对象,然后再发起binder调用,这样来来回回非常繁琐,相比之下,zygote和systemserver进程是父子进程关系,对于简单的消息通信,用管道或者socker更为合适,采用binder的话会更复杂和繁琐
3. 孵化应用进程为什么不交给SystemServer来做,而让Zygote来做?
各执其职,SystemServer主要是用来提供系统服务的,如AMS、PMS。如果采用SystemServer孵化应用进程话,那么应用进程会继承不需要的服务 ,使得程序逻辑变得混乱。
我们都知道,应用在启动的时候需要做很多工作,包括启动虚拟机,加载各类系统资源等等,这些都是非常耗时的,如果能在zygote里就把这些必要的初始化工作最好,子进程在fork的时候就能直接共享,那么这样的话效率就会提高很多,这个就是zygote存在的价值,这是SystemServer替代不了的,因为SystemServer里运行了一堆系统服务,这些是不能继承到应用进程的,我们应用进程在启动的时候,内存空间除了必要的资源外,尽量保持的干干净净,不要继承一些乱七八糟的东西,这也是设计的初衷,所以,不如将SystemServer和应用进程都要用到的资源抽取出来单独放到一个进程,这就是zygote进程,然后再通过zygote进程孵化出SystemServer进程和应用进程,孵化出来后,SystemServer进程和应用进程就可以各干各的事了。