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
中移除,并进入下次循环。
关注我