0
点赞
收藏
分享

微信扫一扫

Android 启动流程7

Zygote 与应用进程的创建机制

Zygote 作为 “进程孵化器”,其核心功能是通过 fork() 系统调用创建新的应用进程。这一过程需经历 “请求接收 - 进程分叉 - 环境初始化” 三个阶段,且依赖跨进程通信与权限控制保障安全性。


当用户点击应用图标时,AMS 会通过 Binder 向 Zygote 发送进程创建请求,携带应用包名、UID/GID、进程名、启动参数等信息。Zygote 监听的 Socket 接收到请求后,会解析参数并校验权限(如检查应用是否已安装、是否拥有启动权限)。校验通过后,Zygote 调用 fork() 生成子进程 —— 此时子进程会继承 Zygote 的内存空间、文件描述符、虚拟机状态等,但通过写时复制机制仅在修改数据时才复制内存页,极大提升效率。


子进程创建后并非直接运行应用代码,而是需完成初始化操作


  1. 进程身份配置:设置子进程的 UID/GID(隔离应用权限)、进程组 ID,切换 SELinux 安全上下文(从 Zygote 的 u:r:zygote:s0 切换为应用专属上下文,如 u:r:untrusted_app:s0)。
  2. 资源隔离:关闭继承自 Zygote 的不必要文件描述符(如 Socket 监听句柄),初始化应用专属的内存空间(如调整堆大小)、线程池与垃圾回收机制。
  3. 启动入口切换:子进程通过 ZygoteInit.zygoteInit() 方法脱离 Zygote 控制,启动应用的主线程(ActivityThread),并调用 ActivityThread.main() 进入应用生命周期。


此外,Zygote 会为特殊进程(如 SystemServer、WebView 进程)提供差异化创建逻辑。例如,SystemServer 由 Zygote fork 后会启动大量系统服务,而普通应用进程则受 AMS 严格管控。这种 “母体 + 子进程” 的架构既保证了系统资源复用,又通过权限隔离保障了应用安全性,是 Android 进程管理的核心设计。

举报

相关推荐

0 条评论