写点什么

Android- 源码分析 -Dalvik- 虚拟机创建过程,干货整理

用户头像
Android架构
关注
发布于: 2021 年 11 月 05 日

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 文件中


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


),都是以内存映射的方式来读取的,因此,Zygote 进程在创建 Android 应用程序进程的时候,除了可以将自身的 Dalvik 虚拟机实例复制到新创建的 Android 应用程序进程之外,还可以与新创建的 Android 应用程序进程共享 Java 核心类和 Android 核心类,以及它们的 JNI 方法,这样就可以节省内存消耗。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android-源码分析-Dalvik-虚拟机创建过程,干货整理