dex、vdex、.odex与.oat

简介: dex、vdex、.odex与.oat

dex、vdex、.odex与.oat文件介绍

1、dex文件

在我们写Java代码的时候,生成的文件是.java文件。

对于PC上的java虚拟机(JVM)运行的是.class。

.java文件转成.class文件,需要jdk工具,转换命令:

javac xxxx.java

关于JVM虚拟机

为了使代码和平台无关,JAVA开发了 JVM,即 Java 虚拟机。它为每一个平台开发一个 JVM,也就意味着 JVM 是和平台相关的。Java 编译器将 .java 文件转换成 .class文件,也就是字节码。最终将字节码提供给 JVM,由 JVM 将它转换成机器码。

在Android端,Android上的Davlik虚拟机是运行.dex。所以还得将.class转成dex文件,即dex文件就是Android Dalvik虚拟机运行的程序。

.class转成dex文件 需要使用dx.bat工具,dx.bat工具在Android SDK中build-tools目录中可以找到,转换命令:

dx --dex --output = C:\output.dex C:\test

其中C:\output.dex表示输出文件,C:\test表示原文件的路径名。

关于Dalvik虚拟机

Dalvik是Google公司自己设计用于Android平台的虚拟机,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

很长时间以来,Dalvik虚拟机一直被用户指责为拖慢安卓系统运行速度不如IOS的根源。

2014年6月25日,Android L 正式亮相于召开的谷歌I/O大会,Android L 改动幅度较大,谷歌将直接删除Dalvik,代替它的是传闻已久的ART。

关于ART

Dalvik 使用 JIT(Just in time)编译,而 ART 使用 AOT(Ahead of time)编译。Android 7.0 向 ART 中添加了一个 just-in-time(JIT)编译器,这样就可以在应用运行时持续的提高其性能。

ART 和 Dalvik 一样使用的是相同的 DEX 字节码。编译好的应用如果使用 ART 在安装时需要额外的时间用于编译,同时还需要更多的空间用于存储编译后的代码。

由于 ART 直接运行的是应用的机器码(native execution),它所占用的 CPU 资源要少于 使用 JIT 编译的 Dalvik。由于占用较少的 CPU 资源也就消耗更少的电池资源。

关于JIT (Just In Time )

使用 Dalvik JIT 编译器,每次应用在运行时,它实时的将一部分 Dalvik 字节码翻译成机器码。在程序的执行过程中,更多的代码被被编译并缓存。由于 JIT 只翻译一部分代码,它消耗的更少的内存,占用的更少的物理存储空间。

关于AOT(Ahead Of Time)

ART 内置了一个 Ahead-of-Time 编译器。在应用的安装期间,他就将 DEX 字节码翻译成机器码并存储在设备的存储器上。这个过程只在将应用安装到设备上时发生。由于不再需要 JIT 编译,代码的执行速度要快得多。

常规的反编译dex流程:

1、拿到apk文件,然后解压 ,得到 class.dex 文件

2、用dex2jar 把 class.dex 还原成 classes-dex2jar.jar 文件

3、用 jd-gui.exe 把 classes-dex2jar.jar 文件打开,就可以看到源码了。

2、vdex文件

在讲odex之前,需要先讲vdex(Android O开始加入的)

package直接转化的 可执行二进制码 文件:

1.第一次开机就会生成在/system/app/<packagename>/oat/下;

2.在系统运行过程中,虚拟机将其 从“/system/app”下 copy到“/data/davilk-cache/”下

为何要搞出个vdex文件

目的不是为了提升性能,而是为了避免不必要的验证Dex 文件合法性的过程,例如首次安装时进行dex2oat时会校验Dex 文件各个section的合法性,这时候使用的compiler filter 为了照顾安装速度等方面,并没有采用全量编译,当app盘启动后,运行一段时间后,收集了足够多的jit 热点方法信息,Android会在后台重新进行dex2oat, 将热点方法编译成机器代码,这时候就不用再重复做验证Dex文件的过程了,

3、odex文件

odex是优化版的dex。

在Android N之前,Dalvik虚拟机执行程序dex文件前,系统会对dex文件做优化,生成可执行文件odex,保存到data/dalvik-cache目录,最后把apk文件中的dex文件删除。

在Android O之后,odex是从vdex这个文件中 提取了部分模块生成的一个新的 可执行二进制码 文件 , odex从vdex中提取后,vdex的大小就减少了。具体过程:

1.第一次开机就会生成在/system/app/<packagename>/oat/下

2.在系统运行过程中,虚拟机将其 从“/system/app”下 copy到 “/data/davilk-cache/”下

3.odex + vdex = apk的全部源码 (vdex并不是独立于odex的文件,odex + vdex才代表一个apk)

4、oat文件

ART虚拟机使用的是oat文件,oat文件是一种Android私有ELF文件格式,它不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容。APK在安装的过程中,会通过dex2oat工具生成一个OAT文件。对于APK来说,oat文件实际上就是对odex文件的包装,即oat=odex,而对于一些framework中的一些jar包,会生成相应的oat尾缀的文件,如system@framework@boot-telephony-common.oat。


目录
相关文章
|
存储 缓存 算法
zram:基于压缩的RAM块设备 【ChatGPT】
zram:基于压缩的RAM块设备 【ChatGPT】
1232 0
|
编解码 监控 API
Android HAL深入探索(6): HIDL 添加SELinux 完整调试过程
Android HAL深入探索(6): HIDL 添加SELinux 完整调试过程
2919 0
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
1399 0
安卓系统调试与优化:(一)bootchart 的配置和使用
|
Android开发 Java C++
带你读《深入理解Android:Java虚拟机ART》之一:本书必读
本书将关注Android系统中至关重要的部分——Java虚拟机ART。随着Android设备的大规模普及,ART虚拟机已经成为当今使用最为广泛的JVM之一。所以,对ART虚拟机进行研究有着非同寻常的意义。本书的出现在一定程度上填补了这方面的空白。
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
1240 1
|
Shell Android开发
Android设置语言
Android设置语言
524 1
|
缓存 编解码 安全
Android经典面试题之Glide的缓存大揭秘
Glide缓存机制包括内存和硬盘缓存。内存缓存使用弱引用的ActiveResources和LRU策略,硬盘缓存利用DiskLruCache。Engine.load方法首先尝试从内存和弱引用池加载,然后从LRU缓存中加载图片,增加引用计数并移出LRU。若缓存未命中,启动新任务或加入现有任务。内存大小根据设备内存动态计算,限制在0.4以下。DiskLruCache使用自定义读写锁,保证并发安全,写操作通过锁池管理,确保高效。
584 0
|
存储
Android10.0 最近任务Recents功能分析(下)
Android10.0 最近任务Recents功能分析(下)
3253 0
Android10.0 最近任务Recents功能分析(下)