La risoluzione degli ANR nel tuo gioco Unity è un processo sistematico:
Integrare i servizi di generazione di report
Servizi di generazione di report come Android vitals, Firebase Crashlytics e Backtrace (un partner di Unity certificato) forniscono la registrazione e l'analisi degli errori per il tuo gioco su larga scala. Integra gli SDK dei servizi di generazione di report nel tuo gioco all'inizio del ciclo di sviluppo. Analizza il servizio di generazione di report più adatto alle esigenze e al budget del tuo gioco.
I vari servizi di generazione di report 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 di correggere gli ANR.
L'integrazione degli SDK di reporting non influisce sul rendimento del gioco o sulle dimensioni dell'APK.
Analizza i simboli
Analizza i report del tuo servizio di generazione di report e controlla se le tracce dello stack sono in un formato leggibile. Per ulteriori informazioni, consulta la pagina Arresti anomali di Android simbolicati e ANR per i giochi Unity.
Come controllare l'ID build del simbolo
Se il sistema di generazione di report mostra l'ID build mancante, ma i simboli di build esistono ancora nello spazio di archiviazione della macchina di build, è possibile controllare l'ID build dei simboli e poi caricarli nel servizio di generazione di report. Altrimenti, per caricare i file di simboli è necessaria una nuova build.
Su Windows o macOS:
- Vai alla cartella dei simboli in base al tuo backend 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
- Cerca 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
non contiene 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 avrà 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'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 nel seguente modo:
- Esamina il progetto C# per rilevare eventuali codici sospetti. In genere, le eccezioni C# non gestite non causano un ANR o un arresto anomalo dell'applicazione. Tuttavia, assicurati che il codice funzioni correttamente in situazioni diverse. Controlla se il codice utilizza un modulo dell'engine di terze parti e analizza se un'uscita recente ha introdotto l'errore. Inoltre, controlla 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 tuo gioco, puoi trovare la funzione che causa l'ANR. Il codice C++ è molto diverso dal codice C# e la conversione del codice raramente presenta un problema. Se ne trovi, apri un ticket di assistenza per Unity.
- Esamina il codice sorgente del gioco e assicurati che qualsiasi logica in esecuzione nelle chiamate di callback OnApplicationFocus() e OnApplicationPause() sia ripulita in modo appropriato.
- Il motore Unity ha un timeout per mettere in pausa l'esecuzione. Un carico di lavoro eccessivo su questi callback può causare un ANR.
- Aggiungi log o breadcrumb alle parti del codice per migliorare l'analisi dei dati.
- Utilizza Unity Profiler per esaminare 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 operazioni di I/O lunghe nel thread principale è utilizzare la modalità rigorosa.
- Analizza la cronologia di Android Vitals o di un altro servizio di generazione di report e controlla le versioni rilasciate del gioco per cui si verifica più spesso l'errore. Esamina il codice sorgente nella cronologia del controllo della versione e confronta le modifiche al codice tra le release. Se rilevi 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 Android che ricevono più ANR. Se i dispositivi o le versioni sono obsoleti, è probabile che tu possa ignorarli tranquillamente se ciò non influisce sulla profittabilità del gioco. Esamina attentamente i dati, dato che un determinato gruppo di utenti non potrà più giocare al tuo gioco. Per ulteriori informazioni, consulta la dashboard Distribuzione.
- Esamina il codice sorgente del gioco per assicurarti di non chiamare alcun codice che potrebbe causare un problema. Ad esempio, finish può risultare dannoso se non viene 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 gli strumenti oltre le 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, controlla se è presente libUnity.so
o libMain.so
nelle analisi dello stack. Se li trovi, svolgi i seguenti passaggi:
- Innanzitutto, cerca i canali della community (Forum Unity, Discussioni su Unity, Stackoverflow).
- Se non trovi nulla, segnala un bug per risolvere il problema. Fornisci una traccia dello stack simbolica in modo che gli ingegneri del motore possano comprendere e risolvere meglio l'errore.
- Controlla se la versione LTS di Unity più recente 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 codice utilizza un elemento
Activity
personalizzato anziché quello predefinito, rivedi 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 che non abbiano report di arresti anomali o ANR per l'ultima versione di Android.
- Visita i forum di Unity per scoprire se gli errori sono stati già 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 stato già identificato da Google. Google è a conoscenza di alcuni errori ANR e si sta adoperando attivamente per risolverli.
Libreria di sistema
Le librerie di sistema di solito non sono sotto il controllo dello sviluppatore, ma non rappresentano una percentuale significativa di ANR. Oltre a contattare lo sviluppatore della libreria o ad aggiungere log per restringere il problema, gli ANR delle librerie di sistema sono difficili da risolvere.
Motivi dell'uscita
ApplicationExitInfo
è un'API Android per comprendere le cause degli ANR.
Se il tuo gioco utilizza Unity 6 o versioni successive, puoi chiamare direttamente ApplicationExitInfo
. Per le versioni precedenti di Unity, devi implementare il tuo plug-in
per abilitare le chiamate ApplicationExitInfo
da Unity.
Anche Crashlytics utilizza ApplicationExitInfo
; tuttavia, la tua implementazione ti offre un controllo più preciso e ti consente di includere informazioni più pertinenti.