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é)碼。
Dalvik可執(zhí)行文件體積小讶泰。Android SDK中有個dx的工具咏瑟,負責Java字節(jié)碼轉換成為Dalvik字節(jié)碼。
dx工具對java類重新排列痪署,消除在類文件中所有的冗余信息码泞,避免虛擬機在初始化時出現(xiàn)反復的文件加載與解析過程。一般情況下狼犯,Java類文件中包含多個不同的方法簽名余寥,如果其他的類文件引用該類文件中的方法,其簽名方法也會被復制到其類文件中悯森,也就是說多個不同的類會同時包含相同的方法簽名宋舷,同樣的大量的字符串常量在多個類文件中被重復使用。這些冗余的信息會直接增加文件的體積呐馆,同時也會嚴重影響虛擬機解析文件的效率肥缔。消除其中的冗余信息,重新組合形成一個常量池汹来,所有的文件共享一個常量池续膳。由于dx工具對常量的壓縮,使得相同的字符串收班、常量在DEX文件中只出現(xiàn)一次坟岔,從而減少了文件的體積。
針對每個Class文件摔桦,都由如下的格式進行組合:
dex文件使用共享的社付、特定類型的常量池機制來節(jié)省內存承疲。常量池存儲類中的所有字面常量,它包括字符串常量鸥咖、字段常量等值燕鸽。
簡單來說,就是dex格式文件就是將多個class文件中公有的部分統(tǒng)一存放啼辣,去除冗余信息啊研。
-
Java虛擬機與Dalvik虛擬機架構不同,這也是Dalvik和JVM之間最大的區(qū)別鸥拧。
Java虛擬器基于棧結構党远,程序需要頻繁的從棧上讀取與寫入數(shù)據(jù),這個過程需要更多的指令分派與內存訪問次數(shù)富弦,會耗費不少CPU時間沟娱,對于手機來說是一筆不小的開銷。Dalvik基于寄存器架構腕柜。數(shù)據(jù)訪問通過寄存器間直接傳遞济似,這樣的訪問方式比基于棧方式要快很多。
4媳握、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%
- 更長的安裝時間。