Android 技能
前往 GitHub 查看R8 分析工具
android skills add r8-analyzer為提供最佳使用者體驗,您應盡可能縮減應用程式大小並提升速度。我們的應用程式最佳化工具 (稱為 R8) 會移除未使用的程式碼和資源、重新編寫程式碼來提升執行階段效能等,藉此簡化應用程式。對使用者而言,這代表:
- 更快的啟動時間
- 減少記憶體用量
- 提升算繪和執行階段效能
- 減少 ANR
R8 最佳化總覽
R8 會使用多階段程序,最佳化應用程式的大小和速度。主要作業包括:
程式碼縮減 (又稱搖樹):R8 會找出應用程式及其程式庫依附元件中無法存取的程式碼,並加以移除。R8 會分析應用程式的進入點 (例如資訊清單中定義的
Activities或Services),建構參照程式碼的圖表,並移除所有未參照的項目。邏輯最佳化:R8 會重新編寫程式碼,提高執行效率並減少作業負擔。主要技術包括:
方法內嵌:R8 會將方法呼叫網站替換為所呼叫方法的實際主體。這可消除函式呼叫的額外負荷,並讓 R8 執行進一步最佳化。
類別合併:R8 會將一組類別和介面合併為單一類別。這會減少應用程式中的類別數量,降低記憶體壓力並提升啟動速度。
模糊處理 (也稱為壓縮):為縮減 DEX 檔案大小,R8 會縮短類別、欄位和方法名稱 (例如
com.example.MyActivity可能會變成a.b.a)。
自 Android Gradle 外掛程式 (AGP) 8.12.0 版起,R8 也會在最佳化階段最佳化資源。詳情請參閱「最佳化資源縮減」。
啟用最佳化功能
如要為應用程式啟用應用程式最佳化功能,請根據專案的 AGP 版本使用適當的 DSL。建議您只在發布前測試的最終版應用程式 (通常是發布版本) 中啟用應用程式最佳化功能,因為最佳化會增加專案的建構時間,且修改程式碼的方式可能會使偵錯更加困難。
適用於 AGP 9.3 以上版本
如要為 AGP 9.3 以上版本啟用應用程式最佳化功能,請按照下列步驟操作:
- 在發布版本的應用程式層級建構指令碼中,將
optimization區塊中的enable = true設為。 - 在
src/<variant>/keepRules來源集中,將保留規則新增至後置字元為.keep的檔案。例如src/main/keepRules/custom-rules.keep。
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Groovy
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
適用於 AGP 9.3 以下版本的舊版 DSL
如要啟用應用程式最佳化功能,請在發布版本的應用程式層級建構指令碼中,設定 isMinifyEnabled = true (程式碼最佳化) 和 isShrinkResources = true (資源最佳化)。建議您一律啟用這兩項設定。
舊版 DSL (Kotlin)
android {
buildTypes {
release {
// Enables code optimizations.
isMinifyEnabled = true
// Enables resource shrinking.
isShrinkResources = true
proguardFiles(
// Default file with automatically generated optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
...
}
}
...
}
舊版 DSL (Groovy)
android {
buildTypes {
release {
// Enables code optimizations.
minifyEnabled = true
// Enables resource shrinking.
shrinkResources = true
// Default file with automatically generated optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
改善 R8 最佳化功能
R8 的效能優勢與 R8 可最佳化的程式碼量直接相關。如要充分發揮 R8 的效益,請遵循下列最佳做法:
- 在完整模式中啟用 R8
- 啟用模糊處理、最佳化和縮減功能
- 啟用資源縮減和最佳化資源縮減功能
- 調整保留規則,盡可能最佳化類別、欄位和方法。
如要協助您修正保留規則,請使用 R8 設定分析器。
R8 設定分析器可讓您執行下列操作:
- 監控 R8 設定分析器報表提供的指標,追蹤及改善整體 R8 設定品質。
- 找出最廣泛的保留規則,也就是最妨礙最佳化的規則
- 並瞭解這些限制會阻礙哪些最佳化作業,進而改善限制。
R8 設定分析器適用於 AGP 9.3.0-alpha05 版,或 R8 9.3.7-dev 版。詳情請參閱「分析 R8 設定」。
最佳化資源縮減功能,進一步縮減應用程式大小
AGP 8.12.0 版導入了最佳化資源縮減功能,可整合資源和程式碼最佳化作業,進一步縮減應用程式大小並提升速度。在資源縮減最佳化之前,Android 資產封裝工具 (AAPT2) 會產生保留規則,有效處理與程式碼分開的資源縮減作業,通常會保留彼此參照的無法存取程式碼或資源。
啟用最佳化資源縮減功能後,系統會將資源視為程式碼的一部分,形成參照圖表。如果程式碼或資源集合未被參照,就不會受到保留規則保護,可能會遭到移除。
啟用最佳化資源縮減功能
如要為 AGP 8.12 或 8.13 啟用新的最佳化資源縮減管道,請在專案的 gradle.properties 檔案中新增下列內容:
android.r8.optimizedResourceShrinking=true
如果您使用 AGP 9.0.0 以上版本,則無須設定 android.r8.optimizedResourceShrinking=true。在建構設定中啟用 isShrinkResources = true 時,系統會自動套用最佳化資源縮減功能。
驗證及設定 R8 最佳化設定
如要啟用 R8 的完整最佳化功能,請從專案的 gradle.properties 檔案中移除下列程式碼 (如有):
android.enableR8.fullMode=false
請注意,啟用應用程式最佳化功能後,堆疊追蹤會變得難以解讀,尤其是 R8 重新命名類別或方法名稱時。如要取得與原始碼正確對應的堆疊追蹤,請參閱「還原原始堆疊追蹤」。
如果啟用 R8,您也應建立啟動設定檔,進一步提升啟動效能。
如果啟用應用程式最佳化功能後發生錯誤,請嘗試下列修正策略:
- 新增保留規則,確保部分程式碼不受影響。
- 逐步採用最佳化措施。
- 更新程式碼,改用更適合用於最佳化的程式庫。
如要瞭解如何根據環境設定 R8,請參閱「設定 R8 的執行方式」。
AGP 和 R8 版本行為異動
下表列出各個 Android Gradle 外掛程式 (AGP) 和 R8 編譯器版本導入的主要功能。
| AGP 版本 | 新功能 |
|---|---|
| 9.3 |
簡化 DSL:新的 `optimization {}` 區塊可減少設定需求,並一律啟用最佳化資源縮減功能,預設 Android 保留規則則為停用。 `keepRules` 來源集:如果您使用新的 DSL,必須將保留規則放在 src/<variant>/keepRules 來源集,檔案的後置字串為 .keep。來源集也與舊版 DSL 相容。
KMP (Kotlin MultiPlatform) 消費者規則:KMP 不再需要設定 publish = true,並支援具有 .keep 擴充功能的 src/<variant>/keepRules 來源集。
請注意,系統仍支援舊版 DSL。 |
| 9.1 |
預設重新封裝的類別:R8 會重新封裝類別 (將類別移至頂層的未命名套件),進一步壓縮 DEX,因此不需要指定 -repackageclasses 選項。如要瞭解這項功能的運作方式和如何停用,請參閱全域選項。
|
| 9.0 |
最佳化資源縮減:預設為啟用 (使用 android.r8.optimizedResourceShrinking 控制)。最佳化資源縮減功能可協助整合資源縮減與程式碼最佳化管道,進而縮減應用程式大小並提升速度。這項功能會同時最佳化程式碼和資源參照,找出並移除僅由未使用的程式碼參照的資源。相較於先前的個別最佳化程序,這項做法有顯著進步。對於在不同外型規格直向之間共用大量資源和程式碼的應用程式來說,這項功能特別實用,應用程式大小可減少超過 50%。縮減大小後,下載速度會變快、安裝時間會縮短,而且啟動速度更快、轉譯效果更佳,ANR 發生次數也會減少,進而提升使用者體驗。 程式庫規則篩選:程式庫消費者規則已不再支援全域選項 (例如 -dontobfuscate),應用程式會將其篩除。詳情請參閱「新增全域選項」。Kotlin 空值檢查:預設為最佳化 (使用 -processkotlinnullchecks 控制)。這個版本也大幅提升了建構速度。詳情請參閱「其他最佳化全域選項」。最佳化特定套件:您可以使用 packageScope 最佳化特定套件。這項功能仍在實驗階段,詳情請參閱「使用 packageScope 最佳化指定套件」。預設為最佳化:已停止支援 getDefaultProguardFile("proguard-android.txt"),因為其中包含應避免使用的 -dontoptimize。請改用 "proguard-android-optimize.txt"。如要在應用程式中全域停用最佳化功能,請手動將標記新增至 Proguard 檔案。
|
| 8.12 |
最佳化資源縮減:新增初始支援 (使用 android.r8.optimizedResourceShrinking 控制)。最佳化資源縮減有助於將資源縮減功能與程式碼最佳化管道整合。您必須在這個版本的 AGP 中手動啟用。Logcat 重新追蹤:支援在 Android Studio Logcat 視窗中自動重新追蹤。 |
| 8.6 |
改善回溯功能:預設會為所有 minSdk 層級回溯檔案名稱和行號 (先前在 8.2 版中需要 minSdk 26 以上)。更新 R8 可確保您能輕鬆清楚地解讀混淆建構作業的堆疊追蹤記錄。這個版本改善了行號和來源檔案的對應方式,讓 Android Studio Logcat 等工具更容易自動將當機情形回溯至原始原始碼。 |
| 8.0 |
預設為完整模式: R8 完整模式提供更強大的最佳化功能。這項功能預設為啟用。如要停用這項功能,請使用 android.enableR8.fullMode=false。
|
| 7.0 |
提供完整模式:以 android.enableR8.fullMode=true 做為選擇加入功能推出。完整模式會對程式碼使用反射和其他動態功能的方式做出更嚴格的假設,進而套用更強大的最佳化功能。雖然這項功能可縮減應用程式大小並提升效能,但可能需要額外的保留規則,才能避免系統移除必要程式碼。 |
搭配使用 R8 與其他建構系統
雖然 AGP 是 Android 應用程式的建議建構系統,且官方也提供支援,但您也可以使用其他建構系統,例如 Bazel。如果使用 Bazel,您可以將 R8 整合至建構管道,縮減、模糊化及最佳化應用程式。
如要瞭解如何使用 Bazel 最佳化 Android 應用程式,請參閱 Bazel 的rules_android 說明文件。請注意,Bazel 並非 Android 應用程式開發的正式支援工具。