Android类加载(一)——DVM、ART、Dexopt、DexAot名词解析
Android类加载(二)——双亲委托机制
Android类加载(三)——源码解读
JVM和DVM
DVM基于寄存器,JVM基于栈
寄存器是CPU上面的一块存储空间,栈是内存上面的一段连续的存储空间,所以CPU直接访问自己上面的一块空间的数据的效率肯定要大于访问内存上面的数据。基于栈架构的程序在运行时虚拟机需要频繁的从栈上读取或写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费不少CPU时间,对于像手机设备资源有限的设备来说,这是相当大的一笔开销。DVM基于寄存器架构。数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。
执行的字节码文件不一样
DVM执行的是.dex文件,JVM执行的是.class文件。
DVM解释执行的是dex字节码.dex:.java –> .class –> .dex –> .apk
JVM运行的是java字节码.class:.java –> .class –> .jar
本质上java文件编译后都是字节码,只不过JVM运行的是.class字节码,而DVM运行的是.dex字节码
ART与Dalvik
Dalvik:Dalvik是谷歌公司自己设计用于Android平台的Java虚拟机(DVM)。支持已转换为.dex格式的应用程序的运行。.dex格式是专门为DVM设计的一种压缩格式,适合内存和处理器有限的系统,例如Android系统。(DVM负责解释.dex文件为机器码)
ART:Android Runtime,Android4.4中引入的一个开发者选项,也是Android5.0及更高版本的默认模式。在应用安装的时候把字节码预编译成机器语言,这一机制叫做Ahead-Of-Time(AOT)预编译。这样应用程序虽然安装会很慢,但是执行效率将更高,启动更快。
- 机器码是直接运行在机器上的,字节码要解释翻译成机器码,在arm手机和x86手机上的机器码是不一样的,所以不能在app打包的时候编译成机器码,要在应用安装的时候编译成手机对应的机器码
- 在Dalvik下,应用需要解释执行,运行效率低。
- ART占用空间比DVM大,“空间换时间”。
- 预编译成机器码也可以改善电池的续航能力,因为应用程序每次运行时不用再重复编译了,从而减少了CPU的使用频率,降低了能耗。
Dexopt与DexAot
-
Dexopt:通常情况下,我们看到的Android应用程序实际上是一个以.apk为后缀名的压缩文件。我们可以通过压缩工具对apk进行解压,解压出来的内容中有一个名为classes.dex的文件,我们应用在启动的时候,classes.dex的文件会被加载到DVM中,函数dexopt会对dex字节码进行优化,实际上也就是由dex文件生成odex文件。
image.png -
DexAot:ART模式下,应用在安装时,对dex文件执行dexopt优化后,再将odex文件进行AOT预编译操作(dexAot),编译为OAT可执行文件(机器码)
网友评论