电竞比分网-中国电竞赛事及体育赛事平台

分享

Android Kitkat系列文章—OAT文件分析—Part1

 老匹夫 2014-02-22

Android Kitkat系列文章—OAT文件分析—Part1

分享到: 3


本文由 ImportNew - Peter Pan 翻譯自 google。如需轉(zhuǎn)載本文,請先參見文章末尾處的轉(zhuǎn)載要求。

這是關(guān)于Android最新版本Kitkat系列文章的第一篇,我把它們寫在了+novex Gmbh上面。這個系列將帶你從(系統(tǒng))開發(fā)人員的角度深入理解Kitkat的內(nèi)部機(jī)制以及相比之前版本的變化。這里會從新的運(yùn)行時ART(Android Runtime)開始。

1、引擎檢視:什么是ART

Kitkat最令人興奮、卻也最少見諸報端的特性之一就是ART,這個處于試驗階段的最新運(yùn)行時。Google并沒有發(fā)布太多有關(guān)ART的信息(http:///9Jzgdo),盡管事實上它已經(jīng)出現(xiàn)了。然而,我覺得這個特性可能對未來的發(fā)布產(chǎn)生巨大的影響,因為有了ART后Android將不再理會執(zhí)行過的dalvik字節(jié)碼,轉(zhuǎn)而使用一種平臺特有的、提前編譯(AOT,ahead-of-time)二進(jìn)制碼。

Dalvik虛擬機(jī)遵循傳統(tǒng)Java虛擬機(jī)的運(yùn)行方式:源碼編譯成平臺無關(guān)的字節(jié)碼,隨后字節(jié)碼立即編譯成機(jī)器碼(JIT-Just in time編譯)。ART使用了另一種實現(xiàn)方式:它使用AOT范例將代碼編譯成前期執(zhí)行的本地代碼。但是,這是如何實現(xiàn)的呢?

鑒于在Android市場上基于當(dāng)前三大不同的體系結(jié)構(gòu)(MIPS,x86,ARM)催生了多種多樣的平臺,應(yīng)用程序之間相互可移植性(inter-portability)變得十分重要。他們不得不找到一種方式整合兩個世界:互相可移植性和執(zhí)行本地二進(jìn)制代碼。就目前所知,他們的解決方案在移動領(lǐng)域是獨(dú)一無二的:將中間字節(jié)碼裝運(yùn)成可執(zhí)行代碼,然后在目標(biāo)設(shè)備上執(zhí)行最后的編譯步驟——“提前編譯”。

對ART進(jìn)一步的觀察顯示:他們在最后的編譯步驟中使用了LLVM。這種對本地代碼的編譯處理過程在安裝應(yīng)用時可以流暢地完成。

除此之外,Android小組還面臨著一個額外的挑戰(zhàn):兼容業(yè)已存在的Dalvik虛擬機(jī)/DEX技術(shù)。為了處理這個問題,他們引入了一種把dex格式轉(zhuǎn)變成新的oat格式的方法。請繼續(xù)閱讀獲取更多的細(xì)節(jié):

2、啟動的故事:從dex到oat

讓我們來探究一下Android是如何在不必重新發(fā)布應(yīng)用的情況下,基于ART執(zhí)行業(yè)已存在的程序。

在接下來的步驟中,我將使用一些新工具,他們伴隨新的運(yùn)行時一起出現(xiàn):dex2oat和oatdump。這兩個工具可以在<aosproot>out/host/<yourplatform>/bin/dex2oat中找到。除此之外,還會用到一些常見的linux工具如objdump、nm、hexdump和hexedit。

從Dalvik運(yùn)行時轉(zhuǎn)換到ART之后,當(dāng)系統(tǒng)更新已經(jīng)安裝應(yīng)用時,啟動程序花費(fèi)了很長一段時間——大約有10分鐘。進(jìn)一步查看ADB輸出可以看到正在發(fā)生些什么:很顯然,dex2oat創(chuàng)建了某種“鏡像”。

1
I/art ( 123): GenerateImage: /system/bin/dex2oat --image=/data/dalvik-cache/system@framework@boot.art@classes.dex--runtime-arg-Xms64m--runtime-arg-Xmx64m--dex-file=/system/framework/core-libart.jar--dex-file=/system/framework/conscrypt.jar--dex-file=/system/framework/okhttp.jar--dex-file=/system/framework/core-junit.jar--dex-file=/system/framework/bouncycastle.jar--dex-file=/system/framework/ext.jar--dex-file=/system/framework/framework.jar--dex-file=/system/framework/framework2.jar--dex-file=/system/framework/telephony-common.jar--dex-file=/system/framework/voip-common.jar --dex-file=/system/framework/mms-common.jar --dex-file=/system/framework/android.policy.jar --dex-file=/system/framework/services.jar --dex-file=/system/framework/apache-xml.jar --dex-file=/system/framework/webviewchromium.jar --oat-file=/data/dalvik-cache/system@framework@boot.art@classes.oat--base=0x60000000--image-classes-zip=/system/framework/framework.jar--image-classes=preloaded-classes

system_server啟動后在log中顯示為“art”的這個進(jìn)程,通過dex2oat工具創(chuàng)建了一個巨大的“鏡像”文件。命令行參數(shù)映射包含下面幾部分:

  • 虛擬機(jī)的一些運(yùn)行時參數(shù)。
  • 將被編譯成鏡像的幾個dex文件。
  • 輸出的鏡像文件名。
  • 輸出的oat文件名。
  • 一個包含應(yīng)被編譯成鏡像的類的jar文件。
  • 一個描述了哪些來自jar文件的類應(yīng)該被使用的說明。

在創(chuàng)建鏡像期間,所有已包含在內(nèi)的dex文件會被編譯。例如:

1
W/dex2oat ( 397): Verification of void org.ccil.cowan.tagsoup.HTMLSchema.<init>() took 187.968ms

看起來很熟悉,對不對?記得dalvik驅(qū)動環(huán)境中的zygote吧?基本情況是,樣版鏡像運(yùn)行了事實上的應(yīng)用、代碼以及那些被頻繁使用的類??梢悦鞔_的是,xygote沒有被取代,它依然存在于ART環(huán)境中,你可以用跟dalvik一樣的方式來處理它。

在更早的啟動過程中,包管理器在每一個已安裝的應(yīng)用中運(yùn)行dexopt。但除此之外,dex2oat編譯器會把每一個已經(jīng)產(chǎn)生的dex文件編譯成oat文件。

1
2
I/PackageManager( 559): Running dexopt on: com.android.inputmethod.latin
I/dex2oat ( 918): dex2oat: /data/dalvik-cache/system@app@LatinIME.apk@classes.dex

好吧?,F(xiàn)在讓我們總結(jié)一下目前為止我們所了解到的內(nèi)容:我們知道ART使用了zygote,就像鏡像一樣,之后很可能執(zhí)行了實際的應(yīng)用程序。同時它也進(jìn)行了大量的編譯,甚至是對框架類的編譯。這意味著著從字面上看,我們熟知的Android整個系統(tǒng)都被改變了。我認(rèn)為這是一個暗示:ART不僅僅是一個“更好的Dalvik”——還意味著范例上的一個改變。

但是現(xiàn)在,我已經(jīng)開始準(zhǔn)備該系列的下一篇。在下一篇中我們將進(jìn)一步查看這種新的可執(zhí)行文件格式:OAT文件分析。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多