一、Android系統效能提升之路
Dalvik虛擬機器作為Android平台的核心組成部分之一,允許在有限的記憶體資源中同時運行多個虛擬機器執行個體。Dalvik虛擬機器通過以下方式提升效能:
1、DEX代碼安裝時或第一次動態載入時odex化處理。
2、Android2.2版本提供了JIT機制提升效能,號稱效能提升3~5倍。
3、提升硬體設定,如更多核CPU、更高頻率CPU、更大的RAM等。
但是Android的系統流暢度與IOS系統還是有一定得差距。Android代碼必須運行在Dalvik虛擬機器上,而IOS直接是本地代碼,效能差距也在情理之中。如果Android系統想擁有與IOS系統相同的系統效能。Dalvik虛擬機器運行機制就成為Android系統效能提升唯一的障礙。
Android Kitkat 提供了一種與Dalvik截然不同的運行環境-ART(Android Runtime)的支援。目前使用者可以選擇裝置的運行環境,在不久的將來ART肯定會替代Dalvik Runtime。
二、Dalvik vs ART
Dalvik運行環境使用JIT(Just-In-Time)來進行轉譯,應用每次啟動並執行時候,位元組碼都需要通過JIT轉換為機器碼,這會拖慢應用的運行效率。而ART則是使用AOT進行處理(Ahead-Of-Time),並會在應用程式安裝完畢時,進行預先的基礎性編譯作業,這就減去了JIT運行時的機器碼轉化時間,應用的啟動和執行都會變得更加快速。
ART優點:
1、系統效能的顯著提升。
2、應用啟動更快、運行更快、體驗更流暢、觸感反饋更及時。
3、更長的電池續航能力。
4、支援更低的硬體。
ART缺點:
1、更大的儲存空間佔用,可能會增加10%-20%。
2、更長的應用安裝時間。
總的來說ART的功效就是“空間換時間”。
三、初步感知ART
1、裝置如何選擇ART運行環境
通過以下步驟開啟:設定→關於手機→點擊最下面的版本號碼7次→開發人員模式出現→返回→進入開發人員模式,然後選擇runtime-使用ART
目前官方Android模擬器並不能開啟ART模式,可以通過該網址下載支援ART模式的Android模擬器鏡像 ( http://blog.csdn.net/coolypf/article/details/17069015)
2、Dalvik切換ART後系統變化
2.1、應用安裝時採用的代碼最佳化方式不同:
Dalvik Runtime : dex2opt(http://124.16.139.131:24080/lxr/source/dalvik/dexopt/OptMain.cpp?v=android-4.0.4#f_OptMain.cpp)
ART Runtime : dex2oat (https://android.googlesource.com/platform/art/+/kitkat-release/dex2oat/dex2oat.cc)
2.2、最佳化後的檔案大小及格式不同:
兩個運行環境產生的最佳化代碼路徑及檔案名稱都為:/data/dalvik-cache/app/data@app@{package name}.apk@classes.dex
ART環境產生的最佳化代碼檔案大小明顯比Dalvik環境產生大:
雖然都為.dex檔案結尾,但是檔案格式卻是天壤之別:
ART環境檔案格式:ELF Shared Object
Dalvik環境檔案格式:
三、ART相關原始碼
ART相關原始碼:(https://android.googlesource.com/platform/art/+archive/kitkat-release.tar.gz)
從原始碼檔案目錄名稱可以很清楚的瞭解各檔案夾中相關檔案的功能,我們最關心的主要有compiler、dex2oat、runtime三個檔案夾:
compiler:主要負責Dalvik位元組碼到本地代碼的轉換,編譯為libart-compiler.so
dex2oat :完成DEX檔案到ELF檔案轉換。編譯為dex2oat
runtime :Android ART運行時原始碼,編譯為libart.so
四、dex2oat最佳化流程
在應用安裝時,installd通過dex2oat最佳化APK安裝包classes.dex的Dalvik位元組碼為本地機器代碼。整個最佳化為:
更多LLVM編譯器的資訊可查看:
http://llvm.org/
http://www.ibm.com/developerworks/cn/opensource/os-createcompilerllvm1/
http://www.chinaicexpo.com/market/1104-llvm.html
五、OAT檔案格式
OAT檔案其實就是基於ELF格式的一種私人檔案格式。
OAT的ELF 段資訊:
OAT的ELF export資訊:
OAT檔案載入流程,通過分析ART相關源碼,當通過DexClassLoader載入一個OAT檔案基本流程如下:
1、讀取oatdata符號地址擷取Oat資料 startAddress。
2、讀取oatlastword符號地址擷取OAT資料 endAddress。
3、通過startAddress和endAddress定位Oat資料。
4、解析Oat資料。構建方法定位所需資料結構。
然後就可以調用載入OAT檔案的代碼了。
整個的方法定位過程和Dalvik運行環境沒有太大區別,讀者可以通過(http://blog.csdn.net/androidsecurity/article/details/8664778)來瞭解如何定位到一個類的某個方法。
您可以簡單的認為ART和Dalvik區別就是:Dalvik定位到的方法是Davlik位元組碼,但是ART定位到的方法是本地代碼。僅是方法代碼內容發生了變化,但是方法的定位過程基本相同。
我們以關鍵的地址點為分割截取OAT檔案資料區段:
ELF頭:
OAT資料內容開始:(注意0x10BB位置,DexHeader開始)
可執行本地代碼部分:
OAT資料結束位置:
具體的OAT檔案格式可以查看原始碼。