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

當應用程式的 UI 執行緒 應用程式未回應超過 5 秒。你可以閱讀 如要進一步瞭解 ANR 以及如何診斷 ANR,請參閱 Android 說明文件

此外,Crashlytics 也有助於找出特定有問題的執行緒。三 會分析 ANR 事件,然後在 Crashlytics 資訊主頁中 為適用的執行緒加上標記,指示 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 的工作降到最低。使用工作站或背景執行緒 適合執行會耗用大量 CPU 的工作

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

Unknown root cause

執行緒會標上 Unknown root cause 標記, 是觸發了 ANR 但其實在處理過程中處於閒置狀態 發生 ANR 情形。Crashlytics 的資訊不足,無法判斷 根本原因無法明確瞭解為何發生此 ANR 事件。

建議

請按照一般建議,瞭解如何預防 ANR。舉例來說,找出 讓應用程式的主執行緒忙碌中 5 秒