十四炫掐、Android虛擬機以及編譯過程

1盲镶、什么是Dalvik虛擬機?

Google設計用于Android平臺的Java虛擬機睁冬,是Android的平臺的重要組成部分挎春,支持dex格式(Dalvik Executable)的Java程序運行。
Dalvik作為面向Linux豆拨、為嵌入式操作系統(tǒng)設計的虛擬機直奋,主要負責完成對象聲明周期管理、堆棧管理施禾、線程管理脚线、安全和異常管理,以及垃圾回收等弥搞。

2邮绿、Dalvik虛擬機的特點

  • 體積小,占用內存小
  • 專有的dex可執(zhí)行文件格式攀例,體積更小船逮,執(zhí)行速度更快
  • 常量池采用32位索引值,尋址類方法名粤铭,字段名挖胃,常量更快
  • 基于寄存器結構,并擁有一套完整的指令系統(tǒng)
  • 提供了對象生命周期管理,堆棧管理冠骄,線程管理伪煤,安全和異常管理以及垃圾回收等重要功能。

每個Android程序都運行在Android系統(tǒng)的進程里面凛辣,每個進程對應著一個Dalvik虛擬機實例抱既。

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

  • Java虛擬機運行的是Java字節(jié)碼扁誓,Dalvik運行的是Dalvik字節(jié)碼防泵。

傳統(tǒng)的Java程序經過編譯,生成Java字節(jié)碼保存在class文件中蝗敢,Java虛擬機通過解碼class文件里面的內容來運行程序捷泞。而Dalvik虛擬機運行的是Dalvik字節(jié)碼,所有的Dalvik字節(jié)碼都是由Java字節(jié)碼轉碼而來寿谴,并被打包到一個DEX(Dalvik Executable)可執(zhí)行文件锁右。Dalvik虛擬機通過解析DEX文件來執(zhí)行這些字節(jié)碼。

image.png

Dalvik可執(zhí)行文件體積小讶泰。Android SDK中有個dx的工具咏瑟,負責Java字節(jié)碼轉換成為Dalvik字節(jié)碼。
dx工具對java類重新排列痪署,消除在類文件中所有的冗余信息码泞,避免虛擬機在初始化時出現(xiàn)反復的文件加載與解析過程。一般情況下狼犯,Java類文件中包含多個不同的方法簽名余寥,如果其他的類文件引用該類文件中的方法,其簽名方法也會被復制到其類文件中悯森,也就是說多個不同的類會同時包含相同的方法簽名宋舷,同樣的大量的字符串常量在多個類文件中被重復使用。這些冗余的信息會直接增加文件的體積呐馆,同時也會嚴重影響虛擬機解析文件的效率肥缔。消除其中的冗余信息,重新組合形成一個常量池汹来,所有的文件共享一個常量池续膳。由于dx工具對常量的壓縮,使得相同的字符串收班、常量在DEX文件中只出現(xiàn)一次坟岔,從而減少了文件的體積。
針對每個Class文件摔桦,都由如下的格式進行組合:
image.png

dex文件使用共享的社付、特定類型的常量池機制來節(jié)省內存承疲。常量池存儲類中的所有字面常量,它包括字符串常量鸥咖、字段常量等值燕鸽。
image.png

簡單來說,就是dex格式文件就是將多個class文件中公有的部分統(tǒng)一存放啼辣,去除冗余信息啊研。

  • Java虛擬機與Dalvik虛擬機架構不同,這也是Dalvik和JVM之間最大的區(qū)別鸥拧。

Java虛擬器基于棧結構党远,程序需要頻繁的從棧上讀取與寫入數(shù)據(jù),這個過程需要更多的指令分派與內存訪問次數(shù)富弦,會耗費不少CPU時間沟娱,對于手機來說是一筆不小的開銷。Dalvik基于寄存器架構腕柜。數(shù)據(jù)訪問通過寄存器間直接傳遞济似,這樣的訪問方式比基于棧方式要快很多。

4媳握、Dalvik虛擬機的結構

Dalvik虛擬機結構圖

一個應用首先經過DX工具將class文件轉換成Dalvik虛擬機可以執(zhí)行的dex文件碱屁,然后由類加載器加載原生類和Java類,接著由解釋器根據(jù)指令對Dalvik字節(jié)碼繼續(xù)解釋蛾找、執(zhí)行。最后根據(jù)dvm_arch參數(shù)選擇編譯的目標機體系結構赵誓。

5打毛、Android APK 編譯打包流程

編譯打包流程
  • 1.Java編譯器對工程本身的Java代碼進行編譯,這些Java有三個來源:app的源碼俩功,由資源文件生成的R文件(appt工具)幻枉,以及aidl文件生成的Java接口文件(aidl工具)。產出為.class文件诡蜓。
  • 2..class文件和依賴的三方文件通過dex工具生成Dalvik虛擬機可執(zhí)行的.dex文件熬甫,包含了所有的class信息,包括項目自身的class和依賴的class蔓罚。產出為.dex文件椿肩。
  • 3.apkbuilder工具將.dex文件和編譯后的資源文件生成未經簽名對齊的apk文件。這里編譯后的資源文件包括2部分豺谈,一是aapt編譯產生的編譯后的資源文件郑象,二是依賴的三方庫里的資源文件。產出為未經簽名的.dex文件茬末。
  • 4.分別由Jarsigner和zipalign對文件進行簽名和對齊厂榛,生成為最終的apk文件。
    總結為:編譯 --> DEX --> 打包 --> 簽名和對齊

6.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)點:

  • 系統(tǒng)的性能顯著提升;
  • 應用啟動更快另萤、運行更快湃密、體驗更流暢、觸感反饋更及時四敞;
  • 更長的電池續(xù)航能力
  • 支持更低硬件
    ART的缺點:
  • 更大的存儲空間占用泛源,可能會增加10%-30%
  • 更長的安裝時間。
?著作權歸作者所有,轉載或內容合作請聯(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
  • 文/不壞的土叔 我叫張陵缕减,是天一觀的道長雷客。 經常有香客問我,道長桥狡,這世上最難降的妖魔是什么搅裙? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任皱卓,我火速辦了婚禮,結果婚禮上部逮,老公的妹妹穿的比我還像新娘娜汁。我一直安慰自己,他們只是感情好兄朋,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布掐禁。 她就那樣靜靜地躺著,像睡著了一般颅和。 火紅的嫁衣襯著肌膚如雪傅事。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天峡扩,我揣著相機與錄音蹭越,去河邊找鬼。 笑死教届,一個胖子當著我的面吹牛响鹃,可吹牛的內容都是我干的。 我是一名探鬼主播案训,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼买置,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了强霎?” 一聲冷哼從身側響起忿项,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎城舞,沒想到半個月后倦卖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡椿争,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了熟嫩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秦踪。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掸茅,靈堂內的尸體忽然破棺而出椅邓,到底是詐尸還是另有隱情,我是刑警寧澤昧狮,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布景馁,位于F島的核電站,受9級特大地震影響逗鸣,放射性物質發(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

推薦閱讀更多精彩內容