提速安卓支撐鴻蒙?“大殺器”方舟編譯器深度解析
華為開發者大會鴻蒙OS正式發布,這是基於微內核的全場景分佈式OS。能實現模塊化解耦,對應不同設備(智慧屏、穿戴設備、車機、智能音箱、手機)可彈性部署。華為消費者業務CEO 余承東描述了華為鴻蒙OS 的方方面面。
余承東稱,華為方舟編譯器,會通過多終端IDE 開發環境來支撐當前的鴻蒙OS。目前方舟編譯器支撐鴻蒙內核,“方舟編譯器能提升60%的編譯性能”,將來鴻蒙微內核能按需擴展,並希望用一個鴻蒙微內核代替全部內核。
今天,我們就聚焦華為的新貴——方舟編譯器,這個一發布就引起巨大響動的底層核心技術。方舟編譯器究竟是什麼?它為什麼能夠做到“青出於藍而勝於藍”,下面就讓我們帶著疑問去解讀。
01 編譯器是什麼?
首先講講編譯器是什麼東西吧?其實絕大多數用戶都不清楚這是什麼。程序員們在寫好應用的代碼之後,在變成我們手機上安裝的應用之前,還差最後一步就是編譯。
簡單來說,編譯器就是把編程人員開發的高級語言程序,翻譯成機器可執行的機器指令,這就是編譯器。它就像一位翻譯官,是連接程序員與機器的橋樑。
由此來看,方舟編譯器面向的是開發者的,但最終受益的還是消費者。
打個比方,說計算機是汽車,那麼軟件就像汽車的操控系統一樣。編譯器則是汽車發動機裡最核心的汽油燃燒技術,將軟件變成計算機的動力,其編譯的效率,直接決定了用戶的使用體驗。所以了解方舟編譯器之前,我們必須得首先了解Android 操作系統中的編譯器的運行機制。
安卓系統從2008年1.0到9.0,截至目前安卓系統大小版本超過15個。十年發展安卓手機的體驗已經今非昔比。可生活中還有很多人詬病安卓手機沒有iPhone流暢,那麼安卓系統的程序是怎樣運行的?下面我們來闡述一下
Java的虛擬機的故事
Android 1.0剛發布的時候,使用的是一個叫Dalvik的虛擬機(Virtual Machine,簡稱VM)裡面集成了一個解釋器,每次用戶在安卓手機上運行APP時,就會喚醒解釋器,來給安卓的硬件解釋APP接下來要幹什麼。
這個問題嚴重拖了安卓手機的後腿,所以Android2.2版本引入了JIT機制。JIT比較聰明,當用戶在安卓手機運行APP時,會同時將用戶經常使用的功能編譯為機器能直接執行的機器碼,不用一句一句去翻譯。當出現不常用的功能時,再喚醒解釋器翻譯。
但是每次啟動APP都要重新編譯一次,加上Dalvik虛擬機性能比較落後,所以穀歌在Android 5.0版本將虛擬機從Dalvik替代成ART,同時把JIT的編譯器替代成AOT 。AOT相比JIT的好處,就是不用每次打開APP都需要先編譯一遍。但是,壞處是安裝應用慢和占用內存空間。
在Android 5.0 正式採用ART 之前,Android 採用的是解釋執行+JIT 的方式執行Java 代碼。在這個階段的系統是“邊解釋邊執行”模式,代碼效率比較低下,當時Android給人的感覺就是卡。
目前的Android採用的是解釋執行+JIT+AOT 的模式,但並沒有擺脫一個前提,即應用在被打包成APK的時候,採用的還是Java代碼。
JNI接口調度佔用額外資源
現在大部分應用都是使用Java和C/C++等多種語言混合開發而成。Java和C/C++屬於兩種不同架構的語言,為了使APP正常運行,它倆之間需要互通的接口——JNI。
這就意味著手機硬件資源要分配一部分給JNI去做調度。不僅佔用了硬件資源,而且這種機製本身就效率較低。
安卓內存回收機制容易造成卡頓
當手機內存資源不夠用的時候,安卓虛擬機就會召喚GC(Garbage Collection),讓所有手機運行的Java線程全部暫停,GC機制,無法精確控制內存回收,所以性能較差的手機間歇的出現“抽搐般”的卡頓現象。
以上這幾個問題,一直影響著安卓手機的體驗。其中最主要的是Java 高級語言轉換機器能懂的語言,這一轉換過程直接導致了Android的卡頓。反觀iOS系統,直接使用Clang/LLVM來編譯出機器碼,就沒有安卓還要一個中間層,也因為如此,我們感覺iOS系統一般更流暢。
02 方舟編譯器牛在哪?”幹掉”虛擬機
方舟編譯器做的就是,將Java的所有語句統統翻譯成機器碼,最後打包成APK安裝文件。方舟編譯器最大的優勢在於它繞過了虛擬機。簡單來說,方舟編譯器可以將高級語言(Java)直接變成機器碼,無需再通過Android 系統中內置的編譯器。
華為Mate 20 RS保時捷版(全網通)
京東商城
12999元
進入購買
總之,方舟編譯器是完全替代了語言虛擬機的靜態編譯器,從此不再需要解釋器。相比現有的編譯機制有以下明顯優勢:
1、方舟編譯器是一種靜態的編譯方式,而現有的安卓系統,運行一個應用程序首先啟動虛擬機,然後讀入應用代碼逐條解釋執行,無法做到100%做到擺脫虛擬機,這也是當前安卓陣營面臨的問題。
簡單一句話,只要是經過編譯器編譯的應用,在應用市場上架以後,用戶下載的APK 就是編譯好的了,方舟編譯的應用在開發階段就已完成了。
2、華為方舟編譯器的靜態編譯方式可將語言裡的動態特性直接翻譯成機器碼,手機安裝應用程序後可全速運行程序,徹底幹掉了虛擬機,極大提升了系統運行效率。
方舟編譯器對於系統在這方面的提升,官方曾這樣描述:
一、EMUI 9.1對系統主要服務System Server進行靜態編譯化,帶來了系統流暢度提升24%,系統響應性能提升44%以上的收益。
二、微博極速版實現了靜態化編譯後,流暢度提升高達60%。通過上方演示視頻來看,經過方舟編譯優化的APP,在流暢度度方面的提升很明顯。
03 新的內存垃圾回收機制
此外,方舟編譯器還帶來了新的系統垃圾回收機制。以往安卓的垃圾回收機制是集中回收,由於Java虛擬機的特點,系統會不停的地自動回收內存垃圾,保證內存不會溢出。
更要命的是,當內存低於某個標準值後,它就會自動殺掉優先級低的進程。系統會集中關閉被標記的多餘進程,這就造成了隨機性的卡頓。相信大家遇到過這種情況,啟動遊戲時,點按應用瞬間進入前會感覺莫名的卡頓,界面像是遲鈍了一下。
而方舟編譯器在這方面有什麼不同,它的內存回收機制是隨用隨回收,回收時不需要暫停應用,而是直接回收內存垃圾,這大大提高了系統運行速度和效率。
小結:方舟編譯器的優勢,可以簡單總結為以下五個方面:
1.安卓程序編譯效果更好
2.安卓應用安裝速度更快
3.APP運行速度更快
4.系統內存垃圾隨用隨清,對手機硬件的要求降低
5.省電
04 十年造方舟,為安卓提速為真,支撐鴻蒙也為實
十年磨一劍,沒錯,華為方舟編譯器準備了十年之久。2009年,華為啟動5G基礎技術研究的同時,開始創建編譯組,第一批海內外研究人員加入。
2013年,華為推出面向基站領域的自研編譯器HCC,並正式提出編譯器框架構想。
2014年,眾多海內外專家加入華為,方舟項目正式啟動。同時,編譯器領域的頂級大佬,周志德(Fred Chow)的加入大大增強了研發實力
2016年,成立編譯器與編程語言實驗室。2019年,華為方舟編譯器正式面世!
方舟編譯器既能統一適配安卓機器語言,自然也能適配成自家系統的機器語言——鴻蒙OS,方舟編譯器為“安卓提速”為真,但能“支撐鴻蒙”也為實,它完全可稱為讓開發者從安卓到鴻蒙過渡的”諾亞方舟”。
05對外開源構建生態
據悉,方舟編譯器也將開放給第三方合作夥伴。其後續會在2019 年11 月的綠盟開發者大會實現完整方舟編譯器代碼開源,讓廣大的應用開發者、手機廠商參與,共同構建開發者生態,使安卓體系變得更加完整強大。
未來方舟編譯器是否能成功,還要看後續完整生態的搭建。希望開發者積極參與進來,最終給消費者帶來更為極致的體驗。總結:
從方舟編譯器我們就能看出華為對研發的投入,以及對未來生態搭建的規劃,或許,想要做一個操作系統並不難,比如阿里雲 OS,但難的是未來完整生態的構建。
無論怎麼看待華為,目前,在國內也只有它有實力去幹這件事情,並不只是說說而已,華為的終極目標很明顯,就是在未來搭建全方位的生態。我們期待這項技術能夠普及開來,促進Android體系更加強大,也希望華為能在未來帶給我們更多驚喜。