Zygote 凭什么让 Android App 启动这么快?从受精卵到进程孵化,拆解系统启动最精妙的设计(附实战优化)
目录
- 一、Zygote 是什么?为什么叫"受精卵"?
- 二、Zygote 的完整启动流程
- 三、Zygote 源码走读
- 四、fork 机制与 COW
- 五、Zygote 孵化应用的完整链路
- 六、preload——Zygote 快的核心秘密
- 七、实战:预加载自定义资源
- 八、Zygote 的 Socket 通信
- 九、SystemServer 的诞生
- 十、常见踩坑记录
- 十一、总结
一、Zygote 是什么?为什么叫"受精卵"?
Android 里你每次打开一个 App,系统都要创建一个新进程。如果每个 App 进程都从零初始化(加载 ART 虚拟机、加载几万个 Java 类、加载系统资源……),那启动一个 App 得等好几秒——用户体验直接崩盘。
Google 想了一个办法:提前准备一个"半成品"进程,把它需要的公共东西全部加载好,然后任何 App 要启动,直接从这个半成品 fork 一份出来。
这个"半成品"就叫Zygote(受精卵),寓意——它是一切 Android 应用的母体,所有 App 都是从它分裂出去的。
一句话:Zygote 是 Android 上所有 Java 进程的爹。你手机上跑的所有 App,全是 Zygote fork 出来的。
Zygote 做了什么预加载(等你 App 启动时这些已经就绪了):
| 预加载内容 | 数量级 | 说明 |
|---|---|---|
| Java 类 | ~5000+个 | framework 层常用类 |
| 系统资源 | 图片、字符串、颜色、主题 | 系统框架的资源 |
| 共享 SO 库 | Native 动态库 | WebView Chromium 引擎等 |
| 字体 | 系统字体 | 预加载好的 Typeface |
| 资源缓存 | AssetAtlas 等 | 框架 UI 资源 |
二、Zygote 的完整启动流程
Zygote 是 init 进程通过 init.rc 拉起来的,最开始的执行路径是app_process: