Android Dalvik虛擬機

雖然Android平臺使用Java來開發應用程序,但Android程序卻不是運行在標準Java虛擬機上的。html

多是出於效率和版權的考慮,Google爲Android專門設計了一套虛擬機Dalvik Virtual Machine。java

 

  而4.4版本的Android的「開發者選項」中已經添加了Art模式和Dalvik模式切換的功能,而前幾天Google I/O宣佈 下一代Android(代號L)會正式移除Dalvik。android

由於:安全

  • 1,ART的性能比Dalvik好
  • 2,ART對dex的檢驗比Dalvik嚴格,某些通過後處理(如混淆)的dex文件即使能在Dalvik環境正常運行,但也可能沒法經過ART的檢查。用於代碼混淆/加密的軟件可能須要針對ART作出變更。
  • 3,改進了垃圾回收
  • 4,更好的debug工具

  對於非預裝軟件,ART的編譯是在手機端現場進行,這遠比dalvik環境下製做optimized dex慢。帶有大量java代碼的應用(好比淘寶,好比微信,好比QQ)會受到很大影響,它們安裝時間可達數十秒乃至超出一分鐘。微信

  更多關於Dalvik與Art:Link架構

  Introducing ART框架

-----------------------------------------------------------------socket

Dalvik虛擬機概述

Dalvik在2007年Android SDK發佈的時候進入人們的實現,名字來源於做者Dan Bornstein的祖先居住過Dalvik小漁村。特色:函數

  1.   體積小,佔用內存空間小;
  2.   專有的DEX可執行文件格式,體積小速度快;
  3.   常量池採用32位索引值,尋址更快;
  4.   基於寄存器架構(JVM基於stack),擁有完整的指令系統;
  5.   提供了對象生命週期管理,堆棧管理,線程管理,安全和異常管理以及垃圾回收等重要功能。
  6.   全部的Android程序都運行在系統進程裏,每個進程對應一個Dalvik虛擬機實例。

 

 

Dalvik虛擬機與Java虛擬機的區別

  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字節碼相比,生成的代碼指令要少,執行速度會快一些。

Dalvik虛擬機是如何執行程序的

Android系統架構採用分層思想,好處是:

  • 減小各層之間依賴性
  • 便於獨立分發
  • 容易收斂問題和錯誤

  Android系統由Linux內核、函數庫、Android運行時、應用程序框架、應用程序 組成。

  

  Dalvik虛擬機屬於Android運行時環境,它與一些核心庫共同承擔Android應用程序的運行工做(這個圖每次看都有新理解)。

  Android系統啓動加載完內核後的步驟:

  1.   執行init進程進行初始化;
  2.   讀取init.rc腳本文件並啓動系統中的外部程序Zygote([ˈzaɪˌɡot],受精卵)。Zygote是Android全部進程的孵化器進程;
  3.   Zygote首先初始化Dalvik虛擬機,而後啓動system_server並進入Zygote模式,經過socket等候命令;
  4.   執行一個Android程序時,system_server進程經過Binder IPC方式發送命令給Zygote,Zygote收到命令後經過fork自身建立一個Dalvik虛擬機的實例來執行應用程序的入口函數,這樣一個程序就啓動完成了。

  Dalvik虛擬機執行程序流程:

  虛擬機線程--->裝載程序類--->驗證字節碼--->查找主類--->執行字節碼流--->結束

即時編譯JIT

  JIT(Just-in-time Compilation,即時編譯)又稱動態編譯,是一種經過在運行時將字節碼翻譯成機器碼的技術,使程序執行速度更快。從Android2.2開始引入。

  JIT的兩種字節碼編譯方式:method方式和trace方式。method方式編譯整個方法的代碼,是的在「冷路徑」上浪費不少編譯時間。trace方式更快的獲取熱路徑的代碼,效率更高。Dalvik默認採用trace方式編譯。

相關文章
相關標籤/搜索