Android运行时– DVM与ART,AOT与JIT
在本教程中,我们将讨论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优化也得到了增强。