Apk在安裝(installer)時,就會進行驗證和優化,目的是為了校驗代碼合法性及優化代碼執行速度,參見Dalvik Optimization and Verification Withdexopt。
驗證和優化后,會產生ODEX文件,運行Apk的時候,直接加載ODEX,避免重復驗證和優化,加快了Apk的響應時間。
先來看一張ODEX文件的結構圖:
ODEX文件的結構圖
下面將圍繞這張圖,結合dexopt的代碼,說明ODEX的生成過程。
一. 首先將一個空的DexOptHeader寫入ODEX文件
dexOptCreateEmptyHeader(cacheFd)
二. 從Apk中提取classes.dex,追加到ODEX文件
dexZipExtractEntryToFile(&zippy, zipEntry, cacheFd)
此時文件結構是這樣的:
三. 修改Dex內容
rewriteDex(((u1*) mapAddr) + dexOffset, dexLength, doVerify, doOpt, &pClassLookup, NULL)
這一步是驗證和優化的核心,具體見:
verifyAndOptimizeClasses(pDvmDex->pDexFile, doVerify, doOpt)... verifyAndOptimizeClass(pDexFile, clazz, pClassDef, doVerify, doOpt)...dvmVerifyClass(clazz)...dvmOptimizeClass(clazz, false)
其中dvmVerifyClass和dvmOptimizeClass都是針對類中的方法,具體做了哪些事情參考源碼。
四. 因為3修改了Dex內容,所以要重新計算Dex的checksum
updateChecksum(dexAddr, dexLength, pHeader)
五. 往ODEX文件后面追加Dependenices內容
writeDependencies(fd, modWhen, crc)
所謂的Dependenicies,是指Dex文件之間的依賴,比如App會依賴于framework的Dex。當framework的Dex發生變化時,App的ODEX文件將失效,需要重新生成。 writeDependencies中將bootclasspath下的dex文件都加入到依賴中。 此時文件結構是這樣的:
六. 將優化的其他內容追加到ODEX文件
writeOptData(fd, pClassLookup, pRegMapBuilder)
其中按照不同類型的內容,分為三個chunk寫入:
writeChunk(fd, (u4) kDexChunkClassLookup, pClassLookup, pClassLookup->size)writeChunk(fd, (u4) kDexChunkRegisterMaps, pRegMapBuilder->data, pRegMapBuilder->size)writeChunk(fd, (u4) kDexChunkEnd, NULL, 0)
此時的文件結構是這樣的:
其中:
dexCreateClassLookup(pDvmDex->pDexFile)
此處根據Dex生成了pClassLookup,pClassLookup你可以簡單理解為一張hash表,里面保存了classDescriptor到classDef的映射。
dvmGenerateRegisterMaps(pDvmDex)
此處根據DvmDex生成了RegisterMaps,RegisterMaps的作用是為了標記方法中寄存器引用的對象,在快速GC時,不會釋放這些對象。具體參考Dalvik虛擬機中RegisterMap結構解析
七. 根據所有的內容,改寫第一步中DexOptHeader的相關字段值。
至此,ODEX文件完整生成。
參考資料:
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
為什么蘋果的App Store接受不到應用的更新?你好可能會是可以設置不正確的導致,建議您重新你的操作設置。iphone手機app store設置更新的操作為:目標:然后點擊桌面“系統設置”圖標。第二步:中,選擇“itunes store和app store”:第二步:登錄賬戶后,把“更新”選項打開即可。itunes store 與app store無法開啟?出現該情況后,我們可能無法從App S...
DNF銀錠有什么用?等級40以上的戰士可以在赫頓馬爾廣場加入NPC喬安費瑞諾進入地下城。也可以通過入場券進入地下城。進入地下城后,玩家可以自行選擇基礎護送物資【銅錠】。還可以加上其他地下城獲得的【銅錠】【銀錠】【金錠】。dnf金錠有什么用:用金錠,銀錠等。用金幣換票。加了他們之后,通關后獎勵會更高。f如何獲得鏢局的金元寶:1。根據護送物資的價值獲得不同的獎勵。護送成功后會發放獎勵【護送證書】。其他...
魔獸世界,美服,歐服,選擇?歐服和美服基本沒有本質區別,都是暴雪最重視的領域,環境基本相同。然而,大多數美國服裝講英語。選擇換公會的時候,不需要考慮語言問題,但是歐服里有一些公會只使用小語種。接下來,你要考慮你的時差。這個要看你的位置了。估計你不想只在他們人最少的時候上線。以下問題要求您選擇特定的服務器。首先,你要考慮你是想去PVP還是PVE服務器。PVE服務器一直都是超過PVP的,無論是數量還是...