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