技術宅

對于手機的底層系統和CPU來說,它們只“認識”0和1這樣的機器碼,而在安卓上運行的APP大多是由Java開發的,這種高級程序語言必須轉換成機器碼,才能夠被底層系統所識別(圖1)。
從高級語言的源代碼到系統底層目標碼的轉換,是由編譯器來完成的,它的角色比較接近現實中的翻譯,因為我們人腦(類似安卓手機的CPU)不懂外語,想要和外國人交流的話就需要借助翻譯(即編譯器),將外語轉換為我們可以理解的母語。好的翻譯可以影響雙方交流的流暢度,而一個好的編譯器同樣直接影響著手機系統和軟件的運行效率。

此次華為開發的方舟編譯器是怎樣提高手機系統效率的呢?
開發安卓應用目前用得最多的是Java,它所創建的源文件經過編譯生成Class.dex文件,最后被打包成DEX字節碼文件,再由安卓系統中的Dalvik、Art(編譯器)負責將DEX字節碼翻譯成機器碼,手機CPU識別出機器碼中的操作命令后即可實際執行了。有興趣的朋友可以用72ip解開安卓應用的APK安裝文件,就會發現其中包含有Class.dex文件(圖2)。

每次安卓應用運行時,Dalvik動態地將一部分Dalvik字節碼解釋為機器碼。隨著應用的運行,更多的字節碼被編譯和緩存,這就是典型的“邊解釋邊執行”的安卓運行模式。雖然這種模式具有更小的內存占用和更少的設備物理空間占用優勢,但是也導致安卓系統的運行效率更為低下。這也是為什么很多安卓機型在硬件配置上可以甩掉iPhone幾條街,但是系統流暢度仍然不如iOS的根本原因(圖3)。

另外一方面,由于Java的跨平臺特性是靠字節碼實現的,這就導致應用運行時,必須先將高級語言轉換成字節碼,再將字節碼轉換成機器需要的語言,而且還得需要虛擬機環境才能運行,過多的中間環節使得運行效率進一步受到影響。
針對這一問題,方舟編譯器—方面從機器碼的編譯效率入手,它不像傳統的安卓編譯器那樣“邊解釋邊執行”,而是將動態編譯改進為靜態編譯,這樣可以做到全程執行機器碼高效運行程序,大大縮短了程序響應時間。這有些像我們在優酷上看電視連續劇,傳統的安卓是一集集按部就班地播放,方舟編譯器則類似使用了快進的方式快速預覽全集,這樣看連續劇花的時間更少,但是該有的劇情一個都不會少(圖4)。

另—方面,方舟編譯器摒棄了虛擬機運行環境的依賴。現在安卓上的應用95%都涉及到多種語言的開發,如C、C++、Java等,不同的語言代碼保持獨立,在運行環境中進行協同,因此會產生系統性能的部分損耗。比如大部分依靠Java開發的應用需要虛擬機環境才能運行,這無形中增加了性能的損耗,方舟編譯器則可以做到將不同語言的代碼放到同一套編譯好的執行文件中,省去虛擬機額外的損耗,從而提高效率(圖5)。
通過上述兩方面的優化,部署方舟編譯器的手機可以有明顯的速度提升。根據華為發布會公布的測試結果(內部測試):EMUI 9_, 1中僅僅對系統組件System Server使用方舟編譯器進行優化,就可以帶來24%的系統流暢度提升,系統響應性能提高44%。目前第三方APP適配后(微博極速版)操作流暢度可以提升60%。現在配備的方舟編譯器的P30 Pro已經上市,從網友實際使用體驗看,系統運行速度和同等配置機型相比也有明顯的提升(圖6)。但是否真能與官方宣傳數據相符,還需要靜待第三方權威機構的測試結果。

華為計劃在2019年1 1月的綠盟開發者大會上將完整的方舟編譯器代碼開源。如果開發者都可以使用統一的方舟編譯器,那么安卓底層編譯開發就可以實現統一化,大大降低碎片化的問題,改善其性能劣勢。
不過方舟編譯器畢竟是針對系統底層的優化,需要海量第三方應用的開發和適配,這是一件非常花費時間的事情。而且不是先進的編譯技術就一定能“一統江湖”,安卓應用的生態現極為混亂不堪,各廠商對系統優化的理解也均不相同,在大家沒有形成統一意見時,利益競爭往往會擺在第一優先級。“方舟”是未來的主流還是華為的自娛自樂,這些都有待時間來驗證。