Ottimizza l'accesso alla rete

L'utilizzo della radio wireless per trasferire i dati è potenzialmente una delle fonti più significative di consumo della batteria dell'app. Per ridurre al minimo il consumo della batteria associato all'attività di rete, è fondamentale comprendere in che modo il tuo modello di connettività influirà sull'hardware della radio sottostante.

Questa sezione presenta la macchina a stati radio wireless e spiega in che modo interagisce il modello di connettività dell'app. Offre quindi diverse tecniche che, se seguite, ti aiuteranno a ridurre al minimo l'effetto del consumo di dati dell'app sulla batteria.

La macchina a stati radio

La radio wireless sul dispositivo degli utenti è dotata di funzionalità di risparmio energetico integrate che aiutano a ridurre al minimo il consumo della batteria. Quando è completamente attiva, la radio wireless consuma molta energia, ma quando è inattiva o in standby consuma pochissima energia.

Un fattore importante da ricordare è che la radio non può passare da standby a completamente attiva all'istante. Esiste un periodo di latenza associato all'"accensione" della radio. Di conseguenza, la batteria passa da stati con energia più elevata a stati con energia più bassa lentamente per risparmiare energia quando non è in uso, tentando al contempo di ridurre al minimo la latenza associata all'accensione della radio.

La macchina a stati per una tipica rete radio 3G è composta da tre stati di energia:

  • Massima potenza: viene utilizzata quando è attiva una connessione, che consente al dispositivo di trasferire i dati alla massima velocità possibile.
  • Basso consumo: uno stato intermedio che riduce il consumo della batteria di circa il 50%.
  • Standby: stato di consumo minimo di energia durante il quale non è attiva alcuna connessione di rete.

Sebbene lo stato Basso e in standby consumi molto meno batteria, introducono anche una latenza significativa per le richieste di rete. Il ritorno alla piena potenza dallo stato basso richiede circa 1,5 secondi, mentre il passaggio dalla modalità standby alla massima potenza può richiedere più di 2 secondi.

Per ridurre al minimo la latenza, la macchina a stati utilizza un ritardo per posticipare la transizione a stati a energia inferiore. La Figura 1 utilizza i tempi di AT&T per una tipica radio 3G.


Figura 1. Tipica macchina con stato radio wireless 3G.

La macchina dello stato radio su ciascun dispositivo, in particolare il ritardo di transizione ("tail time") e la latenza di avvio associati, varieranno in base alla tecnologia radio wireless utilizzata (3G, LTE, 5G e così via) e viene definita e configurata dalla rete dell'operatore su cui viene utilizzato il dispositivo.

In questa pagina viene descritta una macchina a stato rappresentativa per una tipica radio wireless 3G, in base ai dati forniti da AT&T. Tuttavia, i principi generali e le best practice che ne derivano sono applicabili a tutte le implementazioni radio wireless.

Questo approccio è particolarmente efficace per la tipica navigazione sul web mobile, in quanto previene la latenza sgradevole durante la navigazione sul web da parte degli utenti. Il tempo di coda relativamente basso garantisce inoltre che, una volta terminata una sessione di navigazione, la radio possa passare a uno stato di energia inferiore.

Purtroppo questo approccio può portare alla creazione di app inefficienti sui moderni sistemi operativi degli smartphone come Android, dove le app vengono eseguite sia in primo piano (dove la latenza è importante) che in background (dove occorre dare la priorità alla durata della batteria).

Impatto delle app sulla macchina dello stato radio

Ogni volta che crei una nuova connessione di rete, la radio passa allo stato di piena potenza. Nel caso della tipica macchina a stato radio 3G descritta in precedenza, rimarrà a piena potenza per tutta la durata del trasferimento, più altri 5 secondi di coda, seguiti da 12 secondi a bassa energia. Di conseguenza, per un tipico dispositivo 3G, ogni sessione di trasferimento dei dati farà sì che la radio assorbisca energia per almeno 18 secondi.

In pratica, ciò significa che un'app che effettua un trasferimento di dati di un secondo, tre volte al minuto, manterrà la radio wireless per sempre attiva, riportandola a potenza elevata appena entra in modalità standby.


Figura 2. Consumo relativo di potenza radio wireless per trasferimenti di un secondo eseguiti tre volte al minuto. La figura esclude la latenza di "accensione" tra le esecuzioni.

In confronto, se la stessa app raggruppasse i propri trasferimenti di dati, eseguendo un singolo trasferimento di tre secondi ogni minuto, questo manterrebbe la radio nello stato ad alta potenza per un totale di soli 20 secondi al minuto. In questo modo la radio sarebbe rimasta in standby per 40 secondi al minuto, con una riduzione significativa del consumo della batteria.


Figura 3. Consumo relativo di energia radio wireless per trasferimenti di tre secondi eseguiti una volta al minuto.

Tecniche di ottimizzazione

Ora che hai compreso in che modo l'accesso alla rete influisce sulla durata della batteria, vediamo alcune cose che puoi fare per ridurre il consumo della batteria, fornendo al contempo un'esperienza utente veloce e fluida.

Trasferimento dei dati di gruppo

Come indicato nella sezione precedente, il raggruppamento dei trasferimenti di dati in modo da trasferire più dati con minore frequenza è uno dei modi migliori per migliorare l'efficienza della batteria.

Naturalmente, questa operazione non è sempre possibile se la tua app deve ricevere o inviare dati immediatamente in risposta a un'azione utente. Puoi mitigare questo problema anticipando e precaricando i dati. Altri scenari, come l'invio di log o analisi a un server e altri trasferimenti di dati non urgenti e avviati dall'app, si prestano molto bene al raggruppamento e al raggruppamento in batch. Per suggerimenti sulla pianificazione dei trasferimenti di rete in background, vedi Ottimizzare le attività avviate dalle app.

Precarica dati

Il precaricamento dei dati è un altro modo efficace per ridurre il numero di sessioni di trasferimento di dati indipendenti eseguite dalla tua app. Con il precaricamento, quando l'utente esegue un'azione nella tua app, l'app anticipa i dati che più probabilmente saranno necessari per la serie successiva di azioni dell'utente e li recupera a pieno ritmo, in un'unica raffica su un'unica connessione.

Caricando in anticipo i tuoi trasferimenti, riduci il numero di attivazioni radio necessarie per scaricare i dati. Di conseguenza, non solo risparmia la batteria, ma migliori anche la latenza, riduci la larghezza di banda richiesta e i tempi di download.

Il precaricamento fornisce anche una migliore esperienza utente riducendo al minimo la latenza in-app causata dall'attesa del completamento dei download prima di eseguire un'azione o visualizzare i dati.

Ecco un esempio pratico.

Un lettore di notizie

Molte app di notizie tentano di ridurre la larghezza di banda scaricando i titoli solo dopo aver selezionato una categoria, gli articoli completi soltanto quando l'utente vuole leggerli e le miniature proprio mentre scorrono per visualizzarle.

Utilizzando questo approccio, la radio è costretta a rimanere attiva per la maggior parte delle sessioni di lettura di notizie degli utenti mentre scorrono i titoli, cambiano categoria e leggono articoli. Inoltre, il costante passaggio da uno stato di energia all'altro comporta una latenza significativa quando si cambia categoria o si leggono articoli.

Un approccio migliore consiste nel precaricare una quantità ragionevole di dati all'avvio, a partire dal primo insieme di titoli e miniature di notizie, garantendo un tempo di avvio a bassa latenza, continuando con i titoli e le miniature rimanenti, oltre al testo dell'articolo per ogni articolo disponibile almeno nell'elenco dei titoli principali.

Un'altra alternativa è precaricare ogni titolo, miniatura, testo degli articoli e, possibilmente, anche immagini complete degli articoli, generalmente in background e secondo una pianificazione prestabilita. Questo approccio rischia di spendere notevoli quantità di larghezza di banda e durata della batteria per scaricare contenuti che non vengono mai utilizzati, quindi deve essere implementato con cautela.

Considerazioni aggiuntive

Sebbene il precaricamento dei dati abbia molti vantaggi, un utilizzo troppo aggressivo del precaricamento introduce anche il rischio di aumentare il consumo della batteria e della larghezza di banda, nonché la quota di download, scaricando i dati non utilizzati. È inoltre importante assicurarsi che il precaricamento non ritarda l'avvio dell'applicazione mentre quest'ultima attende il completamento del precaricamento. In termini pratici che potrebbero significare elaborare progressivamente i dati o avviare trasferimenti consecutivi con priorità, in modo che i dati richiesti per l'avvio dell'applicazione vengano scaricati ed elaborati per primi.

L'aggressività del precaricamento dei dati dipende dalle dimensioni dei dati scaricati e dalla probabilità che vengano utilizzati. Come guida approssimativa, in base alla macchina a stati descritta in precedenza, per i dati che hanno una probabilità del 50% di essere utilizzati all'interno della sessione utente corrente, in genere puoi eseguire il precaricamento per circa 6 secondi (circa 1-2 megabyte) prima che il costo potenziale del download dei dati inutilizzati corrisponda ai potenziali risparmi derivanti dal mancato download dei dati.

In generale, è buona norma precaricare i dati in modo da avviare un altro download ogni 2-5 minuti nell'ordine di 1-5 MB.

In base a questo principio, i download di grandi dimensioni, ad esempio i file video, dovrebbero essere scaricati in blocchi a intervalli regolari (ogni 2-5 minuti), precaricando in modo efficace solo i dati video che potrebbero essere visualizzati nei prossimi minuti.

Una soluzione è pianificare il download completo in modo che venga eseguito solo quando si è connessi alla rete Wi-Fi ed eventualmente solo quando il dispositivo è in carica. L'API WorkManager supporta esattamente questo caso d'uso, consentendoti di limitare il lavoro in background fino a quando il dispositivo non soddisfa i criteri specificati dallo sviluppatore, ad esempio la ricarica e la connessione alla rete Wi-Fi.

Verifica la connettività prima di effettuare richieste

La ricerca di un segnale cellulare è una delle operazioni di consumo più elevato su un dispositivo mobile. Una best practice per le richieste avviate dall'utente consiste nel controllare innanzitutto la presenza di una connessione utilizzando ConnectivityManager, come mostrato in Monitorare lo stato di connettività e la misurazione della connessione. In assenza di una rete, l'app può risparmiare batteria evitando di forzare la ricerca della radio mobile. La richiesta può quindi essere pianificata ed eseguita in batch con altre richieste quando viene stabilita una connessione.

Connessioni del pool

Un'altra strategia che può essere d'aiuto, oltre ai processi di batch e precaricamento, consiste nel raggruppare le connessioni di rete dell'app.

In genere è più efficiente riutilizzare le connessioni di rete esistenti piuttosto che avviarne di nuove. Inoltre, il riutilizzo delle connessioni consente alla rete di reagire in modo più intelligente alla congestione e ai relativi problemi di dati di rete.

HttpURLConnection e la maggior parte dei client HTTP, come OkHttp, attivano il pooling di connessioni per impostazione predefinita e riutilizzano la stessa connessione per più richieste.

Riepilogo e prospettiva

In questa sezione hai imparato molto sulla radio wireless e su alcune strategie che puoi applicare su larga scala per offrire un'esperienza utente rapida e reattiva riducendo il consumo della batteria.

Nella sezione successiva, esamineremo in dettaglio i tre tipi distinti di interazioni di rete comuni alla maggior parte delle app. Imparerai i driver per ciascuno di questi tipi, nonché le tecniche e le API moderne per gestire queste interazioni in modo efficiente.