活動與計畫

使用 R8 縮減、最佳化及快速追蹤應用程式

5 分鐘閱讀
Ben Weiss
開發人員關係工程師

使用 R8 縮減、最佳化及快速追蹤應用程式

歡迎來到 Android 效能焦點週的第一天!

首先,我們將介紹最有效且最省力的做法,也就是在完整模式中啟用 R8 最佳化工具,藉此提升應用程式效能。

您可能已經知道 R8 是用來縮減應用程式大小的工具。這項工具可有效移除未使用的程式碼和資源,縮減應用程式大小。但它真正的力量在於最佳化

啟用完整模式並允許最佳化後,R8 會執行深入的全程式最佳化,重新編寫程式碼,從根本上提升效率。這不只是小幅調整。

閱讀本文後,請前往 YouTube 觀看「R8 最佳化工具成效焦點週」簡介。

R8 如何提升應用程式效能

image.png

接下來,我們將重點介紹 R8 最佳化工具為提升應用程式效能所採取的最大步驟。

tree shaking (移除沒用到的程式碼)是縮減應用程式大小最重要的步驟。在這個階段,R8 最佳化工具會從應用程式所依附的程式庫中移除未使用的程式碼,以及從您自己的程式碼集移除無效程式碼。

方法內嵌會以實際程式碼取代方法呼叫,進而提升執行階段效能。

系統會套用類別合併和其他策略,讓程式碼更精簡。此時,介面和類別階層等所有精美抽象概念都不重要,而且可能會遭到移除。

程式碼壓縮功能會將類別、欄位和方法名稱改為較短且沒有意義的名稱。因此,您可能會得到名為 a 的類別,而不是 MyDataModel。從 R8 最佳化應用程式讀取堆疊追蹤記錄時,最容易造成混淆的原因就是這個。(請注意,我們已在 AGP 9.0 中改善這項問題!)

資源縮減功能會移除未使用的資源 (例如 XML 檔案和可繪項目),進一步縮減應用程式大小。

套用這些步驟後,R8 最佳化工具可縮短應用程式啟動時間提升 UI 轉譯流暢度,減少緩慢和凍結的影格,並改善裝置端資源整體用量。

個案研究:Reddit 採用 R8 後成效提升

舉例來說,Reddit 的範例顯示,R8 可帶來顯著的效能提升。在完整模式中啟用 R8 後,Reddit Android 版應用程式在各方面都有顯著的效能提升。

image.png

說明文字:R8 如何提升 Reddit 應用程式效能

團隊發現,冷啟動速度提升了 40% 、「應用程式無回應」(ANR) 錯誤減少了 30% 、影格算繪效能提升了 25% ,以及應用程式大小縮減了 14%

這些強化功能對使用者滿意度至關重要。啟動速度越快,等待時間就越短,存取內容的速度也越快。減少 ANR 次數可讓應用程式更穩定可靠,減少使用者挫敗感。更流暢的影格算繪可消除 UI 卡頓,讓捲動和動畫效果更流暢,反應更靈敏。這項技術上的正面影響也明顯反映在使用者的觀感上。

如要進一步瞭解這些改善項目,請參閱我們的網誌

使用 R8 的非技術副作用

與合作夥伴合作期間,我們發現這些技術改良措施會直接影響使用者滿意度,並反映在使用者的使用者留存、參與度和工作階段長度上。技術效能提升也對使用者黏著度帶來正面影響,這項指標可透過每日、每週或每月活躍使用者人數來評估。我們也發現,Play 商店的應用程式評分會隨著 R8 的採用率而提高。將這項資訊提供給產品負責人、技術長和決策者,有助於加快應用程式效能。

image.png

因此,讓我們直言不諱:刻意進行效能最佳化是美德

引導您打造效能更高的應用程式

我們收到意見回饋,指出 R8 的開發人員指南需要改進。因此我們開始著手處理。R8 最佳化工具的開發人員指南現在更具實用性,提供啟用及偵錯 R8 的完整指引。

這份文件將引導您瞭解採用策略的整體架構,強調選擇有助於最佳化的程式庫的重要性,以及逐步採用 R8 功能以確保穩定性。這種分階段做法可讓您安全地發揮 R8 的優勢,同時針對難以偵錯的問題提供指引。

我們大幅擴充了有關保留規則的指引,這是控制 R8 最佳化工具的主要機制。我們現在提供專區,說明保留規則的用途、套用方式,以及編寫和維護規則的最佳做法。我們也會提供實用且可做為行動依據的用途和範例,協助您瞭解如何正確防止 R8 移除執行階段所需的程式碼,例如透過反射存取的程式碼,或使用 JNI 原生介面。

現在也涵蓋重要的後續步驟和進階情境。我們新增了「測試與疑難排解」一節,方便您驗證效能提升幅度,並偵錯任何可能發生的問題。「進階設定」一節說明如何指定特定建構變體、自訂保留或移除的資源,以及為程式庫作者提供特殊最佳化指示,確保您能為其他開發人員提供最佳化且適用於 R8 的套件。

充分發揮 R8 最佳化工具的潛力

自 Android Gradle 外掛程式 8.0 版起,R8 最佳化工具預設會使用「完整模式」。如果專案已開發多年,可能仍包含停用該功能的舊版標記。檢查 gradle.properties 檔案是否有這行程式碼,並將其移除。

android.enableR8.fullMode=false // delete this line to enable R8's full potential

現在請檢查您是否已在發布變體的應用程式 build.gradle.kts 檔案中啟用 R8。如要啟用這項功能,請將 isMinifyEnabled 和 isShrinkResources 設為 true。您也可以在這個步驟傳遞預設和自訂的設定檔。

release {

   isMinifyEnabled = true

   isShrinkResources = true

   proguardFiles(

       getDefaultProguardFile("proguard-android-optimize.txt"),

       "keep-rules.pro"

   )

}

個案研究:Disney+ 提升成效

Disney+ 的工程師致力於提升應用程式效能,並改善應用程式的使用者體驗。有時即使是看似微小的變更,也能帶來巨大影響。在檢查 R8 設定時,團隊發現您使用了 -dontoptimize 標記。這是由預設設定檔帶入,至今仍有許多應用程式使用。

proguard-android.txt 換成 proguard-android-optimize.txt 後,Disney+ 團隊發現應用程式效能大幅提升。

image.png

向使用者推出含有這項變更的應用程式新版本後,Disney+ 的應用程式啟動速度提升了 30%,使用者感受到的 ANR 減少了 25%。

目前許多應用程式仍使用含有 -dontoptimize 旗標的 proguard-android.txt 檔案。這時,工具改良措施就能派上用場。

工具支援

Android Studio Narwhal 3 功能推送起,使用 proguard-android.txt 

image.png

從 AGP 9.0 開始,我們將完全停止支援該檔案。也就是說,您必須遷移至 proguard-android-optimize.txt

我們也投入資源開發全新 Android Studio 功能,讓您輕鬆偵錯 R8 最佳化程式碼。從 AGP 9.0 開始,您現在可以在 Android Studio 的 Logcat 中,自動取消 R8 處理後建構版本的堆疊追蹤混淆處理,即使在經過完整最佳化的應用程式中,也能找出導致問題的確切程式碼行。在明天這篇 Android 效能焦點週的網誌文章中,我們將深入探討這項功能。

後續步驟

請在 YouTube 上觀看「Performance Spotlight Week」簡介影片,瞭解 R8 最佳化工具。

📣 參加成效挑戰!

現在就來親身體驗這些優點吧!

我們誠摯邀請您立即為應用程式啟用 R8 完整模式。

  1. 請參閱開發人員指南,瞭解如何開始使用: 啟用應用程式最佳化
  2. 檢查您是否仍使用 proguard-android.txt,並將其替換為 proguard-android-optimize.txt
  3. 接著,評估成效。別只「感覺」差異,請「驗證」差異。如要評估效能提升幅度,請改編 GitHub 上的 Macrobenchmark 範例應用程式程式碼,測量前後的啟動時間。

我們相信應用程式效能會大幅提升。如有啟用或排解 R8 相關問題,請使用 #optimizationEnabled。我們很樂意提供協助。

歡迎在週五的「Ask Android」環節中提問

如有任何效能問題,請使用社群媒體標記 #AskAndroid。我們會在這一週持續關注您的問題,並在 11 月 21 日星期五的「Ask Android」活動中回答幾個問題。明天我們將深入探討偵錯和疑難排解,敬請期待。但目前請先使用 R8,讓應用程式快速上線。

撰寫者:

繼續閱讀