解讀| 華為方舟編譯器是如何實現Android - 手機討論

Jake avatar
By Jake
at 2019-04-26T12:17

Table of Contents


解讀| 華為方舟編譯器是如何實現Android 性能革命的?

2019 年4 月11 日,在上海的華為新品發布會上,除了可以拍月亮的華為P30 系列,余承東還親自拋出了兩項軟件層面的“重磅炸彈”,分別是方舟編譯器和EROFS 超級文件系統;其中,華為方舟編譯器可以實現“架構級優化和顯著提升性能”,可以解決安卓程序“邊解釋邊執行”的問題,從而被余承東稱之為“安卓性能革命”。


發布會結束之後,華為方舟編譯器引起了外界的熱議。

那麼,方舟編譯器究竟是什麼?它的“革命性” 到底體現在哪裡?面對這些問題,華為終於在兩週之後舉行了媒體沙龍,對方舟編譯器進行了更加細緻的解讀。

Android 生態中編譯器的工作原理

在了解方舟編譯器之前,我們必須得首先了解Android 操作系統中的編譯器的運行機制。

雷鋒網從VirtualXposed/太極的作者weishu處了解到,當前Android平台的絕大多數應用是使用Java語言寫的,CPU只能理解彙編指令,無法直接識別Java語言的虛擬機指令;為了讓CPU能運行Java語言編寫的程序,一般有兩種辦法:

引入一個中間層,這個中間層負責Java 代碼的執行,然後這個中間層本身編譯為CPU 能理解的彙編指令,也就是CPU -> 中間層-> Java 代碼。如果這個中間層採用Java 語言直接作為輸入,理解一句Java 語句就把Java語言翻譯一下讓CPU 執行一段,我們一般稱這種模式為「解釋執行」。毋庸置疑這種方式效率是相當低效的。

直接把Java 語言翻譯成CPU 能理解的機器語言。這裡又有兩種方式:第一,在程序運行之前直接把Java 代碼編譯為機器語言。這種模式稱之為AOT(Ahead of time)編譯;第二,在程序運行起來之後,實時地把Java 語言編譯為機器語言然後執行。這種模式稱之為JIT(Just in time) 編譯。

具體在Android 平台上,代碼編譯經歷了數個階段。

在Android 5.0 正式採用ART 之前,Android 採用的是解釋執行+ JIT 的方式執行Java 代碼。在這個階段是貨真價實的「邊解釋邊執行」的模式,代碼效率相當低下,再加上那時候同樣表現不行的GC(垃圾回收),Android 非常難用。


在Android 5.0 至Android 6.0 階段,Google 推出了ART(Android Runtime)來解決之前的Java 代碼執行效率問題。這個階段採用的是完全AOT 模式;Android 應用在安裝的時候,系統會把所有Java代碼提前編譯為機器碼。這種模式有兩個缺點:

安裝速度巨慢。即使是高通驍龍855 採用AOT 模式編譯一下安裝包比較大的應用(如支付寶)可能就要一分鐘。而那個時候的CPU 並不如現在,安裝一個應用需要很長時間。更要命的是,系統OTA 開機會對所有的應用執行AOT 操作,這時候開機速度可能需要很長時間。

佔用磁盤空間,Java 代碼編譯為機器碼之後體積會急劇膨脹。

到了Android 7.0,Google 做了很大的改進;這一改進是基於這樣一個事實:我們使用一個應用的時候,基本每個人只使用它一小部分功能,為什麼要把所有代碼全編譯呢?因此只編譯用戶經常用的那部分代碼就OK 了,這樣安裝的時候速度比較快,等用戶啟動的時候系統就能知道哪部分代碼經常被執行,把這部分代碼編譯為機器碼,運行起來速度也快。

於是Google 又引入了JIT,這時候的執行模式是AOT + JIT + 解釋執行。具體來看:

應用安裝的時候不執行AOT 編譯,安裝速度飛快。初次使用應用的時候沒有機器碼,因此只能解釋執行。

應用運行起來之後,系統收集經常被運行的代碼的信息,做兩件事:1)在必要的時候在運行時直接把Java 代碼編譯為機器碼(JIT),然後使用機器碼執行提高運行效率。2)把這個「經常被運行的代碼信息保存起來」。

設備空閒的時候,系統拿出應用運行時候保存的「熱點代碼信息」直接把這些代碼編譯為機器碼(AOT)。

Android 8.0 上改進了解釋器,解釋模式執行效率大幅提升;Android 10.0 上提供了預先放置熱點代碼的方式,應用在安裝的時候就能知道常用代碼會被提前編譯。可以看到,當前Android 平台的執行模式在空間佔用+安裝速度+運行速度上已經達到了一個很好的平衡。

總結來看,目前的Android 採用的是解釋執行+ 還算可以的JIT + AOT 的綜合模式;但並沒有擺脫這樣一個前提,即應用在被打包成APK 的時候,採用的還是Java 代碼。換句話說,在APK 變成用戶可應用的過程中,還經歷了一個在Android 系統內部的編譯過程,這是一個繞不過的坎。


按照華為方面在媒體沙龍中的解讀,這個在現有Android 中繞不過去的坎,被稱為虛擬機(Virtual Machine,簡稱VM),它包含翻譯器和編譯器,其目的就是把Java 高級語言轉換成機器能懂的語言——這一轉換過程導致卡頓,並且VM 的統一回收內存垃圾額也會帶來卡頓。

華為方舟編譯器究竟改變了什麼?

首先,方舟編譯器是配合華為EMUI 9.1 操作系統而打造的一個編譯工具。

按照華為方面的說法,雖然方舟編譯器是在2019 年4 月11 日發布,但是華為早在5 年前就開始佈局,2013 年推出了自研編譯器HCC,2014 年編程大神Fred Chow 加入,擔任華為編譯器技術首席科學家,2016 年華為成立編譯器與編程語言實驗室,投入了數百的專家團隊經歷了多次嘗試,才在EMUI 9.1 上實現了機器代碼的翻譯。


按照上述Android 操作系統的代碼運行邏輯,華為編譯器最大的優勢在於,它繞過了VM。

簡單來說,在百人專家團隊的打造下,華為方舟編譯器可以將高級語言(Java)直接變成機器碼,無需再通過Android 操作系統中內置的VM 編譯器。按照華為方面的說法:方舟編譯器編譯的應用在開發階段就已完成;也就是說,只要是經過編譯器編譯的應用,在應用市場上上架了以後,用戶下載APK 的就是編譯過的了。


換句話說,通過方舟編譯器,開發者的應用在下載之前就已經轉化成為機器可以識別的代碼,因而可以在手機上快速安裝、啟動和運行,而無需在經過VM 的編譯——某種程度上,方舟編譯器是將編譯過程提前到應用開發階段,從而大幅度減少了智能手機和操作系統的運行負擔。

按照華為方面的說法,採用華為編譯器之後,提升效果如下:

EMUI 9.1 僅僅對系統組件System Server 應用了方舟編譯器之後,系統流暢速度提升了24%,系統響應速度提升了44%;

第三方應用(目前採用了新浪微博極速版)的操作流暢度提升了60%。

不可忽視的是,實際上,要想實現華為所言的效果,就首先需要第三方的應用開發者採用方舟編譯器對自家的App 提前進行改造,從而能夠上架華為應用商店——這也是余承東在4 月11 日的發布會呼籲開發者積極參與的原因。

除了代碼編譯,方舟編譯器也提供了更高效的內存機制,它與Android 內存回收的不同之處在於:

內存管理是程序開發與運行時需要重點考慮的部分,也和系統流暢度息息相關。Android 在內存回收上採用集中回收機制,發聲全局回收時更需要暫停應用,這也是隨機卡頓的根因之一。而方舟編譯器提供了更高效的內存回收機制,回收時無需暫停應用,隨時用隨時回收,大大提高運行速度。


另外,在方舟編譯器的編譯環境下, 還可以對代碼進行優化。目前,由於Android ART 的AoT 和JIT 動態編譯因為是運行在手機上,受資源所限,因而只能使用簡單的優化算法。而方舟編譯器由於是在應用開發階段進行編譯,所以可以允許不同應用靈活採用不同的編譯優化方案,而且因為在開發環境編譯不會受到手機性能的限制,可以使用更多先進的優化算法,從而使得每個應用的性能達到最佳。

2019,全面開源

其實,在4 月11 日的發布會上,華為方面已經表示,方舟編譯器也將開放給第三方合作夥伴,希望共同構建開發者生態的“方舟朋友圈”。

目前,華為已經宣布方舟編譯器會從2019 年全面開源;其中,華為將在2019 年8 月的華為終端開發者大會宣布方舟編譯框架代碼開源,後續會在2019 年11 月的綠盟開發者大會實現完整方舟編譯器代碼開源。

對於華為方舟編譯器的開源,雷鋒網將保持關注。

雷鋒網(公眾號:雷鋒網)注:本文部分內容編自知乎平台作者weishu的回答內容,已經獲得作者授權。

https://m.leiphone.com/news/201904/oshefuZTLnU00mJO.html

心得:好吧,其實我整天都看不懂,只知道好像很厲害
有厲害的人可以解釋個嗎感謝
這樣子卓卓是不是在效能上要成功反超果果了呢!
太令人期待啦!

PS. 這應該不是偏頗的媒體吧…拜託別水桶我

-----
Sent from JPTT on my Google Pixel 2.

--
Tags: 手機

All Comments

Susan avatar
By Susan
at 2019-04-29T22:54
我看花粉俱樂部都在主打這東西
Jacky avatar
By Jacky
at 2019-05-03T09:31
但認真問 這種廠商自主"優化"的東西 真的會比原裝來的好嗎?
Mary avatar
By Mary
at 2019-05-06T20:08
立場偏頗,建議水桶
Skylar Davis avatar
By Skylar Davis
at 2019-05-10T06:45
意思不就是直譯轉成全編譯? 白話簡化一點就是Java跟直接編出機器碼執行的速度差異
Skylar Davis avatar
By Skylar Davis
at 2019-05-13T17:22
一堆Buzz word 就可以把人唬住了嘿嘿,實際上這篇什麼都沒講,跟你的主管一樣
Genevieve avatar
By Genevieve
at 2019-05-17T03:58
其實就是放棄安卓的虛擬機優點估計大部分軟體開發廠商不會用這種東西
Cara avatar
By Cara
at 2019-05-20T14:35
第三方沒用有意義嗎?
Queena avatar
By Queena
at 2019-05-24T01:12
谷歌當然知道虛擬機機制不是最快但它可跨足不同指令集...
Skylar Davis avatar
By Skylar Davis
at 2019-05-27T11:49
全編譯的壞處就是portability差 很快就會發現APP在不同OS不同build 執行不起來 或是效果不同
Anonymous avatar
By Anonymous
at 2019-05-30T22:26
Google不是笨蛋 當初用Java抽象化還是有其理由
Erin avatar
By Erin
at 2019-06-03T09:03
要追求最快,代價就是破壞無敵相容性
Callum avatar
By Callum
at 2019-06-06T19:40
編譯器會不會藏洞(?
Anthony avatar
By Anthony
at 2019-06-10T06:17
這是取捨問題. 不想被硬體層綁死
Yuri avatar
By Yuri
at 2019-06-13T16:54
沒有什麼卵用
Agnes avatar
By Agnes
at 2019-06-17T03:31
單眼造假,p圖造假,誇大宣傳,種種因素加起來當然大賣
Connor avatar
By Connor
at 2019-06-20T14:07
方舟=特洛伊
Puput avatar
By Puput
at 2019-06-24T00:44
立場偏頗,夾帶政治立場,建議水桶
George avatar
By George
at 2019-06-27T11:21
先說我是外行的,所以要大家重新編碼去經過華為審核過的平台上架去讓android手機加速了解程式指令嗎?如果理解沒錯的話,那還不如好好期待fushia之類的新編碼系統。 還不用擔心其壯大後強迫開發者配合中國政府法令。
Frederic avatar
By Frederic
at 2019-06-30T21:58
該不會ㄧ打開又是某國外的套件
Tom avatar
By Tom
at 2019-07-04T08:35
用過微博極速版,真的很快 …
Thomas avatar
By Thomas
at 2019-07-07T19:12
他開源 不用配合
Jessica avatar
By Jessica
at 2019-07-11T05:49
繞過了VM,沒有相容性問題?安全性問題?我是不信
Mia avatar
By Mia
at 2019-07-14T16:26
坐等mainline大神解釋
Lily avatar
By Lily
at 2019-07-18T03:03
Android又不是華為的,再怎樣弄都是非正式,除非G願意
Quintina avatar
By Quintina
at 2019-07-21T13:40
黨說你實現了,你就實現了
Candice avatar
By Candice
at 2019-07-25T00:16
坦白說這真的很屌~
Callum avatar
By Callum
at 2019-07-28T10:53
還要開發者自行修改程式碼,而且還只能搭配華為商店
Edith avatar
By Edith
at 2019-07-31T21:30
這麼小的市場還不如等Google改架構
Emma avatar
By Emma
at 2019-08-04T08:07
有1好沒2好
Genevieve avatar
By Genevieve
at 2019-08-07T18:44
真的要實做絕對可以,問題是太專用了
Olga avatar
By Olga
at 2019-08-11T05:21
不明覺厲
Edward Lewis avatar
By Edward Lewis
at 2019-08-14T15:58
如果我是一個軟體商,怎可能為了小眾另外改寫程式
Hazel avatar
By Hazel
at 2019-08-18T02:35
話說這種文章,是作者自己產採訪發的,還是廠商付錢
Skylar Davis avatar
By Skylar Davis
at 2019-08-21T13:12
多看幾次,越看越覺得真的是「寫的」好好
Carolina Franco avatar
By Carolina Franco
at 2019-08-24T23:49
方舟編譯器幫你編譯,順便植入監控程式碼
Olive avatar
By Olive
at 2019-08-28T10:25
華為覺得自己的架構師比Google強 哈哈哈
Hedda avatar
By Hedda
at 2019-08-31T21:02
又是華為還是雷鋒網更是簡體字原文,立場偏頗捧華為技術,版主在幹嘛還不刪文
Anthony avatar
By Anthony
at 2019-09-04T07:39
只有在第一次執行上有加快吧,後來的原本android就
Dinah avatar
By Dinah
at 2019-09-07T18:16
是跑已經編譯過的
Barb Cronin avatar
By Barb Cronin
at 2019-09-11T04:53
以後用中文寫程式 樓下會怕機器看不懂switch嗎
Zora avatar
By Zora
at 2019-09-14T15:30
鬼扯
Una avatar
By Una
at 2019-09-18T02:07
ART 本身就是直譯器還繞一圈,況且上架Google本身是依照白皮書開發的,除非亂搞否則早就改進很多了。文中一直提Java 是說甲骨文的還是Open Java 兩者又是不同東西了!這明顯是廣告文吧!因為中國沒有Googleplay 你就偷了人家的東西說是自己的。
Agatha avatar
By Agatha
at 2019-09-21T12:44
新android手機為什麼剛買到的那幾天會續航力崩壞跟超級發熱 但過幾天又好了 就是那時候需要耗費大量運算資源將App編譯成機器碼 才會導致這個情形所以Android手機剛買到必須要使用個一兩天以後再來做效能測試會比較準確 尤其是續航力測試
Ivy avatar
By Ivy
at 2019-09-24T23:21
把Compiler基本功能包裝一下講的很炫砲
Barb Cronin avatar
By Barb Cronin
at 2019-09-28T09:58
這篇應該沒有很難讀懂吧 只是內容正不正確…?
Sarah avatar
By Sarah
at 2019-10-01T20:34
就騙不懂的啊,你如果搞蘋果那一套看你怎麼比
Jake avatar
By Jake
at 2019-10-05T07:11
以為 Google 自己沒能力做喔? 現在的狀況是評估過的
Liam avatar
By Liam
at 2019-10-08T17:48
OpenJDK跟OracleJDK沒有差太多,Google為了專利問題是使用OpenJDK
Hamiltion avatar
By Hamiltion
at 2019-10-12T04:25
Google Android Wiki 裡面有系統直譯的演變 ART
Sierra Rose avatar
By Sierra Rose
at 2019-10-15T15:02
讓人聯想到百度SDK開發軟體事件
Cara avatar
By Cara
at 2019-10-19T01:39
看看有多少老闆要讓你繞過VM 的沙盒環境直接上機
George avatar
By George
at 2019-10-22T12:16
這是一個大家都停下來等紅燈,你他媽直接開過去的概念
Madame avatar
By Madame
at 2019-10-25T22:53
應有更適合的板吧? 如Linux或Programming
William avatar
By William
at 2019-10-29T09:30
areas 大比喻的好
Donna avatar
By Donna
at 2019-11-01T20:07
更正aresa
David avatar
By David
at 2019-11-05T06:43
直接用機器碼的缺點 1.難以事前檢查是否含有惡意程式 2. app優化只能靠app開發者,無法靠手機廠
Callum avatar
By Callum
at 2019-11-08T17:20
沒那麼不堪啦!你還是會在Google 的開發環境下去進行
Ursula avatar
By Ursula
at 2019-11-12T03:57
廣告文 滾
Isabella avatar
By Isabella
at 2019-11-15T14:34
這不就python的玩法 要效率的部分調用c
Joseph avatar
By Joseph
at 2019-11-19T01:11
這篇很不親民 你要懂OS Compiler和Programming Language才能看懂
Franklin avatar
By Franklin
at 2019-11-22T11:48
po錯版
Franklin avatar
By Franklin
at 2019-11-25T22:25
幫本文翻譯:俺大軍企為了以下各種用途之執行效率p月,銀河..etc https://i.imgur.com/pO5LQUN.jpg不可名狀應用.. https://i.imgur.com/vRGW5rT.png發現傳統VM的直譯執行效率不彰,已不敷使用,所以致敬了yoyodiy的手法~繞過去~,全世界都驚呆了呢https://i.imgur.com/oIzUhmx.png這樣翻譯大家有沒有秒懂呢?
Dinah avatar
By Dinah
at 2019-11-29T09:02
我的老天 繞過VM也可以拿來說嘴...這很中國
Megan avatar
By Megan
at 2019-12-02T19:39
很會吹 優異的中國天職
Tracy avatar
By Tracy
at 2019-12-06T06:16
如果是真的直接繞過VM轉成Machine code的話真的很猛吧 怎麼會說是說嘴
Frederica avatar
By Frederica
at 2019-12-09T16:52
就是針對華為限定的特別最佳化JIT...
Bennie avatar
By Bennie
at 2019-12-13T03:29
除了提早翻譯成機器碼才上架商店之外好像看不出其他很明顯的不同,優點就是文中所說,在翻譯的時候因為是在開發端所以可以用更好的演算法去做翻譯優化,缺
Quintina avatar
By Quintina
at 2019-12-16T14:06
點就是先翻好的東西相容性可能不如在手機端上翻好。
Anthony avatar
By Anthony
at 2019-12-20T00:43
講了一堆東西 其實就是重新發明輪子 只有對華為有用
Catherine avatar
By Catherine
at 2019-12-23T11:20
其實這篇也只是猜測方舟的機制
Daph Bay avatar
By Daph Bay
at 2019-12-26T21:57
畢竟華為並沒有公開阿
Una avatar
By Una
at 2019-12-30T08:34
怎麼感覺樓上一堆方舟工程師
Dorothy avatar
By Dorothy
at 2020-01-02T19:11
華為:俺大軍企覺得現行用Java VM的模式導致自己的APK很容易被解包,原始碼都被看光光要藏小祕密幹些甚麼勾當都不太方便有了方舟,我想怎麼加殼都可以,全世界都說好棒棒呢
Ursula avatar
By Ursula
at 2020-01-06T05:48
就這篇的內容評論阿
Kyle avatar
By Kyle
at 2020-01-09T16:25
至於要質疑這篇 那你也要拿出點東西說明方舟幹了什麼與眾不同的東西
Brianna avatar
By Brianna
at 2020-01-13T03:01
我想應該不會是"我不知道他們幹了什麼 但我知道很屌
Irma avatar
By Irma
at 2020-01-16T13:38
中國的用詞真微妙,邊翻譯邊執行,是指直譯器嗎?
Brianna avatar
By Brianna
at 2020-01-20T00:15
是JIT JustInTime吧
Tristan Cohan avatar
By Tristan Cohan
at 2020-01-23T10:52
現在遊戲繪圖Shader都是JIT編譯因為無法預測GPU用什麼指令集無法事先編譯
Sarah avatar
By Sarah
at 2020-01-26T21:29
載入時順便編譯他(透過硬體廠商驅動處理)
Ethan avatar
By Ethan
at 2020-01-30T08:06
台灣隨便一個小學生都做得出來還在吹
Edward Lewis avatar
By Edward Lewis
at 2020-02-02T18:43
....亂嘴這個就不對了
Andrew avatar
By Andrew
at 2020-02-06T05:20
這三小革命性... 不就把JAVA變得和C一樣而已嗎...
Ingrid avatar
By Ingrid
at 2020-02-09T15:57
繞過去變成C一樣,那相容性,可移植性就沒了
Faithe avatar
By Faithe
at 2020-02-13T02:34
系統升級改一次,不同SoC改一次,好厲害的方舟
Hedwig avatar
By Hedwig
at 2020-02-16T13:10
全面重新擁抱碎片化?
Megan avatar
By Megan
at 2020-02-19T23:47
不就變成C........然後包一堆toolchain......
Hamiltion avatar
By Hamiltion
at 2020-02-23T10:24
繞VM就是個假java了啊
Audriana avatar
By Audriana
at 2020-02-26T21:01
這種東西google會準嗎 科科
Isabella avatar
By Isabella
at 2020-03-01T07:38
買iPhone 就好了
Jessica avatar
By Jessica
at 2020-03-04T18:15
嗯? 繞過VM的VM語言 你說你做個硬體來硬解我還比信
Quanna avatar
By Quanna
at 2020-03-08T04:52
文中指出的缺點就是最大的缺點
Suhail Hany avatar
By Suhail Hany
at 2020-03-11T15:29
你App經過方舟之後 For華為的手機平板沒問題
Edith avatar
By Edith
at 2020-03-15T02:06
當你要放到其他裝置 即便是一樣的Android版本也不能保證跑出相同結果來

中華699快約滿,電銷來電續約488成功

Barb Cronin avatar
By Barb Cronin
at 2019-04-26T12:14
4/26 天上掉下來自己解掉 488 了 原本門號 699 當年 小七電信新辦月租 名店NP 折讓 IPhone 7 8500 的樣子 最近租期到了,本來想退掉把一個喜歡的門號 NP 回來(用台哥1.8在養) https://i.imgur.com/A7BqfWZ.png 但因為最近 ...

為何華為這次聲勢浩大?

Jessica avatar
By Jessica
at 2019-04-26T11:41
我記得有看過華為的訪談 他們是說其實他們做手機算是順便,只是要消耗晶片庫存而已,因為有時候會滯銷 大概也沒想到可以做到快要打趴三星LG吧 現在通訊設備剩下高通跟華為兩強 華為可以用自有設備對手機進行最佳優化 會越來越強只能說是必然而已 ----- Sent from JPTT on my iPhone ...

Sony xz1主機板維修

Queena avatar
By Queena
at 2019-04-26T11:14
上個月從隔壁板買了一隻保固內xz1 最近都會有忽然關機開不起來情形 帶著發票送地標查詢說剩台哥有保固 就轉去由台哥做檢測維修部分 一開始還因為門市沒檢查到小刮傷被退貨 昨日工程師打來說換了電池可以開機 但主機板輕微彎曲 再做一些測試 過10分鐘又打來說 充電後發現關機開不起來 應該是因為主機板微彎曲導致 ...

準備好了!台灣之星170億上膛 瞄準5G釋?.

Frederic avatar
By Frederic
at 2019-04-26T10:47
完整標題:準備好了!台灣之星170億上膛 瞄準5G釋照 台灣之星今(25)日董事會通過多項重大議案,決議將透過增資或可轉換公司債等方式籌資90億元,並同意銀行融資之上限提高80億元,預計至少170億元,為即將到來的5G第一次釋照及頻率競標做準備與充實未來營運資金,藉此宣示勢在必得決心。 此外,隨著4G用戶規 ...

NOKIA 8.1的硬體是否較穩定

Connor avatar
By Connor
at 2019-04-26T10:42
我已經下單一台NOKIA 8.1 紅,預計今日會到貨 想請問板上的先進或是使用者們 看了很多相關的影片及評測,優點我就不說了,只提一下網上看到的問題 1、01反映的觸控災情,目前解決了嗎? 我如何知道到手的新機是否可能有觸控問題呢? 2、TYPE-C插上去是否還會晃來晃去? 3、我買這台的主因是 ...