「这是我参与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的差距。