Android 6.0中art虛擬機器編譯dex時已完全放棄使用LLVM
記得在Android 4.4釋出的時候,Google正式引入了稱做ART(Android Run Time)的虛擬機器,用來取代傳統的Dalvik虛擬機器。
ART虛擬機器最大的特點就是,將程式碼優化的過程從Davlik的JIT(Just In Time)模式轉換成了AOT(Ahead Of Time)模式。也就是說,在程式正式執行之前就完成了優化和編譯的工作。而編譯的時機時在程式安裝的時候,由dex2oat程式完成的。
記得在剛開始引入ART的時候,大家都說是用的LLVM編譯器。確實,在原始碼中也有LLVM編譯器的影子:
但實際上,dex2oat編譯的時候有兩種模式。一是所謂的Quick模式,這也是Android的預設編譯模式;二是所謂的Portable模式,一份程式碼通吃所有平臺。
Quick模式是Google自己實現的,架構上也參考了LLVM,分為前端(Frontend)和後端(Backend),優化也是自己做的。
而Portable模式確實是實用的LLVM編譯器,不過在預設情況下,編譯dex2oat的時候並不會加上LLVM的部分。
通過閱讀art目錄下的Android.mk檔案內的內容,可以看到,llvm目錄下的程式碼是通過變數ART_USE_PORTABLE_COMPILER來開啟的:
如果不做任何任何修改,預設情況下,編譯的時候這個變數的值是false,並不會被編譯進dex2oat可執行檔案中。
這一部分程式碼一直到5.1.1版本中都存在。既然沒用,為什麼還要保留呢?筆者一直感覺非常奇怪。
這幾天6.0.0的程式碼釋出了,第一時間下載了一份,發現所有以前關於LLVM程式碼的部分都統統被刪除了:
一併刪除的是所謂的Portable編譯模式。
所以,從今後起,再也不會用到LLVM的任何程式碼了。