Android ART機制分析

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

Dalvik虛擬機作為Android平臺的核心組成部分之一,允許在有限的內(nèi)存資源中同時運行多個虛擬機實例耻姥。Dalvik虛擬機通過以下方式提升性能:
1瓶摆、DEX代碼安裝時或第一次動態(tài)加載時odex化處理查牌。
2、Android2.2版本提供了JIT機制提升性能溃睹,號稱性能提升3~5倍震肮。
3称龙、提升硬件配置,如更多核CPU戳晌、更高頻率CPU鲫尊、更大的RAM等。

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

二妄荔、Dalvik vs ART
Dalvik運行環(huán)境使用JIT(Just-In-Time)來進行轉(zhuǎn)譯,應用每次運行的時候,字節(jié)碼都需要通過JIT轉(zhuǎn)換為機器碼谍肤,這會拖慢應用的運行效率啦租。而ART則是使用AOT進行處理(Ahead-Of-Time),并會在應用程序安裝完畢時荒揣,進行預先的基礎性編譯作業(yè)篷角,這就減去了JIT運行時的機器碼轉(zhuǎn)化時間,應用的啟動和執(zhí)行都會變得更加快速系任。ART優(yōu)點:1恳蹲、系統(tǒng)性能的顯著提升。2俩滥、應用啟動更快嘉蕾、運行更快、體驗更流暢霜旧、觸感反饋更及時错忱。3、更長的電池續(xù)航能力。
4以清、支持更低的硬件儿普。
ART缺點:1、更大的存儲空間占用玖媚,可能會增加10%-20%箕肃。2、更長的應用安裝時間今魔。

總的來說ART的功效就是“空間換時間”勺像。

三、初步感知ART

1错森、設備如何選擇ART運行環(huán)境

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

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

2.1殃姓、應用安裝時采用的代碼優(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)化后的文件大小及格式不同:
兩個運行環(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三個文件夾:
compiler:主要負責Dalvik字節(jié)碼到本地代碼的轉(zhuǎn)換,編譯為libart-compiler.so
dex2oat :完成DEX文件到ELF文件轉(zhuǎn)換丢习。編譯為dex2oat
runtime :Android ART運行時源代碼须妻,編譯為libart.so
[圖片上傳中凿滤。揖曾。赡盘。(5)]

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

在應用安裝時奕塑,installd通過dex2oat優(yōu)化APK安裝包classes.dex的Dalvik字節(jié)碼為本地機器代碼丰歌。整個優(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文件其實就是基于ELF格式的一種私有文件格式特恬。

OAT的ELF 段信息:


/

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

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

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

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


/

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


/

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市儿咱,隨后出現(xiàn)的幾起案子庭砍,更是在濱河造成了極大的恐慌,老刑警劉巖混埠,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怠缸,死亡現(xiàn)場離奇詭異,居然都是意外死亡钳宪,警方通過查閱死者的電腦和手機揭北,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門扳炬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搔体,你說我怎么就攤上這事恨樟。” “怎么了疚俱?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵劝术,是天一觀的道長。 經(jīng)常有香客問我呆奕,道長养晋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任登馒,我火速辦了婚禮匙握,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陈轿。我一直安慰自己圈纺,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布麦射。 她就那樣靜靜地躺著蛾娶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪潜秋。 梳的紋絲不亂的頭發(fā)上蛔琅,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音峻呛,去河邊找鬼罗售。 笑死,一個胖子當著我的面吹牛钩述,可吹牛的內(nèi)容都是我干的寨躁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼牙勘,長吁一口氣:“原來是場噩夢啊……” “哼职恳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起方面,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤放钦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恭金,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體操禀,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年横腿,在試婚紗的時候發(fā)現(xiàn)自己被綠了颓屑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辙培。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖邢锯,靈堂內(nèi)的尸體忽然破棺而出扬蕊,到底是詐尸還是另有隱情,我是刑警寧澤丹擎,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布尾抑,位于F島的核電站,受9級特大地震影響蒂培,放射性物質(zhì)發(fā)生泄漏再愈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一护戳、第九天 我趴在偏房一處隱蔽的房頂上張望翎冲。 院中可真熱鬧,春花似錦媳荒、人聲如沸抗悍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缴渊。三九已至,卻和暖如春鱼炒,著一層夾襖步出監(jiān)牢的瞬間衔沼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工昔瞧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留指蚁,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓自晰,卻偏偏與公主長得像凝化,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缀磕,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,524評論 25 707
  • 兩年前阿里開源了Dexposed 項目缘圈,它能夠在Dalvik上無侵入地實現(xiàn)運行時方法攔截劣光,正如其介紹「enable...
    weishu閱讀 4,562評論 3 42
  • afinalAfinal是一個android的ioc袜蚕,orm框架 https://github.com/yangf...
    passiontim閱讀 15,401評論 2 45
  • 時間飛逝,離上次的日記過了一年了竟然绢涡。這一年牲剃,發(fā)生了太多事,你有了新戀情雄可,現(xiàn)在也失去了戀情凿傅。我呢缠犀?還是一個人飄著,...
    一會兒閱讀 170評論 0 1
  • 文聪舒、圖/蓋是那么美 秋風起辨液,秋意濃如碧妝如燦金如丹霞如玉帶纏腰層層疊疊,曲曲折折箱残,縈縈繞繞秋色撩人心 用心作畫滔迈,開...
    蓋是那么美閱讀 643評論 38 42