深入解析:Android 中 Dalvik 与 ART 的区别

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 更适合低存储设备。但由于编译是在安装后进行的,所以速度较慢。

!Dalvik

随着较新的 Android 版本(特别是从 4.4 版本 KitKat 开始),出现了作为 DVM 替代方案的 ART 概念。ART(Android 运行时)是 DVM 的继任者,它使用相同的字节码和 .dex 文件(但不使用 .odex 文件),这种继任旨在对最终用户透明地提高性能。Android 5.0 “Lollipop” 是第一个将 ART 作为唯一包含运行时的版本。现在 ART 所做的是让应用程序在安装到设备上时完全编译好。因此,性能更高,因为不需要先将代码转换为字节码然后再编译。但缺点是你需要更多的存储空间,安装时间也稍长一点,因为在安装期间要进行编译,这意味着它必须一直驻留在设备上。因此,我们拥有的不是相对较小的 Java 代码,而是更大的字节码/机器代码。你可能听说过 odexedde-odexed 这两个术语。在这种情况下,我们所做的是获取应用程序的一小部分,然后对其进行预编译,它们可以继续优化其应用程序的一部分以便在其设备上运行,所以它们现在已经预编译了应用程序的那一部分,而其余部分在运行时编译。所以这使得它仅仅比 Dalvik 快一点,性能更好一点。但是这种方法需要稍多的存储空间。

> 示例: 使用 TouchWiz 的三星 .. 很多东西,TouchWiz 是基于预编译的,因此当它们被 de-odexed 时,你可以重新设计主题/皮肤,但会失去一些性能优势。

在继续阅读之前,请记住 dex2oat 用于优化和编译 .dex 文件为 .oat 文件,该文件可能包含 ELF 格式的机器代码。ART 使用设备上的 dex2oat 工具编译应用程序。该实用程序接受 DEX 文件作为输入,并为目标设备生成编译后的应用程序可执行文件。当安装应用程序时,Android 会自动优化应用程序数据并创建相应的 OAT 文件。OAT 文件由 Android 操作系统创建,以加快 Android 应用程序(.APK 文件)的加载时间。Android 使用此文件更快地加载应用程序,从而创造更好的用户体验。

!ART

DVM 和 ART 的区别

DALVIK VIRTUAL MACHINE

ANDROID RUN TIME

启动时间更快

重启动时间显著更长

缓存是随时间建立的

缓存是在第一次启动时建立的

由于 JIT 占用较少的空间

由于 AOT 内部消耗大量存储空间

最适合小存储设备

最适合大存储设备

稳定且经过测试的虚拟机

实验性和新的 – 相比之下应用程序支持不多

应用程序加载时间较长

极快且更平滑的应用程序加载时间和更低的处理器使用率

使用 JIT 编译器 (JIT: Just-In-Time) 从而导致存储空间消耗较低

使用 AOT 编译器 从而在应用程序安装时进行编译

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/53053.html
点赞
0.00 平均评分 (0% 分数) - 0