根據 Crashlytics 資訊主頁中的 ANR 標記對 Android 應用程式進行偵錯

當應用程式的 UI 執行緒無回應超過 5 秒時,就會觸發「應用程式無回應」(ANR) 錯誤。如要進一步瞭解 ANR 和如何診斷 ANR,請參閱 Android 說明文件

此外,Crashlytics 還可協助您找出特定有問題的執行緒。我們會分析 ANR,然後在 Crashlytics 資訊主頁中標記適用的執行緒,提供如何偵錯 ANR 的提示。

本頁的後續部分會說明每個 ANR 標記的意義、顯示含有該標記的 ANR 範例,並提供建議的 ANR 偵錯解決方案。

Triggered ANR

如果執行緒阻擋時間過長並觸發 ANR,就會加上 Triggered ANR 標記的註解。

有問題的執行緒可能是應用程式的執行緒,或是其他無回應的執行緒。不過,標示為 Triggered ANR 的執行緒不一定是造成 ANR 的實際原因。為了提供偵錯和修正這些 ANR 的洞察資料,Crashlytics 也會標記 ANR 中涉及的任何其他執行緒。請參閱本頁的後續部分,瞭解可套用至主題的其他標記。

Deadlocked

任何發現與導致 ANR 的死結相關的執行緒,都會加上這個 Deadlocked 標記。

當所需的資源被另一個執行緒佔據而必須進入等待狀態,而另一個執行緒也正在等待第一個執行緒佔據的資源時,就會發生死結。如果應用程式的主執行緒有這種情形,就可能發生 ANR。

建議

查看死結中涉及的執行緒,並檢查這些執行緒取得的資源/鎖定。如需可能的解決方案,請參閱「死結」和「死結防範演算法」。

IO Root blocking

若任何執行緒的 I/O 作業執行速度過慢,且阻擋了 Triggered ANR 執行緒,就會註明 IO Root blocking 標記。如果其他執行緒並未封鎖 Triggered ANR 執行緒,則 IO Root blocking 執行緒也就屬於 Root blocking 執行緒。

建議

一般來說,應用程式不應在主執行緒上執行耗用大量資源的 I/O 作業。如果主執行緒是 IO Root blocking,您也可以使用嚴格模式,找出主執行緒中發生的任何非預期 I/O 作業。

Root blocking

任何封鎖執行緒的執行緒會標上 Triggered ANR,都會加上 Root blocking 標記。如果執行緒同時標記為 Root blockingTriggered ANR,則沒有其他執行緒會封鎖該執行緒。

如果有任何 Triggered ANR 執行緒正在等待 (轉移) 其他執行緒,這些執行緒就會是 Root blocking。導致 ANR 的線程可能有許多原因。

建議

盡量減少主執行緒中 CPU 密集的工作。使用 worker 或背景執行緒執行 CPU 密集型工作。

盡量減少主執行緒上耗用大量 I/O 的工作,例如從資料庫載入資料。

Unknown root cause

如果執行緒觸發了 ANR,但 ANR 發生時其程序處於閒置狀態,就會註明 Unknown root cause 標記。Crashlytics 沒有足夠的資訊來判斷根本原因,無法明確瞭解為何發生此 ANR 事件。

建議

請遵循一般建議,瞭解如何避免 ANR。舉例來說,在程式碼中找出應用程式主執行緒忙碌時間超過 5 秒的部分。