Android ART機(jī)制分析

摘自:http://www.2cto.com/kf/201401/270288.html
一、Android系統(tǒng)性能提升之路

Dalvik虛擬機(jī)作為Android平臺(tái)的核心組成部分之一,允許在有限的內(nèi)存資源中同時(shí)運(yùn)行多個(gè)虛擬機(jī)實(shí)例。Dalvik虛擬機(jī)通過(guò)以下方式提升性能:
1、DEX代碼安裝時(shí)或第一次動(dòng)態(tài)加載時(shí)odex化處理。
2、Android2.2版本提供了JIT機(jī)制提升性能,號(hào)稱性能提升3~5倍。
3、提升硬件配置,如更多核CPU、更高頻率CPU、更大的RAM等。

但是Android的系統(tǒng)流暢度與IOS系統(tǒng)還是有一定得差距。Android代碼必須運(yùn)行在Dalvik虛擬機(jī)上,而IOS直接是本地代碼,性能差距也在情理之中。如果Android系統(tǒng)想擁有與IOS系統(tǒng)相同的系統(tǒng)性能。Dalvik虛擬機(jī)運(yùn)行機(jī)制就成為Android系統(tǒng)性能提升唯一的障礙。
Android Kitkat 提供了一種與Dalvik截然不同的運(yùn)行環(huán)境-ART(Android Runtime)的支持。目前用戶可以選擇設(shè)備的運(yùn)行環(huán)境,在不久的將來(lái)ART肯定會(huì)替代Dalvik Runtime。

二、Dalvik vs ART
Dalvik運(yùn)行環(huán)境使用JIT(Just-In-Time)來(lái)進(jìn)行轉(zhuǎn)譯,應(yīng)用每次運(yùn)行的時(shí)候,字節(jié)碼都需要通過(guò)JIT轉(zhuǎn)換為機(jī)器碼,這會(huì)拖慢應(yīng)用的運(yùn)行效率。而ART則是使用AOT進(jìn)行處理(Ahead-Of-Time),并會(huì)在應(yīng)用程序安裝完畢時(shí),進(jìn)行預(yù)先的基礎(chǔ)性編譯作業(yè),這就減去了JIT運(yùn)行時(shí)的機(jī)器碼轉(zhuǎn)化時(shí)間,應(yīng)用的啟動(dòng)和執(zhí)行都會(huì)變得更加快速。ART優(yōu)點(diǎn):1、系統(tǒng)性能的顯著提升。2、應(yīng)用啟動(dòng)更快、運(yùn)行更快、體驗(yàn)更流暢、觸感反饋更及時(shí)。3、更長(zhǎng)的電池續(xù)航能力。
4、支持更低的硬件。
ART缺點(diǎn):1、更大的存儲(chǔ)空間占用,可能會(huì)增加10%-20%。2、更長(zhǎng)的應(yīng)用安裝時(shí)間。

總的來(lái)說(shuō)ART的功效就是“空間換時(shí)間”。

三、初步感知ART

1、設(shè)備如何選擇ART運(yùn)行環(huán)境

通過(guò)以下步驟開(kāi)啟:設(shè)置→關(guān)于手機(jī)→點(diǎn)擊最下面的版本號(hào)7次→開(kāi)發(fā)者模式出現(xiàn)→返回→進(jìn)入開(kāi)發(fā)者模式,然后選擇runtime-使用ART
目前官方Android模擬器并不能開(kāi)啟ART模式,可以通過(guò)該網(wǎng)址下載支持ART模式的Android模擬器鏡像 ( http://blog.csdn.net/coolypf/article/details/17069015

2、Dalvik切換ART后系統(tǒng)變化

2.1、應(yīng)用安裝時(shí)采用的代碼優(yōu)化方式不同:
Dalvik Runtime : dex2opt(http://124.16.139.131:24080/lxr/source/dalvik/dexopt/OptMain.cpp?v=android-4.0.4#f_OptMain.cpp
ART Runtime : dex2oat (https://android.googlesource.com/platform/art/+/kitkat-release/dex2oat/dex2oat.cc)

/

2.2、優(yōu)化后的文件大小及格式不同:
兩個(gè)運(yùn)行環(huán)境產(chǎn)生的優(yōu)化代碼路徑及文件名都為:/data/dalvik-cache/app/data@app@{package name}.apk@classes.dex
ART環(huán)境產(chǎn)生的優(yōu)化代碼文件大小明顯比Dalvik環(huán)境產(chǎn)生大:
[圖片上傳中。。。(2)]

雖然都為.dex文件結(jié)尾,但是文件格式卻是天壤之別:
ART環(huán)境文件格式:ELF Shared Object
[圖片上傳中。。。(3)]

Dalvik環(huán)境文件格式:
[圖片上傳中。。。(4)]

三、ART相關(guān)源代碼

ART相關(guān)源代碼下載地址:(https://android.googlesource.com/platform/art/+archive/kitkat-release.tar.gz
從源代碼文件目錄名稱可以很清楚的了解各文件夾中相關(guān)文件的功能,我們最關(guān)心的主要有compiler、dex2oat、runtime三個(gè)文件夾:
compiler:主要負(fù)責(zé)Dalvik字節(jié)碼到本地代碼的轉(zhuǎn)換,編譯為libart-compiler.so
dex2oat :完成DEX文件到ELF文件轉(zhuǎn)換。編譯為dex2oat
runtime :Android ART運(yùn)行時(shí)源代碼,編譯為libart.so
[圖片上傳中。。。(5)]

四、dex2oat優(yōu)化流程

在應(yīng)用安裝時(shí),installd通過(guò)dex2oat優(yōu)化APK安裝包c(diǎn)lasses.dex的Dalvik字節(jié)碼為本地機(jī)器代碼。整個(gè)優(yōu)化為:

[圖片上傳中。。。(6)]

更多LLVM編譯器的信息可查看:
http://llvm.org/
http://www.ibm.com/developerworks/cn/opensource/os-createcompilerllvm1/
http://www.chinaicexpo.com/market/1104-llvm.html

五、OAT文件格式

OAT文件其實(shí)就是基于ELF格式的一種私有文件格式。

OAT的ELF 段信息:


/

OAT的ELF export信息:
[圖片上傳中。。。(8)]

OAT文件加載流程,通過(guò)分析ART相關(guān)源碼,當(dāng)通過(guò)DexClassLoader加載一個(gè)OAT文件基本流程如下:
1、讀取oatdata符號(hào)地址獲取Oat數(shù)據(jù) startAddress。
2、讀取oatlastword符號(hào)地址獲取OAT數(shù)據(jù) endAddress。
3、通過(guò)startAddress和endAddress定位Oat數(shù)據(jù)。
4、解析Oat數(shù)據(jù)。構(gòu)建方法定位所需數(shù)據(jù)結(jié)構(gòu)。
然后就可以調(diào)用加載OAT文件的代碼了。

整個(gè)的方法定位過(guò)程和Dalvik運(yùn)行環(huán)境沒(méi)有太大區(qū)別,讀者可以通過(guò)(http://blog.csdn.net/androidsecurity/article/details/8664778)來(lái)了解如何定位到一個(gè)類的某個(gè)方法。
您可以簡(jiǎn)單的認(rèn)為ART和Dalvik區(qū)別就是:Dalvik定位到的方法是Davlik字節(jié)碼,但是ART定位到的方法是本地代碼。僅是方法代碼內(nèi)容發(fā)生了變化,但是方法的定位過(guò)程基本相同。

我們以關(guān)鍵的地址點(diǎn)為分割截取OAT文件數(shù)據(jù)段:
ELF頭:


/

OAT數(shù)據(jù)內(nèi)容開(kāi)始:(注意0x10BB位置,DexHeader開(kāi)始)
[圖片上傳中。。。(10)]
可執(zhí)行本地代碼部分:


/

OAT數(shù)據(jù)結(jié)束位置:
/

具體的OAT文件格式可以查看源代碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,001評(píng)論 25 709
  • 兩年前阿里開(kāi)源了Dexposed 項(xiàng)目,它能夠在Dalvik上無(wú)侵入地實(shí)現(xiàn)運(yùn)行時(shí)方法攔截,正如其介紹「enable...
    weishu閱讀 4,807評(píng)論 3 42
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,861評(píng)論 2 45
  • 時(shí)間飛逝,離上次的日記過(guò)了一年了竟然。這一年,發(fā)生了太多事,你有了新戀情,現(xiàn)在也失去了戀情。我呢?還是一個(gè)人飄著,...
    一會(huì)兒閱讀 194評(píng)論 0 1
  • 文、圖/蓋是那么美 秋風(fēng)起,秋意濃如碧妝如燦金如丹霞如玉帶纏腰層層疊疊,曲曲折折,縈縈繞繞秋色撩人心 用心作畫(huà),開(kāi)...
    蓋是那么美閱讀 686評(píng)論 38 42

友情鏈接更多精彩內(nèi)容