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