技術宅
對于手機的底層系統(tǒng)和CPU來說,它們只“認識”0和1這樣的機器碼,而在安卓上運行的APP大多是由Java開發(fā)的,這種高級程序語言必須轉換成機器碼,才能夠被底層系統(tǒng)所識別(圖1)。
從高級語言的源代碼到系統(tǒng)底層目標碼的轉換,是由編譯器來完成的,它的角色比較接近現(xiàn)實中的翻譯,因為我們人腦(類似安卓手機的CPU)不懂外語,想要和外國人交流的話就需要借助翻譯(即編譯器),將外語轉換為我們可以理解的母語。好的翻譯可以影響雙方交流的流暢度,而一個好的編譯器同樣直接影響著手機系統(tǒng)和軟件的運行效率。
此次華為開發(fā)的方舟編譯器是怎樣提高手機系統(tǒng)效率的呢?
開發(fā)安卓應用目前用得最多的是Java,它所創(chuàng)建的源文件經過編譯生成Class.dex文件,最后被打包成DEX字節(jié)碼文件,再由安卓系統(tǒng)中的Dalvik、Art(編譯器)負責將DEX字節(jié)碼翻譯成機器碼,手機CPU識別出機器碼中的操作命令后即可實際執(zhí)行了。有興趣的朋友可以用72ip解開安卓應用的APK安裝文件,就會發(fā)現(xiàn)其中包含有Class.dex文件(圖2)。
每次安卓應用運行時,Dalvik動態(tài)地將一部分Dalvik字節(jié)碼解釋為機器碼。隨著應用的運行,更多的字節(jié)碼被編譯和緩存,這就是典型的“邊解釋邊執(zhí)行”的安卓運行模式。雖然這種模式具有更小的內存占用和更少的設備物理空間占用優(yōu)勢,但是也導致安卓系統(tǒng)的運行效率更為低下。這也是為什么很多安卓機型在硬件配置上可以甩掉iPhone幾條街,但是系統(tǒng)流暢度仍然不如iOS的根本原因(圖3)。
另外一方面,由于Java的跨平臺特性是靠字節(jié)碼實現(xiàn)的,這就導致應用運行時,必須先將高級語言轉換成字節(jié)碼,再將字節(jié)碼轉換成機器需要的語言,而且還得需要虛擬機環(huán)境才能運行,過多的中間環(huán)節(jié)使得運行效率進一步受到影響。
針對這一問題,方舟編譯器—方面從機器碼的編譯效率入手,它不像傳統(tǒng)的安卓編譯器那樣“邊解釋邊執(zhí)行”,而是將動態(tài)編譯改進為靜態(tài)編譯,這樣可以做到全程執(zhí)行機器碼高效運行程序,大大縮短了程序響應時間。這有些像我們在優(yōu)酷上看電視連續(xù)劇,傳統(tǒng)的安卓是一集集按部就班地播放,方舟編譯器則類似使用了快進的方式快速預覽全集,這樣看連續(xù)劇花的時間更少,但是該有的劇情一個都不會少(圖4)。
另—方面,方舟編譯器摒棄了虛擬機運行環(huán)境的依賴?,F(xiàn)在安卓上的應用95%都涉及到多種語言的開發(fā),如C、C++、Java等,不同的語言代碼保持獨立,在運行環(huán)境中進行協(xié)同,因此會產生系統(tǒng)性能的部分損耗。比如大部分依靠Java開發(fā)的應用需要虛擬機環(huán)境才能運行,這無形中增加了性能的損耗,方舟編譯器則可以做到將不同語言的代碼放到同一套編譯好的執(zhí)行文件中,省去虛擬機額外的損耗,從而提高效率(圖5)。
通過上述兩方面的優(yōu)化,部署方舟編譯器的手機可以有明顯的速度提升。根據(jù)華為發(fā)布會公布的測試結果(內部測試):EMUI 9_, 1中僅僅對系統(tǒng)組件System Server使用方舟編譯器進行優(yōu)化,就可以帶來24%的系統(tǒng)流暢度提升,系統(tǒng)響應性能提高44%。目前第三方APP適配后(微博極速版)操作流暢度可以提升60%?,F(xiàn)在配備的方舟編譯器的P30 Pro已經上市,從網友實際使用體驗看,系統(tǒng)運行速度和同等配置機型相比也有明顯的提升(圖6)。但是否真能與官方宣傳數(shù)據(jù)相符,還需要靜待第三方權威機構的測試結果。
華為計劃在2019年1 1月的綠盟開發(fā)者大會上將完整的方舟編譯器代碼開源。如果開發(fā)者都可以使用統(tǒng)一的方舟編譯器,那么安卓底層編譯開發(fā)就可以實現(xiàn)統(tǒng)一化,大大降低碎片化的問題,改善其性能劣勢。
不過方舟編譯器畢竟是針對系統(tǒng)底層的優(yōu)化,需要海量第三方應用的開發(fā)和適配,這是一件非?;ㄙM時間的事情。而且不是先進的編譯技術就一定能“一統(tǒng)江湖”,安卓應用的生態(tài)現(xiàn)極為混亂不堪,各廠商對系統(tǒng)優(yōu)化的理解也均不相同,在大家沒有形成統(tǒng)一意見時,利益競爭往往會擺在第一優(yōu)先級?!胺街邸笔俏磥淼闹髁鬟€是華為的自娛自樂,這些都有待時間來驗證。