Debug degli errori ANR

La risoluzione degli ANR nel tuo gioco Unity è un processo sistematico:

Figura 1. Passaggi per risolvere gli errori ANR nei giochi Unity.

Integrare i servizi di reporting

Servizi di generazione di report come Android vitals, Firebase Crashlytics e Backtrace (un partner Unity certificato) forniscono il logging e l'analisi degli errori relativi al tuo gioco su larga scala. Integra gli SDK per i servizi di reporting nel tuo gioco all'inizio del ciclo di sviluppo. Analizza il servizio di reporting più adatto alle tue esigenze e al tuo budget.

I diversi servizi di segnalazione hanno modi diversi per acquisire gli errori ANR. Includi un secondo servizio di generazione di report per aumentare le probabilità di ottenere dati validi per supportare la tua decisione sulla correzione degli errori ANR.

L'integrazione degli SDK per i report non influisce sulle prestazioni dei giochi o sulle dimensioni degli APK.

Analizzare i simboli

Analizza i report del servizio di reporting e verifica se le analisi dello stack sono in formato leggibile. Per maggiori informazioni, consulta la sezione Simboli di arresti anomali e ANR di Android per i giochi Unity.

Figura 2. Crashlytics che mostra l'ID build e i simboli libil2cpp.so mancanti.

Come controllare l'ID build del simbolo

Se il sistema di reporting mostra l'ID build mancante, ma i simboli di build continuano a essere presenti nell'archiviazione della macchina di build, puoi controllare l'ID build dei simboli e caricarli nel servizio di reporting. In caso contrario, è necessaria una nuova build per caricare i file di simboli.

Su Windows o macOS:

  1. Vai alla cartella dei simboli in base al tuo backend di script (vedi Risoluzione:)
    1. Usa il comando seguente (su Windows, usa Cygwin per eseguire l'utilità readelf)
    2. L'utilizzo di Grep è facoltativo per filtrare l'output di testo
    3. Cerca l'ID build
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95

Ispeziona il codice di gioco

Quando l'analisi dello stack mostra una funzione nella libreria libil2cpp.so, l'errore si è verificato nel codice C#, che viene convertito in C++. La libreria libil2cpp.so contiene non solo il codice del gioco, ma anche plug-in e pacchetti.

Il nome del file C++ segue il nome dell'assemblaggio definito nel progetto Unity. In caso contrario, il nome del file ha il nome predefinito Assembly-C#. Ad esempio, la figura 3 mostra l'errore nel file Game.cpp (evidenziato in blu), che è il nome definito nel file di definizione dell'assemblaggio. Logger è il nome della classe (evidenziato in rosso) nello script C#, seguito dal nome della funzione (evidenziata in verde). Infine è indicato il nome completo generato dal convertitore IL2CPP (evidenziato in arancione).

Figura 3. Testa lo stack di chiamate del progetto da Backtrace.

Controlla il codice del gioco procedendo nel seguente modo:

  • Esamina il progetto C# per individuare eventuale codice sospetto. Di solito, le eccezioni C# non gestite non causano un errore ANR o un arresto anomalo dell'applicazione. Tuttavia, assicurati che il codice venga eseguito correttamente in situazioni diverse. Controlla se il codice utilizza un modulo del motore di terze parti e verifica se l'errore è stato introdotto da una release recente. Inoltre, controlla se hai aggiornato Unity di recente o se l'errore si verifica solo su dispositivi specifici.
  • Esporta il gioco come progetto Android Studio. Con l'accesso completo al codice sorgente C# convertito del tuo gioco, puoi trovare la funzione che causa l'errore ANR. Il codice C++ ha un aspetto molto diverso dal codice C# e raramente si verificano problemi di conversione del codice. Se trovi qualcosa, apri un ticket di assistenza a Unity.
  • Esamina il codice sorgente del gioco e assicurati che qualsiasi logica in esecuzione nei callback OnApplicationFocus() e OnApplicationPause() venga pulita in modo appropriato.
    • Il motore Unity ha un timeout per mettere in pausa l'esecuzione; un carico di lavoro eccessivo per questi callback può causare un errore ANR.
    • Aggiungi log o breadcrumb a parti di codice per migliorare l'analisi dei dati.
  • Utilizza Unity Profiler per analizzare le prestazioni del gioco. La profilazione della tua app può anche essere un ottimo modo per identificare i colli di bottiglia che potrebbero causare l'errore ANR.
  • Un ottimo modo per identificare lunghe operazioni di I/O nel thread principale è utilizzare la modalità rigida.
  • Analizzare la cronologia di Android vitals o di un altro servizio di reporting e controllare le versioni di release del gioco per cui l'errore si verifica maggiormente. Esamina il codice sorgente nella cronologia del controllo della versione e confronta le modifiche al codice tra le release. Se noti qualcosa di sospetto, sperimenta ogni modifica o potenziale correzione singolarmente.
  • Esamina la cronologia delle segnalazioni ANR di Google Play per i dispositivi e le versioni Android che ricevono il maggior numero di errori ANR. Se i dispositivi o le versioni sono obsoleti, puoi tranquillamente ignorarli se ciò non influisce sulla redditività del gioco. Studia attentamente i dati perché un determinato gruppo di utenti non sarà più in grado di giocare al tuo gioco. Per ulteriori informazioni, consulta la sezione Dashboard di distribuzione.
  • Esamina il codice sorgente del gioco per assicurarti di non chiamare alcun codice che potrebbe causare un problema. Ad esempio, finish può essere distruttivo se non utilizzato correttamente. Consulta le guide per gli sviluppatori Android per scoprire di più sullo sviluppo Android.
  • Dopo aver esaminato i dati ed aver esportato la build del gioco in Android Studio, hai a che fare con il codice C e C++ e quindi puoi sfruttare appieno strumenti che vanno oltre le soluzioni standard di Unity, come Android Memory Profiler, Android CPU Profiler e perfetto.

Codice motore Unity

Per sapere se si verifica un errore ANR sul lato motore Unity, verifica la presenza di libUnity.so o libMain.so nelle analisi dello stack. Se le trovi, procedi nel seguente modo:

  • Per prima cosa, cerca nei canali della community (Forum Unity, Discussioni Unity, Stackoverflow).
  • Se non trovi nulla, segnala un bug per risolvere il problema. Fornisci un'analisi dello stack simbolizzata in modo che gli ingegneri del motore possano comprendere e risolvere meglio l'errore.
  • Controlla se la versione più recente di Unity LTS ha apportato miglioramenti relativi ai tuoi problemi. In tal caso, esegui l'upgrade del gioco per utilizzare quella versione. Questa soluzione potrebbe essere possibile solo per alcuni sviluppatori.
  • Se il tuo codice utilizza un elemento Activity personalizzato anziché quello predefinito, esamina il codice Java per assicurarti che l'attività non causi problemi.

SDK di terze parti

  • Controlla che tutte le librerie di terze parti siano aggiornate e non abbiano report di arresti anomali o ANR per la versione più recente di Android.
  • Vai ai forum Unity per verificare se gli eventuali errori sono già stati risolti in una versione successiva o se è stata fornita una soluzione alternativa da Unity o da un membro della community.
  • Consulta il report ANR di Google Play e assicurati che l'errore non sia già stato identificato da Google. Google è a conoscenza di alcuni errori ANR e sta lavorando attivamente per risolverli.

Libreria di sistema

In genere le librerie di sistema sono lontane dal controllo dello sviluppatore, ma non rappresentano una percentuale significativa di errori ANR. Oltre a contattare lo sviluppatore della libreria o aggiungere log per restringere il problema, è difficile risolvere gli errori ANR delle librerie di sistema.

Motivi di uscita

ApplicationExitInfo è un'API Android per comprendere le cause degli errori ANR. Se il tuo gioco utilizza Unity 6 o versioni successive, puoi chiamare ApplicationExitInfo direttamente. Per le versioni precedenti di Unity, devi implementare un tuo plug-in per abilitare le chiamate ApplicationExitInfo da Unity.

Crashlytics utilizza anche ApplicationExitInfo; tuttavia, la tua implementazione ti offre un controllo più preciso e ti consente di includere informazioni più pertinenti.