排解最佳化問題

由於 R8 的最佳化功能會更新應用程式的程式碼,請務必測試應用程式的行為,確保應用程式正常運作。如果發生非預期行為,請參閱本頁面,瞭解如何排解最佳化後可能發生的問題。

排解問題時,請著重於下列情況:

  • 過度最佳化導致應用程式當機:應用程式當機是因為 R8 最佳化過多程式碼。
  • 最佳化不夠清楚或不充分:R8 未如您預期般最佳化應用程式,或您需要進一步瞭解最佳化作業。

應用程式當機

如果應用程式在透過 R8 最佳化後當機,通常是因為反射中斷。如要找出中斷的反映,請遵守下列規範:

  • 您會觀察到例外狀況,這通常表示所指出的類別、方法或欄位是透過反射作用使用。這些例外狀況通常是 ClassNotFoundExceptionNoSuchMethodExceptionNoSuchFieldExceptionNoClassDefFoundErrorNoSuchMethodErrorNoSuchFieldError 其中之一。
  • 您會看到參照反映的程式碼,其中包含 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 問題,請回報錯誤