Android各版本虚拟机的Dexopt区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android各版本虚拟机的Dexopt区别相关的知识,希望对你有一定的参考价值。

参考技术A android 2.1版本到现在的Android 11 , 中间虚拟机变化过三次 :

对于5.0以下的版本 , 加载Multidex的时候 , 会优先判断 odex 是否存在 , 如果不存在 , 则会通过dexopt生成odex , 然后再加载odex , 同时 , 如果存在 多个Dex文件 的话 , Dexopt 也会执行多次.

使用Dalvik虚拟机 , 生成odex文件 . Dalvik采用的是JIT编译+解释器,也就是即时编译,每次应用运行时会实时将Dex翻译成机器码.

使用ART虚拟机 , 生成oat文件. 在ROM OTA或者恢复出场设置后 , 会要进行dex2oat根据当前ROM进行重新编译生成.oat文件.

使用ART虚拟机 , 但是在7.0之上 , 增加了 .vdex 与 .art 机制 , 在ART虚拟机再次启动/升级 , 加载Dex/Oat文件时 , 会减少Dex的校验时间 , 提升加载与运行效率

在ART虚拟机的基础上 , 增加了 Cdex ( Compat Dex ) 机制 ,

compat_dex_file.h

在dex2oat的时候 , 会有一个目标编译类型 , 会有以下几类 , 根据时机不同dex2oat的编译方式也会不同

配置

JVM虚拟机与Android虚拟机

虚拟机相关

虚拟机是什么, JVM,Dalvik,Art三者的区别

JVM和Android虚拟机的区别

  1. JVM虚拟机执的是.class文件,Android虚拟机执行的是.dex文件
  2. class文件存在很多冗余信息,dex会去除冗余信息
    一个class文件是一个类,一个dex文件里有很多类,减少加载次数和IO操作
  3. JVM虚拟机执行的是基于虚拟栈的虚拟机,Android虚拟机是基于寄存器的虚拟机

虚拟栈和寄存器

  1. Java虚拟机都是基于栈的结构,而Dalvik虚拟机则是基于寄存器。
  2. 基于栈的指令很紧凑,Java虚拟机使用的指令只占一个字节,因而称为字节码。
  3. 基于寄存器的指令由于需要指定源地址和目标地址,因此需要占用更多的指令空间。Dalvik虚拟机的某些指令需要占用2-3个字节。
  4. 基于栈和基于寄存器的指令集各有优劣,一般而言,执行同样的功能,基于栈的需要更多的指令(主要是load和store指令),而基于寄存器需要更多的指令空间。栈需要更多指令意味着要多占用CPU时间,寄存器需要更多指令空间意味着数据缓冲(d-cache)更易失效

基于虚拟栈和寄存器的程序都是怎么运行的

虚拟栈:通过const、store、load等指令,声明变量压入栈顶、存放到本地变量表中、从本地变量表中取回到栈顶进行操作等一连串指令运行程序,基于虚拟栈的程序没有变量引用的概念,指令多(需要更多的load和store指令)但是精简,消耗内存大,运行速度快
寄存器:指令少,但是每个指令比较大,因为指令中包含了变量的内存地址,所以通常需要2-3字节来表示变量

字节码指令查询地址

字节码指令没有地址
arm指令含有地址

class与dex结构


jar文件里边有很多class文件,每个class文件都是一个java类
dex文件里边是很多数据类型的列表,将打包到dex中的所有java类中的变量、方法等,根据不同类型,放到了对应的列表中

  1. dex文件减少了整体文件尺寸,dex更像是一种压缩文件,一次可以表示更多的class,jar是将n个class放在了一起
  2. Android虚拟机加载时,加载一个dex会加载很多类,class每次只加载一个
  3. dex指令更加密集,class指令比较多
  4. dex寄存器设计时方便寻址,class需要多次load与store指令
  5. dex适合于移动设备,class适合PC大内存,单指令小的情况下快速执行

Dalvik虚拟机和Art虚拟机的区别

Dalvik使用JIT(Just in time)编译,Art使用AOT(Ahead of time)编译

Dalvik:每次应用在运行时,实时的将一部分dex字节码翻译成机器码,消耗内存少,占用更少的物理存储空间,但CPU消耗多,启动和运行速度慢
Art:在应用安装期间,将dex字节码翻译成机器码存储在设备中,优点是不需要即时编译,启动运行速度快,缺点是占用更大的存储空间

以上是关于Android各版本虚拟机的Dexopt区别的主要内容,如果未能解决你的问题,请参考以下文章

JVM虚拟机与Android虚拟机

JVM虚拟机与Android虚拟机

Dalvik 和 ART 有什么区别?深扒 Android 虚拟机发展史,真相却出乎意料!

Java虚拟机和Dalvik虚拟机的区别

jdk和java虚拟机的区别

Dalvik和ART虚拟机的区别