zoukankan      html  css  js  c++  java
  • 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请求创建新的应用程序进程。

  • 相关阅读:
    typedef和define的详细区别
    谈谈Android Activity的生命周期管理
    【Android面试】Android面试题集锦 (陆续更新)(最新2012618)
    [ZZ]Ubuntu<>Windows 远程桌面连接(debian等同)
    C语言中的全局变量内存分配和初始化顺序
    [刘未鹏]怎样花两年时间去面试一个人
    线程间通信常用的三种方法
    C语言const详解
    细雨寒风水冰 no
    C#读取*.sql文件,并执行里面的SQL语句 no
  • 原文地址:https://www.cnblogs.com/lufeibin/p/13479779.html
Copyright © 2011-2022 走看看