哈嘍,大家好,我是LittleG。
雖然我主要是做底層驅(qū)動開發(fā),但平時經(jīng)常會看到android應(yīng)用編譯出來帶有odex, oat, vdex, art等后綴的文件,不明其義,比較困惑,所以專門查閱整理學(xué)習(xí)了下,寫篇文章記錄一下。
ref:
https://blog.csdn.net/u010164190/article/details/103328654
https://lief.quarkslab.com/doc/latest/tutorials/10_android_formats.html
有關(guān)odex, oat, vdex, art等后綴的文件說明:
1.dex java程序編譯成class后,dx工具將所有class文件合成一個dex文件,dex文件是jar文件大小的50%左右. 2.odex(Android5.0之前)全稱:Optimized DEX;即優(yōu)化過的DEX. Android5.0之前APP在安裝時會進行驗證和優(yōu)化,為了校驗代碼合法性及優(yōu)化代碼執(zhí)行速度,驗證和優(yōu)化后,會 產(chǎn)生ODEX文件,運行Apk的時候,直接加載ODEX,避免重復(fù)驗證和優(yōu)化,加快了Apk的響應(yīng)時間. 注意:優(yōu)化會根據(jù)不同設(shè)備上Dalvik虛擬機版本、Framework庫的不同等因素而不同,在一臺設(shè)備上被優(yōu)化過 的ODEX文件,拷貝到另一臺設(shè)備上不一定能夠運行。 3.oat(Android5.0之后) oat是ART虛擬機運行的文件,是ELF格式二進制文件,包含DEX和編譯的本地機器指令,oat文件包含DEX文件,因此比ODEX文件占用空間更大。 Android5.0以后在編譯的時候(此處指系統(tǒng)預(yù)制app,如果通過adb install或者商店安裝,在安裝時 dex2oat把dex編譯為odex的ELF格式文件)dex2oat默認會把classes.dex翻譯成本地機器指令,生成ELF格 式的OAT文件,ART加載OAT文件后不需要經(jīng)過處理就可以直接運行,它在編譯時就從字節(jié)碼裝換成機器碼了,因 此運行速度更快。不過android5.0之后oat文件還是以.odex后綴結(jié)尾,但是已經(jīng)不是android5.0之前的文件 格式,而是ELF格式封裝的本地機器碼.可以認為oat在dex上加了一層殼,可以從oat里提取出dex. 4.vdex Android8.0以后加入的,包含APK的未壓縮DEX代碼,另外還有一些旨在加快驗證速度的元數(shù)據(jù)。 5.art (optional) 包含APK中列出的某些字符串和類的ART內(nèi)部表示,用于加快應(yīng)用啟動速度。 注意:Android5.0以后在/data/dalvik-cache目錄下的.dex文件已經(jīng)不是android5.0之前的dex文件, 它是ELF文件,可以使用file命令查看如下: # file system@app@Camera2@Camera2.apk@classes.dex system@app@Camera2@Camera2.apk@classes.dex: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, stripped
以下是關(guān)于OAT的形成圖解:
ELF格式oat :
java to oat:
?