Android Zygote

Android 启动

Android 底层是 Linux 系统,Linux 启动后的第一个进程是 init, init 通过 init.rc 配置文件启动一系列的进程,其中 zygote 进程是 Android 系统的核心,是一个 Android 进程的孵化器,所有 Android 进程都是基于这个进程克隆出来的,包括 system_service。

 

Android Zygote_第1张图片

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

}

你可能感兴趣的:(Android)