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