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