Zygote

Zygote进程启动后, 便会执行到frameworks/base/cmds/app_process/App_main.cpp文件的main()方法. 整个调用流程:

int main(int argc, char* const argv[])
{
    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
    while (i < argc) {
        ...//参数解析
    }

    //设置进程名
    if (!niceName.isEmpty()) {
        runtime.setArgv0(niceName.string());
        set_process_name(niceName.string());
    }

    if (zygote) {
        // 启动AppRuntime
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } else if (className) {
        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
    }
}

   Zygote进程都是通过fock自身创建子进程的,在app_process进程启动过程,有两个分支:

  • 当zygote为true时,则执行ZygoteInit.main()
  • 当zygote为false时,则执行RuntimeInit.main()

AndroidRuntime::start

void AndroidRuntime::start(const char* className, const Vector<String8>& options)
{
    ...
    // 虚拟机创建
    if (startVm(&mJavaVM, &env, zygote) != 0) {
        return;
    }
    onVmCreated(env);

    // JNI方法注册
    if (startReg(env) < 0) {
        return;
    }
    ...
    // 调用ZygoteInit.main()方法
    env->CallStaticVoidMethod(startClass, startMeth, strArray);

ZygoteInit:main

public static void main(String argv[]) {
    try {
        ...
        registerZygoteSocket(socketName); //为Zygote注册socket
        preload(); // 预加载类和资源
        ...
        if (startSystemServer) {
            startSystemServer(abiList, socketName);//启动system_server
        }
        Log.i(TAG, "Accepting command socket connections");
        runSelectLoop(abiList); //进入循环模式
        ...
    } catch (MethodAndArgsCaller caller) {
        caller.run(); //启动system_server
    }
    ...
}

  由此可知,ZygoteInit.java的main方法一共做了4件事:

    1.创建一个server端的socket。

    2.预加载类和资源。

    3.启动SystemServer 进程。

    4.等待AMS请求创建新的应用程序进程。

原文地址:https://www.cnblogs.com/lufeibin/p/13479779.html