ANR-Fehler beheben

Das Lösen von ANRs in deinem Unity-Spiel ist ein systematischer Prozess:

Abbildung 1: Schritte zum Beheben von ANR-Fehlern in Unity-Spielen.

Berichterstellungsdienste einbinden

Berichtsdienste wie Android Vitals, Firebase Crashlytics und Backtrace (ein zertifizierter Unity-Partner) ermöglichen die Fehlerprotokollierung und -analyse für Ihr Spiel in großem Umfang. Binden Sie SDKs für Berichtsdienste frühzeitig in Ihr Spiel ein. Analysieren Sie, welcher Berichtsdienst am besten zu Ihren Spielanforderungen und Ihrem Budget passt.

Je nach Berichtsdienst werden ANR-Fehler auf unterschiedliche Weise erfasst. Fügen Sie einen zweiten Berichtsdienst hinzu, um die Chance zu erhöhen, gültige Daten zu erhalten, die Ihre Entscheidung zur Behebung von ANR-Fehlern unterstützen.

Die Integration von SDKs für die Berichterstellung hat keinen Einfluss auf die Spielleistung oder die APK-Größe.

Symbole analysieren

Analysieren Sie die Berichte Ihres Berichtsdienstes und prüfen Sie, ob die Stacktraces menschenlesbar sind. Weitere Informationen finden Sie unter Symbolication von Android-Abstürzen und ANR-Fehlern für Unity-Spiele.

Abbildung 2: Crashlytics zeigt die Build-ID und fehlende libil2cpp.so-Symbole.

Symbol-Build-ID prüfen

Wenn das Berichtssystem die fehlende Build-ID anzeigt, die Build-Symbole aber noch im Speicher der Build-Maschine vorhanden sind, können Sie die Build-ID der Symbole überprüfen und sie dann in den Berichtsdienst hochladen. Andernfalls ist ein neuer Build erforderlich, um die Symboldateien hochzuladen.

Unter Windows oder macOS:

  1. Rufen Sie basierend auf Ihrem Script-Back-End den Symbolordner auf (siehe Lösung):
    1. Verwenden Sie den folgenden Befehl (unter Windows Cygwin, um das Dienstprogramm readelf auszuführen)
    2. Die Verwendung von grep ist optional, um die Textausgabe zu filtern
    3. Build-ID suchen
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95

Spielcode prüfen

Wenn der Stacktrace eine Funktion in der libil2cpp.so-Bibliothek anzeigt, ist der Fehler im C#-Code aufgetreten, der in C++ konvertiert wurde. Die libil2cpp.so-Bibliothek enthält nicht nur deinen Spielcode, sondern auch Plug-ins und Pakete.

Der C++-Dateiname folgt dem Assembly-Namen, der im Unity-Projekt definiert wurde. Andernfalls hat der Dateiname den standardmäßigen Assembly-C#-Namen. Abbildung 3 zeigt beispielsweise den Fehler in der Datei Game.cpp (blau hervorgehoben). Dies ist der Name, der in der Assembly-Definitionsdatei definiert ist. Logger ist der Klassenname (rot hervorgehoben) im C#-Skript, gefolgt vom Funktionsnamen (grün markiert). Schließlich ist der vollständige Name, den der IL2CPP-Konverter generiert hat (orange hervorgehoben).

Abbildung 3: Testen Sie den Projektaufruf-Stack aus Backtrace.

So prüfen Sie Ihren Spielcode:

  • Prüfen Sie das C#-Projekt auf verdächtigen Code. In der Regel verursachen unbehandelte C#-Ausnahmen keinen ANR-Fehler oder Anwendungsabsturz. Stellen Sie dennoch sicher, dass der Code in verschiedenen Situationen ordnungsgemäß ausgeführt wird. Prüfen Sie, ob im Code das Engine-Modul eines Drittanbieters verwendet wird und ob der Fehler durch einen neuen Release verursacht wurde. Prüfen Sie außerdem, ob Sie Unity vor Kurzem aktualisiert haben oder ob der Fehler nur auf bestimmten Geräten auftritt.
  • Exportieren Sie das Spiel als Android Studio-Projekt. Mit vollständigem Zugriff auf den konvertierten C#-Quellcode des Spiels können Sie die Funktion finden, die den ANR-Fehler verursacht. Der C++-Code unterscheidet sich stark von Ihrem C#-Code und bei der Codekonvertierung treten selten Probleme auf. Wenn Sie etwas finden, reichen Sie ein Support-Ticket bei Unity ein.
  • Prüfen Sie den Quellcode des Spiels und sorgen Sie dafür, dass die in den OnApplicationFocus()- und OnApplicationPause()-Callbacks ausgeführte Logik ordnungsgemäß bereinigt wurde.
    • Die Unity-Engine hat ein Zeitlimit, um ihre Ausführung anzuhalten. Eine übermäßige Arbeitslast durch diese Callbacks kann einen ANR-Fehler verursachen.
    • Fügen Sie Teilen des Codes Logs oder Breadcrumbs hinzu, um Ihre Datenanalyse zu verbessern.
  • Untersuchen Sie die Leistung des Spiels mit dem Unity Profiler. Das Erstellen von App-Profilen ist auch eine gute Möglichkeit, Engpässe zu identifizieren, die zum ANR-Fehler führen können.
  • Mit dem strengen Modus lassen sich lange E/A-Vorgänge im Hauptthread leicht identifizieren.
  • Analysieren Sie den Verlauf von Android Vitals oder einem anderen Berichtsdienst und prüfen Sie die Release-Versionen des Spiels, bei denen der Fehler am häufigsten auftritt. Prüfen Sie Ihren Quellcode im Verlauf der Versionsverwaltung und vergleichen Sie die Codeänderungen zwischen Releases. Wenn Sie etwas Verdächtiges finden, experimentieren Sie mit jeder Änderung oder möglichen Korrektur einzeln.
  • Sehen Sie sich den Google Play-ANR-Berichtsverlauf für die Geräte und Android-Versionen an, die die meisten ANR-Fehler erhalten. Wenn die Geräte oder Versionen veraltet sind, können Sie sie möglicherweise ignorieren, wenn dies die Rentabilität des Spiels nicht beeinträchtigt. Untersuchen Sie die Daten sorgfältig, da eine bestimmte Gruppe von Nutzern Ihr Spiel nicht mehr spielen kann. Weitere Informationen finden Sie im Vertriebs-Dashboard.
  • Prüfen Sie den Quellcode des Spiels, um sicherzustellen, dass Sie keinen Code aufrufen, der ein Problem verursachen könnte. Bei unsachgemäßer Verwendung kann beispielsweise Finish destruktiv sein. Weitere Informationen zur Android-Entwicklung finden Sie in den Android-Entwicklerleitfäden.
  • Nachdem Sie die Daten überprüft und den Spiel-Build nach Android Studio exportiert haben, haben Sie es mit C- und C++-Code zu tun. So können Sie Tools, die über die Standardlösungen von Unity hinausgehen, in vollem Umfang nutzen, z. B. Android Memory Profiler, Android CPU Profiler und Perfetto.

Unity-Engine-Code

Wenn Sie wissen möchten, ob auf der Unity-Engine ein ANR-Fehler auftritt, suchen Sie in den Stacktraces nach libUnity.so oder libMain.so. Wenn Sie sie finden, führen Sie die folgenden Schritte aus:

  • Suchen Sie zuerst in den Community-Kanälen (Unity Forums, Unity Discussions, Stackoverflow).
  • Wenn Sie nichts finden, melden Sie den Fehler, um das Problem zu beheben. Stellen Sie einen symbolisch dargestellten Stacktrace bereit, damit die Entwickler der Engine den Fehler besser verstehen und beheben können.
  • Prüfen Sie, ob durch die aktuelle Version von Unity LTS Ihre Probleme verbessert wurden. Falls ja, aktualisiere dein Spiel, um diese Version zu nutzen. (Diese Lösung ist möglicherweise nur für einige Entwickler möglich.)
  • Wenn in Ihrem Code ein benutzerdefiniertes Activity anstelle des Standardwerts verwendet wird, prüfen Sie den Java-Code, um sicherzustellen, dass die Aktivität keine Probleme verursacht.

Drittanbieter-SDK

  • Achte darauf, dass alle Bibliotheken von Drittanbietern auf dem neuesten Stand sind und für die neueste Android-Version keine Berichte zu Abstürzen oder ANR-Fehlern vorliegen.
  • In den Unity-Foren können Sie nachsehen, ob Fehler bereits in einer späteren Version behoben wurden oder ob von Unity oder einem Community-Mitglied eine Problemumgehung bereitgestellt wurde.
  • Prüfen Sie den Google Play-ANR-Bericht und vergewissern Sie sich, dass der Fehler nicht bereits von Google identifiziert wurde. Google ist über einige ANR-Fehler informiert und arbeitet aktiv daran, sie zu beheben.

Systembibliothek

Der Entwickler hat normalerweise keine Kontrolle über Systembibliotheken, sie bilden jedoch nur einen geringen Prozentsatz von ANR-Fehlern. Neben der Kontaktaufnahme mit dem Bibliotheksentwickler oder dem Hinzufügen von Logs zur Eingrenzung des Problems sind ANR-Fehler von Systembibliotheken schwer zu beheben.

Gründe für den Exit

ApplicationExitInfo ist eine Android API zum Verständnis von ANR-Ursachen. Wenn in Ihrem Spiel Unity 6 oder höher verwendet wird, können Sie ApplicationExitInfo direkt aufrufen. Bei älteren Unity-Versionen müssen Sie ein eigenes Plug-in implementieren, um ApplicationExitInfo-Aufrufe von Unity zu ermöglichen.

Crashlytics verwendet auch ApplicationExitInfo. Ihre eigene Implementierung ermöglicht Ihnen jedoch eine genauere Kontrolle und ermöglicht es Ihnen, relevantere Informationen anzugeben.