簡單理解Android Dalvik旋膳、ART及APK編譯過程

在學習Android之前,都學習了Java途事,對于Java虛擬機都或多或少的進行了了解溺忧。那么Android中的虛擬機是個什么樣子咏连,一個APK的編譯過程又是什么,就讓我們來看看鲁森。

一祟滴、什么是Dalvik虛擬機

Dalvik是Google公司自己設計用于Android平臺的Java虛擬機,它是Android平臺的重要組成部分歌溉,支持dex格式(Dalvik Executable)的Java應用程序的運行垄懂。dex格式是專門為Dalvik設計的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)痛垛。Google對其進行了特定的優(yōu)化草慧,使得Dalvik具有高效、簡潔匙头、節(jié)省資源的特點漫谷。從Android系統(tǒng)架構圖知,Dalvik虛擬機運行在Android的運行時庫層蹂析。

Dalvik作為面向Linux舔示、為嵌入式操作系統(tǒng)設計的虛擬機,主要負責完成對象生命周期管理电抚、堆棧管理惕稻、線程管理、安全和異常管理蝙叛,以及垃圾回收等俺祠。另外,Dalvik早期并沒有JIT編譯器借帘,直到Android2.2才加入了對JIT的技術支持蜘渣。

二、Dalvik虛擬機的特點

體積小肺然,占用內(nèi)存空間兴挝唷;

專有的DEX可執(zhí)行文件格式狰挡,體積更小捂龄,執(zhí)行速度更快;

常量池采用32位索引值加叁,尋址類方法名倦沧,字段名,常量更快它匕;

基于寄存器架構展融,并擁有一套完整的指令系統(tǒng);

提供了對象生命周期管理豫柬,堆棧管理告希,線程管理扑浸,安全和異常管理以及垃圾回收等重要功能;

所有的Android程序都運行在Android系統(tǒng)進程里燕偶,每個進程對應著一個Dalvik虛擬機實例喝噪。

三、Dalvik虛擬機和Java虛擬機的區(qū)別

Dalvik虛擬機與傳統(tǒng)的Java虛擬機有著許多不同點指么,兩者并不兼容酝惧,它們顯著的不同點主要表現(xiàn)在以下幾個方面:

Java虛擬機運行的是Java字節(jié)碼,Dalvik虛擬機運行的是Dalvik字節(jié)碼伯诬。

傳統(tǒng)的Java程序經(jīng)過編譯晚唇,生成Java字節(jié)碼保存在class文件中,Java虛擬機通過解碼class文件中的內(nèi)容來運行程序盗似。而Dalvik虛擬機運行的是Dalvik字節(jié)碼哩陕,所有的Dalvik字節(jié)碼由Java字節(jié)碼轉換而來,并被打包到一個DEX(Dalvik Executable)可執(zhí)行文件中赫舒。Dalvik虛擬機通過解釋DEX文件來執(zhí)行這些字節(jié)碼悍及。


Dalvik可執(zhí)行文件體積小各吨。Android SDK中有一個叫dx的工具負責將Java字節(jié)碼轉換為Dalvik字節(jié)碼割粮。

dx工具對Java類文件重新排列,消除在類文件中出現(xiàn)的所有冗余信息,避免虛擬機在初始化時出現(xiàn)反復的文件加載與解析過程扔涧。一般情況下,Java類文件中包含多個不同的方法簽名届谈,如果其他的類文件引用該類文件中的方法枯夜,方法簽名也會被復制到其類文件中,也就是說艰山,多個不同的類會同時包含相同的方法簽名湖雹,同樣地,大量的字符串常量在多個類文件中也被重復使用曙搬。這些冗余信息會直接增加文件的體積摔吏,同時也會嚴重影響虛擬機解析文件的效率。消除其中的冗余信息纵装,重新組合形成一個常量池征讲,所有的類文件共享同一個常量池。由于dx工具對常量池的壓縮橡娄,使得相同的字符串诗箍,常量在DEX文件中只出現(xiàn)一次,從而減小了文件的體積挽唉。

針對每個Class文件滤祖,都由如下格式進行組成:



dex格式文件使用共享的筷狼、特定類型的常量池機制來節(jié)省內(nèi)存。常量池存儲類中的所有字面常量匠童,它包括字符串常量埂材、字段常量等值。



簡單來講俏让,dex格式文件就是將多個class文件中公有的部分統(tǒng)一存放楞遏,去除冗余信息。

Java虛擬機與Dalvik虛擬機架構不同首昔。這也是Dalvik與JVM之間最大的區(qū)別寡喝。

Java虛擬機基于棧架構,程序在運行時虛擬機需要頻繁的從棧上讀取或寫入數(shù)據(jù)勒奇,這個過程需要更多的指令分派與內(nèi)存訪問次數(shù)预鬓,會耗費不少CPU時間,對于像手機設備資源有限的設備來說赊颠,這是相當大的一筆開銷格二。Dalvik虛擬機基于寄存器架構。數(shù)據(jù)的訪問通過寄存器間直接傳遞竣蹦,這樣的訪問方式比基于棧方式要快很多顶猜。

四、Dalvik虛擬機的結構


一個應用首先經(jīng)過DX工具將class文件轉換成Dalvik虛擬機可以執(zhí)行的dex文件痘括,然后由類加載器加載原生類和Java類长窄,接著由解釋器根據(jù)指令集對Dalvik字節(jié)碼進行解釋、執(zhí)行纲菌。最后挠日,根據(jù)dvm_arch參數(shù)選擇編譯的目標機體系結構。

五翰舌、Android APK 編譯打包流程


1.Java編譯器對工程本身的java代碼進行編譯嚣潜,這些java代碼有三個來源:app的源代碼,由資源文件生成的R文件(aapt工具)椅贱,以及有aidl文件生成的java接口文件(aidl工具)懂算。產(chǎn)出為.class文件。

①.用AAPT編譯R.java文件
②編譯AIDL的java文件
③把java文件編譯成class文件

2..class文件和依賴的三方庫文件通過dex工具生成Delvik虛擬機可執(zhí)行的.dex文件庇麦,包含了所有的class信息计技,包括項目自身的class和依賴的class。產(chǎn)出為.dex文件女器。

3.apkbuilder工具將.dex文件和編譯后的資源文件生成未經(jīng)簽名對齊的apk文件酸役。這里編譯后的資源文件包括兩部分,一是由aapt編譯產(chǎn)生的編譯后的資源文件,二是依賴的三方庫里的資源文件涣澡。產(chǎn)出為未經(jīng)簽名的.apk文件贱呐。

4.分別由Jarsigner和zipalign對apk文件進行簽名和對齊,生成最終的apk文件入桂。

總結為:編譯-->DEX-->打包-->簽名和對齊

六奄薇、ART虛擬機與Dalvik虛擬機的區(qū)別

什么是ART:

ART代表Android Runtime,其處理應用程序執(zhí)行的方式完全不同于Dalvik抗愁,Dalvik是依靠一個Just-In-Time (JIT)編譯器去解釋字節(jié)碼馁蒂。開發(fā)者編譯后的應用代碼需要通過一個解釋器在用戶的設備上運行,這一機制并不高效蜘腌,但讓應用能更容易在不同硬件和架構上運 行沫屡。ART則完全改變了這套做法,在應用安裝時就預編譯字節(jié)碼到機器語言撮珠,這一機制叫Ahead-Of-Time (AOT)編譯沮脖。在移除解釋代碼這一過程后,應用程序執(zhí)行將更有效率芯急,啟動更快勺届。

ART優(yōu)點:

1、系統(tǒng)性能的顯著提升娶耍。
2免姿、應用啟動更快、運行更快榕酒、體驗更流暢胚膊、觸感反饋更及時。
3奈应、更長的電池續(xù)航能力澜掩。
4购披、支持更低的硬件杖挣。

ART缺點:

1、更大的存儲空間占用刚陡,可能會增加10%-20%惩妇。
2、更長的應用安裝時間筐乳。

ART虛擬機相對于Dalvik虛擬機的提升

參考:art和dalvik的區(qū)別歌殃?

**預編譯 **

在dalvik中,如同其他大多數(shù)JVM一樣,都采用的是JIT來做及時翻譯(動態(tài)翻譯),將dex或odex中并排的dalvik code(或者叫smali指令集)運行態(tài)翻譯成native code去執(zhí)行.JIT的引入使得dalvik提升了3~6倍的性能。

而在ART中,完全拋棄了dalvik的JIT,使用了AOT直接在安裝時將其完全翻譯成native code.這一技術的引入,使得虛擬機執(zhí)行指令的速度又一重大提升

①垃圾回收機制

首先介紹下dalvik的GC的過程.主要有有四個過程:
1蝙云、當gc被觸發(fā)時候,其會去查找所有活動的對象,這個時候整個程序與虛擬機內(nèi)部的所有線程就會掛起,這樣目的是在較少的堆棧里找到所引用的對象.需要注意的是這個回收動作和應用程序非并發(fā)氓皱。

2、gc對符合條件的對象進行標記

3、gc對標記的對象進行回收

4波材、恢復所有線程的執(zhí)行現(xiàn)場繼續(xù)運行

dalvik這么做的好處是,當pause了之后,GC勢必是相當快速的.但是如果出現(xiàn)GC頻繁并且內(nèi)存吃緊勢必會導致UI卡頓,掉幀.操作不流暢等股淡。

后來ART改善了這種GC方式 , 主要的改善點在將其非并發(fā)過程改變成了部分并發(fā).還有就是對內(nèi)存的重新分配管理

當ART GC發(fā)生時:

1廷区、GC將會鎖住Java堆,掃描并進行標記

2唯灵、標記完畢釋放掉Java堆的鎖,并且掛起所有線程

3、GC對標記的對象進行回收

4隙轻、恢復所有線程的執(zhí)行現(xiàn)場繼續(xù)運行

5埠帕、重復2-4直到結束

可以看出整個過程做到了部分并發(fā)使得時間縮短.據(jù)官方測試數(shù)據(jù)說gc效率提高2倍

提高內(nèi)存使用,減少碎片化

Dalvik內(nèi)存管理特點是:內(nèi)存碎片化嚴重玖绿,當然這也是Mark and Sweep算法帶來的弊端


可以看出每次gc后內(nèi)存千瘡百孔敛瓷,本來連續(xù)分配的內(nèi)存塊變得碎片化嚴重,之后再分配進入的對象再進行內(nèi)存尋址變得困難斑匪。

ART的解決:在ART中,它將Java分了一塊空間命名為Large-Object-Space,這塊內(nèi)存空間的引入用來專門存放large object琐驴。同時ART又引入了moving collector的技術,即將不連續(xù)的物理內(nèi)存塊進行對齊.對齊了后內(nèi)存碎片化就得到了很好的解決.Large-Object-Space的引入一是因為moving collector對大塊內(nèi)存的位移時間成本太高,而且提高內(nèi)存的利用率
根官方統(tǒng)計,ART的內(nèi)存利用率提高10倍了左右秤标。

參考文章:

理解Android虛擬機體系結構
深入理解Android(二):Java虛擬機Dalvik
Android編譯流程和Gradle使用
art和dalvik的區(qū)別绝淡?
深入理解Android工程的編譯過程

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市苍姜,隨后出現(xiàn)的幾起案子牢酵,更是在濱河造成了極大的恐慌,老刑警劉巖衙猪,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馍乙,死亡現(xiàn)場離奇詭異,居然都是意外死亡垫释,警方通過查閱死者的電腦和手機丝格,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棵譬,“玉大人显蝌,你說我怎么就攤上這事《┫蹋” “怎么了曼尊?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脏嚷。 經(jīng)常有香客問我骆撇,道長,這世上最難降的妖魔是什么父叙? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任神郊,我火速辦了婚禮肴裙,結果婚禮上,老公的妹妹穿的比我還像新娘涌乳。我一直安慰自己践宴,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布爷怀。 她就那樣靜靜地躺著阻肩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪运授。 梳的紋絲不亂的頭發(fā)上烤惊,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音吁朦,去河邊找鬼柒室。 笑死,一個胖子當著我的面吹牛逗宜,可吹牛的內(nèi)容都是我干的雄右。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼纺讲,長吁一口氣:“原來是場噩夢啊……” “哼擂仍!你這毒婦竟也來了?” 一聲冷哼從身側響起熬甚,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤逢渔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乡括,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肃廓,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年诲泌,在試婚紗的時候發(fā)現(xiàn)自己被綠了盲赊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡敷扫,死狀恐怖哀蘑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呻澜,我是刑警寧澤递礼,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布惨险,位于F島的核電站羹幸,受9級特大地震影響,放射性物質發(fā)生泄漏辫愉。R本人自食惡果不足惜栅受,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屏镊,春花似錦依疼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棍丐,卻和暖如春误辑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歌逢。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工巾钉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秘案。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓砰苍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阱高。 傳聞我的和親對象是個殘疾皇子赚导,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

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