写点什么

Android- 源码分析 -Dalvik- 虚拟机创建过程,android 棋牌游戏开发

用户头像
Android架构
关注
发布于: 刚刚

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 进程在创建 And


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


roid 应用程序进程的时候,就可以将它自身的 Dalvik 虚拟机实例复制到新创建 Android 应用程序进程中去,从而加快了 Android 应用程序进程的启动过程。


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

  • 3.Zygote 进程为了加快 Android 应用程序进程的启动过程,牺牲了自己的启动速度,因为它需要加载大量的 Java 核心类,以及注册大量的 Android 核心类 JNI 方法。Dalvik 虚拟机在加载 Java 核心类的时候,还需要对它们进行验证以及优化,这些通常都是比较耗时的。又由于 Zygote 进程是由 init 进程启动的,也就是说 Zygote 进程在是开机的时候进行启动的,因此,Zygote 进程的牺牲是比较大的。不过毕竟我们在玩手机的时候,很少会关机,也就是很少开机,因此,牺牲 Zygote 进程的启动速度是值得的,换来的是 Android 应用程序的快速启动。


更多完整项目下载。未完待续。源码。图文知识后续上传 github。可以点击关于我?联系我获取

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android-源码分析-Dalvik-虚拟机创建过程,android棋牌游戏开发