Android中Dalvik、ART区别与联系

539 阅读2分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

Android中Dalvik、ART区别与联系

在很长的一段时间中,在开发安卓应用中,java都是作为主流语言,直到2017年,谷歌宣布 Kotlin 成为安卓官方开发语言,我们姑且先不谈Kotlin、Flutter这些新一些的技术,从底层了解起来,安卓到底是怎么运行起来的?Dalvik、ART、JVM有什么区别与联系?

一个误解

安卓使用JAVA语言开发,安卓系统也自带一个JVM去解释运行

因为我最初的学校专业是JAVA,后来转安卓也是JAVA,所以一切都比较顺利。在很长的一段时间中,我误认为JVM这些在安卓系统中也是存在的,因为JAVA也需要进行编译,然后由JVM解释才能运行。

Dalvik

运行流程

思想是没有错的,在安卓平台不使用JAVA虚拟机(JVM)执行代码,而是编译成了Dilvik字节码,是由Dilvik虚拟机(DVM)来解释执行。JAVA语言先编译成JAVA字节码,然后编译成Dilvik字节码,在应用运行时,DilvikVM即时编译成机器码进行运行。 所以它的流程是这样


graph LR

A[JAVA] --> B(JAVA字节码)

B --> C(Dilvik字节码)

C --> D(Dilvik VM)

所以最终应用apk所包含的不是JAVA字节码,而是Dalvik字节码,也就是dex文件。

编译方式

Dalvik 虚拟机采用的是即时编译(JIT Just In Time)模式,每当apk安装到手机,每次运行app时,Dalvik虚拟机就会将dex文件解释为机器码,然后才可以运行。这种即时编译被很多开发者诟病,因为每次运行就会解释运行,所以耗费了重复的解释运行的能力。

ART

在安卓5.0版本之后,全部采用了ART进行解释Dex文件,应用在第一次安装的时候,字节码就会预先编译成机器码存储在本地。

为了加快Dalvik 虚拟机解释dex的速度,为了摆脱安卓卡顿的问题,ART应运而生。 实际上ART和Dalvik都是解释dex文件的,它们的作用是相同的,明显的区别就在于:

Dalvik即时编译,ART预编译(安装时编译)

由于是安装时编译,那么也会带来一些问题,比如说安装应用时间变长了,现在的应用市场可以后台进行安装,这个问题也就不再重要了。 在使用了ART之后,安卓才算拉近了和IOS的差距。