ANR-Fehler beheben

Die Behebung von ANR-Fehlern in Ihrem Unity-Spiel ist ein systematischer Prozess:

Abbildung 1. Schritte zur Behebung von ANR-Fehlern in Unity-Spielen

Berichtdienste einbinden

Berichtdienste wie Android Vitals, Firebase Crashlytics und Backtrace (ein zertifizierter Unity Partner) bieten eine umfassende Fehlerprotokollierung und -analyse für Ihr Spiel. Binden Sie die SDKs der Berichtdienste frühzeitig in den Entwicklungszyklus Ihres Spiels ein. Analysieren Sie, welcher Berichtdienst am besten zu den Anforderungen und dem Budget Ihres Spiels passt.

Verschiedene Berichtdienste erfassen ANR-Fehler auf unterschiedliche Weise. Fügen Sie einen zweiten Berichtdienst hinzu, um die Wahrscheinlichkeit zu erhöhen, dass Sie gültige Daten erhalten, die Ihnen bei der Behebung von ANR-Fehlern helfen.

Die Einbindung von Bericht-SDKs hat keine Auswirkungen auf die Spielleistung oder die APK-Größe.

Symbole analysieren

Analysieren Sie die Berichte Ihres Berichtdienstes und prüfen Sie, ob die Stacktraces in einem für Menschen lesbaren Format vorliegen. Weitere Informationen finden Sie unter Android-Abstürze und ANR-Fehler für Unity-Spiele symbolisieren.

Abbildung 2 Crashlytics mit Build-ID und fehlenden libil2cpp.so-Symbolen

Symbol-Build-ID prüfen

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

Unter Windows oder macOS:

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

Spielcode prüfen

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

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

Abbildung 3 Testprojekt-Aufrufstack von Backtrace

So prüfen Sie Ihren Spielcode:

  • Suchen Sie im C#-Projekt nach verdächtigem Code. In der Regel verursachen nicht behandelte C#-Ausnahmen keine ANR-Fehler oder Abstürze der Anwendung. Dennoch sollten Sie prüfen, ob der Code in verschiedenen Situationen ordnungsgemäß ausgeführt wird. Prüfen Sie, ob der Code ein Drittanbieter-Engine-Modul verwendet, und analysieren Sie, ob der Fehler durch eine aktuelle Version eingeführt wurde. Prüfen Sie außerdem, ob Sie Unity kürzlich 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 Ihres Spiels können Sie die Funktion finden, die den ANR-Fehler verursacht. Der C++-Code sieht ganz anders aus als Ihr C#-Code und die Codekonvertierung verursacht selten Probleme. Wenn Sie etwas finden, reichen Sie ein Supportticket bei Unity ein.
  • Prüfen Sie den Quellcode des Spiels und stellen Sie sicher, dass alle Logik, die in den OnApplicationFocus() und OnApplicationPause() Rückrufen ausgeführt wird, ordnungsgemäß bereinigt wird.
    • Die Unity-Engine hat ein Timeout, um die Ausführung zu pausieren. Eine übermäßige Arbeitslast bei diesen Rückrufen kann zu einem ANR-Fehler führen.
    • Fügen Sie Protokolle oder Breadcrumbs zu Teilen des Codes hinzu, um die Datenanalyse zu verbessern.
  • Verwenden Sie den Unity Profiler, um die Leistung des Spiels zu untersuchen. Das Profiling Ihrer App kann auch eine gute Möglichkeit sein, Engpässe zu identifizieren, die möglicherweise den ANR-Fehler verursachen.
  • Eine gute Möglichkeit, lange E/A-Vorgänge im Hauptthread zu identifizieren, ist die Verwendung des strikten Modus.
  • Analysieren Sie den Verlauf von Android Vitals oder eines anderen Berichtdienstes und prüfen Sie die Releaseversionen des Spiels, bei denen der Fehler am häufigsten auftritt. Prüfen Sie den Quellcode in Ihrem Versionsverwaltungsverlauf und vergleichen Sie die Codeänderungen zwischen den Releases. Wenn Sie etwas Verdächtiges finden, testen Sie jede Änderung oder potenzielle Lösung einzeln.
  • Prüfen Sie den Google Play-Berichtsverlauf für ANR-Fehler für die Geräte und Android-Versionen, bei denen die meisten ANR-Fehler auftreten. Wenn die Geräte oder Versionen veraltet sind, können Sie sie wahrscheinlich ignorieren, wenn dies keine Auswirkungen auf die Rentabilität des Spiels hat. Analysieren Sie die Daten sorgfältig, da eine bestimmte Gruppe von Nutzern Ihr Spiel dann nicht mehr spielen kann. Weitere Informationen finden Sie im Dashboard „Verteilung“.
  • Prüfen Sie den Quellcode des Spiels und stellen Sie sicher, dass Sie keinen Code aufrufen, der Probleme verursachen könnte. Beispielsweise kann „finish“ destruktiv sein, wenn es nicht richtig verwendet wird. Weitere Informationen zur Android-Entwicklung finden Sie in den Android-Entwicklerleitfäden.
  • Nachdem Sie die Daten geprüft und den Spiel-Build in Android Studio exportiert haben, arbeiten Sie mit C- und C++-Code. Sie können also Tools nutzen, die über die Standardlösungen von Unity hinausgehen, z. B. Android Speicher-Profiler, Android CPU-Profiler und Perfetto.

Unity-Engine-Code

Wenn Sie wissen möchten, ob ein ANR-Fehler auf der Unity-Engine-Seite 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-Foren, Unity Diskussionen, Stackoverflow).
  • Wenn Sie nichts finden, reichen Sie einen Fehlerbericht ein, um das Problem zu beheben. Geben Sie einen symbolisierten Stacktrace an, damit die Engine-Entwickler den Fehler besser verstehen und beheben können.
  • Prüfen Sie, ob die neueste Unity LTS Verbesserungen in Bezug auf Ihre Probleme enthält. Wenn ja, aktualisieren Sie Ihr Spiel auf diese Version. Diese Lösung ist möglicherweise nur für einige Entwickler möglich.
  • Wenn Ihr Code anstelle der Standardaktivität eine benutzerdefinierte Activity verwendet, prüfen Sie den Java-Code, um sicherzustellen, dass die Aktivität keine Probleme verursacht.

Drittanbieter-SDK

  • Prüfen Sie, ob alle Drittanbieterbibliotheken auf dem neuesten Stand sind und ob es für die neueste Android-Version keine Berichte zu Abstürzen oder ANR-Fehlern gibt.
  • In den Unity-Foren können Sie nachsehen, ob Fehler bereits in einer späteren Version behoben wurden oder ob Unity oder ein Community-Mitglied eine Problemumgehung bereitgestellt hat.
  • Prüfen Sie den Google Play-ANR-Bericht und stellen Sie sicher, dass der Fehler nicht bereits von Google identifiziert wurde. Google sind einige ANR-Fehler bekannt und wir arbeiten aktiv an der Behebung.

Systembibliothek

Systembibliotheken liegen in der Regel außerhalb der Kontrolle des Entwicklers, machen aber keinen erheblichen Prozentsatz der ANR-Fehler aus. Abgesehen davon, dass Sie sich an den Entwickler der Bibliothek wenden oder Protokolle hinzufügen, um das Problem einzugrenzen, sind ANR-Fehler in Systembibliotheken schwer zu beheben.

Gründe für das Beenden

ApplicationExitInfo ist eine Android API, mit der Sie die Ursachen von ANR-Fehlern nachvollziehen können. Wenn Ihr Spiel Unity 6 oder höher verwendet, können Sie ApplicationExitInfo direkt aufrufen. Bei älteren Unity-Versionen müssen Sie ein eigenes Plug-in implementieren, um ApplicationExitInfo-Aufrufe von Unity aus zu ermöglichen.

Crashlytics verwendet auch ApplicationExitInfo. Ihre eigene Implementierung bietet Ihnen jedoch mehr Kontrolle und ermöglicht es Ihnen, relevantere Informationen einzubeziehen.