Zygote 与应用进程的创建机制
Zygote 作为 “进程孵化器”,其核心功能是通过 fork()
系统调用创建新的应用进程。这一过程需经历 “请求接收 - 进程分叉 - 环境初始化” 三个阶段,且依赖跨进程通信与权限控制保障安全性。
当用户点击应用图标时,AMS 会通过 Binder 向 Zygote 发送进程创建请求,携带应用包名、UID/GID、进程名、启动参数等信息。Zygote 监听的 Socket 接收到请求后,会解析参数并校验权限(如检查应用是否已安装、是否拥有启动权限)。校验通过后,Zygote 调用 fork()
生成子进程 —— 此时子进程会继承 Zygote 的内存空间、文件描述符、虚拟机状态等,但通过写时复制机制仅在修改数据时才复制内存页,极大提升效率。
子进程创建后并非直接运行应用代码,而是需完成初始化操作:
- 进程身份配置:设置子进程的 UID/GID(隔离应用权限)、进程组 ID,切换 SELinux 安全上下文(从 Zygote 的
u:r:zygote:s0
切换为应用专属上下文,如u:r:untrusted_app:s0
)。 - 资源隔离:关闭继承自 Zygote 的不必要文件描述符(如 Socket 监听句柄),初始化应用专属的内存空间(如调整堆大小)、线程池与垃圾回收机制。
- 启动入口切换:子进程通过
ZygoteInit.zygoteInit()
方法脱离 Zygote 控制,启动应用的主线程(ActivityThread
),并调用ActivityThread.main()
进入应用生命周期。
此外,Zygote 会为特殊进程(如 SystemServer、WebView 进程)提供差异化创建逻辑。例如,SystemServer 由 Zygote fork 后会启动大量系统服务,而普通应用进程则受 AMS 严格管控。这种 “母体 + 子进程” 的架构既保证了系统资源复用,又通过权限隔离保障了应用安全性,是 Android 进程管理的核心设计。