Android Runtime 的簡單了解


一 什么是Android Runtime

Android Runtime是Android系統里面的核心模塊之一。在編譯Android代碼后會生成APK文件,如果我們打開APK文件,會發現.dex后綴的文件,這些文件包含了了我們APP運行的所有源碼,它們的表現形式為—— 字節碼(byte code)。而字節碼是無法直接被機器執行的,所以Android Runtime的作用是將.dex文件的字節碼(byte code)翻譯成機器可以直接執行的機器碼(machine code)。機器碼(machine code)是一系列可以直接被機器理解和CPU執行的指令。當然Android Runtime還有其他包括內存管理,垃圾回收等功能,不是我們今天所要了解的重點。

我們所說的Dalvik和ART則是Google官方對Android Runtime的具體實現,他們分別代表了不同的實現策略。

二 Dalvik、ART、JIT、AOT

APP性能可以分為如上幾類,Google所作的一切努力都是為了提升如上所示的指標。

Dalvik虛擬機

早期Android系統Android Runtime的具體實現,直到在Android K發布后,光榮退役。受限於早期智能手機的存儲空間和RAM,Dalvik的出現便是為了解決優化一個核心指標——RAM的使用。不同於現在動輒6G,8G的RAM,早期智能手機的RAM最低可以低到200MB。所以為了避免編譯整個APP,Dalvik采用了 Just In Time (JIT)的編譯策略。

JIT(Just in Time)

JIT的核心原理是編譯器僅僅只在APP運行到相關代碼的時候才會去編譯當前運行的一小部分代碼。也正是因為這一原理,Dalvik虛擬機僅僅只在運行時編譯他所需要執行的代碼,這樣就可以節省下大量的RAM。但是我們很快就能想到,這種策略有一個致命的問題,因為一切都發生在運行時,當我們運行時虛擬機才會去編譯我們所需要的代碼,編譯完成后,我們才能執行。這樣就會嚴重影響APP運行時候的性能。雖然Google為Dalvik這種機制做了非常多的優化,比如對一些常用的代碼進行緩存,不用頻繁編譯,但是這些優化手段能夠起到的作用非常有限。隨着時間的推移,我們的手機性能變得越來越強勁,RAM也變得越來越大,存儲空間也越來越大。我們日常所使用的APP,隨着功能的增加,也變得越來越大。開發者們開始發現JIT帶來的性能影響也越來越大。

Google便在Android L中引入了新的Android Runtime 虛擬機實現——ART

ART虛擬機

ART虛擬機的實現與Dalvik虛擬機的實現是完全不同的。它引入了一種新的編譯策略——Ahead of Time(AOT) 而不是繼續使用或者優化JIT。

AOT(Ahead of Time)

AOT的核心原理是,在APP安裝時便將字節碼編譯成機器碼。這樣的實現使得APP在運行時可以直接使用機器碼,而不是在運行時再進行翻譯,這種方法可以將APP的運行性能提高到使用JIT的20倍甚至更多。但同樣的它所帶來的問題是 安裝APP時間會大大拉長,因為系統需要將字節碼翻譯成機器碼。同時翻譯后的產物也會占用更多的存儲空間。隨着ART的推廣,開發者們發現對於一個APP的大部分功能,用戶幾乎很少使用(二八定律)。所以預編譯整個APP,在目前來看是沒有必要的,所以Google在Android N中重新引入了 JIT,同時引入了另一種編譯策略profile-guide optimization(PGO)。

PGO(Profile-Guide Optimization)

它的原理就是,當ART發現熱點代碼的時候,這些代碼便會被直接翻譯成機器碼,並被緩存下來。隨着執行次數的增加,用戶的常用功能被直接探測,那么一個符合用戶使用習慣的profile文件便會被生成。用戶APP的執行性能也會越來越高。而這一部分的操作也並不是在運行時執行,而是在用戶手機空閑的時候根據profile文件做預編譯工作。它所帶來的缺點就是,系統需要根據用戶的使用習慣和方法來進行預編譯,也就是說用戶在第一次使用的時候只會使用JIT,導致首次使用的性能較差。Google為了解決這種問題在Android P中引入了新的編譯策略 profiles in the cloud。具體操作如下所示。

PIC(profiles in the cloud)

它的核心原理是,大部分用戶的使用模式趨同,所以對於已經安裝了該APP的用戶,Google會根據大部分人的行為習慣生成profile文件並存儲在雲端,所以在新用戶安裝時,這份文件會隨着APK文件同時下發,進行預編譯的處理。然后在用戶實際使用時,還會不斷優化profile文件,進行預編譯處理。

三 總結

通過上面的部分,我們可以對文章開頭的幾個名詞有個大概的了解。簡單來說,Dalvik和ART是Google對Android Runtime的具體實現。JIT(時間換空間),AOT(空間換時間),PGO(熱點代碼預編譯),PIC(熱點代碼預測),都是具體的編譯策略。不同的編譯策略沒有好壞之分,他們適用於不同的情況,這也就是為什么Google在移除JIT后,又在后面的版本中重新引入了JIT。

目前來看,國內對於PGO和PIC的討論並沒有多少。PIC本身因為依托於Google商店使得國內的APP廠商興趣不大。對於PGO,開發者更多的關注於用戶的使用性能,用戶的使用體驗是每個開發團隊的核心指標,開發團隊希望每個功能的都能讓用戶直接使用,哪怕是低頻功能,而對於涉及到系統整體優化考量的地方則關心不足,任重道遠。

參考文獻:

JIT的實現

什么是Android Runtime?

深度挖掘ART Runtime

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM