La risoluzione degli ANR nel tuo gioco Unity è un processo sistematico:
Integrare i servizi di reporting
I servizi di reporting come Android vitals, Firebase Crashlytics e Backtrace (un partner certificato di Unity ) 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 nelle prime fasi del ciclo di sviluppo. Analizza quale servizio di reporting si adatta meglio alle esigenze e al budget del tuo gioco.
I diversi servizi di reporting hanno modi diversi di acquisire gli ANR. Includi un secondo servizio di reporting per aumentare la probabilità di ottenere dati validi a supporto della tua decisione di correggere gli 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 reporting e controlla se le analisi dello stack sono in formato leggibile. Per ulteriori informazioni, consulta la sezione Simbolizzare gli arresti anomali e gli ANR di Android per i giochi Unity.
libil2cpp.so mancanti.Come controllare l'ID build dei simboli
Se il sistema di reporting 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 caricarli nel servizio di reporting. In caso contrario, è necessaria una nuova build per caricare i file dei simboli.
Su Windows o macOS:
- Vai alla cartella dei simboli in base al tuo scripting
backend (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
Esaminare il codice del 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'assembly 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'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).
Esamina il codice del gioco procedendo nel seguente modo:
- Esamina il progetto C# per individuare eventuali codici sospetti. In genere, le eccezioni non gestite di C# non causano un ANR o un arresto anomalo dell'applicazione. Anche in questo caso, 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 una release 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'ANR. Il codice C++ è molto diverso dal codice C# e la conversione del codice raramente presenta problemi. Se trovi qualcosa, invia un ticket di assistenza a Unity.
- Esamina il codice sorgente del gioco e assicurati che la logica in esecuzione nei
callback OnApplicationFocus() e OnApplicationPause()
venga pulita correttamente.
- 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 a 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'ANR.
- Un ottimo modo per identificare le operazioni di I/O lunghe sul thread principale è utilizzare la modalità StrictMode.
- Analizza la cronologia di Android vitals o di un altro servizio di reporting e controlla le versioni di release del gioco per le quali l'errore si verifica più spesso. Esamina il codice sorgente nella cronologia del controllo della versione e confronta le modifiche del 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 ANR. Se i dispositivi o le versioni sono obsoleti, è probabile che tu possa ignorarli in sicurezza se non influiscono sulla redditività del gioco. Studia attentamente i dati, poiché un determinato gruppo di utenti non potrà più giocare. Per ulteriori informazioni, consulta la sezione Dashboard di 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. Per saperne di più sullo sviluppo per Android, consulta le guide per gli sviluppatori 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 alle soluzioni standard di Unity, come Android Memory Profiler, Android CPU Profiler e perfetto.
Codice del motore Unity
Per sapere se si verifica un ANR sul lato del motore Unity, cerca libUnity.so o libMain.so nelle analisi dello stack. Se li trovi, segui questi passaggi:
- Innanzitutto, cerca i canali della community (forum di Unity, discussioni di Unity, Stackoverflow).
- Se non trovi nulla, invia 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 l'ultima versione Unity LTS ha apportato miglioramenti relativi ai tuoi problemi. In caso affermativo, esegui l'upgrade del gioco per utilizzare quella versione. (Questa soluzione potrebbe essere possibile solo per alcuni sviluppatori.)
- Se il codice utilizza un
Activitypersonalizzato 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 abbiano report di arresti anomali o ANR per l'ultima versione di Android.
- Vai ai forum di Unity per vedere se eventuali errori sono già stati risolti in una versione successiva o se Unity o un membro della community ha fornito una soluzione alternativa.
- Esamina il report ANR di Google Play e assicurati che l'errore non sia già stato identificato da Google. Google è a conoscenza di alcuni ANR e sta lavorando attivamente per risolverli.
Libreria di sistema
In genere, le librerie di sistema sono fuori dal 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 della libreria di sistema sono difficili da risolvere.
Motivi di uscita
ApplicationExitInfo è un'API Android per comprendere le cause degli ANR.
Se il tuo gioco utilizza Unity 6 o versioni successive, puoi chiamare ApplicationExitInfo
direttamente. 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.