反模糊或符號化處理當機堆疊追蹤

當 Android 裝置發生當機和 ANR 時,系統就會產生堆疊追蹤,亦即是當機前程式調用一系列嵌套函數的快覽。這些快覽可助你識別及修正來源中的所有問題。

如果你以 Java 開發應用程式或遊戲,並使用 ProGuard 對應用程式進行優化並隱匿編碼,你可在「Play 管理中心」為每個應用程式版本上載 ProGuard 對應檔案。如果你以 C++ 等原生程式碼開發應用程式或遊戲,你可在「Play 管理中心」為每個應用程式版本上載偵錯符號檔案,以便分析及修正當機和 ANR 問題。

重要事項::只有 ReTrace 兼容的對應檔案可對 Java 編譯的應用程式進行反模糊化處理。格式相與 ProGuard 或 R8 所採用的相同。

步驟 1:產生反模糊或符號化檔案

如要為某個應用程式版本的當機和 ANR 情況進行反模糊化或符號化處理,您需要先為該應用程式版本產生必要檔案。您必須為每個新版本產生及上載檔案,才能順利進行反模糊化或符號化處理。

Java:產生 ProGuard 對應檔案

如要反模糊處理 Java 堆疊追蹤,您需要先產生 ProGuard 對應檔案。請前往 Google Developers 網站瞭解操作方式。

原生程式碼:產生偵錯符號檔案

Android Gradle 外掛程式 4.1 或以上版本

如果您的項目建立 Android App Bundle,可以自動加入偵錯符號檔案。如要加入這個檔案,請在應用程式的 build.gradle 檔案中新增以下程式碼:

  • android.defaultConfig.ndk.debugSymbolLevel = 'FULL'

注意:偵錯符號檔案的大小上限為 800 MB。如果偵錯符號檔案的磁碟使用量太大,請改用 SYMBOL_TABLE (而非 FULL) 縮減檔案大小。

如果您的項目建立 APK,請使用上方的 build.gradle 版本設定分別產生偵錯符號檔案。您可按照下方步驟 2:上載反模糊或符號化檔案中的說明,手動將偵錯符號檔案上載至「Google Play 管理中心」。在建立版本的程序中,Android Gradle 外掛程式會在以下項目位置輸出這個檔案:

  • app/build/outputs/native-debug-symbols/variant-name/native-debug-symbols.zip

Android Gradle 外掛程式 4.0 或以下版本 (及其他版本系統)

在 App Bundle 或 APK 的建立程序中,Android Gradle 外掛程式會在項目目錄中保留未移除訊息 (unstripped) 的程式庫副本。此目錄會使用類似下方的結構:

app/build/intermediates/cmake/universal/release/obj

├── armeabi-v7a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── arm64-v8a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── x86/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

└── x86_64/

    ├── libgameengine.so

    ├── libothercode.so

    └── libvideocodec.so

注意:如果您使用不同的版本系統,可以加以修改,將未移除訊息 (unstripped) 的程式庫儲存在具備上述必要結構的目錄內。

  1. 壓縮以下目錄的內容:
    • $ cd app/build/intermediates/cmake/universal/release/obj
    • $ zip -r symbols.zip .
  2. 按下方「步驟 2:上載反模糊化或符號化檔案」中的說明,手動上載 symbols.zip 檔案到「Play 管理中心」。

偵錯符號檔案的大小上限為 800 MB。如果檔案太大,可能是因為 .so 檔案包含符號表格 (函數名稱) 以及 DWARF 偵錯資訊 (檔案名稱和數行程式碼)。符號化處理程式碼時無需這些資料,因此可以執行以下指令將其移除:

  • $OBJCOPY --strip-debug lib.so lib.so.sym

注意: $OBJCOPY 會指向您要移除的特定 ABI 版本,例如:ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy

步驟 2:上載反模糊化或符號化檔案

如要為某個應用程式版本的當機和 ANR 情況進行反模糊化或符號化處理,您必須為每個版本上載反模糊化或符號化檔案。

重要事項:只有使用 APK 的開發人員才需要執行此步驟。如果您使用 App Bundle 和 Android Gradle 外掛程式 4.1 或以上版本,則無需採取任何動作。系統會自動從 App Bundle 中擷取反模糊化檔案,因此您可跳至「步驟 3:查看已反模糊化的當機堆疊追蹤」。您可前往 Android 開發人員網站,進一步瞭解 App Bundle。

使用「Play 管理中心」上載檔案

如何上載反模糊化或符號化檔案:

  1. 開啟「Play 管理中心」。
  2. 選取應用程式。
  3. 在左側選單中,選取 [發佈版本] > [App Bundle 探索工具]
  4. 使用右上角的點選器,選擇相關的成品。
  5. 選取「下載」分頁,然後向下捲動至「資產」部分。
  6. 視情況按一下對應檔案或偵錯符號的上載箭咀,即可上載該應用程式版本的反模糊化或符號化檔案。
使用 Google Play Developer API 上載檔案

如要使用 Google Play Developer API 上載檔案,請前往 Google 開發人員網站

步驟 3:查看經反模糊化處理的當機堆疊追蹤

為應用程式版本上載 ProGuard 對應檔案或偵錯符號檔案後,其後發生的當機和 ANR 情況將進行反模糊化處理。您可在應用程式的「當機與 ANR」頁面,查看個別當機和 ANR 情況已反模糊化的當機堆疊追蹤。

  1. 開啟「Play 管理中心」。
  2. 選取應用程式。
  3. 在左側選單中,選取 [品質] > [Android 應用程式狀態] > [當機與 ANR]
  4. 選取當機情況。
  5. 「堆疊追蹤」部分會顯示反模糊化與符號化後的堆疊追蹤。

重要事項:上載應用程式版本的對應檔案後,只有該版本日後的當機和 ANR 將進行反模糊化處理。上載其對應檔案前,該應用程式版本發生的當機和 ANR 不會進行反模糊化處理。

常見問題

我不想使用「Play 管理中心」的反模糊化/符號化功能,可以進行離線操作嗎?

「Play 管理中心」使用 ndk-stack 將原生應用程式的堆疊追蹤符號化,並對 Java 當機情況使用 ReTrace。如果你選擇不分享反模糊化檔案,可以從「Play 管理中心」複製經編碼隱匿的當機堆疊,並離線使用適當的工具作符號化處理。不過,你必須對每個當機堆疊手動進行這個程序,因此過程既緩慢且費時。如果你選擇提供反模糊化檔案,「Play 管理中心」將為你處理這個程序。

我已上載反模糊化/符號化檔案,為什麼當機和 ANR 情況仍被隱匿編碼?

為應用程式版本上載 ProGuard 對應檔案或偵錯符號檔案後,只有其後發生的當機和 ANR 將進行反模糊化處理。你將需預留時間讓使用者的裝置報告新的當機和 ANR 情況,才能在「Play 管理中心」看到反模糊化的當機和 ANR 情況。

上載反模糊化/符號化檔案後,為什麼只有部分當機和 ANR 情況完成反模糊化?

因為您上載的反模糊化/符號化檔案並不完整。特別在使用複雜或多階段建立程序時,請務必確認已加入整個應用程式的符號化檔案。使用第三方程式庫也是導致只有部分情況完成反模糊化處理的最常見原因之一。在這種情況下,您可向程式庫供應商取得反模糊化檔案。

上載反模糊化/符號化檔案後,雖然當機和 ANR 的次數好像有所減少,但程度卻比之前嚴重,為什麼?

如果您未使用反模糊化檔案,同一個當機或 ANR 情況在 32 位元和 64 位元裝置 (或 ARM 和 Intel 裝置) 上會分開顯示。提供反模糊化檔案有助系統將這些當機事件分類,讓您瞭解對應用程式影響最大的當機和 ANR 情況。

如忘記上載檔案,會有什麼影響?

如果忘記為應用程式新版本上載檔案,當機和 ANR 將以原來的編碼隱匿方式處理。請按照上述指示立即上載檔案。為應用程式版本上載 ProGuard 對應檔案或偵錯符號檔案後,只有其後發生的當機和 ANR 將進行反模糊化處理。你將需預留時間讓使用者的裝置報告新的當機和 ANR 情況,才能在「Play 管理中心」看到反模糊化的當機和 ANR 情況。

如要避免忘記上載檔案的風險,請考慮改為使用 App Bundle 和 Android Gradle 外掛程式 4.1 或以上版本進行建立程序。在這個情況下,您可按照 Android 開發人員網站上的指示,自動在 App Bundle 中加入偵錯符號檔案。

如上載錯誤的檔案,會有什麼影響?

如果為應用程式新版本上載錯誤檔案,當機和 ANR 將還原為以編碼隱匿的方式處理。如何上載修正後的版本:

  1. 開啟「Play 管理中心」。
  2. 選取應用程式。
  3. 在左側選單中,選取 [發佈版本] > [App Bundle 探索工具]
  4. 使用右上角的點選器,選擇相關的成品。
  5. 選取「下載」分頁,然後向下捲動至「資產」部分。
  6. 找出不正確的反模糊化或符號化檔案,然後按一下旁邊的刪除圖示
  7. 刪除錯誤的版本後,請按一下上載圖示,然後上載該應用程式版本的正確檔案。

為應用程式版本上載正確的 ProGuard 對應檔案或偵錯符號檔案後,只有其後發生的當機和 ANR 將進行反模糊化處理。您將需預留時間讓使用者的裝置報告新的當機和 ANR 情況,才能在「Play 管理中心」看到反模糊化的當機和 ANR 情況。

提示:如要避免忘記上載檔案的風險,請考慮改為使用 App Bundle 和 Android Gradle 外掛程式 4.1 或以上版本進行建立程序。在這個情況下,您可按照 Android 開發人員網站上的指示,自動在 App Bundle 中加入偵錯符號檔案。

我目前使用 APK,該如何改用 App Bundle 呢?

前往 Android 開發人員網站即可開始使用。

我的應用程式同時含有原生程式碼和 Java 程式碼,可否同時上載原生符號化檔案和 Java 反模糊化檔案?

可以。

為什麼部分 ANR 沒有顯示堆疊追蹤?

有時系統遇到 ANR 問題,但無法收集堆疊追蹤。在這個情況下,系統會顯示 ANR 錯誤,讓您對應用程式穩定性有更全面的瞭解,但無法顯示堆疊追蹤。系統會按類型和活動將沒有堆疊追蹤的 ANR 分類,因此檢查並修正相似的 ANR 情況,可能有助減少沒有堆疊追蹤的 ANR 次數。

此內容對您有幫助嗎?

我們可以如何改善?

需要更多協助?

嘗試以下步驟:

搜尋
清除搜尋
閂搜尋模式
主選單
12790107223340396436
true
搜尋說明中心
true
true
true
true
true
92637
false
false