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

Integrare i servizi di generazione di report
Servizi di reporting come Android vitals, Firebase Crashlytics e Backtrace (un partner Unity certificato) forniscono la registrazione e l'analisi degli errori per il tuo gioco su larga scala. Integra gli SDK dei servizi di reporting nel tuo gioco all'inizio del ciclo di sviluppo. Analizza quale servizio di reporting si adatta meglio alle esigenze e al budget del tuo gioco.
Servizi di generazione di report diversi hanno modi diversi di acquisire gli errori ANR. Includi un secondo servizio di reporting per aumentare le probabilità di ottenere dati validi per supportare la tua decisione nella correzione degli errori ANR.
L'integrazione degli SDK di reporting non influisce sulle prestazioni del gioco o sulle dimensioni dell'APK.
Analizzare i simboli
Analizza i report del servizio di segnalazione e verifica se le analisi dello stack sono in un formato leggibile. Per saperne di più, consulta Generare file di simboli per arresti anomali e errori ANR di Android per i giochi Unity.

libil2cpp.so
mancanti.Come controllare l'ID build dei simboli
Se il sistema di generazione dei report mostra l'ID build mancante, ma i simboli della build esistono ancora nello spazio di archiviazione della macchina di build, è possibile controllare l'ID build dei simboli e caricarli nel servizio di generazione dei report. In caso contrario, è necessaria una nuova build per caricare i file di simboli.
Su Windows o macOS:
- Vai alla cartella dei simboli in base al backend
di scripting (vedi Risoluzione):
- Utilizza il seguente comando (su Windows, utilizza Cygwin per eseguire
l'utilità
readelf
): - L'utilizzo di Grep è facoltativo per filtrare l'output di testo
- Cercare l'ID build
- Utilizza il seguente comando (su Windows, utilizza Cygwin per eseguire
l'utilità
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95
Ispezionare il codice del gioco
Quando la traccia 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'assembly definito nel progetto Unity.
In caso contrario, il nome del file è quello predefinito di 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'assembly. Logger
è il
nome della classe (evidenziato in rosso) nello script C#, seguito dal
nome della funzione (evidenziato in verde). Infine, il nome completo
generato dal convertitore IL2CPP (evidenziato in arancione).

Controlla il codice del gioco procedendo nel seguente modo:
- Esamina il progetto C# alla ricerca di codice sospetto. In genere, le eccezioni non gestite di C# non causano un errore ANR o un arresto anomalo dell'applicazione. Ciononostante, assicurati che il codice venga eseguito correttamente in diverse situazioni. Controlla se il codice utilizza un modulo del motore di terze parti e analizza se un rilascio recente ha introdotto l'errore. Inoltre, verifica se hai aggiornato di recente Unity 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 gioco, puoi trovare la funzione che causa l'errore ANR. Il codice C++ è molto diverso dal codice C# e la conversione del codice raramente presenta problemi. Se trovi qualcosa, apri un ticket di assistenza per 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 sospendere l'esecuzione; un carico di lavoro eccessivo su questi callback può causare un ANR.
- Aggiungi log o breadcrumb a parti del codice per migliorare l'analisi dei dati.
- Usa Unity Profiler per analizzare le prestazioni del gioco. La profilazione dell'app può anche essere un ottimo modo per identificare i colli di bottiglia che potrebbero causare l'errore ANR.
- Un ottimo modo per identificare le operazioni di I/O lunghe nel thread principale è utilizzare la modalità Strict.
- Analizza la cronologia di Android Vitals o di un altro servizio di reporting e controlla le versioni di rilascio del gioco per cui si verifica maggiormente l'errore. Esamina il codice sorgente nella cronologia del controllo della versione e confronta le modifiche al codice tra le release. Se trovi qualcosa di sospetto, prova ogni modifica o potenziale correzione singolarmente.
- Esamina la cronologia dei report ANR di Google Play per i dispositivi e le versioni di Android che ricevono il maggior numero di errori ANR. Se i dispositivi o le versioni sono obsoleti, probabilmente puoi ignorarli in sicurezza se ciò non influisce sulla redditività del gioco. Studia attentamente i dati, poiché un determinato gruppo di utenti non potrà più giocare al tuo gioco. Per ulteriori informazioni, vedi Dashboard della distribuzione.
- Esamina il codice sorgente del gioco per assicurarti di non chiamare 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 per Android.
- Dopo aver esaminato i dati ed esportato la build del gioco in Android Studio, hai a che fare con codice C e C++, quindi puoi sfruttare appieno strumenti oltre alle soluzioni standard di Unity, come Android Memory Profiler, Android CPU Profiler e perfetto.
Codice del motore Unity
Per sapere se si verifica un errore ANR sul lato del motore Unity, cerca
libUnity.so
o libMain.so
negli stack trace. Se li trovi, segui i
seguenti passaggi:
- Innanzitutto, cerca nei canali della community (forum di Unity, discussioni di Unity, Stack Overflow).
- Se non trovi nulla, segnala un bug per risolvere il problema. Fornisci una traccia dello stack con simboli in modo che gli ingegneri del motore possano comprendere meglio e risolvere l'errore.
- Controlla se l'ultima versione LTS di Unity ha apportato miglioramenti relativi ai tuoi problemi. In questo caso, esegui l'upgrade del gioco per utilizzare questa versione. (Questa soluzione potrebbe essere possibile solo per alcuni sviluppatori.)
- Se il tuo codice utilizza un
Activity
personalizzato anziché quello predefinito, esamina il codice Java per assicurarti che l'attività non causi problemi.
SDK di terze parti
- Verifica che tutte le librerie di terze parti siano aggiornate e non presentino report di arresti anomali o ANR per l'ultima versione di Android.
- Visita i forum di Unity per verificare se 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.
- Esamina 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
Le librerie di sistema di solito sono fuori dal controllo dello sviluppatore, ma non rappresentano una percentuale significativa di ANR. Oltre a contattare lo sviluppatore della libreria o aggiungere log per restringere il problema, gli errori ANR della libreria di sistema sono difficili da risolvere.
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 plug-in personalizzato
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.