ART、Dalvik
本文最后更新于:2017年4月24日 凌晨
ART虚拟机的实现在libart.so中,而Dalvik再libdvm.so中
实现了Java虚拟机的接口,内部却提供完全不一样的东西, – 为了兼容。
I. Dalvik
- 简介: 是Java虚拟机,Android L 之前Android的核心组成部分之一(Android L 后被ART取代)。
- 作者: Dan Bornstein
- 名字来源: 作者祖先曾经居住过的小渔村(位于冰岛)- Dalvík
- 基本功能: 支持
.dex
(Dalvik Executable)运行 .dex
: 专为Dalvik设计的一种压缩格式(Java应用程序),适合内存和处理器速度有限的系统- 业界评价: 一直被用户指责为拖慢安卓系统运行速度不如IOS的根源。2014年的Google I/O大会上,在Android L 中被Google 删除,取而代之的是ART。
诞生缘由
- 业界猜测: 是对Sun尝试控制和保护来自Java ME收入来源的一次反应,以及对建立OpenJDK统辖理事会迟迟未果的回答
- 官方解释: Dalvik是对解决目前Java ME平台上分裂(与已有的JVM)的一次尝试,也是为了提供一个拥有较少限制许可证的平台
基本组件
- dex字节码解释器: 逐条逐行的执行字节码指令
- JIT(Just-In-Time)编译器: 当多次运行速度稍慢的代码时,JIT编译器则会自动将热点代码编译并缓存起来,由此执行速度会逐渐加快
II. ART
Ahead-Of-Time(AOT)编译
在安装时就已经编译成本地代码,因此只需要编译一次,运行时直接执行(应用运行更快(少去该部分的资源竞争)的同时,更省电)。
- 占用内存空间变大。
- 运行速度更快,且更省电 - 运行程序时无需额外的编译、加载转换等,少去这块的CPU资源竞争。
III. ART与Dalvik相同之处
接口名 | 备注 |
---|---|
JNI_GetDefaultJavaVMInitArgs | 获取虚拟机的默认初始化参数 |
JNI_CreateJavaVM | 在进程中创建虚拟机实例 |
JNI_GetCreatedJavaVMs | 获取进程中创建的虚拟机实例 |
IV. ART与Dalvik不同之处
虚拟机名 | 安装时 | 每次重新运行apk时 |
---|---|---|
ART | 解析翻译dex字节码为本地代码(AOT) | 直接执行本地代码 |
Dalvik | 将dex字节码优化生成odex文件(PackageManagerService 请求守护进程installd 来执行) | 通过解释器(Android 2.2引入JIT(缓存热点代码的解释结果))对dex字节码解释为机器码,再执行机器码 |
V. 推敲
persist.sys.dalvik.vm.lib
: 系统属性,若等于libdvm.so
则当前使用的是Dalvik虚拟机,若等于libstart.so
,则当前使用的是ART虚拟机
1. 安装
最终安装优化/翻译 结果都是保存在
odex
文件中
系统启动时,系统除了对/system/app和/data/app目录下所有apk进行翻译以外,还会对/system/framework目录的apk/jar以及这些apk所引用的外部jar进行翻译,保证不对Dalvik虚拟机产生任何依赖。
2. 运行
运行相关代码段:
1 |
|
1 |
|
安装相关代码段:
1 |
|
1 |
|
- Android ART运行时无缝替换Dalvik虚拟机的过程分析
- Dalvik VM vs. ART (Android Runtime): Impact for end-users?
- Dalvik、ART虚拟机小结
- ART运行时垃圾收集(GC)过程分析
- 浅谈为什么Java运行环境是虚拟机,而Python运行环境是解释器
ART、Dalvik
https://blog.dreamtobe.cn/2015/11/01/android_art_dalvik/