Android运行时– DVM与ART,AOT与JIT

时间:2020-02-23 14:29:14  来源:igfitidea点击:

在本教程中,我们将讨论Android中使用的运行时环境。
我们将看到差异以及它如何改进以改善android应用程序的执行。

运行环境

运行时环境由在执行编程时使用的软件指令(从代码生成)组成。
JVM是用于将字节码转换为机器代码以便运行基于Java的程序的组件。

为什么虚拟机需要运行任何应用程序?

  • 虚拟机将程序的执行与OS隔离开。
    从而保护恶意代码不影响系统文件。

  • 虚拟机执行与CPU架构无关的代码

Dalvik虚拟机(DVM)专为最初运行Android应用程序而设计。

为什么Android使用DVM而不使用JVM?

移动环境不如您的计算机系统强大(主要是)。
有电池和内存限制。
DVM经过特别优化,可以在Android上运行。

JVM使用基于堆栈的模型。
DM使用基于寄存器的模型。

基于堆栈的模型与基于寄存器的模型之间的区别

基于堆栈的虚拟机具有堆栈类型的内存结构。
基于寄存器的使用CPU的寄存器来存储操作数。
因此,还与操作数一起存储了它们的地址。

基于寄存器的模型不需要任何推送和弹出指令。
因此,指令执行速度更快。

基于寄存器的模型也擅长优化。
它们可以存储常见的子表达式结果,以后无需计算即可再次使用。
这在基于堆栈的模型中是不可能的。

Android DVM

在查看Dalvik虚拟机之前,让我们看一下JVM:

以下是JVM的流程:

以下是DVM的流程:

我们知道DVM专用于低内存设备。

Dex编译器(" dx"工具)将从javac编译器生成的.class文件转换为.dex文件。
然后,这些.dex文件将转换为机器代码。

注意:DVM的一部分dexopt工具将dex文件转换为.odex文件格式。

JVM运行纯Java类的字节码,而DVM运行从Java字节码重新编译的dex格式的.dex文件的字节码。

JVM从相应的.class文件动态加载每个类的字节码。
Dalvik字节码仅由一个.dex文件组成,包含应用程序的所有类。

dex字节码如何转换为机器码?

使用JIT(及时)。

准时制是一个组件,它接收应用程序代码,对其进行分析,并主动将其转换为运行速度更快的形式,并在应用程序继续运行时这样做。
这导致应用程序的启动时间增加,因为每次启动应用程序时都需要完成启动。

随着执行的进行,更多的字节码将被编译和缓存。
这样可以缩短启动时间。

自Android Lollipop以来,DVM和JIT分别被ART和AOT取代。

Dex编译是将.class文件转换为.dex文件的过程。
dx工具对此负责。

自Android Studio 3.1.0起,D8工具已发布。
它比dx领先一步,构建速度更快,生成的.dex文件更小。
因此APK大小会更小。
在gradle.properties中设置android.enableD8 = true

自Android Studio 3.2.0 R8工具发布以来,它已成为代码缩减器。
它比Proguard领先一步,用于在缩小和混淆代码的同时将Java字节码转换为dex。

在gradle.properties中设置android.enableR8 = true

Android ART

自Android Lollipop以来,Android运行时已取代DVM。
ART使用提前时间方法(AOT)代替JIT。

使用AOT,可以在需要之前编译dex文件。
通常,它们仅在安装时完成,然后存储在手机存储中。

让我们看一下使用ART的流程变化:

ART与DVM

ART使用基于AOT的方法,而DVM使用JIT。

ART可以直接运行本机代码。
DVM需要运行已编译的Dex字节码。
因此,ART对于应用程序更快。

ART的唯一缺点是:安装时间增加,重新启动时间增加,存储量增加。

  • 电池性能:与DVM相比,ART大大提高了电池性能,因为不会每次都解释dex字节码。

  • 存储:安装后,AOT将预编译的二进制文件直接存储在电话存储中。
    因此,DVM更适合于存储空间低的手机。

  • 引导时间:ART会导致重新引导时间变慢,因为在第一次引导时就已建立了缓存,因此重新引导设备花费的时间明显更长。

  • 应用程序启动时间:DVM的应用程序启动时间较慢。
    借助AOT,ART可以立即执行本机代码。
    因此是超级快。

  • 垃圾收集:ART的垃圾收集比DVM好得多。
    在DVM中,堆更加分散。
    而ART使用不同的堆来存储大对象(例如位图)。
    此外,ART具有并发压缩垃圾收集器,并且与DVM相比,能够更轻松地压缩堆

重新引入JIT

Android Nougat重新引入了带有代码概要分析的即时编译功能以及AOT,并在ART中提供了解释器,从而使其具有混合性。
这样做是为了解决诸如初始安装时间和内存之类的问题。
使用Hybrid Runtime,在安装过程中不会进行任何编译,并且可以立即启动应用程序,并解释字节码。
现在,借助ART和新的JIT,应用程序安装变得更快。

新的JIT不断进行性能分析,并在应用程序运行时对其进行改进。

在Android P ART中,Kotlin优化也得到了增强。