ANR-Fehler (Application Not Responding) werden ausgelöst, wenn der UI-Thread der Anwendung länger als
Darüber hinaus kann Crashlytics dabei helfen, bestimmte problematische Threads zu lokalisieren. Wir analysieren ANRs und markieren dann im Crashlytics-Dashboard entsprechende Threads, um Hinweise zum Debuggen des ANR bereitzustellen.
In den folgenden Abschnitten auf dieser Seite wird erläutert, was jedes ANR-Tag bedeutet, ein Beispiel-ANR mit diesem Tag gezeigt und eine empfohlene Lösung zum Debuggen des ANR bereitgestellt.
Triggered ANR
Ein Thread, der zu lange blockiert war und die ANR ausgelöst hat, wird damit gekennzeichnetTriggered ANR
-Tag.
Der problematische Thread kann der Hauptthread der App oder ein beliebiger Thread sein, der nicht reagiert. Der Thread wurde jedoch mit dem Tag versehenTriggered ANR
kann die tatsächliche Ursache der ANR sein oder auch nicht. Um Erkenntnisse zum Debuggen und Beheben dieser ANRs bereitzustellen, markiert Crashlytics auch alle anderen Threads, die an der ANR beteiligt sind. In den folgenden Abschnitten dieser Seite erfahren Sie mehr über die anderen Tags, die auf einen Thread angewendet werden können.
Deadlocked
Alle Threads, bei denen festgestellt wird, dass sie in einen Deadlock verwickelt sind, der zum ANR geführt hat, werden damit vermerktDeadlocked
.
Ein Deadlock tritt auf, wenn ein Thread in den Wartezustand wechselt, weil eine erforderliche Ressource von einem anderen Thread gehalten wird, der ebenfalls auf eine vom ersten Thread gehaltene Ressource wartet. Wenn sich der Hauptthread der App in dieser Situation befindet, ist es wahrscheinlich, dass ANRs auftreten.
Empfehlung
Schauen Sie sich die am Deadlock beteiligten Threads an und überprüfen Sie die von diesen Threads erworbenen Ressourcen/Sperren. Mögliche Lösungen finden Sie unter Deadlock- und Deadlock-Verhinderungsalgorithmen .
IO Root blocking
Jeder Thread, der langsame E/A-Vorgänge ausführte und blockierteTriggered ANR
Thread wird mit dem kommentiertIO Root blocking
. Wenn dieTriggered ANR
Thread wird nicht von anderen Threads blockiertIO Root blocking
ist auch einRoot blocking
.
Empfehlung
Im Allgemeinen sollte Ihre App keine teuren E/A-Vorgänge im Hauptthread ausführen. Im Fall des HauptthreadsIO Root blocking
können Sie den strikten Modus auch verwenden, um alle unbeabsichtigten E/A-Vorgänge zu identifizieren, die im Hauptthread stattfinden.
Root blocking
Jeder Thread, der den als markierten Thread blockiert hatTriggered ANR
wird mit dem gekennzeichnetRoot blocking
-Tag. Wenn ein Thread als beides markiert istRoot blocking
undTriggered ANR
, dann gibt es keine anderen Threads, die diesen Thread blockieren.
Wenn überhauptTriggered ANR
Threads warteten (möglicherweise transitiv) auf andere Threads, das sind sieRoot blocking
. Es kann verschiedene Gründe geben, warum ein Thread eine Hauptursache für die ANR ist.
Empfehlung
Minimieren Sie die CPU-intensive Arbeit im Hauptthread. Verwenden Sie Arbeits- oder Hintergrundthreads zum Ausführen CPU-intensiver Aufgaben.
Minimieren Sie E/A-intensive Arbeit, wie das Laden aus einer Datenbank, im Hauptthread.
Unknown root cause
Ein Thread ist mit dem markiertUnknown root cause
Tag, wenn es der Thread war, der die ANR ausgelöst hat, aber im Prozess inaktiv war, als die ANR auftrat. Crashlytics verfügt nicht über ausreichende Informationen, um die Grundursache zu ermitteln. Es gibt keinen ersichtlichen Grund, warum diese ANR aufgetreten ist.
Empfehlung
Befolgen Sie die allgemeinen Ratschläge zur Vorbeugung von ANRs. Identifizieren Sie beispielsweise die Stellen in Ihrem Code, an denen der Hauptthread der App länger als