一句话总结
Zygote 是 Android 的“App 孵化器”,像工厂的模板机器,快速克隆出一个个 App 进程,省时省力还省内存!
一、Zygote的核心职责:模板工厂模式
Zygote(受精卵)是 Android 系统中一个特殊的进程。它在系统启动时被创建,其核心职责是作为所有应用进程的“模板” 。
-
预加载:在
Zygote启动时,它会加载所有应用都需要的公共资源,包括:- Android 核心类库(
framework.jar)。 - 常用系统资源(主题、图标、字体)。
- 启动一个 ART 虚拟机实例。
- Android 核心类库(
-
资源共享:
Zygote加载的这些资源,在内存中被标记为只读。当应用进程通过fork()创建时,它们会共享这部分只读内存,从而实现了高效的资源共享。
二、Zygote的工作流程:从监听请求到进程克隆
Zygote 的工作流程是一个精密的“请求-响应”循环。
-
启动:Linux 内核启动
init进程,init进程随后启动Zygote进程。 -
预加载:
Zygote进程在启动后,执行ZygoteInit.main()方法,加载核心库和资源,并启动一个 ART 虚拟机。 -
监听:
Zygote随后进入一个循环,通过Socket监听来自SystemServer的启动请求。 -
fork():当收到启动应用的请求时,Zygote会调用fork()系统调用,复制自身,创建一个新的子进程。 -
子进程分离:
- 子进程:立即执行 App 的
main()方法,开始应用的初始化。 - 父进程:继续循环,监听下一个请求。
- 子进程:立即执行 App 的
三、Zygote的三大优势
Zygote 的设计,是 Android 能够实现流畅、高效体验的关键。
- 快速启动(Fast Startup) :
fork()克隆一个进程比从头加载所有资源要快得多。 - 节省内存(Memory Saving) :
Copy-on-Write(写时复制)机制使得父子进程可以共享大部分只读内存,只在需要修改时才进行复制,从而节省了物理内存。 - 统一环境(Unified Environment) :所有 App 进程都继承自同一个
Zygote进程,这确保了它们拥有统一的运行时环境,避免了兼容性问题。
四、高级话题:Zygote的多进程与安全性
WebView进程:为了隔离潜在的安全风险,现代 Android 系统将WebView的运行隔离在独立的进程中。这使得即使WebView的代码存在漏洞,也不会影响整个应用进程的安全性。- 多 Zygote 进程:在一些设备上,为了进一步优化,可能会存在多个
Zygote进程,每个进程负责孵化不同类型的应用,从而实现更细粒度的资源管理。