每日最新頭條.有趣資訊

這個改造了Android的華為方舟編譯器,厲害不?

方舟編譯器是華為發布的最新的“黑科技”,但華為不是無意為之。

在前不久華為P30系列新品發布會上,華為消費者事業群 CEO余承東提到過一項很厲害的技術,但被他一嘴帶過,這項技術就是方舟編譯器。

他提到,方舟編譯器可以提升Android系統內應用的編譯效率,過去Android應用一邊編譯一邊執行,而方舟編譯器將轉變為全程機器預編譯然後高效執行。華為宣布,使用方舟編譯器最終將提升24%的系統操作流暢度,提升44%的系統響應能力,以及提升60%的三方應用操作流暢度,“Android系統將比iOS系統還要流暢”。這一技術將正式開源給開發者,讓所有人都可以使用方舟編譯器對應用預編譯。

據華為消費者事業群軟體部總裁王成錄向包括PingWest品玩在內的媒體介紹,自發布會結束後,華為軟體內部團隊的電話幾乎被打爆,很多開發者都想了解方舟編譯器更多的信息。

這個技術到底厲害在哪?

它哪裡厲害?

在了解方舟編譯器的同時,我們需要先了解一下Android的編譯流程。

編譯器的定義為:將“一種語言(通常為高級語言)”翻譯成能直接被計算機或虛擬機執行的目標代碼,編譯器的效率將直接影響程序運營性能/效率。

而Android系統內部絕大多數應用的邏輯部分都使用Java來編寫,但為了保證安全性、可靠性、兼容性等不同的需求,很多開發者會使用不同的語言來編寫其他的庫,最終供Java調用。也就是說在Android系統內部,不同模塊可能採用了不同的語言編寫,而為了達對各個模塊的互相理解,相互調用則會帶來系統資源上的內耗。

編譯器充當的是“翻譯”功能。將不同計算機的高級語言轉化為機器可以理解、可以執行的機器語言,由不同的代碼替換為機器可讀懂的“0101”。這體現在軟體開發的部分。

而編寫應用的Java代碼能夠如何被Android系統理解,直接影響了程序的執行效率。編譯器的性能體現在是否可以將一種語言完美地解釋為可執行的高級語言。

比如說,一個中英文翻譯,她既能理解中文成語的博大精深,也可以譜寫出英文語境中優美的句子。

乍一看,只要有一個非常好的“翻譯官/編譯器”就可以解決所有的問題。其實在編寫Android系統的Java語言內部,還引入了虛擬機的機制。

從Android系統誕生那天起,就選擇了使用Java作為基礎的編寫語言。據王成錄介紹,Java語言有非常多的優勢,比如說它跨平台、分布式,安全性做得都很好。而Java語言設計當初就有一個JDK,叫Java語言的開發包,開發包中就包含了一項重要的功能,稱之為虛擬機。

虛擬機主要針對硬體環境。有了這個虛擬機以後,接下來無論是什麽樣的硬體,Java語言不需要管了,它的功能是將其抽象成Java的運行環境,因此Java實現了跨平台——不管是X86機器,ARM機器,還是其他CPU的機器都沒有問題。但這也導致了新的問題:無論任何一個機器,虛擬機資源必須分配好,所以佔用了額外的系統資源。

也就是說,一個應用先由Java編寫成可執行文件(Dex碼),再進入系統由虛擬機虛擬環境解釋執行為機器可讀的二進製碼。兩道工序的執行效率也就是應用在系統內被執行使用的執行效率。

打開使用一個軟體應用,快不快,體驗好不好,就在於這兩道工序效率如何。

實際上Android的演進解釋了這套編譯邏輯上帶來的效率問題。王成錄提到,Android 1.0的時候,基本完全使用Dalvik虛擬機,邏輯就是解釋一句執行一句,效率非常慢。Android 2.2的時候,當系統發現應用內有有一段代碼頻繁執行的時候,系統將直接編譯解釋,下次調用就不用重複解釋,直接執行上次解釋出的機器指令,這叫JIT(即時,Just In Time)編譯。但是這個應用一退出了以後, 這段機器指令也消失了。

Android 5.0的時候,一個非常大的變化是引入了ART虛擬機(Android Run Time),採用AOT編譯器(Ahead Of Time),就是運行之前,將部分代碼編譯解釋好為二進製語言,轉為靜態編譯,極大地提升了效率。但對於那些Java動態特性的部分,還有其他部分,仍然做不到直接編譯,還是要解釋執行。

前面已經提到,一個應用由C語言編譯出來的庫,加上Java語言本身的編譯以及虛擬機的編譯,當一個應用發生複雜的邏輯關係調用時,解釋和編譯這些代碼需要通過接口去使用,因此產生很大的開銷。“一個數據,如果沒有跨語言的協同,和有跨語言協調來比,效率差別很大。”王成錄說。

方舟編譯器是直接將應用打包成二進製碼輸送到系統內執行,將所有編譯轉為靜態編譯。“有了方舟編譯器後如何實現的呢?相當於,我不論你這個業務邏輯是Java寫的還是庫是用C寫的,都沒有問題,用方舟編譯器做了統一的程序優化以後直接編譯成機器指令。用方舟編譯器做出來的APK,下載到手機上不需要再編譯了。這就是巨大的差別。”

“最難啃的骨頭”

王成錄介紹,華為方舟編譯器有四大技術亮點。第一,首個多語言聯合優化的編譯器,消除了跨語言調用開銷;第二,程序運行時無需依賴虛擬機,減少了資源佔用,同時實現了高效的記憶體回收機制;第三,方舟編譯器可以針對不同應用靈活編譯優化;第四,對於開發者學習和使用成本非常低。

方舟編譯器最大的突破是將所有編譯的部分,包括靜態動態的部分全部變為靜態編譯出的二進製代碼。

眾所周知,Java語言系統非常龐大。這就需要對Android現有的應用,可能會用到哪些庫,這些庫之間怎麽用理解,需要大量的分析運行狀態,才能夠將這些動態特性完成提前的編譯。由於是機器語言,所以還涉及到了跨硬體平台開發。

這就需要對所有開發環境、系統內部解釋環境的編譯及語言、整體架構和邏輯理解非常深入。“就像一個優秀的翻譯官一定對漢語言文學理解的非常到位,然後再對英語理解非常到位。”

王成錄說,一個翻譯器做得好不好,重要的衡量標準是能不能給程序帶來性能提升。“編譯器和翻譯人類語言是一樣的,翻譯出來不太難,但是要翻譯的又快又好就太難了。”

邏輯通順以後,還需要大量的優化和調整。一方面對Java語言的了解再深入再細致再重建;另外一方面,對機器指令順序結構理解要非常清楚才行,這兩個匹配的方法越準確,編譯器效率越高。“一個好的編譯器,開發者一行代碼都不需要修改,性能能提升10%到20%。”

據PingWest品玩了解,方舟編譯器是個通用技術,基於目前ARM指令集開發、適用於所有ARM芯片平台。也就是說,經過方舟編譯器編譯的應用,再經過其他品牌廠商的適配,就可以適用於包括小米、OPPO、vivo等其他品牌手機上的Android系統。如果沒有適配,則還是按照普通app效率執行。

據王成錄介紹,華為在2009年開始準備編譯器研發方面的工作,從華為海思研發起步時,2013年華為HCC自研編譯器有了雛形,它吸引了第一批海內外研究人員加入,創建了編譯組。

隨後,華為“2012年實驗室”成立,2016年正式設立了編譯器與編程語言實驗室。直到今天,華為才算正式推出了方舟編譯器。王成錄說,編譯器真的是一個“板凳要坐十年冷”的工程,“我們穩得住才能做下來,非常的複雜。”

據PingWest品玩了解,方舟編譯器開發人員有一半來自於消費者BG,一半來自於“2012實驗室”,投入研發人員幾百人。

方舟編譯器是華為發布的最新的“黑科技”,但華為不是無意為之。王成錄介紹說,華為一直在圍繞性能這條線找最主要的矛盾。比如隨著應用的豐富,手遊越來越流行,華為針對遊戲做了GPU Turbo。把遊戲問題解決後,發現還有很多應用需要改進網絡實時連接,所以華為發布了Link Turbo,“這個發揮了華為的優勢,我們對網絡非常熟悉,我們做了聚合把端和網絡的連接。”

王成錄說,方舟編譯器是最後的、最難啃的骨頭,但華為把它攻克了。

給Android系統動手術

華為方舟編譯器,只是華為改造Android性能的一部分。

簡而言之,華為在系統軟體上針對用戶使用中的痛點問題進行有針對性的優化。比如EMUI 5.0主要解決Android系統卡頓問題,EMUI 8.2上線了GPU Turbo主攻遊戲性能受限問題,EMUI9.0上線了Link Turbo主攻網絡覆蓋不均問題,EMUI 9.1則上線了方舟編譯器和超級文件系統EROFS,針對Android流暢度不足問題。

鋪開Android系統全棧圖,華為針對每一項Android系統內部模塊進行改造優化。

華為將Android系統分為生態外部、框架層、中間件、硬體抽象和內核等多個層面進行全鏈條優化。

王成錄介紹,EMUI 5.0圍繞核心組件內的進程管理和文件系統進行優化。“我們最終把F2FS(專門為Flash閃存定做的作業系統)這個系統放在5.0上了,發現上手機的碎片整理能力比原來EXT系列的文件系統要高了很多。”

而EMUI 8.0的Link Turbo圍繞框架層的通信、中間件的連接以及芯片驅動的網絡管理做優化。“這是在整個圖形中間件、在記憶體管理,和在進程上做完整的優化技術。”

除去方舟編譯器,EMUI 9.0上線的另一重大技術是超級文件系統EROFS,這個文件系統是解決系統分區文件存儲和管理的問題,圍繞Android系統內核安全管理和記憶體管理進行改造。

王成錄提到,所有系統初始化的文件存在系統分區,以前系統分區只有初始化啟動寫入一次後,除系統升級以外,永遠不允許再次寫入。原始的系統分區給隻讀隻寫加了兩道鎖。如果寫了以後,就意味著系統已經被攻破。

但文件系統對磁盤讀寫效率有著重要影響,據華為介紹,超級文件系統EROFS採用了可讀設計,使用了壓縮算法,Android系統隨機讀性能平均提升20%,升級包大小下降約5%-10%,升級時間縮短了約20%。

“這個文件系統是隻讀的,既解決安全性問題,又解決性能效率問題。這個系統是華為百分之百原創的,我們這個團隊能夠把這件事情做出來,在中國也是第一次。”

走入無人區

據PingWest品玩了解,華為此前在5萬台華為手機上秘密試驗F2FS文件系統性能的影響,為此王成錄還和余承東簽了“軍令狀”——因為測試修改手機文件系統對於手機安全有極大的隱患,一旦發生意外,將對手機品牌造成很嚴重的影響。而一旦成功,將驅動Android系統帶來文件可讀取本質和讀寫性能方面的變革。

一個問題是,華為給Android動了這麽多的手術,這件事情Google怎麽看?

Google是華為的戰略合作夥伴,華為和Google一直保持著積極持續的溝通。王成錄說,“我們在安卓底層的優化工作,很多其實都體現在了Android的大版本裡,作為了產業的共同資產。比如‘天生快,一生快’裡的很多系統機制。F2FS文件系統也為多個廠家使用。”

根據王成錄的說法,Google很快就注意到了華為在測試F2FS文件系統,Google的態度是“在中國用沒有問題。”

這次進一步推出方舟編譯器和超級文件系統EROFS,我們推測華為的目標是,推動這些改變進入Google的開源社區,借此進駐到系統內部。

華為過去幾波改造都是推動終端側的改革。華為提到,這就像是改造人的身體機能。同時,華為還想保證市場上的水和糧食的供應是好的——通過華為HiAI和HiLink,推動外部生態的繁榮和開放。

方舟編譯器未來使命就在這裡。“這是華為非常完整的邏輯,我相信我們後續仍然會圍繞全棧,因為下層的芯片還要不斷的演進,上面的應用也在不斷發展變化,整個系統優化調整還會持續。”

有了方舟編譯器編譯以後,就不需要用Java的虛擬機了,它改變了過去Android系統內部的代碼解釋機制。王成錄說,“海思做了芯片以後,需要有自己的編譯器才能真正發揮芯片的能力。”

他還提到,方舟編譯器也可以適用於ICT行業其他系統,未來可基於具體芯片指令集進行開發。

提到軟體研發,王成錄流露出了個人情懷,“我覺得中國這麽大量的軟體研發人員,但國內一直缺乏領先的系統軟體。系統軟體指的是什麽?基本上是作業系統,數據庫、編譯器。但實際上還有一個,就是編程框架和編程語言。實際上華為走到編譯器領域,是非常重要的部分,這個編譯器再發展,就可能變成編程框架和編程語言。”

編譯器似乎是一個開始。在軟體行業,華為正在走入無人區。

(文章技術部分按照王成錄口述整理,部分插圖由華為供圖)

獲得更多的PTT最新消息
按讚加入粉絲團