天天看点

Android zygote进程启动

Linux系统进程创建是通过复制和继承的方式,系统启动后会创建init进程,后面所有的进程都是通过init进程创建的,在Android系统上,最早被init进程创建的是zygote进程,zygote是受精卵的意思,意即为最原始的最初的进程,后面的用户进程都是通过zygote创建出来的,zygote进程是通过启动在init.rc中指定,

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
           

前面的关键字service告诉init进程创建一个名为”zygote”的进程,这个zygote进程要执行的程序是/system/bin/app_process,后面是要传给app_process的参数,**这里定义的socket的类型为unix domain socket,它是用来作本地进程间通信用的

app_process程序的源码在\frameworks\base\cmds\app_process\app_main.cpp

int main(int argc, const char* const argv[])
{
    // These are global variables in ProcessState.cpp
    mArgC = argc;
    mArgV = argv;

    mArgLen = ;
    for (int i=; i<argc; i++) {
        mArgLen += strlen(argv[i]) + ;
    }
    mArgLen--;

    AppRuntime runtime;
    const char* argv0 = argv[];

    // Process command line arguments
    // ignore argv[0]
    argc--;
    argv++;

    // Everything up to '--' or first non '-' arg goes to the vm

    int i = runtime.addVmArguments(argc, argv);

    // Parse runtime arguments.  Stop at first unrecognized option.
    bool zygote = false;
    bool startSystemServer = false;
    bool application = false;
    const char* parentDir = NULL;
    const char* niceName = NULL;
    const char* className = NULL;
    while (i < argc) {
        const char* arg = argv[i++];
        if (!parentDir) {
            parentDir = arg;
        } else if (strcmp(arg, "--zygote") == ) {
            zygote = true;
            niceName = "zygote";
        } else if (strcmp(arg, "--start-system-server") == ) {
            startSystemServer = true;
        } else if (strcmp(arg, "--application") == ) {
            application = true;
        } else if (strncmp(arg, "--nice-name=", ) == ) {
            niceName = arg + ;
        } else {
            className = arg;
            break;
        }
    }

    if (niceName && *niceName) {
        setArgv0(argv0, niceName);
        set_process_name(niceName);
    }

    runtime.mParentDir = parentDir;

    if (zygote) {
        runtime.start("com.android.internal.os.ZygoteInit",
                startSystemServer ? "start-system-server" : "");
    } else if (className) {
        // Remainder of args get passed to startup class main()
        runtime.mClassName = className;
        runtime.mArgC = argc - i;
        runtime.mArgV = argv + i;
        runtime.start("com.android.internal.os.RuntimeInit",
                application ? "application" : "tool");
    } else {
        fprintf(stderr, "Error: no class name or --zygote supplied.\n");
        app_usage();
        LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
        return ;
    }