Android- 源码分析 -Dalvik- 虚拟机创建过程,干货整理
char jitprithreadweightOptBuf[sizeof("-Xjitprithreadweight:")-1 + PROPERTY_VALUE_MAX];char jittransitionweightOptBuf[sizeof("-Xjittransitionweight:")-1 + PROPERTY_VALUE_MAX];char gctypeOptsBuf[sizeof("-Xgc:")-1 + PROPERTY_VALUE_MAX];char backgroundgcOptsBuf[sizeof("-XX:BackgroundGC=")-1 + PROPERTY_VALUE_MAX];char heaptargetutilizationOptsBuf[sizeof("-XX:HeapTargetUtilization=")-1 + PROPERTY_VALUE_MAX];char cachePruneBuf[sizeof("-Xzygote-max-boot-retry=")-1 + PROPERTY_VALUE_MAX];char dex2oatXmsImageFlagsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX];char dex2oatXmxImageFlagsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX];char dex2oatXmsFlagsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX];char dex2oatXmxFlagsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX];char dex2oatCompilerFilterBuf[sizeof("--compiler-filter=")-1 + PROPERTY_VALUE_MAX];char dex2oatImageCompilerFilterBuf[sizeof("--compiler-filter=")-1 + PROPERTY_VALUE_MAX];char dex2oatThreadsBuf[sizeof("-j")-1 + PROPERTY_VALUE_MAX];char dex2oatThreadsImageBuf[sizeof("-j")-1 + PROPERTY_VALUE_MAX];char dex2oat_isa_variant_key[PROPERTY_KEY_MAX];char dex2oat_isa_variant[sizeof("--instruction-set-variant=") -1 + PROPERTY_VALUE_MAX];char dex2oat_isa_features_key[PROPERTY_KEY_MAX];char dex2oat_isa_features[sizeof("--instruction-set-features=") -1 + PROPERTY_VALUE_MAX];char dex2oatFlagsBuf[PROPERTY_VALUE_MAX];char dex2oatImageFlagsBuf[PROPERTY_VALUE_MAX];char extraOptsBuf[PROPERTY_VALUE_MAX];char voldDecryptBuf[PROPERTY_VALUE_MAX];...
/*
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) {ALOGE("JNI_CreateJavaVM failed\n");return -1;}
return 0;}
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote){
/* start the virtual machine /JniInvocation jni_invocation;jni_invocation.Init(NULL);JNIEnv env;if (startVm(&mJavaVM, &env, zygote) != 0) {return;}onVmCreated(env);
/*
Register android functions.*/if (startReg(env) < 0) {ALOGE("Unable to register all android natives\n");return;}
}
//Dalvik 虚拟机在 Zygote 进程中的启动过程,这个启动过程主要就是完成了以下四个事情://1. 创建了一个 Dalvik 虚拟机实例;//2. 加载了 Java 核心类及其 JNI 方法;//3. 为主线程的设置了一个 JNI 环境;//4. 注册了 Android 核心类的 JNI 方法。
Zygote 启动 Dalvik 作用:
Zygote 进程为 Android 系统准备好了一个 Dalvik 虚拟机实例,以后 Zygote 进程在创建 Android 应用程序进程的时候,就可以将它自身的 Dalvik 虚拟机实例复制到新创建 Android 应用程序进程中去,从而加快了 Android 应用程序进程的启动过程。
2.Java 核心类和 Android 核心类(位于 dex 文件中),以及它们的 JNI 方法(位于 so 文件中
),都是以内存映射的方式来读取的,因此,Zygote 进程在创建 Android 应用程序进程的时候,除了可以将自身的 Dalvik 虚拟机实例复制到新创建的 Android 应用程序进程之外,还可以与新创建的 Android 应用程序进程共享 Java 核心类和 Android 核心类,以及它们的 JNI 方法,这样就可以节省内存消耗。
评论