Wenn der UI-Thread einer Android-App zu lange blockiert ist, wird ein ANR-Fehler (App antwortet nicht) ausgelöst. Android Vitals erfasst und meldet ANR-Messwerte in der Google Play Console, damit du die Stabilität und Reaktionsfähigkeit deiner App auf verschiedenen Geräten im Blick behalten kannst.
Android Vitals-Messwerte und ‑Grenzwerte
Mit Android Vitals können Sie die ANR-Rate Ihrer App im Blick behalten und verbessern. Android Vitals misst mehrere ANR-Raten:
- ANR-Rate:Prozentsatz der aktiven Nutzer pro Tag, bei denen ein beliebiger ANR-Fehler aufgetreten ist.
- Rate der vom Nutzer wahrgenommenen ANR-Fehler:Prozentsatz der aktiven Nutzer pro Tag, bei denen mindestens ein vom Nutzer wahrgenommener ANR-Fehler aufgetreten ist. Derzeit werden nur ANR-Fehler vom Typ
Input dispatching timed outals vom Nutzer wahrgenommen eingestuft. - Mehrfach-ANR-Rate:Prozentsatz der aktiven Nutzer pro Tag, bei denen mindestens zwei ANR-Fehler aufgetreten sind.
Ein aktiver Nutzer pro Tag ist ein einzelner Nutzer, der Ihre App an einem Tag auf einem Gerät verwendet, möglicherweise in mehreren Sitzungen. Wenn ein Nutzer Ihre App an einem Tag auf mehreren Geräten verwendet, wird jedes Gerät zur Zahl der aktiven Nutzer an diesem Tag addiert.
Die Rate der vom Nutzer wahrgenommenen ANR-Fehler ist ein Vitalparameter, d. h., er beeinflusst die Sichtbarkeit Ihrer App bei Google Play. Er ist wichtig, weil die gezählten ANR-Fehler immer auftreten, während der Nutzer mit der App interagiert, und daher die größte Störung verursachen.
Google Play hat für diesen Messwert zwei Grenzwerte zu unerwünschtem Verhalten definiert:
- Grenzwert zu unerwünschtem Verhalten auf allen Geräten:Bei mindestens 0, 47% der aktiven Nutzer pro Tag tritt auf allen Gerätemodellen ein vom Nutzer wahrgenommener ANR-Fehler auf.
- Grenzwert zu unerwünschtem Verhalten auf einzelnen Geräten:Bei mindestens 8% der Nutzer pro Tag tritt bei einem einzelnen Gerätemodell ein vom Nutzer wahrgenommener ANR-Fehler auf.
Wenn Ihre App den Grenzwert zu unerwünschtem Verhalten insgesamt überschreitet, ist sie wahrscheinlich auf allen Geräten weniger gut sichtbar. Wenn Ihre App auf einigen Geräten den Grenzwert zu unerwünschtem Verhalten pro Gerät überschreitet, ist sie auf diesen Geräten wahrscheinlich weniger gut sichtbar und in Ihrem Store-Eintrag wird möglicherweise eine Warnung angezeigt.
Android Vitals kann dich über die Play Console benachrichtigen, wenn deine App übermäßig viele ANR-Fehler aufweist.
Informationen dazu, wie Google Play Android Vitals-Daten erhebt, findest du in der Play Console-Dokumentation.
Problem erkennen
Wenn die App im Vordergrund ist, wenn ein ANR-Fehler auftritt, zeigt das System dem Nutzer ein Dialogfeld an, wie in Abbildung 1 dargestellt. Im ANR-Dialogfeld kann der Nutzer das Beenden der App erzwingen.
ANR-Fehler sind ein Problem, weil der Hauptthread der App, der für die Aktualisierung der Benutzeroberfläche verantwortlich ist, keine Nutzereingabeereignisse verarbeiten oder zeichnen kann, was zu Frustration beim Nutzer führt. Weitere Informationen zum Hauptthread der App finden Sie unter Prozesse und Threads – Übersicht.
Ein ANR-Fehler wird für Ihre App ausgelöst, wenn eine der folgenden Bedingungen erfüllt ist:
- Zeitüberschreitung bei der Eingabeverteilung: Wenn deine App nicht innerhalb von 5 Sekunden auf ein Eingabeereignis (z. B. Tastendruck oder Berührung des Bildschirms) reagiert hat.
- Dienst wird ausgeführt: Wenn ein von deiner App deklarierter Dienst
Service.onCreateundService.onStartCommandoderService.onBindnicht innerhalb weniger Sekunden ausführen kann. Service.startForegroundnicht aufgerufen:Wenn deine AppContext.startForegroundServiceverwendet, um einen neuen Dienst im Vordergrund zu starten, der Dienst aber nicht innerhalb von 5 SekundenstartForegroundaufruft.- Broadcast of Intent: Wenn ein
BroadcastReceivernicht innerhalb einer bestimmten Zeit ausgeführt wurde. Wenn die App im Vordergrund aktiv ist, beträgt dieses Zeitlimit 10 Sekunden. JobScheduler-Interaktionen: Wenn einJobServicenicht innerhalb weniger Sekunden vonJobService.onStartJoboderJobService.onStopJobzurückkehrt oder wenn ein vom Nutzer initiierter Job gestartet wird und Ihre App nicht innerhalb weniger Sekunden nach dem Aufruf vonJobService.onStartJobdie MethodeJobService.setNotificationaufruft. Bei Apps, die auf Android 13 und niedriger ausgerichtet sind, werden die ANRs im Hintergrund ausgeführt und nicht an die App gemeldet. Bei Apps, die auf Android 14 und höher ausgerichtet sind, werden die ANRs explizit an die App gemeldet.
Neben Android Vitals kannst du auch andere Tools verwenden, um ANRs in der Praxis zu erkennen. Tools von Drittanbietern können jedoch keine ANRs unter Android 10 (API-Level 29) und niedriger melden.
ANR-Fehler diagnostizieren
Bei der Diagnose von ANRs gibt es einige häufige Muster, auf die Sie achten sollten:
- Die App führt langsame Vorgänge mit E/A im Hauptthread aus.
- Die App führt eine lange Berechnung im Hauptthread aus.
- Der Hauptthread führt einen synchronen Binder-Aufruf an einen anderen Prozess aus und es dauert lange, bis dieser andere Prozess zurückgegeben wird.
- Der Hauptthread ist blockiert und befindet sich im Wartezustand für einen synchronisierten Block für einen langen Vorgang, der in einem anderen Thread ausgeführt wird.
- Der Hauptthread befindet sich in einem Deadlock mit einem anderen Thread, entweder in Ihrem Prozess oder über einen Binderaufruf. Der Hauptthread wartet nicht nur darauf, dass ein langer Vorgang abgeschlossen wird, sondern befindet sich in einer Deadlock-Situation.
Mit den folgenden Methoden können Sie die Ursache Ihrer ANRs ermitteln.
HealthStats
HealthStats liefert Messwerte zum Zustand einer Anwendung, indem die gesamte Nutzer- und Systemzeit, die CPU-Zeit, das Netzwerk, die Funkstatistiken, die Zeit, in der der Bildschirm ein- und ausgeschaltet ist, und die Weckalarme erfasst werden. So können Sie die CPU-Gesamtauslastung und den Akkuverbrauch messen.
Fehler beheben
Mit Debug können Sie Android-Apps während der Entwicklung prüfen, einschließlich Tracing und Zuordnungsanzahl, um Ruckeln und Verzögerungen in den Apps zu erkennen.
Mit Debug können Sie auch Laufzeit- und native Speicherzähler sowie Speichermesswerte abrufen, mit denen Sie den Speicherbedarf eines bestimmten Prozesses ermitteln können.
ApplicationExitInfo
ApplicationExitInfo ist unter Android 11 (API-Level 30) und höher verfügbar und liefert Informationen zum Grund für das Beenden der Anwendung. Dazu gehören ANRs, wenig Arbeitsspeicher, App-Abstürze, übermäßige CPU-Auslastung, Unterbrechungen durch Nutzer, Systemunterbrechungen und Änderungen der Laufzeitberechtigungen.
Strenger Modus
Mit StrictMode kannst du während der Entwicklung deiner App versehentliche E/A-Vorgänge im Hauptthread finden. Du kannst StrictMode auf Anwendungs- oder Aktivitätsebene verwenden.
ANR-Dialoge im Hintergrund aktivieren
Android zeigt ANR-Dialogfelder für Apps, die zu lange für die Verarbeitung der Broadcast-Nachricht benötigen, nur dann an, wenn in den Entwickleroptionen des Geräts die Option Alle ANRs anzeigen aktiviert ist. Aus diesem Grund werden ANR-Dialogfelder im Hintergrund nicht immer angezeigt, auch wenn bei der App Leistungsprobleme auftreten.
CPU- und System-Traces profilieren
Verwende den Android Studio-CPU-Profiler, um System-Traces und CPU-Aktivitäten aufzuzeichnen, während dein Spiel ausgeführt wird. Wenn du den Hauptthread Activity zusammen mit den Render-, Audio- und Arbeitsthreads deiner Spiel-Engine untersuchst, kannst du lange Frames, synchrone Asset-Ladevorgänge und Thread-Konflikte erkennen, bevor sie einen ANR-Fehler auslösen.
Trace-Datei abrufen
Android speichert Trace-Informationen, wenn ein ANR-Fehler auftritt. Auf älteren Android-Versionen gibt es auf dem Gerät eine einzelne /data/anr/traces.txt-Datei. In höheren Android-Versionen gibt es mehrere /data/anr/anr_*-Dateien. Du kannst über die Android Debug Bridge (ADB) als Root auf ANR-Traces von einem Gerät oder Emulator zugreifen:
adb root
adb shell ls /data/anr
adb pull /data/anr/<filename>
Du kannst einen Fehlerbericht von einem physischen Gerät erstellen, indem du entweder die Entwickleroption „Fehlerbericht abrufen“ auf dem Gerät oder den Befehl adb bugreport auf deinem Entwicklungscomputer verwendest. Weitere Informationen finden Sie unter Fehlerberichte erfassen und lesen.
Probleme beheben
Nachdem Sie das Problem identifiziert haben, können Sie die Tipps in diesem Abschnitt verwenden, um häufig auftretende Probleme zu beheben.
Langsamer Code im Hauptthread
Ermitteln Sie die Stellen im Code, an denen der Hauptthread der App länger als 5 Sekunden beschäftigt ist. Suchen Sie in Ihrem Spiel nach verdächtigen Anwendungsfällen und versuchen Sie, den ANR-Fehler zu reproduzieren.
In Spielen treten Hauptthread-Blockierungen häufig auf, wenn die synchrone Dekomprimierung von Assets, die Shader-Kompilierung oder die Initialisierung des Spielstatus im Android-Hauptthread Activity ausgeführt wird (z. B. in onCreate, onResume oder JNI-Callbacks, die vom UI-Thread aufgerufen werden). Verschiebe die Ausführung der Spielschleife, die Verarbeitung von Assets und die Initialisierung von Szenen in dedizierte Engine-, Render- oder Hintergrund-Arbeitsthreads, damit der Hauptthread für die Verarbeitung von Eingaben und Lifecycle-Events verfügbar bleibt.
E/A im Hauptthread
Das Ausführen von E/A-Vorgängen im Hauptthread ist eine häufige Ursache für langsame Vorgänge im Hauptthread, die zu ANR-Fehlern führen können.
Verschiebe alle Asset-Bundle-Lesevorgänge, die Serialisierung von Spielständen, SharedPreferences-Zugriffe und Netzwerkanfragen vom Haupt-Activity-Thread in Hintergrund-Arbeitsthreads, damit die Speicher- oder Netzwerklatenz die Eingabeverteilung nicht blockieren kann.
Deadlocks
Ein Deadlock tritt auf, wenn ein Thread in einen Wartestatus wechselt, weil eine erforderliche Ressource von einem anderen Thread gehalten wird, der ebenfalls auf eine Ressource wartet, die vom ersten Thread gehalten wird. Wenn sich der Hauptthread der App in dieser Situation befindet, sind ANR-Fehler wahrscheinlich.
In Spielen treten Deadlocks und Sperrkonflikte häufig zwischen dem Android-Hauptthread Activity (der Lebenszyklus-, Oberflächen- oder Eingabe-Callbacks verarbeitet) und nativen C- oder C++-Render-, Logik- oder Audiothreads auf. Vermeide synchrones Warten im Hauptthread auf Sperren der nativen Engine und verwende eine konsistente Sperrreihenfolge oder sperrfreie Nachrichtenwarteschlangen, wenn du über JNI- und Engine-Threads kommunizierst.
Deadlocks sind ein gut erforschtes Phänomen in der Informatik. Es gibt Algorithmen zur Deadlock-Vermeidung, mit denen Sie Deadlocks vermeiden können.
Weitere Informationen finden Sie unter Deadlock und Algorithmen zur Vermeidung von Deadlocks auf Wikipedia.
Langsame Übertragungsempfänger
Apps können mithilfe von Übertragungsempfängern auf Broadcast-Nachrichten reagieren, z. B. auf das Aktivieren oder Deaktivieren des Flugmodus oder auf eine Änderung des Verbindungsstatus. Ein ANR-Fehler tritt auf, wenn eine App zu lange braucht, um die Broadcast-Nachricht zu verarbeiten.
Ein ANR-Fehler tritt in den folgenden Fällen auf:
- Ein Übertragungsempfänger hat die Methode
onReceivenicht innerhalb eines angemessenen Zeitraums ausgeführt. - Ein Übertragungsempfänger ruft
goAsyncauf und kannfinishnicht für dasPendingResult-Objekt aufrufen.
Ihre App sollte in der Methode onReceive eines BroadcastReceiver nur kurze Vorgänge ausführen. Wenn deine App jedoch aufgrund einer Nachricht an alle eine komplexere Verarbeitung erfordert, solltest du die Aufgabe an einen Hintergrund-Arbeitsthread weiterleiten, wenn die Aufgabe voraussichtlich höchstens ein paar Sekunden dauert, oder an WorkManager, wenn die Aufgabe voraussichtlich länger als ein paar Sekunden dauert.
GameActivity
Die Bibliothek GameActivity hat in Fallstudien zu Spielen und Apps, die in C oder C++ geschrieben wurden, die Anzahl der ANRs reduziert. Wenn Sie Ihre vorhandene native Aktivität durch GameActivity ersetzen, können Sie die Blockierung des UI-Threads reduzieren und einige ANRs verhindern.
Wenn Sie Ihr Spiel mit Unity entwickeln, lesen Sie die Hilfeartikel ANRs für Unity-Spiele debuggen, Häufige ANRs bei Unity-Spielen und Android-Abstürze und ANRs für Unity-Spiele symbolisieren.
Weitere Informationen zu ANR-Fehlern finden Sie unter Keep your app responsive (Reaktionsfähigkeit der App beibehalten). Weitere Informationen zu Threads finden Sie unter Bessere Leistung durch Threading.
Empfehlungen für Sie
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Übermäßige Wakeups