剖析 Android ART Runtime (1) - 背景知识
Android 4.4 发布后出现了一个新的运行时 ART 用来替代原有的 Dalvik VM。此后断断续续的看了一下相关的源码,一直想梳理一下 ART 的知识,资料以及相关代码。我会用几篇文章讲述 ART Runtime 的运行机制,源码分析。希望这篇文章能帮助我梳理知识,同时为大家提供参考。
一、什么是 ART 运行时?
先来看一下 Android Developers 上面对 ART 的介绍:
ART is a new Android runtime being introduced experimentally in the 4.4 release. This is a preview of work in progress in KitKat that can be turned on in Settings > developer options. This is available for the purpose of obtaining early developer and partner feedback.
ART 是一种代替 Dalivk 的新的运行时,出现在 Android 4.4 KitKat。但是还处在实验阶段,用户可以通过设置选择使用 ART 运行时。Android Developers 里没虽然有做过多介绍,但是 ART 的出现可以说是 Android 最近这几年里影响最大的两个项目之一(另外一个是 Butter 项目)。ART 出现后引起了科技界的广泛关注,Marko Vitas 的一篇博客介绍了 ART 的知识。Android Police 通过一些 benchmark 分析了 ART 在不同场景下性能的改善。本文参考了这两篇文章,给出更详细的介绍。
简单的讲 ART 为了改善 Dalvik VM 的性能瓶颈,通过 AOT (Ahead-of-Time) 在安装时由 LLVM 编译成可执行文件(oat 文件)。由 ART 运行时执行 oat 文件,处理 JNI 和其他 Android 相关特性。所以 ART 整个项目包括编译器、运行时和相关工具(dex2oat)等。
二、Dalvik vs ART
Dalvik 是从 Android 从出现到现在一直在使用的运行时,Dalvim 虚拟机类似 Java 虚拟机。主要区别是 Java 是 stack based VM,而 Dalvik VM 是 register based VM。stack based VM 和 register based VM 孰优孰劣还有一定的争议,不过在研究领域,有人用 register based 重新实现了 Java VM,实验结果证明 register based 有很大的提高。有点跑题了,总之,Google 在提高虚拟机的性能已经做出了很多努力,这次推出 ART 相信会有更大的提升。
Dalvik VM 使用一种 JIT (Just-in-Time) 的运行时编译的机制,也就是在运行时把 dex bytecode 编译成机器码执行。而 ART 则使用 AOT (Ahead-of-Time) 方式在安装时就编译成机器码。因为运行时编译机制优化代码的时间只在运行时,所以会有很多限制,而 AOT 可以最大限度的利用优化来提高代码执行效率。但是付出的代价是安装时间会比较长,编译后可执行文件会变大。
Android Police 的实验表明还在测试当中的 ART 相比 Dalvik 有以下性能提升:
- CPU 浮点运算大约提高 20%
- 内存操作大约提高 10%
- 存储操作大约提高 10%
- CPU 整数运算也有一些提高
三、ART 带来了什么?
ART 的出现将会对 Android 的生态圈有很大影响。
性能,能耗 Android 会不会从此摆脱刷硬件数据的现状?性能最终能又多大的提高(非常期待)?不同运行时的能耗是否有所不同?
安全、软件保护、逆向工程 如果未来的某个版本 APK 包中不再是 dex 而是已经编译好的 aot 文件,是不是逆向工程就变难了呢?这样会不会更好的保护 Android 应用?对于新出的 ART,会不会存在更大的漏洞?
开发者 性能、能耗、安全的提升一定会吸引更多用户和开发者,Android 生态圈会不会开始良性发展?开发者是否能从此受益?
研究人员 ART 运行时如何 hook?主动防御软件如何做出改变?有了 ART 我们还能为 Android 做些什么改善?
以下文章可作为补充: