App安装时不编译代码只校验合法性,运行时通过解释器执行,将运行频繁的代码进行编译放到内存缓存并且记录在本地配置文件,后台线程编译配置文件记录的方法存放到.odex文件,再次运行App时优先读.odex文件中编译后的代码,然后重复这个过程 。【Android虚拟机Dalvik和ART详解】
文章插图
Android应用用JAVA/Kotlin编写,Android虚拟机并不使用JVM字节码,而是将Class文件通过DX编译器(现已换成D8)编译程dex文件,然后由虚拟机执行;一、Dalvik简单介绍1、Dalvik虚拟机介绍Dalvik是google公司自己设计用于Android平台的虚拟机 。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一 。它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统 。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且 每一个Dalvik 应用作为一个独立的linux 进程执行 。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭 。
底层眼里无论是java还是kolin,最终都是机器码运行;
不废话,开始介绍
2、Dalvik诞生消亡史
- Android 1.0,使用Dalvik作为Android虚拟机运行环境 。
- Android 2.2,Google在Andriod虚拟机中加入了JIT编译器(Just-In-Time Compiler) 。
- Android 4.4,Google带来了全新的虚拟机运行环境ART,此时ART和Dalvik是共存的,用户可以在两者之间进行选择 。
- Android 5.0,ART全面取代了Dalvik成为了Android虚拟机运行环境,至此Dalvik退出历史舞台 。
- Dalvik虚拟机运行的是Dalvik字节码,Dalvik字节码由Java字节码转换而来,并被打包到一个dex文件中 。而JVM运行的是class文件或jar文件;
- 加载速度快,dex相比于Jar文件会把所有包含的信息整合在一起,减少了冗余信息 。这样就减少I/O操作,提高类的查找速度 。
- Dalvik虚拟机是基于寄存器,而JVM是基于栈(操作数栈) 。虽然基于寄存器执行效率好,但是可移植性差,难跨平台 。
- Dalvik虚拟机允许在有限的内存中同时运行多个进程,每一个应用都运行在一个Dalvik虚拟机实例中,拥有独立的进程空间 。
- Dalvik虚拟机有共享机制,不同应用之间在运行时可以共享相同的类,拥有更高的效率 。
- ART虚拟机在Android 5.0开始替换Dalvik虚拟机 。其处理应用程序执行的方式不同于Dalvik虚拟机,它不使用JIT而是使用了AOT(Ahead-Of-Time),也就是提前编译技术 。并且对垃圾收集器也进行了改进和优化 。
- ART虚拟机由Android4.4被引入成为可选项,在Android5.0之后替换掉了Dalvik,并且在Android7.0和8.0分别进行了一系列改动 。
- .dex文件:App所有java源代码编译后生成众多class文件,由DX/D8,编译为一个/多个(multiDex)dex文件,由Android虚拟机编译执行 。
- .odex文件:dex文件经过验证和优化后的产物,art下的odex文件包含经过AOT编译后的代码以及dex的完整内容,但Android8.0之后odex中的dex内容移动到了.vdex文件 。
- .art文件:art下根据配置文件生成odex文件时同时生成.art文件,主要是为了提升运行时加载odex中热点代码的速度,包含了类信息和odex中热点方法的索引,运行App时会首先根据这个文件来加载odex中已经编译过的代码 。
- 解释器(Interpreter):用于程序运行时对代码进行逐行解释,翻译成对应平台的机器码执行 。
- JIT编译(Just In Time):由于解释器方式运行太慢引入,对于频繁运行的热点代码(判定标准一般是在某个时间段内执行次数达到某个阈值)进行实时编译(在ART下以方法为粒度)执行,并且缓存JIT编译后的代码在内存中用于下次执行 。由于以方法为粒度(ArtMethod)进行编译,JIT编较于解释器可以生成效率更高的代码,运行更快 。
推荐阅读
- Android 14 DP1 新特性:平板电脑任务栏应用图标会显示名称
- wma文件用什么播放器?.wma格式的文件在android手机上用什么播放器可以打开?
- vmware删除虚拟机的几种方式 如何卸载vmware虚拟机
- 怎么看虚拟机是32位还是64位的 虚拟机64位系统
- 虚拟主机怎么使用,虚拟机登录地址及使用教程
- 安卓开发环境配置有哪些方法,android开发环境的搭建步骤
- 手机怎么录制屏幕,android手机屏幕录制方法
- Android中各种Exception错误小结
- 虚拟机中的Linux怎么配置上网 虚拟机上网设置
- 什么是虚拟机? windows虚机