一、什么是Dalvik虚拟机?
虚拟机:就是把字节码转为机器能够识别运行的机器码的一个中间桥梁。
关于dalvik虚拟机,绕不过三个文件类型,分别是:.java、.class、.dex。
关于.java和.class文件有一个比较通俗的解释是:
*.java文件是人编写的,给人看的。
.class是通过工具处理.java文件后的产物,它是给VM看的,给VM操作的
至于.dex文件,这是由于早起手机内存不足,因此对JVM的一些地方进行了优化,从而没有采用.class文件而是采用.dex文件
二、什么是ART?
ART(Android RunTime)其实也是一种虚拟机,是Google新推出来想取代Dalvik的优化后的虚拟机,与Dalvik不同,ART采用的是Ahead -of -time(预先编译)的技术,所以通过ART得到的文件是.aot文件,google在Android4.4版本发出测试,5.0版本正式使用,一些比较老的手机可以在设置里进行二者的切换,但博主的小米android6.0已经没有这个切换选项,被固定成ART了。
三、ART相对于Dalvik做了哪些改进
ART最大的改变就是使用了预先编译技术。
- Dalvik是在应用运行时,Dalvik 对 Java Byte Code 进行解释执行,运行时编译,所以速度是是会比较慢的。而在ART中,他会一安装就用系统自带的dex2oat将dex编译成oat文件,运行的时候直接执行2进制码,这对于速度的提高的帮助是很大的。
- 虽然编译成oat文件,但是里面依旧会保留dex文件的,这无疑造成oat文件会比较大,之所以会保留dex文件有这么几点考虑:一.需要dex里面关于类的信息,用来支持java反射;二.需要dex里面调试的信息,调试的时候需要。
ART就垃圾回收机制进行了小幅度的改进。
对于Android2.3版本以后的GC,会在GC前和GC后有一定时间的阻塞代码运行,而ART只会阻塞一次代码的运行。ART安全性的改动。
- 安装时他会对dex进行更加严格的验证
- 他改正了原来Dalvik的一些规则:在Dalvik中,用默认访问权限修饰的包,不是这同一包里的子类还能访问和重载,这跟java是有冲突了,因此在ART中改过来了。
四、我们代码编写上需要注意什么么?
理论上不需要,因为我们打包完成的apk里面其实还是dex文件,后续的转换都是在安装的时候手机上的dex2oat进行的操作,因此我们无论是调试还是编码的时候基本是不需要改变的,当然如果我们的编码有对dex进行操作,那就要注意一下了。