Quando il thread dell'interfaccia utente di un'app per Android viene bloccato per troppo tempo, viene attivato un errore "L'applicazione non risponde" (ANR). Android vitals monitora e segnala le metriche ANR in Google Play Console per aiutarti a monitorare la stabilità e la reattività della tua app su tutti i dispositivi.
Metriche e soglie di Android vitals
Android vitals può aiutarti a monitorare e migliorare la percentuale di ANR della tua app. Android vitals misura diverse percentuali di ANR:
- Percentuale di ANR:la percentuale di utenti attivi giornalieri che hanno riscontrato qualsiasi tipo di ANR.
- Percentuale di ANR percepiti dagli utenti:la percentuale di utenti attivi giornalieri che hanno riscontrato almeno un errore ANR percepito dall'utente. Al momento, solo gli ANR di tipo
Input dispatching timed outsono considerati percepiti dall'utente. - Percentuale di ANR multipli:la percentuale di utenti attivi giornalieri che hanno riscontrato almeno due errori ANR.
Un utente attivo giornaliero è un utente unico che utilizza la tua app in un singolo giorno su un singolo dispositivo, potenzialmente in più sessioni. Se un utente utilizza la tua app su più dispositivi in un solo giorno, ogni dispositivo contribuirà al numero di utenti attivi per quel giorno.
La percentuale di ANR percepiti dagli utenti è una metrica vitals essenziale, ovvero influisce sulla rilevabilità della tua app su Google Play. È importante perché gli errori ANR che conta si verificano sempre quando gli utenti interagiscono con l'app, causando così il maggior numero di interruzioni.
Play ha definito due soglie relative alle prestazioni scadenti per questa metrica:
- Soglia relativa alle prestazioni scadenti generali:almeno lo 0, 47% degli utenti attivi giornalieri ha riscontrato un errore ANR percepito dall'utente su tutti i modelli di dispositivi.
- Soglia relativa alle prestazioni scadenti del dispositivo:almeno l'8% degli utenti giornalieri ha riscontrato un errore ANR percepito dall'utente, su un singolo modello di dispositivo.
Se la tua app supera la soglia relativa alle prestazioni scadenti complessiva, è probabile che sia meno rilevabile su tutti i dispositivi. Se la tua app supera la soglia relativa alle prestazioni scadenti per dispositivo su alcuni dispositivi, è probabile che sia meno rilevabile su questi dispositivi e potrebbe essere mostrato un avviso nella tua scheda dello Store.
Android vitals può avvisarti tramite Play Console quando la tua app mostra un numero eccessivo di errori ANR.
Per informazioni su come Google Play raccoglie i dati di Android vitals, consulta la documentazione di Play Console.
Rileva il problema
Se l'app è in primo piano quando si verifica un ANR, il sistema mostra una finestra di dialogo all'utente, come mostrato nella figura 1. La finestra di dialogo ANR offre all'utente la possibilità di forzare l'uscita dall'app.
Gli errori ANR sono un problema perché il thread principale dell'app, responsabile dell'aggiornamento della UI, non può elaborare gli eventi di input dell'utente o disegnare, causando frustrazione nell'utente. Per saperne di più sul thread principale dell'app, consulta la panoramica di processi e thread.
Un errore ANR viene attivato per la tua app quando si verifica una delle seguenti condizioni:
- Timeout dell'invio dell'input: se la tua app non ha risposto a un evento di input (ad esempio la pressione di un tasto o il tocco dello schermo) entro 5 secondi.
- Esecuzione del servizio: se un servizio dichiarato dalla tua app non riesce a completare l'esecuzione di
Service.onCreateeService.onStartCommandoService.onBindentro pochi secondi. Service.startForegroundnon chiamato:se la tua app utilizzaContext.startForegroundServiceper avviare un nuovo servizio in primo piano, ma il servizio non chiamastartForegroundentro 5 secondi.- Trasmissione dell'intent: se un
BroadcastReceivernon ha terminato l'esecuzione entro un determinato periodo di tempo. Se l'app ha attività in primo piano, questo timeout è di 10 secondi. - Interazioni con
JobScheduler: se unJobServicenon restituisce un risultato daJobService.onStartJoboJobService.onStopJobentro pochi secondi o se un job avviato dall'utente viene avviato e la tua app non chiamaJobService.setNotificationentro pochi secondi dalla chiamata diJobService.onStartJob. Per le app che hanno come target Android 13 e versioni precedenti, gli ANR sono silenziosi e non vengono segnalati all'app. Per le app che hanno come target Android 14 e versioni successive, gli ANR sono espliciti e vengono segnalati all'app.
Oltre ad Android vitals, puoi utilizzare altri strumenti per rilevare gli ANR sul campo, anche se gli strumenti di terze parti non possono segnalare gli ANR su Android 10 (livello API 29) e versioni precedenti.
Diagnostica gli ANR
Esistono alcuni pattern comuni da cercare quando si diagnosticano gli ANR:
- L'app esegue operazioni lente che coinvolgono l'I/O sul thread principale.
- L'app sta eseguendo un calcolo lungo sul thread principale.
- Il thread principale sta eseguendo una chiamata a Binder sincrona a un altro processo e quest'ultimo impiega molto tempo per restituire il risultato.
- Il thread principale è bloccato in attesa di un blocco sincronizzato per un'operazione lunga che si sta verificando su un altro thread.
- Il thread principale è in un deadlock con un altro thread, nel tuo processo o tramite una chiamata binder. Il thread principale non è solo in attesa del completamento di un'operazione lunga, ma si trova in una situazione di deadlock.
Le seguenti tecniche possono aiutarti a determinare la causa degli ANR.
HealthStats
HealthStats fornisce metriche sull'integrità di un'applicazione acquisendo il tempo totale dell'utente e del sistema, il tempo di CPU, la rete, le statistiche radio, il tempo di accensione e spegnimento dello schermo e le sveglie. In questo modo puoi misurare l'utilizzo complessivo della CPU e il consumo della batteria.
Debug
Debug ti aiuta a ispezionare le app per Android durante lo sviluppo, inclusi i conteggi di tracciamento e allocazione per identificare jank e ritardi nelle app.
Puoi anche utilizzare Debug per ottenere contatori di memoria nativa e di runtime, nonché metriche di memoria che possono aiutarti a identificare il footprint della memoria di un determinato processo.
ApplicationExitInfo
ApplicationExitInfo è disponibile su Android 11 (livello API 30) e versioni successive e fornisce informazioni sul motivo dell'uscita dall'applicazione. Sono inclusi ANR, memoria insufficiente, arresti anomali delle app, utilizzo eccessivo della CPU, interruzioni dell'utente, interruzioni del sistema e modifiche alle autorizzazioni di runtime.
Modalità più restrittiva
L'utilizzo di StrictMode ti aiuta a trovare operazioni di I/O accidentali sul thread principale durante lo sviluppo della tua app. Puoi utilizzare StrictMode a livello di applicazione o attività.
Attiva finestre di dialogo ANR in background
Android mostra le finestre di dialogo ANR per le app che impiegano troppo tempo per elaborare il messaggio di trasmissione solo se l'opzione Mostra tutti gli ANR è attiva nelle Opzioni sviluppatore del dispositivo. Per questo motivo, le finestre di dialogo ANR in background non vengono sempre mostrate all'utente, anche quando l'app presenta problemi di prestazioni.
Profila la CPU e il tracciamento del sistema
Utilizza CPU Profiler di Android Studio per registrare il tracciamento del sistema e l'attività della CPU durante l'esecuzione del gioco. L'ispezione del thread principale Activity insieme ai thread di rendering, audio e di lavoro del motore grafico ti aiuta a individuare frame lunghi, caricamenti di asset sincroni e conflitti di thread prima che attivino un ANR.
Estrai un file di tracce
Android memorizza le informazioni di traccia quando si verifica un ANR. Nelle versioni di Android precedenti, sul dispositivo è presente un singolo file /data/anr/traces.txt. Nelle versioni di Android successive, sono presenti più file /data/anr/anr_*. Puoi accedere alle tracce ANR da un dispositivo o un emulatore utilizzando Android Debug Bridge (ADB) come root:
adb root
adb shell ls /data/anr
adb pull /data/anr/<filename>
Puoi acquisire una segnalazione di bug da un dispositivo fisico utilizzando l'opzione sviluppatore
Crea segnalazione di bug sul dispositivo o il comando adb bugreport sulla tua
macchina di sviluppo. Per saperne di più, consulta
Acquisisci e leggi le segnalazioni di bug.
Risolvi i problemi
Dopo aver identificato il problema, puoi utilizzare i suggerimenti in questa sezione per risolvere i problemi più comuni.
Codice lento nel thread principale
Identifica i punti del codice in cui il thread principale dell'app è occupato per più di 5 secondi. Cerca i casi d'uso sospetti nel tuo gioco e prova a riprodurre l'ANR.
Nei giochi, i blocchi del thread principale si verificano comunemente quando la decompressione sincrona degli asset, la compilazione degli shader o l'inizializzazione dello stato del gioco vengono eseguite sul thread principale di Android Activity (ad esempio all'interno di onCreate, onResume o dei callback JNI richiamati dal thread dell'interfaccia utente). Sposta l'esecuzione del loop di gioco, l'elaborazione degli asset e l'inizializzazione delle scene in thread di lavoro dedicati per il motore, il rendering o il background, in modo che il thread principale rimanga libero di elaborare gli input e gli eventi del ciclo di vita.
I/O nel thread principale
L'esecuzione di operazioni di I/O sul thread principale è una causa comune di operazioni lente sul thread principale, che possono causare errori ANR.
Sposta tutte le letture dei bundle di asset, la serializzazione dei salvataggi dei giochi, gli accessi a SharedPreferences e le richieste di rete dal thread Activity principale ai thread di lavoro in background, in modo che la latenza di archiviazione o di rete non possa bloccare l'invio degli input.
Deadlock
Un deadlock si verifica quando un thread entra in uno stato di attesa perché una risorsa richiesta è occupata da un altro thread, che a sua volta è in attesa di una risorsa occupata dal primo thread. Se il thread principale dell'app si trova in questa situazione, è probabile che si verifichino errori ANR.
Nei giochi, i deadlock e i conflitti di blocco si verificano spesso tra il thread principale Activity di Android (che gestisce i callback del ciclo di vita, della superficie o dell'input) e i thread di rendering, logica o audio nativi C o C++. Evita le attese sincrone sul thread principale per i blocchi del motore nativo e utilizza un ordine di blocco coerente o code di messaggi senza blocchi durante la comunicazione tra i thread JNI e del motore.
I deadlock sono un fenomeno ben studiato nell'informatica ed esistono algoritmi di prevenzione dei deadlock che puoi utilizzare per evitarli.
Per saperne di più, consulta Deadlock e Algoritmi di prevenzione dei deadlock su Wikipedia.
Broadcast receiver lenti
Le app possono rispondere ai messaggi di trasmissione, ad esempio attivando o disattivando la modalità aereo o una modifica dello stato della connettività, tramite i broadcast receiver. Un ANR si verifica quando un'app impiega troppo tempo per elaborare l'annuncio.
Un errore ANR si verifica nei seguenti casi:
- Un broadcast receiver non ha terminato l'esecuzione del metodo
onReceiveentro un periodo di tempo considerevole. - Un broadcast receiver chiama
goAsynce non riesce a chiamarefinishsull'oggettoPendingResult.
La tua app deve eseguire solo operazioni brevi nel metodo onReceive di un BroadcastReceiver. Tuttavia, se la tua app richiede un'elaborazione più complessa come risultato di un annuncio, devi rimandare l'attività a un thread di lavoro in background se l'attività dovrebbe richiedere al massimo alcuni secondi o a WorkManager per le attività che dovrebbero richiedere più di alcuni secondi.
GameActivity
La libreria GameActivity ha ridotto gli ANR nei case study di giochi e app scritti in C o C++. Se sostituisci l'attività nativa esistente con GameActivity, puoi ridurre il blocco del thread dell'interfaccia utente ed evitare che si verifichino alcuni ANR.
Se stai creando il tuo gioco con Unity, consulta Esegui il debug degli ANR per i giochi Unity, ANR comuni dei giochi Unity e Simbolizza gli arresti anomali e gli ANR di Android per i giochi Unity.
Per saperne di più sugli errori ANR, consulta Mantieni l'app reattiva. Per saperne di più sui thread, consulta Miglioramento delle prestazioni tramite threading.
Consigliati per te
- Nota: il testo del link viene visualizzato quando JavaScript è disattivato
- Wakeup eccessivi