1. Zygote —— Java世界的创建者


Zygote 原意为“受精卵”,是Android里面Java世界的起源。 它创建了第一个Java虚拟机,也通过Fork产生了

framework的核心system_server进程。个人觉得《深入理解Android 卷1》一书里对此部分的介绍比较详尽,

我们通过看书,结合Android的源码就可窥知一二。


Zygote创建Java世界的步骤为:

(1)创建AppRuntime对象,并调用它的start。(frameworks\base\cmds\app_process\app_main.c里的Main函数)

参数是在Init那边启动zygote时传过来的。


 AppRuntime runtime;    const char* argv0 = argv[0];    // 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);

解析部分参数,并将剩余未解析的保存,设置Process name。

while (i < argc) {        const char* arg = argv[i++];        if (!parentDir) {            parentDir = arg;        } else if (strcmp(arg, "--zygote") == 0) {            zygote = true;            niceName = "zygote";        } else if (strcmp(arg, "--start-system-server") == 0) {            startSystemServer = true;        } else if (strcmp(arg, "--application") == 0) {            application = true;        } else if (strncmp(arg, "--nice-name=", 12) == 0) {            niceName = arg + 12;        } else {            className = arg;            break;        }    }    if (niceName && *niceName) {        setArgv0(argv0, niceName);        set_process_name(niceName);    }


if (zygote) {        runtime.start("com.android.internal.os.ZygoteInit",                startSystemServer ? "start-system-server" : "");    }

(2)调动startVm创建Java虚拟机,然后调用startReg来注册JNI函数。

    /* start the virtual machine */    JNIEnv* env;    if (startVm(&mJavaVM, &env) != 0) {        return;    }    onVmCreated(env);    /*     * Register android functions.     */    if (startReg(env) < 0) {        ALOGE("Unable to register all android natives\n");        return;    }


对于startReg,这里稍作说明:

(register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0)

static int register_jni_procs(const RegJNIRec array[], size_t count, JNIEnv* env){    for (size_t i = 0; i < count; i++) {        if (array[i].mProc(env) < 0) {#ifndef NDEBUG            ALOGD("----------!!! %s failed to load\n", array[i].mName);#endif            return -1;        }    }    return 0;}

static const RegJNIRec gRegJNI[] = {    REG_JNI(register_android_debug_JNITest),    REG_JNI(register_com_android_internal_os_RuntimeInit),    REG_JNI(register_android_os_SystemClock),    REG_JNI(register_android_util_EventLog),    REG_JNI(register_android_util_Log),    REG_JNI(register_android_util_FloatMath),    REG_JNI(register_android_text_format_Time),    REG_JNI(register_android_content_AssetManager),    REG_JNI(register_android_content_StringBlock),    REG_JNI(register_android_content_XmlBlock),......}


就是执行数组中的那些JNI注册函数,如register_android_hardware_Camera (这个后面介绍Android Camera流程的时候

会再提到)


(3)通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入了Java世界。

  /*     * Start VM.  This thread becomes the main thread of the VM, and will     * not return until the VM exits.     */    char* slashClassName = toSlashClassName(className);    jclass startClass = env->FindClass(slashClassName);    if (startClass == NULL) {        ALOGE("JavaVM unable to locate class '%s'\n", slashClassName);        /* keep going */    } else {        jmethodID startMeth = env->GetStaticMethodID(startClass, "main",            "([Ljava/lang/String;)V");        if (startMeth == NULL) {            ALOGE("JavaVM unable to find main() in '%s'\n", className);            /* keep going */        } else {            env->CallStaticVoidMethod(startClass, startMeth, strArray);#if 0            if (env->ExceptionCheck())                threadExitUncaughtException(env);#endif        }    }

(4)调用registerZygoteSocket。通过这个函数,他可以响应子孙后代的请求。调用

preloadClasses和preloadResources预加载类和资源。

 registerZygoteSocket();            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,                SystemClock.uptimeMillis());            preload();            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,                SystemClock.uptimeMillis());            // Finish profiling the zygote initialization.            SamplingProfilerIntegration.writeZygoteSnapshot();            // Do an initial gc to clean up after startup            gc();            // Disable tracing so that forked processes do not inherit stale tracing tags from            // Zygote.            Trace.setTracingEnabled(false);            // If requested, start system server directly from Zygote            if (argv.length != 2) {                throw new RuntimeException(argv[0] + USAGE_STRING);            }            if (argv[1].equals("start-system-server")) {                startSystemServer();            } else if (!argv[1].equals("")) {                throw new RuntimeException(argv[0] + USAGE_STRING);            }            Log.i(TAG, "Accepting command socket connections");            runSelectLoop();            closeServerSocket();



2. SystemServer

此处还是将书中的那个图抄过来吧,读者有时间的话,还是看下代码。




更多相关文章

  1. C语言函数的递归(上)
  2. Android(安卓)电源管理 (部分转载)
  3. Wifi 资源整理
  4. Android(安卓)NDK C++中的多线程
  5. 使用 kotlin 来进行 Android(安卓)开发(一)
  6. [Android]Smali语法
  7. Android(安卓)关机流程分析-----(1)Framework层
  8. unity重写软键盘for Android(安卓)NGUI
  9. Flutter中高级培训

随机推荐

  1. android设置横屏代码
  2. Android中关于cpu/cpuset/schedtune的应
  3. 带weight的LinearLayout嵌套RecyclerView
  4. Activity属性设置大全
  5. 进程保活
  6. The differences between @+id and @andr
  7. PhoneGap Android(安卓)hello android:mi
  8. content provider
  9. android之EditText
  10. android软件测试log知多少