Android 的 ART 是什麼東西,有何作用?

&> ART is a new Android runtime being introduced experimentally in the 4.4 release. This is a preview of work in progress in KitKat that can be turned on in Settings &> developer options. This is available for the purpose of obtaining early developer and partner feedback.

via http://source.android.com/devices/tech/dalvik/art.html


以下引用自我前幾天寫的一篇簡介 繼續談談下一代Android VM runtime: ART

ART是一個AOT編譯器。所謂AOT (Ahead of Time)是指在運行以前就把中間代碼靜態編譯成本地代碼,而JIT (Just inTime)則是在運行時動態編譯。

AOT和JIT比各有長處,這裡不詳細展開,只簡單列舉幾個最主要的:

  • AOT的主要編譯過程發生於開發用機,因此編譯得慢一點沒關係,可以充分的做各種耗時的優化;JIT在運行時動態編譯,通常不能做太耗時的優化,否則影響啟動和運行速度
    • 更具體一點,以Sun的JVM為例,JIT大體上劃分為client和server兩種模式。Client模式下VM是一邊解釋執行,一邊識別熱點區域進行JIT編譯,以免明顯影響啟動速度;考慮到內存佔用,也不會把所有Java位元組碼都編譯成本地代碼。Server模式下則會進行全面的JIT編譯,因為server啟動慢一點沒關係,一旦跑起來就會運行很長時間,所以花一點點時間全面優化是值得的。
  • 因為受優化程度限制,JIT編譯出來的本地代碼體積通常比較大,5到10倍於bytecode都是正常的。AOT編譯出來的本地代碼體積更小。Android的JIT code cache也是內存佔用的重要角色。
  • 因為是預編譯好的機器代碼,AOT產生的代碼和載入執行過程和普通的本地代碼沒有太大分別。不過仍然需要運行時的GC支持。
  • 雖然AOT可以有更多的時間和空間做編譯優化,但並不等於性能上就一定勝過JIT。JVM有不少東西只能在運行時動態決定是否可以採用編譯優化(如識別可以inline的虛方法),以及運行時動態反優化(例如inline了一個虛方法,後來發現遇到新的派生類的實例,就需要取消原來的inline)。這些事情AOT就不容易做到。
  • AOT的編譯器一般會分兩個版本,一個在開發機上編譯整個系統和預裝應用,另一個是一個精簡版,在設備上運行,負責編譯連接新安裝的應用。
  • AOT編譯出來的代碼仍然需要運行時的支持,特別是GC。

如果ART確實是用AOT compiler替換JIT,性能先不談,Android的內存佔用應該會因此獲益。現在dex代碼經過 dex =&> optimized dex =&> JIT cache這個過程,內存中需要同時容納odex和JIT cache兩份代碼;換成ART以後,就變成dex =&> oat,內存里只放oat就可以。不過考慮到ART的解釋器代碼里有提到deoptimization,也有可能在特定情況下還需要load dex代碼解釋執行。重要的是oat應該是可以直接mmap執行的代碼(其實就是一個真·ELF格式的文件),載入/換頁重載入的速度都會比從odex動態編譯來得快。


以前從愛極客視頻里看到的:安卓軟體相對於每台機器來說好比一本外文原著,Dalvik就是每台機器帶的一個同聲翻譯,你在翻看書時,你一邊看他一邊翻譯,對同聲翻譯(配置)要求較高;ART模式好比一個翻譯出版社,你買了外文書後他先翻譯成你的母語(安裝時間變長),之後你就擁有了一本針對你自己機器的母語書籍,看起來就會快很多


所有Metro/Modern UI的app都跑在一個叫Windows RT的東西上,全稱叫 windows runtime。大概就是說,用來運行win8、wp8.1 的環境,這跟魚和水的效果差不多。
========現在來說 ART========
ART 全稱 android runtime,前身是Dalvik。作用跟Windows RT一樣,用來運行android app的,但是不能叫 android RT啊(該死的微軟),於是靈光一閃,就叫 ART吧


類似dex的文件這邊有個粗略的信息
BREAKING: New Runtime Compiler in Android 4.4 to Possibly Bring Better Performance in Future Releases
dex2oat/dex2oat.cc


是android的一種新的運行模式,我記得5.0版本以下程序運行在dalvik虛擬機中,運行方式為JIT,而5.0以上用戶可以選擇運行態是為dalvik或者art(在設置-&>開發者選項中),art的好處就是它是aot的,它把代碼先編譯優化存起來(這就造成art模式安裝軟體的話會有一些慢),等運行的時候直接載入到內存跑,運行速度就會快很多。


在我的手機啟用ART模式之後確實沒感受到特別明顯的流暢度的變化,而且還有部分的軟體特別是遊戲的不兼容性。但是總覺得在未來ART模式還是應該唄推廣。


推薦閱讀:

為什麼會出現下載「家庭用藥」卻變成「應用寶」這種情況?
目前(2011 年 6 月),各種智能手機操作系統有哪些優劣?
Android App 中支持 GCM 推送的有哪些?
Android 上有些遊戲為什麼針對 CPU / GPU 做這麼多適配版本?
Android 平台最好的 Google Reader 客戶端是什麼?

TAG:Android | Android44 | AndroidRuntimeART |