什么是Dalvik?
- Dalvik是用于Android平台的Java虚拟机
- Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一
- 它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行
- dex格式是专为Dalvik应用设计的一种压缩格式,适合内存和处理器速度有限的系统
- Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为独立的Linux进程执行
- 独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭
Dalvik特点
- Dalvik是依靠一个Just-In-Time(JIT编译)编译器去解释字节码
- Dalvik虚拟机下运行Java时,要将字节码通过即时编译器(just in time ,JIT)转换为机器码(机器码才是能真正运行的),这会拖慢应用的运行效率
应用安装时,执行dexopt指令,将dex文件优化为odex文件
- 应用运行时,会将二进制翻译成机器码流程
鉴于Dalvik这个缺点,Google开发了新的虚拟机叫ART(Android Runtime)
ART(ART代表Android Runtime,Android 4.4引入)
应用在第一次安装的时候,字节码就会预先编译成机器码
,使其成为真正的本地应用,这个过程叫做预编译(AOT,Ahead-Of-Time)
- 在移除解释代码这一过程后,应用程序执行将更有效率,启动更快
ART特点
- AOT编译
应用安装时执行dex2oat指令,将dex文件翻译为oat文件
- 应用运行时,无二进制翻译为机器码流程
ART分为2种模式, 即解释模式和AOT机器码模式
- 解释模式类似于JavaScript, 就是取出Dex代码并逐条解释,运行仍然会慢
- 机器码模式就是在安装app时就编译好Dex对应的机器码,运行很快, 这是Android5.0及后续版本的默认方式。
ART和Dalvik区别:
从Android5.0开始废弃了Dalvik,全面推行ART。
- (1)在Dalvik下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这虽然会使安装过程比较快,但是会拖慢应用以后每次启动的效率。 而在ART 环境中,应用在第一次安装的时候,字节码就会预编译(AOT)成机器码,这样的话,虽然设备和应用的首次启动(安装慢了)会变慢,但是以后每次启动执行的时候,都可以直接运行,因此运行效率会提高。
- (2)ART占用空间比Dalvik大(字节码变为机器码之后,可能会增加10%-20%),这也是著名的“空间换时间大法"。
- (3)预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了 CPU 的使用频率,降低了能耗
ART优点:
- 系统性能的显著提升
- 应用启动更快、运行更快、体验更流畅、触感反馈更及时
- 更长的电池续航能力
- 支持更低的硬件
ART缺点:
- 更大的存储空间占用,可能会增加10%-20%
- 更长的应用安装时间