丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
業(yè)界 正文
發(fā)私信給李帥飛
發(fā)送

1

解讀 | 華為方舟編譯器是如何實(shí)現(xiàn) Android 性能革命的?

本文作者: 李帥飛 2019-04-25 19:25
導(dǎo)語(yǔ):華為已經(jīng)宣布方舟編譯器會(huì)從 2019 年全面開(kāi)源。

2019 年 4 月 11 日,在上海的華為新品發(fā)布會(huì)上,除了可以拍月亮的華為 P30 系列,余承東還親自?huà)伋隽藘身?xiàng)軟件層面的“重磅炸彈”,分別是方舟編譯器和 EROFS 超級(jí)文件系統(tǒng);其中,華為方舟編譯器可以實(shí)現(xiàn)“架構(gòu)級(jí)優(yōu)化和顯著提升性能”,可以解決安卓程序“邊解釋邊執(zhí)行”的問(wèn)題,從而被余承東稱(chēng)之為 “安卓性能革命”。

解讀 | 華為方舟編譯器是如何實(shí)現(xiàn) Android 性能革命的?

發(fā)布會(huì)結(jié)束之后,華為方舟編譯器引起了外界的熱議。

那么,方舟編譯器究竟是什么?它的 “革命性” 到底體現(xiàn)在哪里?面對(duì)這些問(wèn)題,華為終于在兩周之后舉行了媒體沙龍,對(duì)方舟編譯器進(jìn)行了更加細(xì)致的解讀。

Android 生態(tài)中編譯器的工作原理

在了解方舟編譯器之前,我們必須得首先了解 Android 操作系統(tǒng)中的編譯器的運(yùn)行機(jī)制。

雷鋒網(wǎng)從 VirtualXposed/太極的作者 weishu 處了解到,當(dāng)前 Android 平臺(tái)的絕大多數(shù)應(yīng)用是使用 Java 語(yǔ)言寫(xiě)的,CPU 只能理解匯編指令,無(wú)法直接識(shí)別 Java 語(yǔ)言的虛擬機(jī)指令;為了讓 CPU 能運(yùn)行 Java 語(yǔ)言編寫(xiě)的程序,一般有兩種辦法:

  • 引入一個(gè)中間層,這個(gè)中間層負(fù)責(zé) Java 代碼的執(zhí)行,然后這個(gè)中間層本身編譯為 CPU 能理解的匯編指令,也就是 CPU -> 中間層 -> Java 代碼。如果這個(gè)中間層采用 Java 語(yǔ)言直接作為輸入,理解一句 Java 語(yǔ)句就把Java語(yǔ)言翻譯一下讓 CPU  執(zhí)行一段,我們一般稱(chēng)這種模式為「解釋執(zhí)行」。毋庸置疑這種方式效率是相當(dāng)?shù)托У摹?/p>

  • 直接把 Java 語(yǔ)言翻譯成 CPU 能理解的機(jī)器語(yǔ)言。這里又有兩種方式:第一,在程序運(yùn)行之前直接把 Java 代碼編譯為機(jī)器語(yǔ)言。這種模式稱(chēng)之為 AOT(Ahead of time)編譯;第二,在程序運(yùn)行起來(lái)之后,實(shí)時(shí)地把 Java 語(yǔ)言編譯為機(jī)器語(yǔ)言然后執(zhí)行。這種模式稱(chēng)之為 JIT(Just in time) 編譯。

具體在 Android 平臺(tái)上,代碼編譯經(jīng)歷了數(shù)個(gè)階段。

在 Android 5.0 正式采用 ART 之前,Android 采用的是解釋執(zhí)行 + JIT 的方式執(zhí)行 Java 代碼。在這個(gè)階段是貨真價(jià)實(shí)的「邊解釋邊執(zhí)行」的模式,代碼效率相當(dāng)?shù)拖?,再加上那時(shí)候同樣表現(xiàn)不行的 GC(垃圾回收),Android 非常難用。

解讀 | 華為方舟編譯器是如何實(shí)現(xiàn) Android 性能革命的?

在 Android 5.0 至 Android 6.0 階段,Google 推出了 ART(Android Runtime)來(lái)解決之前的 Java 代碼執(zhí)行效率問(wèn)題。這個(gè)階段采用的是完全 AOT 模式;Android 應(yīng)用在安裝的時(shí)候,系統(tǒng)會(huì)把所有Java代碼提前編譯為機(jī)器碼。這種模式有兩個(gè)缺點(diǎn):

  • 安裝速度巨慢。即使是高通驍龍 855 采用 AOT 模式編譯一下安裝包比較大的應(yīng)用(如支付寶)可能就要一分鐘。而那個(gè)時(shí)候的 CPU 并不如現(xiàn)在,安裝一個(gè)應(yīng)用需要很長(zhǎng)時(shí)間。更要命的是,系統(tǒng) OTA 開(kāi)機(jī)會(huì)對(duì)所有的應(yīng)用執(zhí)行 AOT 操作,這時(shí)候開(kāi)機(jī)速度可能需要很長(zhǎng)時(shí)間。

  • 占用磁盤(pán)空間,Java 代碼編譯為機(jī)器碼之后體積會(huì)急劇膨脹。

到了 Android 7.0,Google 做了很大的改進(jìn);這一改進(jìn)是基于這樣一個(gè)事實(shí):我們使用一個(gè)應(yīng)用的時(shí)候,基本每個(gè)人只使用它一小部分功能,為什么要把所有代碼全編譯呢?因此只編譯用戶(hù)經(jīng)常用的那部分代碼就 OK 了,這樣安裝的時(shí)候速度比較快,等用戶(hù)啟動(dòng)的時(shí)候系統(tǒng)就能知道哪部分代碼經(jīng)常被執(zhí)行,把這部分代碼編譯為機(jī)器碼,運(yùn)行起來(lái)速度也快。

于是 Google 又引入了 JIT,這時(shí)候的執(zhí)行模式是 AOT + JIT + 解釋執(zhí)行。具體來(lái)看:

  • 應(yīng)用安裝的時(shí)候不執(zhí)行 AOT 編譯,安裝速度飛快。初次使用應(yīng)用的時(shí)候沒(méi)有機(jī)器碼,因此只能解釋執(zhí)行。

  • 應(yīng)用運(yùn)行起來(lái)之后,系統(tǒng)收集經(jīng)常被運(yùn)行的代碼的信息,做兩件事:1)在必要的時(shí)候在運(yùn)行時(shí)直接把 Java 代碼編譯為機(jī)器碼 (JIT),然后使用機(jī)器碼執(zhí)行提高運(yùn)行效率。2)把這個(gè)「經(jīng)常被運(yùn)行的代碼信息保存起來(lái)」。

  • 設(shè)備空閑的時(shí)候,系統(tǒng)拿出應(yīng)用運(yùn)行時(shí)候保存的「熱點(diǎn)代碼信息」直接把這些代碼編譯為機(jī)器碼 (AOT)。

Android 8.0 上改進(jìn)了解釋器,解釋模式執(zhí)行效率大幅提升;Android 10.0 上提供了預(yù)先放置熱點(diǎn)代碼的方式,應(yīng)用在安裝的時(shí)候就能知道常用代碼會(huì)被提前編譯??梢钥吹?,當(dāng)前 Android 平臺(tái)的執(zhí)行模式在空間占用+安裝速度+運(yùn)行速度上已經(jīng)達(dá)到了一個(gè)很好的平衡。

總結(jié)來(lái)看,目前的 Android 采用的是解釋執(zhí)行 + 還算可以的 JIT + AOT 的綜合模式;但并沒(méi)有擺脫這樣一個(gè)前提,即應(yīng)用在被打包成 APK 的時(shí)候,采用的還是 Java 代碼。換句話(huà)說(shuō),在 APK 變成用戶(hù)可應(yīng)用的過(guò)程中,還經(jīng)歷了一個(gè)在 Android 系統(tǒng)內(nèi)部的編譯過(guò)程,這是一個(gè)繞不過(guò)的坎。

解讀 | 華為方舟編譯器是如何實(shí)現(xiàn) Android 性能革命的?

按照華為方面在媒體沙龍中的解讀,這個(gè)在現(xiàn)有 Android 中繞不過(guò)去的坎,被稱(chēng)為虛擬機(jī)(Virtual Machine,簡(jiǎn)稱(chēng) VM),它包含翻譯器和編譯器,其目的就是把 Java 高級(jí)語(yǔ)言轉(zhuǎn)換成機(jī)器能懂的語(yǔ)言——這一轉(zhuǎn)換過(guò)程導(dǎo)致卡頓,并且 VM 的統(tǒng)一回收內(nèi)存垃圾額也會(huì)帶來(lái)卡頓。

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

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

按照華為方面的說(shuō)法,雖然方舟編譯器是在 2019 年 4 月 11 日發(fā)布,但是華為早在 5 年前就開(kāi)始布局,2013 年推出了自研編譯器 HCC,2014 年編程大神 Fred Chow 加入,擔(dān)任華為編譯器技術(shù)首席科學(xué)家,2016 年華為成立編譯器與編程語(yǔ)言實(shí)驗(yàn)室,投入了數(shù)百的專(zhuān)家團(tuán)隊(duì)經(jīng)歷了多次嘗試,才在 EMUI 9.1 上實(shí)現(xiàn)了機(jī)器代碼的翻譯。

解讀 | 華為方舟編譯器是如何實(shí)現(xiàn) Android 性能革命的?

按照上述 Android 操作系統(tǒng)的代碼運(yùn)行邏輯,華為編譯器最大的優(yōu)勢(shì)在于,它繞過(guò)了 VM。

簡(jiǎn)單來(lái)說(shuō),在百人專(zhuān)家團(tuán)隊(duì)的打造下,華為方舟編譯器可以將高級(jí)語(yǔ)言(Java)直接變成機(jī)器碼,無(wú)需再通過(guò) Android 操作系統(tǒng)中內(nèi)置的 VM 編譯器。按照華為方面的說(shuō)法:方舟編譯器編譯的應(yīng)用在開(kāi)發(fā)階段就已完成;也就是說(shuō),只要是經(jīng)過(guò)編譯器編譯的應(yīng)用,在應(yīng)用市場(chǎng)上上架了以后,用戶(hù)下載 APK 的就是編譯過(guò)的了。

解讀 | 華為方舟編譯器是如何實(shí)現(xiàn) Android 性能革命的?

換句話(huà)說(shuō),通過(guò)方舟編譯器,開(kāi)發(fā)者的應(yīng)用在下載之前就已經(jīng)轉(zhuǎn)化成為機(jī)器可以識(shí)別的代碼,因而可以在手機(jī)上快速安裝、啟動(dòng)和運(yùn)行,而無(wú)需在經(jīng)過(guò) VM 的編譯——某種程度上,方舟編譯器是將編譯過(guò)程提前到應(yīng)用開(kāi)發(fā)階段,從而大幅度減少了智能手機(jī)和操作系統(tǒng)的運(yùn)行負(fù)擔(dān)。

按照華為方面的說(shuō)法,采用華為編譯器之后,提升效果如下:

  • EMUI 9.1 僅僅對(duì)系統(tǒng)組件 System Server 應(yīng)用了方舟編譯器之后,系統(tǒng)流暢速度提升了 24%,系統(tǒng)響應(yīng)速度提升了 44%;

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

不可忽視的是,實(shí)際上,要想實(shí)現(xiàn)華為所言的效果,就首先需要第三方的應(yīng)用開(kāi)發(fā)者采用方舟編譯器對(duì)自家的 App 提前進(jìn)行改造,從而能夠上架華為應(yīng)用商店——這也是余承東在 4 月 11 日的發(fā)布會(huì)呼吁開(kāi)發(fā)者積極參與的原因。

除了代碼編譯,方舟編譯器也提供了更高效的內(nèi)存機(jī)制,它與 Android 內(nèi)存回收的不同之處在于:

內(nèi)存管理是程序開(kāi)發(fā)與運(yùn)行時(shí)需要重點(diǎn)考慮的部分,也和系統(tǒng)流暢度息息相關(guān)。Android 在內(nèi)存回收上采用集中回收機(jī)制,發(fā)聲全局回收時(shí)更需要暫停應(yīng)用,這也是隨機(jī)卡頓的根因之一。而方舟編譯器提供了更高效的內(nèi)存回收機(jī)制,回收時(shí)無(wú)需暫停應(yīng)用,隨時(shí)用隨時(shí)回收,大大提高運(yùn)行速度。

解讀 | 華為方舟編譯器是如何實(shí)現(xiàn) Android 性能革命的?

另外,在方舟編譯器的編譯環(huán)境下, 還可以對(duì)代碼進(jìn)行優(yōu)化。目前,由于 Android ART 的 AoT 和 JIT 動(dòng)態(tài)編譯因?yàn)槭沁\(yùn)行在手機(jī)上,受資源所限,因而只能使用簡(jiǎn)單的優(yōu)化算法。而方舟編譯器由于是在應(yīng)用開(kāi)發(fā)階段進(jìn)行編譯,所以可以允許不同應(yīng)用靈活采用不同的編譯優(yōu)化方案,而且因?yàn)樵陂_(kāi)發(fā)環(huán)境編譯不會(huì)受到手機(jī)性能的限制,可以使用更多先進(jìn)的優(yōu)化算法,從而使得每個(gè)應(yīng)用的性能達(dá)到最佳。

2019,全面開(kāi)源

其實(shí),在 4 月 11 日的發(fā)布會(huì)上,華為方面已經(jīng)表示,方舟編譯器也將開(kāi)放給第三方合作伙伴,希望共同構(gòu)建開(kāi)發(fā)者生態(tài)的“方舟朋友圈”。

目前,華為已經(jīng)宣布方舟編譯器會(huì)從 2019 年全面開(kāi)源;其中,華為將在 2019 年 8 月的華為終端開(kāi)發(fā)者大會(huì)宣布方舟編譯框架代碼開(kāi)源,后續(xù)會(huì)在 2019 年 11 月的綠盟開(kāi)發(fā)者大會(huì)實(shí)現(xiàn)完整方舟編譯器代碼開(kāi)源。

對(duì)于華為方舟編譯器的開(kāi)源,雷鋒網(wǎng)將保持關(guān)注。

雷鋒網(wǎng)注:本文部分內(nèi)容編自知乎平臺(tái)作者 weishu 的回答內(nèi)容,已經(jīng)獲得作者授權(quán)。

雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知

分享:
相關(guān)文章

作者

雷鋒網(wǎng)編輯,歡迎來(lái)撩。微信 ID:XI_308.
當(dāng)月熱門(mén)文章
最新文章
請(qǐng)?zhí)顚?xiě)申請(qǐng)人資料
姓名
電話(huà)
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶(hù)安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)