使用 R8 設定分析器

R8 設定分析器這項工具可提供應用程式設定品質的詳細洞察資料,協助您充分發揮 R8 的效能優勢。您可以監控主要指標 (具體來說是縮減、最佳化和模糊化分數),藉此追蹤及改善 R8 最佳化作業,這些指標會指出可供最佳化的程式碼集百分比。分析器會找出廣泛或不必要的保留規則 (包括第三方程式庫導入的規則),協助您修正設定,確保 R8 盡可能有效最佳化類別、欄位和方法。

產生報表

AGP 9.3.0-alpha05 以上版本開始,執行 R8 建構作業時,系統會自動在 build/outputs/mapping/release/configanalyzer.html 中產生報表。如要停用自動產生輸出內容,請設定下列 Gradle 屬性:

android.experimental.r8.enableR8ConfigurationAnalyzer=false

如果是 AGP 9.2 以上版本,請在執行 Gradle 工作時設定 com.android.tools.r8.dumpkeepradiushtmltodirectory 系統屬性,並啟用 R8 建構。

./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

舉例來說,使用下列指令在 /tmp/r8analysis 目錄中產生 HTML 報表:

// To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis

// To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis

解讀報表

R8 設定分析器可深入瞭解應用程式的 R8 設定,以及每項保留規則對應用程式的影響,協助您充分運用 R8 進行最佳化,進而提升應用程式效能。您可以根據下列分數,瞭解 R8 可最佳化的程式碼集比例。

報表摘要部分範例
圖 1 報表摘要部分的範例。

縮減分數

R8 縮減應用程式時,會找出並移除未使用的程式碼和資源,藉此縮減應用程式的整體大小,確保最終建構版本盡可能精簡。縮減分數會追蹤受縮減影響的類別、欄位和方法百分比。舉例來說,縮減分數為 66% 表示 R8 可以在 66% 的程式碼庫中執行縮減作業。

最佳化分數

R8 會執行方法內嵌和類別合併等最佳化作業,進而提升應用程式的啟動速度和記憶體用量。最佳化分數會追蹤受 R8 最佳化作業影響的類別、欄位和方法百分比。舉例來說,如果最佳化分數為 66%,表示 R8 只能在 66% 的程式碼集執行最佳化。

模糊化分數

R8 會將類別、欄位和方法模糊處理為較短的名稱,藉此縮減應用程式的中繼資料用量,節省記憶體。混淆分數會評估程式碼集中可混淆處理的程式碼百分比。

調整保留規則

如要提高分數並解鎖更完善的 R8 最佳化功能,請調整保留規則,避免 R8 不必要地無法最佳化應用程式。您應只保留透過反射存取的類別、方法或欄位。

如要達成此目標,請使用「保留規則分析」

保留規則分析範例
圖 2. 保留規則分析範例。

如要查看規則的詳細分析,請點選規則開啟詳細資料畫面。

保留規則分析範例
圖 3 保留規則分析範例。

如何調整保留規則

如要調整保留規則,充分發揮 R8 最佳化功能,請按照下列步驟操作:

  1. 在「設定分析器」中,查看每個保留規則的類別、欄位和方法百分比,這些項目無法由 R8 最佳化。您可以使用這項功能,找出大量類別、欄位或方法中,導致無法最佳化的保留規則。系統也會列出各項保留規則禁止的最佳化屬性。
  2. 如果發現有保留規則導致大量類別無法最佳化,請務必檢查保留規則禁止最佳化的類別、欄位和方法,確認這項規則是否保留了未使用反映動態叫用的項目。
  3. 如要減少因保留規則而遭到封鎖的最佳化作業,請選擇合適的保留選項,並遵循最佳做法,只指定必要的類別、欄位或方法。
  4. 調查並執行涵蓋受影響類別、欄位和保留規則方法的測試,然後修正保留規則。

檢查程式庫最佳化程度

整合第三方程式庫時,這些程式庫通常會納入自己的消費者保留規則,以便與 R8 搭配運作。由於程式庫作者無法預測您的具體實作方式,因此有時會編寫保守且適用範圍廣泛的規則,導致不必要的類別、欄位和方法無法最佳化。這可能會導致 R8 無法最佳化與程式庫實際執行階段無關的應用程式部分。您可以使用 R8 設定分析器,找出導入規則的程式庫,這些規則會對應用程式的最佳化造成負面影響。

使用設定分析器檢查所有合併的消費者保留規則,瞭解這些規則的綜合影響。分析第三方程式庫中每項保留規則的影響,找出並追蹤導致應用程式無法大幅最佳化的特定第三方程式庫。

如何最佳化程式庫

  • 如果程式庫包含過於寬鬆的規則,建議您提供報表中的資料,向程式庫維護人員說明目前的規則如何影響應用程式的最佳化分數。如果是外部程式庫,請先在程式庫中尋找現有錯誤,再提出問題。
  • 如有需要,您可以篩除特定程式庫中的規則,測試潛在的改善項目。您可以將程式庫的規則匯入專案、排除廣泛規則,然後重新執行設定分析器,評估大小和效能的潛在增益。

併入的規則

如果多個保留規則重疊,其中一項規則可能會導致系統過度保留項目,無法進行必要的最佳化。如果程式碼集中有兩項保留規則。

# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }

# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass

第一個保留規則會防止整個套件進行最佳化,並涵蓋第二個保留規則,後者則是以第一個保留規則保留的套件內類別為目標。如果保留規則重疊,可能會阻礙過多最佳化作業。修正這些重疊規則,即可盡量發揮 R8 最佳化功能,並消除技術債。這個程序包括簡化設定,確保只保留必要程式碼,同時充分發揮 R8 的最佳化功能。

報表摘要部分範例
圖 4:報表中遭併入規則的範例。

最佳化涵蓋規則

  1. 使用 R8 設定分析工具找出 subsuming keep 規則。
  2. 找出程式碼集內實際依附於反射的確切類別、欄位或方法,這些項目需要使用保留規則保留。瞭解這點有助於你調整保留規則。
  3. 使用設定分析器,比較以相同類別、欄位或方法為目標的各項規則所造成的影響。您可以根據每項保留規則避免的優化百分比,判斷規則的範圍較廣或較窄。
    1. 如果窄規則編寫精確,只保留以反射方式存取的確切成員或類別,請移除較廣泛的保留規則。這項操作可安全地為套件的其餘部分解鎖 R8 最佳化功能。
    2. 如果廣泛規則指定的是正確的類別,請保留廣泛規則並刪除精細規則。窄規則只是多餘的雜亂。 請務必修正廣泛規則,只指定您識別出的類別、欄位或方法。

驗證及測試變更:重新執行設定分析器,確保衝突已修正。接著,編譯發布子版本並測試變更,確保程式碼集正常運作。

移除不必要的規則

使用設定分析工具,您可以有系統地稽核程式碼集,找出並修剪造成設定雜亂的過時保留規則。R8 設定分析器會特別標示不必要規則的兩個主要來源:

  • 未使用的規則:在目前的建構作業中,與零個類別、方法或欄位相符的規則。這些設定通常會在程式碼重構、移除依附元件後,或從不再相關的複製貼上設定中保留下來,進而增加不必要的設定複雜度。
  • 相同規則:相同保留規則是指目標為相同類別、欄位和方法的規則,或是在相同或不同保留規則檔案中重複宣告保留規則。

這兩種規則都會讓設定變得雜亂,維護和偵錯難度也會提高。找出這些項目後,即可清理設定。