淺談JIT&AOT

1218496450.jpg

這是一篇給自己腦補(bǔ)的筆記!

想必很多Android用戶已經(jīng)在自己各種設(shè)備上使用Android L了谋逻。自己年初在淘寶上¥1200進(jìn)了nexus5,系統(tǒng)早早的升級(jí)到Android L,不得不說Nexus是一個(gè)非常非常棒的手機(jī)决乎。

Android L與之前Android KK的對(duì)比,Dalvik虛擬機(jī)已經(jīng)在L中移除派桩,ART(Android run time)在kk的時(shí)候作為Optional构诚,現(xiàn)在已經(jīng)正式代替Dalvik。講到這些轉(zhuǎn)變的時(shí)候窄坦,疑問就來了而且還根本停不下來唤反,我不知道Dalvik之前是怎么做的,Java于我只是大學(xué)一個(gè)學(xué)期的課程,Java虛擬機(jī)鸭津,我當(dāng)時(shí)在課堂上絞盡腦汁也想不出一個(gè)具體樣子出來彤侍,然后渾渾噩噩,大學(xué)就過去了逆趋,好吧我想知道java在傳統(tǒng)JVM中是如何運(yùn)行的盏阶,在DVM中又是如何運(yùn)行的,什么是dex闻书,什么是odex名斟,什么是JIT,什么是AOT,什么是oat,什么是ART...魄眉?有時(shí)想想砰盐,想這么多真的好嘛!坑律?不過沒辦法岩梳,有時(shí)腦子蹦蹦出來這么多疑問,實(shí)在憋不下去就會(huì)覺得有必要抽個(gè)時(shí)間腦補(bǔ)一下晃择。

dex

本質(zhì)上java文件編譯后都是字節(jié)碼ByteCode冀值,不管是傳統(tǒng)的JVM,還是Google Dalvik DVM宫屠。只是這兩種虛擬機(jī)環(huán)境下ByteCode有所差異列疗,最直觀的是在JVM運(yùn)行的是.class文件,而DVM是.dex文件浪蹂,DVM專門對(duì)移動(dòng)操作系統(tǒng)(尤其是Android)的特性進(jìn)行了優(yōu)化抵栈,并且DVM的設(shè)計(jì)是基于寄存器的告材,指令集有非常大的不同(具體未研究),還有等等等等...,好吧,到這步竭讳,了解到.dex是字節(jié)碼创葡,至于dex文件format構(gòu)成,腦補(bǔ)階段暫時(shí)略過吧XD~~绢慢。

JIT

接下來Android2.2的時(shí)候引入了JIT(JUST-IN-TIME)技術(shù)灿渴,JIT技術(shù)準(zhǔn)確來講應(yīng)該是JIT Compiler,那JIT之前是怎么一回事?最早的時(shí)候胰舆,java是由解釋器(Interpreter),將每個(gè)java指令轉(zhuǎn)譯為對(duì)等的微處理器指令骚露,并根據(jù)轉(zhuǎn)譯后的指令先后次序依序執(zhí)行,一個(gè)java指令可能對(duì)應(yīng)十幾或者幾十個(gè)對(duì)等微處理指令缚窿,運(yùn)行的時(shí)候還要先解釋棘幸,在硬件條件差的情況下,執(zhí)行速度是可想而知有多慢的倦零。為了解決這個(gè)問題误续,JIT就來了,當(dāng)java執(zhí)行runtime環(huán)境時(shí)扫茅,每遇到一個(gè)class蹋嵌,JIT就會(huì)對(duì)這個(gè)類進(jìn)行編譯,生成相當(dāng)精簡(jiǎn)的二進(jìn)制碼葫隙,花費(fèi)少許的編譯時(shí)間來換取后續(xù)的執(zhí)行速率栽烂,這個(gè)效率提高還是比較大的,但這并沒有達(dá)到頂尖的效能恋脚,因?yàn)槟承﹋ava文件是極少執(zhí)行的腺办,編譯它們的時(shí)間有可能遠(yuǎn)遠(yuǎn)長(zhǎng)于轉(zhuǎn)譯器轉(zhuǎn)譯執(zhí)行的時(shí)間,整體下來糟描,花費(fèi)的時(shí)間并沒有減少怀喉。基于JIT的經(jīng)驗(yàn)船响,又出來了動(dòng)態(tài)編譯器(dynamic compiler),動(dòng)態(tài)預(yù)判哪些需要compile哪些需要轉(zhuǎn)譯磺送,所以動(dòng)態(tài)編譯器是既包含了轉(zhuǎn)譯器&編譯器的。尚不確定Android的JIT技術(shù)是否為這種dynamic compiler灿意。另外,說到這里崇呵,我們第一次執(zhí)行APP速度慢一些應(yīng)該是因?yàn)樵谧鲆恍〤ompile的動(dòng)作缤剧,如果說得不對(duì),還請(qǐng)指正域慷。google當(dāng)時(shí)說荒辕,JIT技術(shù)的引入速度提升3-5倍汗销,后來發(fā)現(xiàn)我們?nèi)A麗麗的又被騙了。

Odex

講了dex抵窒、JIT,接下來講講Odex弛针,Odex即Optimize Dex對(duì)dex文件的優(yōu)化,最直觀的好處:

  • deodex在系統(tǒng)第一次開機(jī)時(shí)李皇,需要提取所有apk里的dex文件削茁,而odex優(yōu)化是提前提取出來了,開機(jī)速度&運(yùn)行速度都有提高掉房。
  • Odex優(yōu)化后茧跋,APK里可以沒有dex文件,而未Odex在APK包里有一份dex文件卓囚,在/data/dalvik-cache下還有提取出來的一份瘾杭,浪費(fèi)存儲(chǔ)空間。
  • 一定程度上保護(hù)了廠商自己的APK哪亿,因?yàn)閍pk里只有資源文件粥烁,反匯編沒有意義,直接拷貝到別處無法安裝運(yùn)行...蝇棉。

AOT

技術(shù)隨著時(shí)間之輪毫不停歇前行讨阻。Android kitkat 4.4,新的Android Runtime(ART)出現(xiàn)了,做為一個(gè)可選項(xiàng)银萍,供一些愿意的用戶測(cè)試使用变勇,當(dāng)然這個(gè)時(shí)候Dalvik還是作為默認(rèn)的虛擬機(jī)環(huán)境。ART采取了AOT(Ahead-Of-Time)技術(shù)贴唇,簡(jiǎn)單一點(diǎn)理解就是搀绣,在APK安裝的時(shí)候就會(huì)做預(yù)先編譯動(dòng)作,編譯好的文件是OAT文件戳气,該文件本質(zhì)上是一個(gè)ELF文件链患,這里與dex(Odex)文件最大的區(qū)別是OAT文件不再是字節(jié)碼文件,而是一個(gè)可執(zhí)行文件瓶您,可以更底層的與硬件接觸麻捻,運(yùn)行時(shí)也省去了預(yù)編譯和轉(zhuǎn)譯的時(shí)間呀袱。在Android L中我們找不到OAT文件贸毕,其實(shí)oat文件依舊以.odex作為后綴,通過file命令或者UE打開可以看到ELF頭部夜赵。另外ART設(shè)計(jì)是考慮兼容性的,即在Dalvik可以運(yùn)行的APP寇僧,在系統(tǒng)升級(jí)到5.0摊腋、5.1(Dalvik->ART)這些APP依舊可以運(yùn)行沸版,這個(gè)是通過dex2oat做到的,dalvik下的dex兴蒸、odex文件均可以通過這個(gè)工具轉(zhuǎn)化為oat文件视粮,并且odex文件將比dex文件編譯的更快。

腦補(bǔ)暫告一段落橙凳,歡迎客官拍磚蕾殴、指正。

References:

http://www.importnew.com/596.html
http://bbs.mfunz.com/thread-1007717-1-1.html
http://source.android.com/devices/tech/dalvik/configure.html
http://source.android.com/devices/tech/dalvik/index.html
http://www.th7.cn/Program/Android/201401/168089.shtml

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痕惋,一起剝皮案震驚了整個(gè)濱河市区宇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌值戳,老刑警劉巖议谷,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異堕虹,居然都是意外死亡卧晓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門赴捞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逼裆,“玉大人,你說我怎么就攤上這事赦政∈び睿” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵恢着,是天一觀的道長(zhǎng)桐愉。 經(jīng)常有香客問我,道長(zhǎng)掰派,這世上最難降的妖魔是什么从诲? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮靡羡,結(jié)果婚禮上系洛,老公的妹妹穿的比我還像新娘。我一直安慰自己略步,他們只是感情好描扯,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趟薄,像睡著了一般绽诚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天憔购,我揣著相機(jī)與錄音,去河邊找鬼岔帽。 笑死玫鸟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的犀勒。 我是一名探鬼主播屎飘,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贾费!你這毒婦竟也來了钦购?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤褂萧,失蹤者是張志新(化名)和其女友劉穎押桃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體导犹,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唱凯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谎痢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磕昼。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖节猿,靈堂內(nèi)的尸體忽然破棺而出票从,到底是詐尸還是另有隱情,我是刑警寧澤滨嘱,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布峰鄙,位于F島的核電站,受9級(jí)特大地震影響九孩,放射性物質(zhì)發(fā)生泄漏先馆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一躺彬、第九天 我趴在偏房一處隱蔽的房頂上張望煤墙。 院中可真熱鬧,春花似錦宪拥、人聲如沸仿野。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚作。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間球涛,已是汗流浹背劣针。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亿扁,地道東北人捺典。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像从祝,于是被迫代替她去往敵國(guó)和親襟己。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 最近項(xiàng)目apk方法數(shù)即將達(dá)到65536上限牍陌,雖然通過瘦身減少了一些方法數(shù)擎浴,但是隨著更多sdk的接入,終究還是避免不...
    the_q閱讀 16,483評(píng)論 6 39
  • Dalvik虛擬機(jī)如同其他Java虛擬機(jī)一樣毒涧,在運(yùn)行程序時(shí)首先需要將對(duì)應(yīng)的類加載到內(nèi)存中贮预。而在Java標(biāo)準(zhǔn)的虛擬機(jī)...
    SilenceDut閱讀 39,582評(píng)論 9 81
  • 問題現(xiàn)象 復(fù)現(xiàn)步驟Android 7.0平臺(tái)(剛bring up完成)user版本只要連接特定wifi, syst...
    dumphex閱讀 3,052評(píng)論 0 3
  • Android插件化基礎(chǔ)的主要內(nèi)容包括 Android插件化基礎(chǔ)1-----加載SD上APKAndroid插件化基...
    隔壁老李頭閱讀 5,413評(píng)論 5 36
  • ##常用命令: cd:進(jìn)入目錄(文件夾),路徑前綴不加“/”則是相對(duì)路徑链嘀,加“/”是絕對(duì)路徑萌狂,在絕對(duì)路徑時(shí)可準(zhǔn)確的...
    billa_8f6b閱讀 4,169評(píng)論 0 2