https://www.jianshu.com/p/389911e2cdfbandroid
https://www.jianshu.com/p/a468e714aca7git
ODEX是安卓上的應用程序apk中提取出來的可運行文件,即將APK中的classes.dex文件經過dex優化過程將其優化生成一個·odex文件單獨存放,原APK中的classes.dex文件會保留。github
優化是依據當前ROM的特性進行的,會減小不少冗餘信息,和當前ROM強相關,優化後,文件減少不少。加載快,運行快。優化發生在手機從出產狀態到第一次啓動的過程。app
這樣作能夠加快軟件的啓動速度,預先提取,減小對RAM的佔用,由於沒有odex的話,系統要從apk包中提取dex再運行。(只有dex,也是隻有在第一次程序運行時,啓動會慢些;由於要解壓獲得dex文件,解壓出來的dex文件會存儲下來,系統應用和普通應用存儲位置不一樣。然後再加載到內存。後面再啓動時,會直接將存儲的dex文件加載到內存中)。框架
odex , vdex ,art 文件區別
1.vdex(Android O開始加入的)編輯器
package 直接轉化的 可執行二進制碼 文件:函數
1.第一次開機就會生成在/system/app/<packagename>/oat/ 下;優化
2.在系統運行過程當中,虛擬機將其 從 「/system/app」 下 copy 到 「/data/davilk-cache/」 下spa
2.odex 調試
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 )
3.art
odex 進行優化 生成的 可執行二進制碼 文件,主要是apk 啓動的熱點函數相關地址的記錄,方便尋址相關;
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 文件也變化了。
反編譯vdex文件
華爲mate10使用了最新的android o,並進行了預編譯,而後baksmali如今還不支持androido,致使反編譯困難,因而本身動手diy一、adb pull /system/framework,把整個框架的代碼pull 出來,特別是arm64目錄下的vdex文件二、從vdex文件扣出dex文件,並構成jar文件,這一步可使用16進制編輯器,找到dex\n035開頭的magic,並把日後的內容導出成一個classes.dex文件,而後並壓縮到jary誰的中,注意,boot-framework.vdex裏,包括兩個dex文件三、adb pull /system/app/iaware/oat/arm64/base.vdex,pull出預編譯後的vdex代碼,並扣出dex文件四、下載baksmali源碼,編譯並調試執行baksmali d –x base.vdex –d <2中生成的framework的.jar目錄>五、哪裏錯了改哪裏,還要把華爲的bootclasspath替換掉本來的bootclasspath,或者直接使用https://github.com/lcweik/smali六、再執行一下baksmali d –x base.vdex –d<2中生成的framework的.jar目錄>,所有都反編譯出來了,保存在out目錄,再 smali a out –o base.dex,就好了。