每當 Android 發生當機和 ANR 事件時,系統就會產生堆疊追蹤,也就是當機之前程式呼叫一系列巢狀函式的數據匯報。您可以參考這些數據匯報,找出與修正來源程式碼的任何問題。
如果您的應用程式或遊戲是用 Java 開發,並透過 ProGuard 執行最佳化及模糊化,代表您可以在 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'
注意:偵錯符號檔案的大小上限為 800 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 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
注意:如果您使用的是其他建構系統,則可以加以修改,將未移除的程式庫儲存在具備上述必要結構的目錄中。
- 壓縮以下目錄的內容:
$ cd app/build/intermediates/cmake/universal/release/obj
$ zip -r symbols.zip .
- 按照下方步驟 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 的開發人員才需要執行這個步驟。如果您使用的是應用程式套件和 Android Gradle 外掛程式 4.1 以上版本,則無需採取任何動作。系統會自動從套件中擷取去模糊化檔案,因此您可以直接跳到步驟 3:查看經過去模糊化的當機堆疊追蹤。如要進一步瞭解應用程式套件,請前往 Android 開發人員網站。
使用 Play 管理中心上傳檔案如何上傳去模糊化或符號化檔案:
- 開啟 Play 管理中心。
- 選取應用程式。
- 在左選單中依序選取「
測試及發布
」>「應用程式套件探索工具」。 - 使用右上角的挑選器,選擇相關的構件。
- 選取「下載」分頁標籤,然後向下捲動至「資產」部分。
- 視情況按一下對應檔或偵錯符號檔的上傳箭頭,即可上傳該應用程式版本的去模糊化或符號化檔案。
如要使用 Google Play Developer API 上傳檔案,請前往 Google Developers 網站。
步驟 3:查看經過去模糊化的當機堆疊追蹤
您上傳某個應用程式版本的 ProGuard 對應檔或偵錯符號檔後,系統就會針對日後發生的當機和 ANR 事件進行去模糊化處理。在應用程式的「當機與 ANR」頁面,您可以查看個別當機和 ANR 事件經去模糊化後的堆疊追蹤。
- 開啟 Play 管理中心。
- 選取應用程式。
- 在左選單中,依序選取「監控及改善」>「Android Vitals」>「當機與 ANR」。
- 選取當機事件。
- 「堆疊追蹤」部分會顯示去模糊化與符號化後的堆疊追蹤。
重要資訊:您上傳某個應用程式版本的對應檔後,系統日後只會針對該應用程式版本的當機和 ANR 事件進行去模糊化處理。為某個應用程式版本上傳相應對應檔之前發生的當機和 ANR 事件,則不會進行去模糊化處理。
常見問題
我不想使用 Play 管理中心的去模糊化/符號化功能,可以在離線狀態下操作嗎?Play 管理中心會使用 ndk-stack,以符號表示原生應用程式的堆疊追蹤;如果是 Java 的當機事件,則會採用 ReTrace。如果您選擇不提供去模糊化檔案,可以從 Play 管理中心複製模糊化的當機堆疊,然後離線使用適當的工具進行符號化處理。不過,由於您必須為每個當機堆疊手動執行這個程序,因此會費時許久。如果您提供去模糊化檔案,Play 管理中心就會為您處理所有程序。
您上傳某個應用程式版本的 ProGuard 對應檔或偵錯符號檔案後,系統只會針對之後發生的當機和 ANR 事件進行去模糊化。您需要等使用者的裝置回報新的當機和 ANR 事件,才能在 Play 管理中心看到去模糊化的當機和 ANR 事件。
因為您上傳的去模糊化/符號化檔案並不完整。請確認您已加入整個應用程式的符號化檔案,尤其在使用複雜或多階段建構程序時,更須小心留意。使用第三方程式庫也是導致只有部分事件完成去模糊化處理的最常見原因之一。遇到這個問題時,您可以向程式庫供應商索取去模糊化檔案。
如果您未使用去模糊化檔案,同一個當機或 ANR 事件在 32 位元和 64 位元裝置 (或 ARM 和 Intel 裝置) 上會分開顯示;如果您提供去模糊化檔案,我們就可以將這些當機情形分門別類,讓您更深入瞭解對應用程式影響最大的當機和 ANR 事件。
如果您忘記為新版應用程式上傳檔案,當機和 ANR 事件都會還原為以模糊化的方式處理。請按照上方的操作說明立即上傳檔案。您上傳某個應用程式版本的 ProGuard 對應檔或偵錯符號檔案後,系統只會針對之後發生的當機和 ANR 事件進行去模糊化。您需要等使用者的裝置回報新的當機和 ANR 事件,才能在 Play 管理中心看到去模糊化的當機和 ANR 事件。
為避免忘記上傳檔案帶來的風險,建議您將建構程序改為使用應用程式套件搭配 Android Gradle 外掛程式 4.1 以上版本。在此情況下,您可以按照 Android 開發人員網站上的操作說明,自動在應用程式套件中加入偵錯符號檔。
如果您為某個版本的應用程式上傳了錯誤的檔案,當機和 ANR 事件都會還原為以模糊化的方式處理。如何上傳修正後的版本:
- 開啟 Play 管理中心。
- 選取應用程式。
- 在左選單中依序選取「
測試及發布
」>「應用程式套件探索工具」。 - 使用右上角的挑選器,選擇相關的構件。
- 選取「下載」分頁標籤,然後向下捲動至「資產」部分。
- 找出錯誤的去模糊化或符號化檔案,然後點選旁邊的刪除圖示。
- 刪除錯誤的版本後,請按一下上傳圖示,然後為應用程式版本上傳正確的檔案。
您為應用程式版本上傳正確的 ProGuard 對應檔或偵錯符號檔案後,系統僅會針對日後發生的當機和 ANR 事件進行去模糊化處理。您必須先等待一段時間,讓使用者的裝置回報新的當機和 ANR 事件,才能在 Play 管理中心看到去模糊化的當機和 ANR 事件。
提示:為避免上傳錯誤檔案版本所帶來的風險,建議您將建構程序改為使用應用程式套件搭配 Android Gradle 外掛程式 4.1 以上版本。在此情況下,您可以按照 Android 開發人員網站上的操作說明,自動在應用程式套件中加入偵錯符號檔。
如要開始使用應用程式套件,請造訪 Android 開發人員網站。
可以。
系統有時會發生 ANR 情形,卻無法收集堆疊追蹤。在這種情況下,系統會顯示 ANR 情形,協助您更全面地瞭解應用程式的穩定性,但不會顯示堆疊追蹤本身。系統會依據類型和活動將不含堆疊追蹤的 ANR 情形分組,因此檢查並修正相似的 ANR 情形,可能有助於減少不含堆疊追蹤的 ANR 次數。