Android系統架構詳解(2)--Android Runtime

風靈使發表於2018-11-12

現在再說Android Runtime和以前說的Android Runtime有所不同了,因為現在的Android RuntimeART機制,是google android4.4新的執行機制。ART 的機制與 Dalvik 不同。在 Dalvik 下,應用每次執行的時候,位元組碼都需要通過即時編譯器轉換為機器碼,這會拖慢應用的執行效率,而在 ART 環境中,應用在第一次安裝的時候,位元組碼就會預先編譯成機器碼,使其成為真正的本地應用。這個過程叫做預編譯(AOT,Ahead-Of-Time)。這樣的話,應用的啟動和執行都會變得更加快速。

開篇就說了這麼多專業詞是不是有點蒙了,說實話我自己也暈,因為我是應用開發,而且是半路轉行做的開發,對計算機原理一類的東西認知度接近於0,先說說以前的Dalvik吧。知過去才能懂現在。

(一) Dalvik

關於Dalvik的文章寫了好幾天,本來已經總結了好幾百字了,發現說的條例有點亂,後來無意中發現一位大俠寫的相當好,但是太深了,所以我就直接將做了一個精簡,重新整理了一下,原帖網址為http://blog.csdn.net/andyxm/article/details/6126907,文中大部分專業知識引用於此,有興趣的童鞋可以自己做更深的研究。

我們通過四個問題來了解Dalvik:

  1. 什麼是Dalvik虛擬機器?
  2. Dalvik VMJVM有什麼區別?
  3. 有什麼新的特點?
  4. Dalvik VM的架構是怎麼樣的?

前三個問題下文中做了總結和引導,這第四個問題。。。尼瑪,這個架構看的我是頭昏眼花,研究了好久,只明白了冰山一角。反正我不明白也就不隨便亂說了,有興趣的自己去原部落格看吧。

1) 什麼是Dalvik虛擬機器?

首先,回顧一下什麼是java虛擬機器。Java虛擬機器(JVM)是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。它有自己完善的硬體架構(如處理器、堆疊、暫存器等),還具有相應的指令系統。使用“Java虛擬機器”程式就是為了支援與作業系統無關、在任何系統中都可以執行的程式。

因此,我們不妨對Dalvik虛擬機器作出這樣的描述:

Dalvik虛擬機器是Android程式的虛擬機器,是Android中Java程式的執行基礎。其指令集基於暫存器架構,執行其特有的檔案格式——dex位元組碼來完成物件生命週期管理、堆疊管理、執行緒管理、安全異常管理、垃圾回收等重要功能。它的核心內容是實現庫(libdvm.so),大體由C語言實現。依賴於Linux核心的一部分功能——執行緒機制、記憶體管理機制,能高效使用記憶體,並在低速CPU上表現出的高效能。每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機器例項,其程式碼在虛擬機器的解釋下得以執行。
在這裡插入圖片描述

2) Dalvik VM與JVM有什麼區別?

Dalvik VM ≠Java VM
Dalvik 執行的是特有的DEX檔案格式,而JVM執行的是*.class檔案格式。
Dalvik 基於暫存器,而JVM基於棧。

基於棧與基於暫存器的架構,誰更快?現在實際的處理器,大多都是基於暫存器的架構,從側面反映出基於暫存器比基於棧的架構更與實際的處理器接近。但對於VM來說,源架構的求值棧或者暫存器都可能是用實際機器的記憶體來模擬的,所以效能特性與實際硬體又有不同。一般認為基於暫存器架構的Dalvik VM比基於棧架構JVM執行效率更高,原因是:雖然零地址指令更緊湊,但完成操作需要更多的load/store指令,也意味著更多的指令分派(instruction dispatch)次數與記憶體訪問次數;訪問記憶體是執行速度的一個重要瓶頸,二地址或三地址指令雖然每條指令佔的空間較多,但總體來說可以用更少的指令完成操作,指令分派與記憶體訪問次數都較少。

Dalvik優勢:
A. 在編譯時提前優化程式碼而不是等到執行時
B. 虛擬機器很小,使用的空間也小;被設計來滿足可高效執行多種虛擬機器例項。
C. 常量池已被修改為只使用32位的索引,以簡化直譯器

3) Dalvik VM有什麼新的特點?

Dalvik VM的新特點可以概括為:一個應用,一個虛擬機器例項,一個程式!!!

每一個Android應用都執行在一個Dalvik虛擬機器例項裡,而每一個虛擬機器例項都是一個獨立的程式空間。每個程式之間可以通訊(IPC,Binder機制實現)。虛擬機器的執行緒機制,記憶體分配和管理,Mutex等等都是依賴底層作業系統而實現的。

不同的應用在不同的程式空間裡執行,當一個虛擬機器關閉或意外中止時不會對其它虛擬機器造成影響,可以最大程度的保護應用的安全和獨立執行。

有一張圖,很牛逼,總結的很精闢:
在這裡插入圖片描述

(二) ART

這是android4.4的新東西,還在研究呢,除了官網沒有太多可參考的材料,加上時間有限,我就從百度百科裡扒下來一部分內容略作修改,以後慢慢再做總結改進。

從 Android 4.4 開始,Google 開發者引進了新的Android 執行環境 ART(意思就是 Android Runtime。Android 官方頁面的介紹中,也將其稱作新的虛擬機器),以替代舊的 Dalvik VM。它現在是實驗選項,系統預設的執行環境仍然是 DalvikART 會為 Android 帶來怎樣的改變?AndroidPolice 網站對此進行了分析。

ART 的機制與 Dalvik 不同。在 Dalvik 下,應用每次執行的時候,位元組碼都需要通過即時編譯器轉換為機器碼,這會拖慢應用的執行效率,而在 ART 環境中,應用在第一次安裝的時候,位元組碼就會預先編譯成機器碼,使其成為真正的本地應用。這個過程叫做預編譯(AOT,Ahead-Of-Time)。這樣的話,應用的啟動和執行都會變得更加快速。

根據一些基準測試,新的執行環境能夠使大多數應用的執行時間減半。這意味著,CPU 消耗大、執行時間長的應用能夠更加快速地完成,而一般的應用也能更加流暢,比如動畫效果更順暢,觸控反饋更加即時。在多核處理器的裝置上,多數情況下只需啟用少量的核心,或者能夠更好的利用 ARM 的 big.LITTLE 架構。另外,它將會顯著提升電池的續航能力以及系統的效能。

預編譯也會帶來一些缺點。一方面,機器碼佔用的儲存空間更大。位元組碼變為機器碼之後,可能會增加 10%-20%,不過在應用包中,可執行的程式碼常常只是一部分。比如最新的 Google+ APK 是 28.3 MB,但是程式碼只有 6.9 MB。另一方面,應用的安裝時間會變長。至於延長多少時間,取決於應用本身,一些複雜的應用如 Facebook 和 Google+ 會讓你等待更長時間。

總的來說,ART 的優點還是遠遠超越其缺點的,執行起來更有效率、耗電更少、佔的記憶體也更低。畢竟,影響使用者體驗的要素中,電池續航和應用順暢執行更為重要。我們仍然不知道 ART 何時能夠替代 Dalvik,不過 AndroidPolice 網站說,Google 已經祕密開發了兩年之久。Android 擺脫卡頓的希望,看來就是它了。

相關文章