zoukankan      html  css  js  c++  java
  • Android4.0.3源码分析——开机流程之Zygote


    Zygote


    Zygote启动是从

    /frameworks/base/cmds/app_process/app_main.cpp

    中的main()函数开始的。


    启动JavaVM:

    main()函数中有启动VM

    if(zygote) {

    runtime.start("com.android.internal.os.ZygoteInit",

    startSystemServer? "start-system-server" : "");

    runtimeAppRuntime的对象,同样在main()中:

    AppRuntimeruntime;

    appRuntimeAndroidRuntime的子类,它的定义就在app_main.cpp中:

    classAppRuntime : public AndroidRuntime

    所以,这里的runtime.start()其实调用的是AndroidRuntime::start().


    下面对AndroidRuntime::start()进行分析:

    /frameworks/base/core/jni/AndroidRuntime.cpp

    start()函数中启动VM

        /* start the virtual machine */
        JNIEnv* env;
        if (startVm(&mJavaVM, &env) != 0) {
            return;
        }
        onVmCreated(env);
    其中startVm()函数和onVmCreated()函数也都在AndroidRuntime.cpp中。
    startVm()函数中通过有如下代码调用JNI创建JavaVM:
    /*
    * Initialize the VM.
    *
    * The JavaVM* is essentially per-process, and the JNIEnv* is per-thread.
    * If this call succeeds, the VM is ready, and we can start issuing
    * JNI calls.
    */
    if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) {
    LOGE("JNI_CreateJavaVM failed\n");
    goto bail;
    }
    onVmCreated()函数其实是个空函数。
    void AndroidRuntime::onVmCreated(JNIEnv* env)
    {
    // If AndroidRuntime had anything to do here, we'd have done it in 'start'.
    }
    同时在start()函数中调用startReg()函数注册JNI接口:
        if (startReg(env) < 0) {
            LOGE("Unable to register all android natives\n");
            return;
        }

    然后在start()函数中:

    env->CallStaticVoidMethod(startClass,startMeth, strArray);

    调用com.android.internal.os.ZygoteInit中的main()函数。


    /fameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    main()调用了:

    registerZygoteSocket();//来注册SocketListen端口,用来接受请求。

    preload();

    startSystemServer();//启动SystemServer

    其中preload()函数定义如下:

    static void preload() {
        preloadClasses();
        preloadResources();
    }

    它主要进行预加载类和资源,以加快启动速度。preloadclass列表保存在/frameworks/base/preloaded-classes文件中。

    经过以上步骤,Zygote就建立完成。


  • 相关阅读:
    [转] 美股评论:远离波动的噪音
    [转] GDB 下 watch的使用
    [转] Web性能压力测试工具之ApacheBench(ab)详解
    [转] Ubuntu 12.04下LAMP安装配置 (Linux+Apache+Mysql+PHP)
    [转] 在 Linux 中怎样使用cp命令合并目录树
    [转] postgresql常用命令
    [转] 跟着美联储投资
    [转] 智能指针(三):unique_ptr使用简介
    关于前端开发
    [转] 美股评论:美国散户血泪辛酸
  • 原文地址:https://www.cnblogs.com/ainima/p/6332020.html
Copyright © 2011-2022 走看看