Android中dex odex oat vdex art文件格式区别
1. dex
dex是Android平台的可执行文件。java文件先编译成class文件(java字节码),再通过dx或d8工具转换成dex文件。
class文件时java虚拟机的可执行文件,与之相对的,dex文件是Dalvik虚拟机的可执行文件,dex文件中存放的自然就是Dalvik字节码。
Android应用安装包,即apk文件中就含有一个或多个dex文件,命名如下:
- classes.dex
- classes1.dex
- classes2.dex
- ……
2. odex
odex也是Android平台的可执行文件。
在Android 5之前(也许),为了加快应用的运行速度,对apk中的dex文件进行优化(优化工具:dexopt-wrapper),生成odex文件,保存在data/dalvik-cache目录下或与apk同目录下,并删除apk中的dex文件。之后运行程序时,直接加载odex文件,避免重复验证和优化。
不过在Android 5之后,.odex就不再是odex文件了,而是oat文件,用十六进制编辑器打开,可以发现文件头是”ELF”,即ELF文件格式。
3. oat
oat也是Android平台的可执行文件,是一种elf文件格式。
在Android 5之后,在安装apk的过程中,Android系统会对应用程序进行优化,使用dex2oat工具生成oat文件。它不仅包含dex文件的内容,也将一些Dalvik指令编译成了本地机器指令。
oat文件结构会随Android版本变化,且没有向后兼容性。oat文件结构可见http://romainthomas.fr/oat/。
4. vdex
vdex文件不是Android平台的可执行文件。
在Android 8之后加入的,vdex文件包含apk的未压缩dex代码,以及一些旨在加快验证速度的元数据,其目的主要是为了跳过verified流程,减少dex2oat执行时间。
同oat文件一样,vdex文件结构也会随Android版本变化,且没有向后兼容性。vdex文件结构可见https://romainthomas.fr/vdex/。
5. art
oat也是Android平台的可执行文件,是一种elf文件格式。
借助odex文件进行优化生成的,记录应用启动的热点函数相关地址,方便寻址。
同oat文件一样,art文件结构也会随Android版本变化,且没有向后兼容性。
参考:
https://lief-project.github.io/doc/latest/tutorials/10_android_formats.html
https://www.wuyifei.cc/dex-vdex-odex-art/
https://www.eefocus.com/article/525061.html
https://source.android.com/docs/core/runtime/configure?hl=zh-cn
https://medium.com/@_sushil/oat2dex-android-pentesting-6f99e9c57198
https://newandroidbook.com/files/ArtOfDalvik.pdf
https://newandroidbook.com/files/(里面有很多可以参考的pdf)
https://www.blackhat.com/docs/asia-15/materials/asia-15-Sabanal-Hiding-Behind-ART-wp.pdf