1.dex文件格式
dex是android虛擬機(jī)的可執(zhí)行字節(jié)碼文件,java文件經(jīng)過javac編譯成class文件,class文件又被dx處理后生成dex文件。
dex文件分為四大部分: DEX文件頭,索引結(jié)構(gòu)區(qū),data數(shù)據(jù)區(qū),靜態(tài)鏈接數(shù)據(jù)區(qū)。
所有的代碼和數(shù)據(jù)都放在data數(shù)據(jù)區(qū)中,索引結(jié)構(gòu)區(qū)中存放的是data中各種數(shù)據(jù)的對(duì)應(yīng)的偏移和索引。
利用010查看一個(gè)dex文件的信息,可以發(fā)現(xiàn)此文件并沒有靜態(tài)鏈接數(shù)據(jù)區(qū)。
2.odex和oat格式
在android4.4之前,android為了優(yōu)化程序執(zhí)行效率使用的是JIT(just-in-time)即時(shí)編譯,也就是程序運(yùn)行時(shí)編譯。因?yàn)閍pk文件是一個(gè)zip壓縮包的格式,每次系統(tǒng)啟動(dòng)程序時(shí)都需要從apk中讀取dex文件并加載執(zhí)行,為了減少程序啟動(dòng)時(shí)從apk讀取dex文件所需要的,android在apk第一次安裝的時(shí)候dexopt將程序的dex文件進(jìn)行優(yōu)化生成odex文件,并將其放在了/data/dalvik-cache目錄下。等下次apk啟動(dòng)時(shí)直接加載這個(gè)目錄中經(jīng)過優(yōu)化的odex文件減少啟動(dòng)所需要的時(shí)間(優(yōu)化基于當(dāng)前系統(tǒng)的dalvik虛擬機(jī)版本,不同版本上的odex文件無法進(jìn)行兼容)。在程序運(yùn)行時(shí)android虛擬機(jī)會(huì)對(duì)一些執(zhí)行頻率較高的熱點(diǎn)函數(shù)進(jìn)行jit編譯生成對(duì)應(yīng)的本地代碼,下次再執(zhí)行此函數(shù)的時(shí)候直接執(zhí)行對(duì)應(yīng)的本地代碼提高了執(zhí)行的效率,注意jit編譯的代碼只會(huì)存在于內(nèi)存中并不會(huì)持久化保存再磁盤中,下次啟動(dòng)apk后執(zhí)行此函數(shù)還需要解釋執(zhí)行。
在android4.4之后,android使用的是AOT(Ahead-of-time)事前編譯,也就是程序在運(yùn)行前先編譯。oat是ART虛擬機(jī)運(yùn)行的文件,是ELF格式二進(jìn)制文件,包含DEX和編譯的本地機(jī)器指令,oat文件包含DEX文件,因此比ODEX文件占用空間更大。程序在首次安裝的時(shí)候,dex2oat默認(rèn)會(huì)把classes.dex編譯成本地機(jī)器指令,生成ELF格式的OAT文件,并將其放在了/data/dalvik-cache或者是/data/app/packagename/目錄下。ART加載OAT文件后不需要經(jīng)過處理就可以直接運(yùn)行,它在編譯時(shí)就從字節(jié)碼裝換成機(jī)器碼了,因此運(yùn)行速度更快。不過android4.4之后oat文件的后綴還是odex,但是已經(jīng)不是android4.4之前的文件格式,而是ELF格式封裝的本地機(jī)器碼.可以認(rèn)為oat在dex上加了一層殼,可以從oat里提取出dex.
因?yàn)榇藭r(shí)的oat文件是一個(gè)標(biāo)準(zhǔn)的elf文件,識(shí)別其是不是oat文件的標(biāo)準(zhǔn)就是看其符號(hào)表。
oatdata指向的是ELF文件的.rodata節(jié)區(qū),存放了OAT文件頭OATHeader,OAT的DEX文件頭,原始DEX文件的DexFile等信息。
oatexec指向的是ELF文件的.text節(jié)區(qū),這里存放的是編譯生成的指定平臺(tái)的二進(jìn)制代碼。
oatlastword指向的是對(duì)應(yīng)oat文件的結(jié)尾。
3.vdex文件格式
在android8.0(Android O)之前dex文件嵌入到oat文件本身中,在Android 8.0之后dex2oat將classes.dex優(yōu)化生成兩個(gè)文件oat文件(.odex)和vdex文件(.vdex)
odex文件中包含了本機(jī)代碼的OAT
vdex文件包含了原始的DEX文件副本
4.art文件格式
ART虛擬機(jī)在執(zhí)行dex文件時(shí),需要將dex文件中使用的類,字符串等信息轉(zhuǎn)換為自定義的結(jié)構(gòu)。art文件就是保存了apk中使用的一些類,字符串等信息的ART內(nèi)部表示,可以加快程序啟動(dòng)的速度。
審核編輯:湯梓紅
-
Android
+關(guān)注
關(guān)注
12文章
3926瀏覽量
127158 -
文件格式
+關(guān)注
關(guān)注
0文章
19瀏覽量
15077 -
程序
+關(guān)注
關(guān)注
116文章
3778瀏覽量
80858 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
908瀏覽量
28109
原文標(biāo)題:Android的dex、odex、oat、vdex、art文件格式
文章出處:【微信號(hào):哆啦安全,微信公眾號(hào):哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論