科普:Android 关于Dalvik和ART

时间:2022-03-19 17:42:26

关键字Dalvik,ART,dex,odex
(为什么叫科普呢,是尽量用通俗的语言而不是代码来阐述)

Pre:

  • Dalvik: Dalvik是Google公司自己设计用于Android平台的Java虚拟机它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。执行的是字节码,它是依靠Just-In-Time (JIT)机制去解释字节码
  • ART:即Android Runtime,google为了替代Dalvik专门为Android研发的。Android KK为开发者推出,L版本正式上线。比替代品更高效省电,执行的是本地机器码,依靠Ahead-Of-Time (AOT)机制

简化流程

先上个图
科普:Android 关于Dalvik和ART

Java的代码实际上需要两次“转换”才可以在android设备上运行,一次发生在开发者编译打包的时候,使用开发者PC的CPU将java代码解释为JVM可执行的.class字节码(bytecode),然后通过SDK的dex工具会将该文件统一处理为Dalvik可执行的.dex文件,再将.dex文件和二进制的资源文件等统一打包为.apk文件。

第二次是在手机上,应用安装时,系统会将dex文件优化(差不多就是优化类的检索寻址去冗余啊之类的),生成odex文件(这个过程由安装服务PackageManagerService请求守护进程installd来执行的),使用手机的CPU将优化过的.odex字节码解释执行为机器码

区别在于第二步。是在安装时就执行了操作3,执行的是使用dex2oat工具提取.dex优化为.odex的机器码,也叫作预编译;而dalvik是用户安装时提取dex优化为odex的字节码(注:后缀名同样是odex,但ART和Dalvik生成并执行的分别表示不同的含义,一个是机器码,一个是字节码,这样做的意义请参照文末),每次启动都需要执行将优化过的odex字节码再转换成机器码。

ART优缺

  • 系统性能大幅提升
  • App启动、运行更快
  • 减少每次启动的编译增加电池续航
  • 存储占用更大
  • 安装时间更长

注意

无论是步骤1对dex字节码进行优化,还是步骤3将dex字节码翻译成本地机器码,最终得到的结果都是保存在相同名称的一个odex文件里面的。虽然名字后缀都是odex,但是前者对应的是一个odex文件(表示这是一个优化过的dex),后者对应的是一个oat文件(实际上是一个自定义的elf文件,里面包含的都是本地机器指令)。这样保证统一后缀的作用是,原来任何通过绝对路径引用了该odex文件的代码就都不需要修改了

第一次用markdown,这篇也是我的个人笔记吧,详细的流程可参照这篇Android ART运行时无缝替换Dalvik虚拟机的过程分析

转载请注明出处,谢谢