接下来,我们来看看AndroidRuntime的start函数的流程。
创建Java虚拟机 /* * Start the Android runtime. This involves starting the virtual machine * and calling the "static void main(String[] args)" method in the class * named by "className". * * Passes the main function two arguments, the class name and the specified * options string. */ void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote) { ... ... // 打印一些日志,获取ANDROID_ROOT环境变量 /* start the virtual machine */ JniInvocation jni_invocation; jni_invocation.Init(NULL); // 初始化JNI,加载libart.so JNIEnv* env; // 创建虚拟机,其中大多数参数由系统属性决定 // 最终,startVm利用JNI_CreateJavaVM创建出虚拟机 if (startVm(&mJavaVM, &env, zygote) != 0) { return; } // 回调AppRuntime的onVmCreated函数 // 对于zygote进程的启动流程而言,无实际操作,表示虚拟创建完成,但是里面是空实现 onVmCreated(env); ... ... }这边我们跟一下jni_invocation.Init():libnativehelper/JniInvocation.cpp