Android 运行时(ART)是 Android 上应用程序和某些系统服务使用的托管运行时。ART 及其前身 Dalvik 最初是专门为 Android 项目创建的。ART 和 Dalvik 是兼容运行 Dex 字节码的运行时,因此为 Dalvik 开发的应用程序在 ART 上运行时应该也能正常工作。
Dalvik 虚拟机或 DVM 是一个基于寄存器的虚拟机,由 Dan Bornstein 设计并编写。Dalvik 虚拟机由 Bornstein 以冰岛埃亚峡湾的渔村“Dalvík”命名,那里是他一些祖先曾经居住的地方。Dalvik 是 Android 操作系统中一个已停止开发的进程虚拟机(VM),用于执行为 Android 编写的应用程序。虽然 Dalvik 字节码格式仍被用作分发格式,但在较新的 Android 版本中不再在运行时使用。Android 本身是一个 Linux 系统,Dalvik 位于其之上。DVM 获取 Android 应用程序,将其从 Java 代码转换为 Linux 系统可以运行的字节码。基本上,普通的 Java 代码在运行时通过 JIT 编译器编译成字节码,以便在机器上运行。这可能会导致速度减慢,因为在运行时进行编译(尤其是在应用运行期间)非常耗时。因此,制造商和 OEM 厂商有时会将它们的应用程序发布为 odexed 格式。主要有两种类型的文件:
- .dex(Dalvik Executable file) 文件是 Android 的编译代码文件。这些 .dex 文件随后被压缩成一个单一的 .apk 文件。
- .odex 文件由 Android 操作系统创建,用于节省空间并提高 Android 应用程序(.apk 文件)的启动速度。
dexopt 用于将 DEX 优化为 ODEX(优化的 DEX),其中包含优化后的字节码。因此,DVM 中的整个过程可以总结为:
> JAVA source code(.java) –> Bytecode(.dex) –> DVM
DVM 更适合低存储设备。但由于编译是在安装后进行的,所以速度较慢。
随着较新的 Android 版本(特别是从 4.4 版本 KitKat 开始),出现了作为 DVM 替代方案的 ART 概念。ART(Android 运行时)是 DVM 的继任者,它使用相同的字节码和 .dex 文件(但不使用 .odex 文件),这种继任旨在对最终用户透明地提高性能。Android 5.0 “Lollipop” 是第一个将 ART 作为唯一包含运行时的版本。现在 ART 所做的是让应用程序在安装到设备上时完全编译好。因此,性能更高,因为不需要先将代码转换为字节码然后再编译。但缺点是你需要更多的存储空间,安装时间也稍长一点,因为在安装期间要进行编译,这意味着它必须一直驻留在设备上。因此,我们拥有的不是相对较小的 Java 代码,而是更大的字节码/机器代码。你可能听说过 odexed 和 de-odexed 这两个术语。在这种情况下,我们所做的是获取应用程序的一小部分,然后对其进行预编译,它们可以继续优化其应用程序的一部分以便在其设备上运行,所以它们现在已经预编译了应用程序的那一部分,而其余部分在运行时编译。所以这使得它仅仅比 Dalvik 快一点,性能更好一点。但是这种方法需要稍多的存储空间。
> 示例: 使用 TouchWiz 的三星 .. 很多东西,TouchWiz 是基于预编译的,因此当它们被 de-odexed 时,你可以重新设计主题/皮肤,但会失去一些性能优势。
在继续阅读之前,请记住 dex2oat 用于优化和编译 .dex 文件为 .oat 文件,该文件可能包含 ELF 格式的机器代码。ART 使用设备上的 dex2oat 工具编译应用程序。该实用程序接受 DEX 文件作为输入,并为目标设备生成编译后的应用程序可执行文件。当安装应用程序时,Android 会自动优化应用程序数据并创建相应的 OAT 文件。OAT 文件由 Android 操作系统创建,以加快 Android 应用程序(.APK 文件)的加载时间。Android 使用此文件更快地加载应用程序,从而创造更好的用户体验。
!ART
DVM 和 ART 的区别
ANDROID RUN TIME
—
重启动时间显著更长
缓存是在第一次启动时建立的
由于 AOT 内部消耗大量存储空间
最适合大存储设备
实验性和新的 – 相比之下应用程序支持不多
极快且更平滑的应用程序加载时间和更低的处理器使用率
使用 AOT 编译器 从而在应用程序安装时进行编译