Android进程基础:Zygote
1.Zygote的作用
Zygote是安卓系统的核心进程
核心作用 | 详细说明 |
---|---|
进程孵化器 | 作为所有应用进程的父进程,通过 fork 快速创建新进程(避免重复初始化虚拟机)。(system server 也由 zygote 启动) |
预加载公共资源 | 提前加载系统类(如 Activity、View)、资源文件(如主题、布局)、共享库(如 libandroid.so),减少应用启动时的开销。 |
内存优化 | 通过 Copy-on-Write(写时复制)机制共享只读内存页,降低多进程的内存占用。 |
2. Zygote 的启动流程
Zygote 的启动流程分为 系统初始化阶段 和 服务准备阶段:
阶段 1:系统初始化
-
Init 进程触发:
Android 系统启动时,init 进程解析init.rc
配置文件,启动 zygote 服务。# init.rc 关键配置 service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server class main socket zygote stream 660 root system
-
启动 Zygote 进程:
执行app_process
可执行文件,进入ZygoteInit
的main()
方法。 -
区分 32/64 位:
可能存在zygote
(32 位)和zygote64
(64 位)两个进程。
阶段 2:服务准备
- 预加载资源:
- 加载系统类(
preloadClasses()
)。 - 加载资源文件(
preloadResources()
)。 - 加载 OpenGL、共享库等(
preloadSharedLibraries()
)。
- 加载系统类(
- 启动 SystemServer:
通过fork()
创建子进程,执行SystemServer
的main()
方法,启动系统核心服务(如ActivityManagerService
)。 - 进入 Loop 监听:
注册ZygoteServer Socket
(/dev/socket/zygote
),监听来自系统服务(如 AMS)的进程创建请求。
3. Zygote 的工作原理
Zygote 的核心工作原理基于 进程分叉(fork)+ 特化执行:
步骤 | 详细说明 |
---|---|
1. 监听 Socket 请求 | Zygote 主线程通过 Socket 接收创建进程的请求(如 AMS 发送的startActivity 触发应用启动)。 |
2. Fork 子进程 | 调用fork() 创建子进程,子进程继承 Zygote 的虚拟机状态和预加载资源。 |
3. 子进程特化 | 子进程执行handleChildProc() ,关闭无用资源,设置进程名,并通过反射调用目标类(如ActivityThread.main() )。 |
4. 进入应用环境 | 子进程初始化为独立的应用进程,运行应用代码(如启动 Activity)。 |
关键机制:
- Copy-on-Write:子进程与 Zygote 共享内存,仅在修改时复制内存页,节省物理内存。
- Socket 通信:避免 Binder 线程池竞争,通过高效 IPC 接收进程创建请求。