活動與計畫

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

閱讀時間:5 分鐘
查看 Ben Weiss 的個人資料
Ben Weiss 開發人員關係工程師

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

歡迎參加 Android 效能焦點週第一天的活動!

首先,我們將介紹一項最有效、最省力的變更,可提升應用程式效能:在完整模式中啟用 R8 最佳化工具。

您可能已經知道 R8 是縮減應用程式大小的工具。這項工具可有效移除未使用的程式碼和資源,縮減應用程式大小。但它真正的強項,也就是它最厲害的地方,是做為最佳化工具。

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

閱讀本文後,請前往 YouTube 觀看 Performance Spotlight Week 的 R8 最佳化工具介紹。

R8 如何提升應用程式效能

image.png

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

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

方法內嵌會將方法呼叫替換為實際程式碼,進而提升執行階段效能。

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

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

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

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

個案研究:Reddit 透過 R8 提升效能

以下舉 Reddit 為例,說明 R8 可帶來的效能提升。在完整模式下啟用 R8 後,Android 版 Reddit 應用程式在多個方面的效能都有顯著提升。

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 旗標。這個檔案是由預設設定檔帶入,目前仍有許多應用程式使用。

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

image.png

在向使用者推出包含這項變更的新版應用程式後,Disney+ 的應用程式啟動速度提升了 30%,使用者感知 ANR 事件則減少了 25%。

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

工具支援

自 Android Studio Narwhal 3 功能推送起,使用 proguard-android.txt 時會看到 Lint 警告

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,讓應用程式快速上線。

作者:
繼續閱讀