Zygote进程启动过程
上篇文章《浅析Android系统启动过程》简要讲解了Android系统整体启动过程,今天我们看一下其中一个重要的过程:Zygote进程是如何启动的。
文中源码基于
Android 8.0
概览
Zygote进程是通过init进程启动起来的,我们直接看Zygote进程的入口函数,位于ZygoteInit类中的main方法:
1 | public class ZygoteInit { |
由上面代码可以看出Zygote进程主要做了4件事:
- 创建一个
Socket用于跨进程通信 - 预加载类和资源
- 启动
SystemServer进程 - 进入循环等待
AMS请求创建新的应用程序进程
我们继续跟进看看各个方法具体做了什么,
registerServerSocket
创建socket用于跨进程通信
1 | void registerServerSocket(String socketName) { |
preload
预加载各种类及资源
1 | static void preload(BootTimingsTraceLog bootTimingsTraceLog) { |
startSystemServer
启动SystemServer进程
1 | private static boolean startSystemServer(String abiList, String socketName, ZygoteServer zygoteServer) |
注释1处创建args数组,用来保存用于启动SystemServer进程的启动参数。注释2处调用Zygote.forkSystemServer方法,通过fork当前进程来创建SystemServer进程,如果进程的pid值为0,则表示当前运行在新创建的进程中,就会执行注释3处的handleSystemServerProcess来处理SystemServer进程。关于SystemServer进程的启动放在之后的文章讲解。
runSelectLoop
死循环等待AMS请求
1 | void runSelectLoop(String abiList) throws Zygote.MethodAndArgsCaller { |
注释1处获取之前创建的socket的fd添加到fds中,然后进入无限循环来等待AMS请求Zygote进程创建新的应用程序进程。注释2处遍历fds存储的信息放到pollFds中。注释3处对pollFds进行遍历,如果i=0说明pollFds中没有内容,此时会通过注释4处acceptCommandPeer方法创建一个ZygoteConnection,然后获取ZygoteConnection的fd并加入到fds中,以便接收下次AMS的请求。而当i!=0时,会执行注释5处的peers.get(i).runOnce(this),这个方法用来处理AMS发送过来的请求,处理完后,将ZygoteConnection从peers中移除,将fd从fds中移除,并进入下次循环。
关注我



