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); }