使用 R8 縮減、最佳化及快速追蹤應用程式
歡迎來到 Android 效能焦點週的第一天!
首先,我們將介紹最有效且最省力的做法,也就是在完整模式中啟用 R8 最佳化工具,藉此提升應用程式效能。
您可能已經知道 R8 是用來縮減應用程式大小的工具。這項工具可有效移除未使用的程式碼和資源,縮減應用程式大小。但它真正的力量在於最佳化。
啟用完整模式並允許最佳化後,R8 會執行深入的全程式最佳化,重新編寫程式碼,從根本上提升效率。這不只是小幅調整。
閱讀本文後,請前往 YouTube 觀看「R8 最佳化工具成效焦點週」簡介。
R8 如何提升應用程式效能
接下來,我們將重點介紹 R8 最佳化工具為提升應用程式效能所採取的最大步驟。
tree shaking (移除沒用到的程式碼)是縮減應用程式大小最重要的步驟。在這個階段,R8 最佳化工具會從應用程式所依附的程式庫中移除未使用的程式碼,以及從您自己的程式碼集移除無效程式碼。
方法內嵌會以實際程式碼取代方法呼叫,進而提升執行階段效能。
系統會套用類別合併和其他策略,讓程式碼更精簡。此時,介面和類別階層等所有精美抽象概念都不重要,而且可能會遭到移除。
程式碼壓縮功能會將類別、欄位和方法名稱改為較短且沒有意義的名稱。因此,您可能會得到名為 a 的類別,而不是 MyDataModel。從 R8 最佳化應用程式讀取堆疊追蹤記錄時,最容易造成混淆的原因就是這個。(請注意,我們已在 AGP 9.0 中改善這項問題!)
資源縮減功能會移除未使用的資源 (例如 XML 檔案和可繪項目),進一步縮減應用程式大小。
套用這些步驟後,R8 最佳化工具可縮短應用程式啟動時間、提升 UI 轉譯流暢度,減少緩慢和凍結的影格,並改善裝置端資源整體用量。
個案研究:Reddit 採用 R8 後成效提升
舉例來說,Reddit 的範例顯示,R8 可帶來顯著的效能提升。在完整模式中啟用 R8 後,Reddit Android 版應用程式在各方面都有顯著的效能提升。
說明文字:R8 如何提升 Reddit 應用程式效能
團隊發現,冷啟動速度提升了 40% 、「應用程式無回應」(ANR) 錯誤減少了 30% 、影格算繪效能提升了 25% ,以及應用程式大小縮減了 14% 。
這些強化功能對使用者滿意度至關重要。啟動速度越快,等待時間就越短,存取內容的速度也越快。減少 ANR 次數可讓應用程式更穩定可靠,減少使用者挫敗感。更流暢的影格算繪可消除 UI 卡頓,讓捲動和動畫效果更流暢,反應更靈敏。這項技術上的正面影響也明顯反映在使用者的觀感上。
如要進一步瞭解這些改善項目,請參閱我們的網誌。
使用 R8 的非技術副作用
與合作夥伴合作期間,我們發現這些技術改良措施會直接影響使用者滿意度,並反映在使用者的使用者留存、參與度和工作階段長度上。技術效能提升也對使用者黏著度帶來正面影響,這項指標可透過每日、每週或每月活躍使用者人數來評估。我們也發現,Play 商店的應用程式評分會隨著 R8 的採用率而提高。將這項資訊提供給產品負責人、技術長和決策者,有助於加快應用程式效能。
因此,讓我們直言不諱:刻意進行效能最佳化是美德。
引導您打造效能更高的應用程式
我們收到意見回饋,指出 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+ 團隊發現應用程式效能大幅提升。
向使用者推出含有這項變更的應用程式新版本後,Disney+ 的應用程式啟動速度提升了 30%,使用者感受到的 ANR 減少了 25%。
目前許多應用程式仍使用含有 -dontoptimize 旗標的 proguard-android.txt 檔案。這時,工具改良措施就能派上用場。
工具支援
自 Android Studio Narwhal 3 功能推送起,使用 proguard-android.txt
從 AGP 9.0 開始,我們將完全停止支援該檔案。也就是說,您必須遷移至 proguard-android-optimize.txt。
我們也投入資源開發全新 Android Studio 功能,讓您輕鬆偵錯 R8 最佳化程式碼。從 AGP 9.0 開始,您現在可以在 Android Studio 的 Logcat 中,自動取消 R8 處理後建構版本的堆疊追蹤混淆處理,即使在經過完整最佳化的應用程式中,也能找出導致問題的確切程式碼行。在明天這篇 Android 效能焦點週的網誌文章中,我們將深入探討這項功能。
後續步驟
請在 YouTube 上觀看「Performance Spotlight Week」簡介影片,瞭解 R8 最佳化工具。
📣 參加成效挑戰!
現在就來親身體驗這些優點吧!
我們誠摯邀請您立即為應用程式啟用 R8 完整模式。
- 請參閱開發人員指南,瞭解如何開始使用: 啟用應用程式最佳化。
-
檢查您是否仍使用
proguard-android.txt,並將其替換為proguard-android-optimize.txt。 - 接著,評估成效。別只「感覺」差異,請「驗證」差異。如要評估效能提升幅度,請改編 GitHub 上的 Macrobenchmark 範例應用程式程式碼,測量前後的啟動時間。
我們相信應用程式效能會大幅提升。如有啟用或排解 R8 相關問題,請使用 #optimizationEnabled。我們很樂意提供協助。
歡迎在週五的「Ask Android」環節中提問
如有任何效能問題,請使用社群媒體標記 #AskAndroid。我們會在這一週持續關注您的問題,並在 11 月 21 日星期五的「Ask Android」活動中回答幾個問題。明天我們將深入探討偵錯和疑難排解,敬請期待。但目前請先使用 R8,讓應用程式快速上線。
繼續閱讀
-
活動與計畫
從 R8 最佳化工具和設定檔導向最佳化的基礎功能,到 Jetpack Compose 的效能提升,再到應用程式效能升級的新指南,我們涵蓋了您建構高效能應用程式所需的工具,這些工具不僅影響重大,而且使用起來毫不費力。
Ben Weiss, Sara Hamilton • 3 分鐘可讀完
-
活動與計畫
Google I/O 大會時間表出爐!
1 分鐘小故事
-
活動與計畫
去年 9 月,我們分享了 Google Play Games 的未來願景,並秉持著一項核心信念:提供世界一流的玩家體驗,是推動遊戲成功的最佳方式。
Maru Ahues Bouza • 3 分鐘可讀完
隨時掌握最新消息
每週透過電子郵件接收最新的 Android 開發洞察資料。