Android 启动
Android 底层是 Linux 系统,Linux 启动后的第一个进程是 init, init 通过 init.rc 配置文件启动一系列的进程,其中 zygote 进程是 Android 系统的核心,是一个 Android 进程的孵化器,所有 Android 进程都是基于这个进程克隆出来的,包括 system_service。
init
init.zygote64_32.rc
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
class main
priority -20
user root
group root readproc
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
service zygote_secondary /system/bin/app_process32 -Xzygote /system/bin --zygote --socket-name=zygote_secondary --enable-lazy-preload
class main
priority -20
user root
group root readproc
socket zygote_secondary stream 660 root system
onrestart restart zygote
writepid /dev/cpuset/foreground/tasks
64 位系统启动了两个 zygote, zygote_secondary 是 32 位的。
app_process
app_process 代码位于 frameworks/base/cmds/app_process,逻辑很简单,启动 java 类 ZygoteInit.
int main(int argc, char * const argv[]) {
AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
// 解析参数 argv, 然后启动 ZygoteInit
......
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
}
......
}
ZygoteInit
ZygoteInit 初始化 Android 环境, 启动系统服务进程 system_server,最后进入 socket s服务器监听模式,根据客户端请求 fork 应用进程。
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
public static void main(String argv[]) {
ZygoteServer zygoteServer = new ZygoteServer();
......
zygoteServer.registerServerSocketFromEnv(socketName); //启动 socket 服务
preload(bootTimingsTraceLog); // 预先加载基础类和资源
......
if (startSystemServer) {
Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
// zygote 进程 r == null, 子进程 system_server r != null
if (r != null) {
r.run();
return
}
}
caller = zygoteServer.runSelectLoop(abiList);
}