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请求创建新的应用程序进程。

  • 相关阅读:
    Oracle 的日期类型
    简单的同步Socket程序服务端
    MMORPG中的相机跟随算法
    使用了UnityEditor中的API,打包时却不能打包UnityEditor的问题
    C# 中的关键字整理
    Unity3D C#中使用LINQ查询(与 SQL的区别)
    C# 值类型与引用类型的异同
    Unity3D NGUI事件监听的综合管理
    Unity3D 动画状态机简单控制核心代码
    Unity3D判断触摸方向
  • 原文地址:https://www.cnblogs.com/lufeibin/p/13479779.html
Copyright © 2011-2022 走看看