雖然Android平臺使用Java來開發應用程序,但Android程序卻不是運行在標準Java虛擬機上的。html
多是出於效率和版權的考慮,Google爲Android專門設計了一套虛擬機Dalvik Virtual Machine。java
而4.4版本的Android的「開發者選項」中已經添加了Art模式和Dalvik模式切換的功能,而前幾天Google I/O宣佈 下一代Android(代號L)會正式移除Dalvik。android
由於:安全
對於非預裝軟件,ART的編譯是在手機端現場進行,這遠比dalvik環境下製做optimized dex慢。帶有大量java代碼的應用(好比淘寶,好比微信,好比QQ)會受到很大影響,它們安裝時間可達數十秒乃至超出一分鐘。微信
更多關於Dalvik與Art:Link架構
-----------------------------------------------------------------socket
Dalvik在2007年Android SDK發佈的時候進入人們的實現,名字來源於做者Dan Bornstein的祖先居住過Dalvik小漁村。特色:函數
Dalvik虛擬機與傳統Java虛擬機並不兼容,不一樣點主要有:工具
1.Java虛擬機運行的是Java字節碼,Dalvik虛擬機運行的是Dalvik字節碼
Java虛擬機經過解碼class文件中的內容來運行程序;
Dalvik虛擬機運行的Dalvik字節碼由Java字節碼轉換而來,並被打包成一個DEX(Dalvik Executable)可執行文件,Dalvik虛擬機經過解釋DEX文件來執行這些字節碼。
2.Dalvik可執行文件體積更小
Android SDK 中有一個叫作dx的工具負責將Java字節碼轉換爲Dalvik字節碼。
dx對Java類文件從新排列,消除冗餘信息,避免反覆加載與解析。
dx對常量池進行壓縮,使相同的字符串、常量在DEX中指出現一次,減少了文件的體積。
3.Java虛擬機與Dalvik虛擬機架構不一樣
Java虛擬機基於棧架構,程序運行時須要頻繁從棧上讀取或寫入數據,耗費很多CPU時間。
Dalvik基於寄存器架構,數據訪問直接經過寄存器傳遞。
做者經過一個例子對比Java字節碼與Dalvik字節碼的區別:
編譯了一個Hello.class而後分別反編譯成Java和Dalvik字節碼:
(Sony的渣相機真夠屎)
經過對比做者證實基於寄存器架構的Dalvik字節碼與基於棧架構的Java字節碼相比,生成的代碼指令要少,執行速度會快一些。
Android系統架構採用分層思想,好處是:
Android系統由Linux內核、函數庫、Android運行時、應用程序框架、應用程序 組成。
Dalvik虛擬機屬於Android運行時環境,它與一些核心庫共同承擔Android應用程序的運行工做(這個圖每次看都有新理解)。
Android系統啓動加載完內核後的步驟:
Dalvik虛擬機執行程序流程:
虛擬機線程--->裝載程序類--->驗證字節碼--->查找主類--->執行字節碼流--->結束
JIT(Just-in-time Compilation,即時編譯)又稱動態編譯,是一種經過在運行時將字節碼翻譯成機器碼的技術,使程序執行速度更快。從Android2.2開始引入。
JIT的兩種字節碼編譯方式:method方式和trace方式。method方式編譯整個方法的代碼,是的在「冷路徑」上浪費不少編譯時間。trace方式更快的獲取熱路徑的代碼,效率更高。Dalvik默認採用trace方式編譯。