由於 R8 的最佳化功能會更新應用程式的程式碼,請務必測試應用程式的行為,確保應用程式正常運作。如果發生非預期行為,請參閱本頁面,瞭解如何排解最佳化後可能發生的問題。
排解問題時,請著重於下列情況:
- 過度最佳化導致應用程式當機:應用程式當機是因為 R8 最佳化過多程式碼。
- 最佳化不夠清楚或不充分:R8 未如您預期般最佳化應用程式,或您需要進一步瞭解最佳化作業。
應用程式當機
如果應用程式在透過 R8 最佳化後當機,通常是因為反射中斷。如要找出中斷的反映,請遵守下列規範:
- 您會觀察到例外狀況,這通常表示所指出的類別、方法或欄位是透過反射作用使用。這些例外狀況通常是
ClassNotFoundException、NoSuchMethodException、NoSuchFieldException、NoClassDefFoundError、NoSuchMethodError、NoSuchFieldError其中之一。 - 您會看到參照反映的程式碼,其中包含
import kotlin.reflect.*或import java.lang.reflect.*。 - 您會發現類別建構函式的使用方式如下:
Something::class.constructors。 - 畫面會顯示
Class.forName(...)。
解決方法:新增保留規則。
最佳化不明確或不足
由於規則是從應用程式和內含程式庫套用,您可能需要進一步瞭解套用的規則,或需要說明 R8 為何保留您預期會最佳化的特定程式碼區段。
套用的規則不明確:由於所含程式庫的規則也會套用至應用程式,且這些程式庫的全域選項也會傳播至應用程式,您可能不確定套用哪些規則。
解決方法:查看 R8 建構專案時套用的所有規則報表,確認套用的規則。如要查看這份報告,請前往
./app/build/outputs/mapping/configuration.txt。這份報表包含用於設定 R8 的每個程式庫和模組中,所有已合併的規則,可用於找出效率不彰的規則。保留過多程式碼:R8 的最佳化功能可能會保留您預期會移除的程式碼。
解決方案:使用
-whyareyoukeeping設定選項,瞭解程式碼保留的原因。輸出內容包含從保留的程式碼到應用程式其中一個進入點的路徑。詳情請參閱-whyareyoukeeping。難以瞭解原始堆疊追蹤:R8 會透過各種方式變更程式碼,導致堆疊追蹤不再參照原始程式碼。舉例來說,行號以及類別和方法名稱可能會變更。
解決方案:從 Android Studio Otter 3 功能推送和 AGP 9.0 開始,Logcat 會自動還原堆疊追蹤的混淆處理。不過,如果您使用舊版 Android Studio,則必須手動復原原始堆疊追蹤記錄。如要復原原始堆疊追蹤,請使用
retrace指令列工具,此工具包含在指令列工具套件之中。如要使用
retrace,請提供指令,並附上對應檔案和堆疊追蹤檔案的路徑。這個對應檔案稱為mapping.txt,會自動與 Android App Bundle (AAB) 一併封裝。詳情請參閱 retrace 說明文件,以及 Play 管理中心說明文章「如何針對當機時的堆疊追蹤去模糊化」。使用 Play 和 Firebase Crashlytics 時,請使用mapping.txt檔案,其中包含服務從應用程式使用者收集到的當機資訊。以下指令示範如何從專案根目錄執行retrace:$ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
回報問題
如果無法解決 R8 問題,請回報錯誤。