Dalvik、ART、JVM


Dalvik虛擬機


dex文件

Java虛擬機運行的是java字節碼,即class文件,而Dalvik虛擬機執行的是專有的dex格式字節碼,dex文件是由一個或多個class文件打包而成。dex體積更小,class文件都有一個常量池,而dex文件只有一個常量池,多個class文件如果有重復的字符串,在dex文件里只有一份。
dex文件生成:

  • javac 把.java文件編譯成.class文件
  • dx工具:在sdk/build-tools/中的dx工具,執行命令dx --dex --output="文件名.dex" [class文件地址]
  • 在jdk 1.8 可能會出現錯誤,提示不支持當前版本,所以編譯時要強制用低版本的jdk編譯,如javac -source 1.7 -target 1.7 [java文件]

odex文件

  • odex是Optimized dex 的簡寫,即優化后的dex文件,主要是為了提高Dalvik虛擬機的運行速度。
  • odex文件時dex文件具體在某個系統上的優化。odex文件優化依賴系統上的幾個核心模塊,一般是/system/framwork/下的jar包,尤其是core.jar。odex的優化及時把本來需要在執行過程中做的類校驗、調用其他類函數時的解析等工作提前處理。

Dalvik虛擬機的啟動

在Android系統中,應用程序進程都是由Zygote進程孵化出來的,而Zygote進程是由Init進程啟動的。Zygote進程在啟動時會創建一個Dalvik虛擬機實例,每當它孵化一個新的應用程序進程時,都會將這個Dalvik虛擬機實例復制到新的應用程序進程里面去,從而使得每一個應用程序進程都有一個獨立的Dalvik虛擬機實例。Zygote是虛擬機實例的孵化器。AndroidRuntime.cpp中ZygoteInit.main()的執行會完成一個分裂,分裂出來的子進程繼續初始化Java層的架構,這個分裂出來的進程就是system_server。每當系統要求執行一個Android應用程序,Zygote就會fork出一個子進程來執行該應用程序。system_server是應用與Zygote之間交流的橋梁,通過socket進行通信。Android系統啟動加載完內核后,第一個執行的是init進程,init進程首先要做的是設備的初始化工作,然后讀取inic.rc文件并啟動系統中的重要外部程序 Zygote。Zygote進程是Android所有進程的孵化器進程,它啟動后會首先初始化Dalvik虛擬機,然后啟動system_server并進入Zygote模式,通過socket等候命令。當執行一個Android應用程序時,system_server進程通過Binder IPC方式發送命令給Zygote,Zygote收到命令后通過fork自身創建一個Dalvik虛擬機的實例來執行應用程序的入口函數,這樣一個程序就啟動完成了。

Dalvik和Jvm之間的區別

  • Dalvik和Jvm最大的區別是Dalvik基于寄存器結構,而Jvm基于棧結構。一般來說基于寄存器結構的運行速度更快,但代碼長度會邊長,這也是現在很多cpu采用的結構。
  • Dalvik虛擬機運行dex格式的字節碼,而Jvm虛擬機運行class格式的字節碼。 Dalvik虛擬機所占空間小,且可執行文件體積小。
  • 每Dalvik負責進程隔離和線程管理,每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機實例,其代碼在虛擬機的解釋下得以執行。

Dalvik和ART的區別

Android Runtime,在android 5.0以后及后續版本取代Dalvik。

  • JIT最早在Android 2.2系統中引進到Dalvik虛擬機中,在應用程序啟動時,JIT通過進行連續的性能分析來優化程序代碼的執行,在程序運行的過程中,Dalvik虛擬機在不斷的進行將字節碼編譯成機器碼的工作。 與Dalvik虛擬機不同的是,ART引入了AOT這種預編譯技術,在應用程序安裝的過程中,ART就已經將所有的字節碼重新編譯成了機器碼。應用程序運行過程中無需進行實時的編譯工作,只需要進行直接調用。因此,ART極大的提高了應用程序的運行效率,同時也減少了手機的電量消耗,提高了移動設備的續航能力,在垃圾回收等機制上也有了較大的提升。 為了保證向下兼容,ART使用了相同的Dalvik字節碼文件(dex),即在應用程序目錄下保留了dex文件供舊程序調用然而.odex文件則替換成了可執行與可鏈接格式(ELF)可執行文件。一旦一個程序被ART的dex2oat命令編譯,那么這個程序將會指通過ELF可執行文件來運行。因此,相對于Dalvik虛擬機模式,ART模式下Android應用程序的安裝需要消耗更多的時間,同時也會占用更大的儲存空間(指內部儲存,用于儲存編譯后的代碼),但節省了很多Dalvik虛擬機用于實時編譯的時間。

  • 核心庫:Dalvik核心庫libdvm.so,Art核心庫libart.so

  • Art的核心是OAT文件。OAT文件是一種Android私有ELF文件格式,它不僅包含有從DEX文件翻譯而來的本地機器指令,還包含有原來的DEX文件內容。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容