一、什么是方舟編譯器
方舟編譯器雖然是在 4.11 日 HUAWEI P30 系列國內(nèi)發(fā)布會上公布的應(yīng)用編譯技術(shù),但其實華為早在 5 年前就開始布局,并投入數(shù)百專家團隊,歷經(jīng)多次嘗試,才在 EMUI 9.1 上實現(xiàn)了機器代碼的翻譯。幾千年來,人們從裹腹耐寒到智慧創(chuàng)新,從未停止探索世界的步伐。同時,他們將這些智慧賦予更多的物體,比如機器。
想讓機器讀懂人類情感,他們之間就需要有個“翻譯”,來充當人機交互的橋梁,也就是專業(yè)人士口中的編譯技術(shù)。
它能夠?qū)?C、Java 等高級語言轉(zhuǎn)換為機器能讀懂的低級語言,將精妙的代碼轉(zhuǎn)化為 0 和 1 的二進制指令,消除了溝通障礙,從而馴服了機器。
可以說編譯器是軟件與芯片之間的橋梁,其性能,效率直接影響到機器的運行效率。
二、方舟編譯器和Java的故事
而既有的安卓系統(tǒng)框架與應(yīng)用之間,仍然使用的是不被機器直接讀懂的 Java 語義,最初的解決方案是通過增加一個虛擬機制(JVM),相當于一個“中間層”將 Java 語言“翻譯”為機器可以讀懂的匯編指令。
中間層”翻譯一句 Java 語義機器就執(zhí)行一段,也就是“邊解釋邊運行”(動態(tài)編譯),不但效率低,耗費系統(tǒng)資源,對操作流暢度也有影響。
盡管安卓系統(tǒng) 6.0 以后采用了 ART (Android Runtime)模式,對調(diào)用次數(shù)多的 Java 代碼編譯為機器碼(靜態(tài)編譯);在設(shè)備空閑的時候進行一些預編譯,解決了部分 Java 代碼執(zhí)行效率問題,但對于動態(tài)語義部分還是無法實現(xiàn)靜態(tài)編譯,仍需要虛擬機充當“翻譯”邊解釋邊運行,效率和體驗提升有限。
而方舟編譯器,采用了全新的系統(tǒng)及應(yīng)用的編譯和運行機制,對所有的 Java 語義全部做到靜態(tài)編譯,直接將 Java 語言“翻譯”成機器語言(靜態(tài)編譯),消除了虛擬機動態(tài)編譯的額外開銷,實現(xiàn)了開發(fā)和運行效率的兼容并舉。
如果把編譯器看做一個翻譯,就好比我們?nèi)サ揭粋€語言不通的國家,原本只能通過同聲翻譯(虛擬機)來進行交流溝通,難免效率低下。而華為方舟編譯器更像是讓您直接獲得了語言能力,從而可以擺脫同聲翻譯(虛擬機),可以更暢快地與當?shù)厝藴贤ā?/p>
根據(jù)華為實驗室的測試數(shù)據(jù),EMUI 9.1 在僅僅對系統(tǒng)組件 System Server 應(yīng)用了華為方舟編譯器后,系統(tǒng)操作流暢度提升 24%,系統(tǒng)響應(yīng)性能提升 44%。同時,新浪微博極速版在應(yīng)用方舟編譯器之后,操作流暢度最高提升了60%
方舟編譯器編譯的應(yīng)用在開發(fā)階段就已完成。也就是說,只要是經(jīng)過編譯器編譯的應(yīng)用,在應(yīng)用市場上上架了以后,用戶下載的就是編譯過的了。
三、方舟編譯器在底層重造安卓系統(tǒng)體驗
據(jù)王成錄透露,在方舟編譯器發(fā)布當天,電話被打爆了,業(yè)界的開發(fā)者都高度關(guān)注。
為什么會這樣?因為方舟編譯器是對安卓底層機制的重構(gòu),給用戶體驗帶來的提升是顛覆性的。
它解決的是安卓手機上最大的痛點:“卡頓”。編譯器,就像是人類和機器溝通的橋梁,承擔著將高級語言“翻譯”成機器能懂的機器碼,并按照指令運行。但是,在安卓系統(tǒng)中,編譯器卻有一個繞不過的坎兒:虛擬機。安卓系統(tǒng)雖然在不斷演進,但始終需要虛擬機來實現(xiàn)解釋和執(zhí)行。
用翻譯的方式來比喻,更容易理解。安卓程序的虛擬機中有解釋器和編譯器,相當于是有兩個翻譯在運行。解釋器好像現(xiàn)場翻譯,演講者講一句,就需要停下來翻譯一句給編譯器,編譯器則結(jié)合上下文一次翻譯一大段。兩個翻譯同時在搞,于是你聽到的內(nèi)容就是斷斷續(xù)續(xù)的,你的系統(tǒng)就會變得非??D。
而且,虛擬機的統(tǒng)一回收內(nèi)存也是卡頓的罪魁禍首之一,Java的虛擬機模式提供了內(nèi)存GC(垃圾回收)機制,內(nèi)存垃圾是集中回收,但全局回收時需要短暫中斷應(yīng)用,成為隨機卡頓的根因之一。
那么,方舟編譯器帶來的顛覆在哪里呢?首先,方舟的內(nèi)存回收機制是隨用隨回收,回收時無需暫停應(yīng)用,因內(nèi)存回收的隨機卡頓就消除了。其次,方舟編譯器是在應(yīng)用打包的時候直接編譯出了機器指令,無需繁瑣的虛擬機運行,徹底消除了虛擬機的動態(tài)編譯的額外開銷,從邊翻譯邊執(zhí)行到提前編譯機器碼直接執(zhí)行(運行時無需再編譯),大幅提升了效率,讓性能得到大幅提升。
用量化的方式可以很好地看到這種性能提升的效果:有了方舟編譯器的手機,能實現(xiàn)系統(tǒng)操作流暢度提升24%,系統(tǒng)響應(yīng)性能提升44%。
能實現(xiàn)這樣的效果,方舟編譯器的內(nèi)存回收機制也功不可沒。原來虛擬機的內(nèi)存回收是統(tǒng)一進行的,全局回收時需要暫停應(yīng)用(導致卡頓);而方舟編譯器則是內(nèi)存隨用隨回收,回收時無需暫停應(yīng)用,顯然能夠避免卡頓。
方舟編譯器看起來深奧,但是對應(yīng)用開發(fā)者和用戶來說卻很簡單。王成錄說,對于應(yīng)用開發(fā)者無需修改代碼,只需要用方舟編譯器重新編譯,就能帶來性能的提升。對于用戶來說,只要在應(yīng)用市場下載編譯過的應(yīng)用,就直接能享受到性能提升的好處。
重新編譯,會帶來應(yīng)用安裝包和安裝后占用空間的增大,以微博極速版為例,安卓9.0的apk是9.7Mb,安裝后是37.5Mb,而使用方舟編譯器后的安裝文件apk是23Mb,安裝完后大約不到50Mb。但是,使用方舟編譯器后的性能提升卻是顛覆性的,微博極速版的操作流暢度提升了60%!
一句話,方舟編譯器給安卓程序的性能提升結(jié)果非常顯著。這個性能提升可以用應(yīng)用執(zhí)行時間來衡量,而應(yīng)用執(zhí)行時間=應(yīng)用執(zhí)行指令總條數(shù)X平均每條指令所用CPU cycle數(shù)/ CPU頻率,CPU頻率由手機硬件決定,方舟編譯器可以實現(xiàn)平均每條指令所用CPU cycle數(shù)更少、應(yīng)用執(zhí)行指令總條數(shù)更少,從而帶來更快的應(yīng)用執(zhí)行時間。
同樣用翻譯來比喻這種編譯帶來的性能提升?!啊癢hat happens in Vegas, stays in Vegas”如果比作最初的應(yīng)用,如果不編譯,翻譯可能是“在拉斯維加斯發(fā)生的一切,就留在拉斯維加斯”,而方舟編譯器編譯帶來的則是“勿念過往 活在當下”,顯然要好得多。
總結(jié)
所以,方舟編譯器、EROFS超級文件系統(tǒng)等顛覆性的技術(shù)創(chuàng)新,只是華為在軟件領(lǐng)域不斷突破和努力的縮影。華為正在憑借自己的技術(shù)實力和不斷努力,重造安卓系統(tǒng)的體驗。
除了硬件的技術(shù)突破,軟件也在用戶體驗中扮演越來越重要的角色。這就是軟件的力量,通過持續(xù)的技術(shù)進步,持續(xù)的生態(tài)開放,讓消費者感受到,華為的產(chǎn)品體驗在進步,安卓系統(tǒng)的體驗在進步。