針對當機時的堆疊追蹤去模糊化或符號化

 

每當 Android 發生當機和 ANR 事件時,系統就會產生堆疊追蹤,也就是當機之前程式呼叫一系列巢狀函式的數據匯報。您可以透過這些數據匯報來尋找及修正來源中的所有問題。

如果您是使用 Java 開發應用程式或遊戲,且使用 ProGuard 對 APK 檔案進行最佳化及模糊化處理,您就可以為您在 Play 管理中心的各個應用程式版本上傳 ProGuard 對應檔;如果您是以 C ++ 等原生程式碼開發應用程式或遊戲,則可為 Play 管理中心的各個應用程式版本上傳偵錯符號檔案,以利分析及修正當機和 ANR 問題。

重要資訊::如要對以 Java 編譯的應用程式進行去模糊化處理,您只能使用與 ReTrace 相容的對應檔,也就是 ProGuard 或 R8 所採用的格式。

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

如要針對特定應用程式版本的當機和 ANR 事件進行去模糊化或符號化處理,您必須先為該應用程式版本產生必要檔案。為了讓去模糊化或符號化作業順利運作,請務必為應用程式的各個新版本產生並上傳檔案。

Java:產生 ProGuard 對應檔

如要對 Java 的堆疊追蹤加以去模糊化處理,您必須先產生 ProGuard 對應檔。如要瞭解操作方式,請前往 Google Developers 網站

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

Android Gradle 外掛程式 4.1 以上版本

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

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

注意:偵錯符號檔的大小上限為 300 MB。如果偵錯符號檔占用的空間過大,請改用 SYMBOL_TABLE (而非FULL) 縮減檔案大小。

如果您在專案中建構的是 APK,請使用上方的 build.gradle 建構設定分別產生偵錯符號檔。您可以按照下方步驟 2:上傳去模糊化或符號化檔案中的說明,手動將偵錯符號檔上傳到 Google Play 管理中心。在建構程序中,Android Gradle 外掛程式會在下列專案位置輸出這個檔案:

  • app/build/outputs/native-debug-symbols/<版本名稱>/native-debug-symbols.zip

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

在 APK 或 Android App Bundle 的建構程序中,Android Gradle 外掛程式會在專案目錄中保留未移除的程式庫副本。這個目錄會採用類似下方的結構:

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

注意:如果您使用的是其他建構系統,則可以加以修改,將未移除的程式庫儲存在具備上述必要結構的目錄中。

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

偵錯符號檔案的大小上限為 300 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 的開發人員才需要執行這個步驟。如果您使用的是 Android App Bundle 和 Android Gradle 外掛程式 4.1 以上版本,則無需採取任何動作。系統會自動從套件中擷取去模糊化檔案,因此您可以直接跳到步驟 3:查看經過去模糊化的當機堆疊追蹤。如要進一步瞭解應用程式套件,請前往 Android 開發人員網站

使用 Play 管理中心上傳檔案

如何上傳去模糊化或符號化檔案:

  1. 開啟 Play 管理中心
  2. 選取應用程式。
  3. 在左選單中依序選取 [發布] > [應用程式套件探索工具]
  4. 使用右上角的挑選器,選擇相關的成果。
  5. 點選 [下載] 分頁標籤,然後向下捲動至「元素」部分。
  6. 視情況按一下對應檔或偵錯符號檔的上傳箭頭,即可上傳該應用程式版本的去模糊化或符號化檔案。
使用 Google Play Developer API 上傳檔案

如要使用 Google Play Developer API 上傳檔案,請前往 Google Developers 網站

步驟 3:查看經過去模糊化的當機堆疊追蹤

您上傳某個應用程式版本的 ProGuard 對應檔或偵錯符號檔後,系統就會針對日後發生的當機和 ANR 事件進行去模糊化處理。您可以在應用程式的「當機與 ANR」頁面查看個別當機和 ANR 事件經去模糊化處理後的堆疊追蹤。

  1. 開啟 Play 管理中心
  2. 選取應用程式。
  3. 在左側選單中,依序選取 [品質] > [Android Vitals] > [當機與 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 事件。

為避免忘記上傳檔案帶來的風險,建議您將建構程序改為使用應用程式套件搭配 Android Gradle 外掛程式 4.1 以上版本。在此情況下,您可以按照 Android 開發人員網站上的操作說明,自動在應用程式套件中加入偵錯符號檔。

如果我上傳的檔案有誤,會有什麼影響?

如果您為某個版本的應用程式上傳了錯誤的檔案,當機和 ANR 事件都會還原為以模糊化的方式處理。如何上傳修正後的版本:

  1. 開啟 Play 管理中心
  2. 選取應用程式。
  3. 在左選單中依序選取 [發布] > [應用程式套件探索工具]
  4. 使用右上角的挑選器,選擇相關的成果。
  5. 點選 [下載] 分頁標籤,然後向下捲動至「元素」部分。
  6. 找出錯誤的去模糊化或符號化檔案,然後點選旁邊的刪除圖示
  7. 刪除錯誤的版本後,請按一下上傳圖示,然後為應用程式版本上傳正確的檔案。

您為應用程式版本上傳正確的 ProGuard 對應檔或偵錯符號檔案後,系統僅會針對日後發生的當機和 ANR 事件進行去模糊化處理。您必須先等待一段時間,讓使用者的裝置回報新的當機和 ANR 事件,才能在 Play 管理中心看到去模糊化的當機和 ANR 事件。

提示:為避免上傳錯誤檔案版本所帶來的風險,建議您將建構程序改為使用應用程式套件搭配 Android Gradle 外掛程式 4.1 以上版本。在此情況下,您可以按照 Android 開發人員網站上的操作說明,自動在應用程式套件中加入偵錯符號檔。

我目前使用的是 APK,該如何改用應用程式套件?

如要開始使用應用程式套件,請造訪 Android 開發人員網站

我的應用程式同時含有原生程式碼和 Java 程式碼,我可以一併上傳原生符號化檔案和 Java 去模糊化檔案嗎?

可以。

有些 ANR 為何不會顯示堆疊追蹤?

系統有時會發生 ANR 情形,卻無法收集堆疊追蹤。在此情況下,系統會顯示 ANR 讓您瞭解發生狀況,但不會顯示堆疊追蹤本身。

這對您有幫助嗎?
我們應如何改進呢?

還有其他問題嗎?

登入即可獲得其他支援選項,快速解決您的問題