apk
APK(Android package):android安裝包,由aapt(Android Assert Packaging Tool)把AndroidManifest.xml、資源文件、dex(二進制字節碼)文件組合而成。將apk文件修改擴展名為rar,然后解壓可已看到目錄如下:
METE-INF:存放應用簽名證書等信息
res:存放資源文件
AndroidManifest.xml:應用配置文件
classes.dex:應用程序二進制字節碼文件
resources.arsc:二進制資源文件
dex
dex(Dalvik VM Excutors):Dalvik虛擬機執行程序,執行前需要優化
vdex
android O 新增的格式包,dex代碼 直接轉化的 可執行二進制碼 文件:
1.第一次開機就會生成在/system/app/<packagename>/oat/ 下;
2.在系統運行過程中,虛擬機將其 從 “/system/app” 下 copy 到 “/data/davilk-cache/” 下
odex
在Android N 之前,Dalvik虛擬機執行程序dex文件前,系統會對dex文件做優化,生成可執行文件odex,保存到data/dalvik-cache目錄,最后把apk文件中的dex文件刪除。
優點:
1.減少了啟動時間(省去了系統第一次啟動應用時從apk文件中讀取dex文件,并對dex文件做優化的過程。)和對RAM的占用(apk文件中的dex如果不刪除,同一個應用就會存在兩個dex文件:apk中和data/dalvik-cache目錄下)。
2.防止第三方用戶反編譯系統的軟件(odex文件是跟隨系統環境變化的,改變環境會無法運行;而apk文件中又不包含dex文件,無法獨立運行)。
在Android O 之后,odex 是從vdex 這個文件中 提取了部分模塊生成的一個新的 可執行二進制碼 文件 , odex 從vdex 中提取后,vdex 的大小就減少了。
1.第一次開機就會生成在/system/app/<packagename>/oat/ 下
2.在系統運行過程中,虛擬機將其 從 “/system/app” 下 copy 到 “/data/davilk-cache/” 下
3.odex + vdex = apk 的全部源碼 (vdex 并不是獨立于odex 的文件 odex + vdex 才代表一個apk )
art
odex 進行優化 生成的 可執行二進制碼 文件,主要是apk 啟動的常用函數相關地址的記錄,方便尋址相關; 通常會在data/dalvik-cache/保存常用的jar包的相關地址記錄。
1.第一次開機不會生成在/system/app/<packagename>/oat/ 下,以后也不會;
2.odex 文件在運行時,虛擬機會計算函數調用頻率,進行函數地址的修改;
3.最后在/data/davilk-cache/ 由虛擬機生成;
4.生成art 文件后,/system/app 下的odex 和 vdex 會無效,即使你刪除,apk也會正常運行
5.push 一個新的apk file 覆蓋之前/system/app 下apk file ,會觸發PKMS 掃描時下發force_dex flag ,強行生成新的vdex 文件 ,覆蓋之前的vdex 文件,由于某種機制,這個新vdex 文件會copy到/data/dalvik-cache/下,于是art 文件也變化了。
oat
ART虛擬機使用的是oat文件,oat文件是一種Android私有ELF文件格式,它不僅包含有從DEX文件翻譯而來的本地機器指令,還包含有原來的DEX文件內容。APK在安裝的過程中,會通過dex2oat工具生成一個OAT文件。對于apk來說,oat文件實際上就是對odex文件的包裝,即oat=odex,而對于一些framework中的一些jar包,會生成相應的oat尾綴的文件,如system@framework@boot-telephony-common.oat。
QA
- Android 5.0開始,默認已經使用ART,棄用Dalvik了,app會在安裝時被編譯成OAT文件,(ART上運行的格式)ODEX還有什么用呢? Google權威的回答:
Dex file compilation uses a tool called dex2oat and takes more time than dexopt. The increase in time varies, but 2-3x increases in compile time are not unusual. For example, apps that typically take a second to install using dexopt might take 2-3 seconds.
DEX轉換成OAT的這個過程是5.0以上系統用戶在安裝程序或是刷入ROM、增量更新后首次啟動時必然執行的。 按照Google的說法,相比做過ODEX優化,未做過優化的DEX轉換成OAT要花費更長的時間,比如2-3倍。 比如安裝一個odex優化過的程序假設需要1秒鐘,未做過優化的程序就需要2~3秒。 由此可見,雖然dalvik被棄用了,但ODEX優化在Android 5.0系統以上依舊起著作用。 ODEX優化事實上是由一個叫做WITH_DEXPREOPT的參數控制的,開啟該參數后,會對APK、JAR以及內核鏡像進行優化。
其中,針對APK和JAR的最直觀的優化體現就是,程序的dex被轉換成odex。
- Android8.0引入的vdex?