Questo articolo è originariamente apparso su CodeProject.com

Come risolvere i problemi di qualità delle app con Android vitals (Parte 2)

Post 2 di 2: come la correzione di arresti anomali e blocchi di riattivazione non necessari può migliorare le prestazioni del Play Store

Sono entusiasta che sempre più di voi stiano trovando successo nella risoluzione dei problemi di qualità delle app utilizzando la sezione vitals di Android in Google Play Console. Dal mio primo articolo su Android vitals, abbiamo apportato miglioramenti per offrirti nuove metriche e funzionalità. In questo articolo, inizierò con uno sguardo alle novità, quindi ti spiegherò come lavorare con i blocchi e gli arresti anomali bloccati.

Cosa c'è di nuovo in vitals Android

Abbiamo annunciato nuove funzionalità vitali per Android a Google I / O 2018. Questi miglioramenti includevano due nuove aree di prestazioni, miglioramenti alle informazioni metriche esistenti e un modo per avvisarti di cambiamenti inattesi nei tuoi dati Android.

Benchmark di categoria

La misura di ciò che costituisce un livello "buono" (basso) o "cattivo" (alto) in un'app dipende molto dalla categoria Play Store in cui si trova l'app. Ad esempio, le app nella categoria "Giochi da tavolo" hanno , in media, una latenza di avvio inferiore rispetto alle app classificate in "Giochi di corse". Questo è il motivo per cui Android vitals ora mostra i benchmark delle categorie, quindi puoi vedere come sta andando la tua app rispetto ad altre app nella stessa categoria.

Rilevazione di anomalie

Un improvviso cambiamento nel comportamento della tua app non è una buona cosa. Per aiutarti a superare rapidamente queste situazioni, ogni volta che Android vitals rileva un picco improvviso in modo vitale, ti avviserà nella Play Console e via e-mail. Puoi quindi visitare Android vitals per vedere cosa sta succedendo e affrontare la causa.

Rifiuti delle autorizzazioni

Vedi la percentuale di persone che hanno negato una richiesta di autorizzazione fatta dalla tua app. Laddove il livello di rifiuto è elevato, puoi rivedere il design della tua app per vedere se, ad esempio, una migliore evidenziazione del motivo dell'autorizzazione aiuterà le persone a essere più sicure nel concederlo.

Tempo di avvio dell'applicazione

Anche se stai offrendo ottime funzionalità o un'esperienza di gioco eccezionale, le persone non resteranno in giro per usarlo se la tua app si avvia troppo lentamente. Per aiutarti a capire se questa potrebbe essere una sfida nella tua app, questa nuova area delle prestazioni mostra la velocità con cui la tua app o il gioco inizia dai tre tipi di avvio dell'app: avvio a freddo, quando l'app non è stata utilizzata di recente e non lo è memorizzato nella cache; avvio a caldo, quando l'app è in memoria, ma l'attività deve essere ricreata; e hot start, quando l'app e l'attività sono in memoria quando l'utente è tornato all'app.

Quando riscontri problemi con l'avvio in vitals Android, usa i nuovi strumenti di Android Profiler in Android Studio 3.2, come ad esempio il profilo della CPU di avvio delle app e Systrace, per rintracciare i problemi di latenza di avvio.

Vitali core

Tutti i parametri vitali sono importanti per le app di alta qualità. Tuttavia, ci sono quattro parametri che possono essere la tua priorità: riattivazioni eccessive, ANR, blocchi di riattivazione in background bloccati e arresti anomali. Risvegli eccessivi e ANR sono stati oggetto del mio primo articolo. Quindi, ora esaminerò i blocchi e gli arresti anomali.

Wake locks

Storicamente, fare un lavoro in background su Android si basava sulla creazione di servizi in background quando erano necessari, che venivano eseguiti per tutto il tempo necessario - a volte chiamati servizi a esecuzione libera. I blocchi di attivazione sono stati utilizzati durante l'esecuzione di questi servizi in background per impedire lo spegnimento della CPU e delle radio del dispositivo.

L'uso dei wake lock in questo modo non è ottimale. Le app possono pianificare i loro servizi troppo spesso e finiscono per funzionare per troppo tempo occupando risorse, come la memoria. Questo uso delle risorse porta spesso a un peggioramento delle prestazioni del dispositivo e all'eccessivo consumo della batteria, a causa del maggiore utilizzo della CPU e della radio e del fatto che impediscono al dispositivo di dormire.

Android vitals ti fornisce i dettagli dei blocchi di riattivazione parziale, acquisiti dalla tua app tramite la classe PowerManager, nelle pagine Blocchi di sveglia bloccati e Blocchi di sveglia bloccati (in background). Un blocco parziale della sveglia assicura che la CPU sia in esecuzione ma la retroilluminazione dello schermo e della tastiera può spegnersi.

Nei rapporti, viene visualizzata la percentuale di sessioni della batteria (il periodo tra due cariche complete del dispositivo) interessate da blocchi di riattivazione bloccati. Le informazioni includono la percentuale di sessioni interessate nei precedenti due periodi di 30 giorni, benchmark che mostrano il rendimento della tua app rispetto alle prime 1000 app su Google Play (in base al numero di installazioni), un grafico delle sessioni interessate nel tempo e (non mostrato nello screenshot) una serie di suddivisioni per criteri quali versione dell'app, versione del sistema operativo Android e dispositivo.

Se i parametri di riferimento mostrano che la parte di sessioni della tua app interessata da blocchi bloccati della sveglia è nella parte inferiore del 25%, inizia a pensare a migliorare l'app.

Come accennato nel mio primo articolo, dall'introduzione di JobScheduler, in Android 5.0, il consiglio delle migliori pratiche è stato quello di abbandonare l'uso di allarmi e servizi gratuiti. A partire da Android Oreo questa mossa diventa obbligatoria, poiché la tua app non può più avviare un servizio in background (si tradurrà in un'eccezione). Allo stesso modo, allontana le tue app dall'uso dei wake lock, poiché ora ci sono alternative migliori per la maggior parte dei casi d'uso. Pertanto, anziché utilizzare i blocchi di riattivazione, ti consigliamo quanto segue per la tua app:

  • Utilizzare JobScheduler o WorkManager API quando è necessario eseguire un lavoro in background. L'uso di queste funzioni manterrà un blocco riattivazione per il lavoro mentre è in esecuzione.
  • Pianificare una trasmissione di AlarmManager quando si desidera eseguire un'attività in background a un orario fisso o ad intervalli regolari. AlarmManager mantiene un blocco della sveglia fino a quando il metodo BroadcastReceiver.onReceive () è in esecuzione.
  • Aggiungi FLAG_KEEP_SCREEN_ON a qualsiasi finestra in cui desideri mantenere lo schermo mentre qualcuno sta guardando un'attività nella tua app. Ad esempio, durante la lettura di un ebook. Con questo metodo, il sistema pulirà il blocco della sveglia quando l'attività non è più visibile.

Quando è necessario gestire autonomamente un blocco della sveglia (ad esempio, quando si utilizza un servizio di primo piano a esecuzione prolungata per riprodurre una traccia audio), ricordare di seguire queste regole:

  • Utilizza PARTIAL_WAKE_LOCK, non utilizzare i tipi obsoleti di wake wake.
  • Specificare un timeout quando si acquisisce un blocco riattivazione, in questo modo se l'app non rilascia il blocco riattivazione il sistema lo pulirà alla scadenza del timeout.
  • Dai ai tag di scia un tag statico e descrittivo, come com.myapp: il mio blocco di scia per ottenere la migliore segnalazione dei blocchi di scia nei video di Android. Non aggiungere contatori o altri dati dinamici al tag. Con buoni tag descrittivi, i gruppi vitali di Android raggruppano (uniscono) blocchi di riattivazione simili per darti un quadro accurato del comportamento dei singoli blocchi di riattivazione.
  • Rilasciare i blocchi di attivazione quando non sono più necessari. Ricordare che gli errori possono anche rendere non necessario il blocco della sveglia. Un buon approccio alla gestione degli errori è la codifica difensiva e il wrapping delle chiamate in un tentativo {...} infine {wakeLock.release (); } blocco.

Arresti

Le funzioni vitali Android forniscono sia visualizzazioni riepilogative che dettagliate degli arresti anomali. Nelle pagine Frequenza di arresto anomalo e Frequenza di arresto multiplo vengono visualizzati i dati di arresto combinato con i dati di utilizzo per creare una metrica normalizzata.

Oltre a queste informazioni di riepilogo, puoi anche visualizzare i dettagli sugli arresti anomali in tempo reale nella pagina ANR e arresti anomali.

Come per i blocchi di riattivazione dello sfondo bloccati, la metrica chiave per confrontare la frequenza di arresto anomalo è la soglia di comportamento errato. Se il tasso di arresto anomalo della tua app supera la soglia di comportamento scorretto, ti consigliamo di risolvere gli arresti anomali come priorità.

Esistono molti motivi per cui il codice può generare un'eccezione e arrestare in modo anomalo l'app. Pertanto, non è pratico discutere e offrire una soluzione a tutti qui. Tuttavia, posso fornire alcuni consigli generali per evitare incidenti.

Android vitals è un ottimo modo per ottenere informazioni sugli arresti più comuni e su quante persone ne sono colpite. Un grande vantaggio per i vitali Android è che cattura gli arresti anomali che si verificano prima che gli SDK di report sugli arresti anomali di terze parti possano inizializzarsi.

Se desideri ulteriori informazioni per la riproduzione, il debug e la correzione di arresti anomali, prendi in considerazione l'utilizzo di Firebase Crashlytics. Questo strumento fornisce informazioni dettagliate su ciò che accade nella tua app al momento di un arresto anomalo. Firebase Crashlytics lo fa integrandosi con Firebase Analytics e consentendo di aggiungere la registrazione personalizzata da includere nei rapporti sugli arresti anomali.

Il mio consiglio chiave per evitare molte delle cause più comuni di crash è:

  • Non reinventare
  • Passa a Kotlin
  • Attenersi alle API pubbliche

Non reinventare modelli di codice comuni

Perché correre il rischio di commettere errori nella codifica per un'attività comune, quando librerie di alta qualità che è improbabile che causino un arresto anomalo sono prontamente disponibili e facili da riutilizzare.

Una buona fonte di librerie per molte delle cose che vuoi fare nel tuo codice è Android Jetpack, un insieme di librerie che può servire da base per la maggior parte delle app Android. Puoi affidarti a Android Jetpack per molte attività comuni, come la gestione del ciclo di vita delle attività, la navigazione, l'esecuzione di processi in background, le operazioni del database, il caricamento di dati da fonti esterne e altro ancora. Non devi limitarti alle biblioteche sviluppate da Google. Ci sono molte librerie fantastiche, testate e open source disponibili che puoi usare nelle tue app.

Considera di passare da Java a Kotlin

L'anno scorso all'I / O abbiamo annunciato che Android supportava Kotlin. Stiamo continuando tale investimento con i miglioramenti al supporto di Kotlin. L'obiettivo finale è rendere gli sviluppatori più produttivi, almeno in parte evitando alcuni errori di codifica comuni che potrebbero causare arresti anomali.

Una cosa grandiosa di Kotlin è che ha informazioni di nullability integrate nel sistema di tipi della lingua. Con chiamate null-safe e controlli null in fase di compilazione, puoi essere più sicuro che il tuo codice non causerà una NullPointerException in fase di esecuzione. Ti incoraggio a provare Kotlin se non l'hai già fatto. Puoi iniziare ad aggiungerlo lentamente alla tua app, non è necessario sostituire tutto il codice Java poiché Kotlin offre un'ottima interoperabilità con Java.

Attenersi all'utilizzo delle API Android pubbliche

Le API pubbliche di Android sono le classi e i metodi pubblici documentati sul sito per sviluppatori Android. Queste API sono garantite per essere disponibili e funzionare su tutti i dispositivi Android certificati. I metodi privati ​​o nascosti, a cui è possibile accedere tramite reflection, possono essere una grande fonte di arresti anomali. La sfida con questi metodi è che non è garantito che siano disponibili sui dispositivi e spesso cambiano o si rompono con ogni aggiornamento di Android. Quindi, vanno bene per sperimentare, ma consigliamo di evitarli nelle app pubbliche del Play Store.

A causa dei problemi con metodi privati ​​o nascosti, nell'anteprima per sviluppatori Android P e per tutte le future edizioni dell'accesso Android a questi documenti non documentati, le API private sono limitate e le tue app potrebbero smettere di usarle immediatamente per rimanere compatibili. Se vuoi saperne di più, consulta l'articolo del sito di anteprima "Restrizioni su interfacce non SDK".

Un'ultima parola

Android vitals è qui per aiutarti a creare app di qualità migliore che coinvolgono e mantengono più usi in modo da poter costruire attività vibranti. Nei miei due articoli ti ho dato informazioni essenziali sui quattro aspetti fondamentali: riattivazione eccessiva, ANR, blocco della sveglia in background bloccato e arresti anomali. Ho anche esaminato le funzionalità recentemente aggiunte ai canali Android.

Speriamo che seguendo i consigli e le intuizioni in questo articolo, ti aiuterà a dare un senso migliore ai vitali Android delle tue app e utilizzarli per migliorare la qualità della tua app.

Se vuoi saperne di più, dai un'occhiata alla registrazione dei dati Android: esegui il debug delle prestazioni dell'app e raccogli i frutti di una sessione di Google I / O 2018 che ho presentato insieme a Joel t Newman e Fergus Hurley. Puoi anche imparare altre best practice per app e giochi Android da Google Play sul blog Medium.

Cosa ne pensi?

Se hai pensieri su Android vitals o su una delle sue nuove funzionalità, faccelo sapere tramite Twitter tramite #AskPlayDev e risponderemo da @GooglePlayDev, dove condividiamo regolarmente notizie e suggerimenti su come avere successo su Google Play.