Ottimizza l'accesso alla rete

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

Questa sezione illustra la macchina a stati radio wireless e spiega come interagisce il modello di connettività dell'app con questa macchina. Offre quindi diverse tecniche che, se utilizzate, ti aiuteranno a ridurre al minimo l'effetto del consumo di dati della tua app sulla batteria.

La macchina a stati radio

Il segnale radio wireless sul dispositivo dell'utente dispone di funzioni integrate di risparmio energetico che aiutano a ridurre al minimo la quantità di energia consumata dalla batteria. Quando il dispositivo è completamente attivo, la radio wireless consuma molta energia, ma quando è inattivo o in standby, consuma pochissima energia.

Un fattore importante da ricordare è che la radio non può passare istantaneamente dalla modalità standby all'attivazione completa. Esiste un periodo di latenza associato all'"accensione" della radio. Di conseguenza, la batteria passa lentamente dagli stati di energia più alta a quelli di energia più bassa per risparmiare energia quando non in uso, cercando di ridurre al minimo la latenza associata all'accensione della radio.

Lo stato dell'energia per una tipica radio di rete 3G è costituito da tre stati energetici:

  • Potenza massima: 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 di energia della batteria di circa il 50%.
  • Standby: lo stato di consumo energetico minimo durante il quale non è attiva alcuna connessione di rete.

Anche se gli stati basso e standby consumano molto meno batteria, introducono anche una latenza significativa nelle richieste di rete. Il ritorno alla massima 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 di energia più bassi. La Figura 1 utilizza i tempi di AT&T per una tipica radio 3G.


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

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

Questa pagina descrive 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 risultanti sono applicabili a tutte le implementazioni delle radio wireless.

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

Sfortunatamente, questo approccio può determinare 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 la durata della batteria è importante).

Impatto delle app sulla macchina dello stato della radio

Ogni volta che crei una nuova connessione di rete, la radio passa allo stato di massima alimentazione. Nel caso della tipica macchina a stati radio 3G descritta in precedenza, rimarrà a potenza piena per l'intera durata del trasferimento, più altri 5 secondi di coda, seguiti da 12 secondi in stato a bassa energia. Pertanto, per un tipico dispositivo 3G, a ogni sessione di trasferimento di dati la radio attinge energia per almeno 18 secondi.

In pratica, ciò significa che un'app che esegue un trasferimento di dati di un secondo, tre volte al minuto, manterrà la radio wireless perpetuamente attiva, riportandola a potenza elevata proprio mentre sta entrando in modalità standby.


Figura 2. Uso della potenza della radio wireless relativa per un trasferimento di un secondo, eseguito 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, la radio manterrà lo stato ad alta potenza per un totale di soli 20 secondi al minuto. Ciò consentirebbe alla radio di rimanere in standby per 40 secondi ogni minuto, con un conseguente calo significativo del consumo della batteria.


Figura 3. Consumo di potenza della radio wireless relativa per trasferimenti di 3 secondi eseguiti una volta al minuto.

Tecniche di ottimizzazione

Ora che hai compreso in che modo l'accesso alla rete incide sulla durata della batteria, vediamo alcuni accorgimenti che puoi adottare per ridurre il consumo della batteria e, allo stesso tempo, garantire un'esperienza utente fluida e veloce.

Raggruppa trasferimenti di dati

Come indicato nella sezione precedente, raggruppare i trasferimenti di dati in modo da trasferire una quantità maggiore di dati con minore frequenza è uno dei modi migliori per aumentare l'efficienza della batteria.

Ovviamente, ciò non è sempre possibile se la tua app deve ricevere o inviare dati immediatamente in risposta a un'azione dell'utente. Puoi mitigare questo problema prevedendo 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. Consulta Ottimizzazione delle attività avviate dall'app per suggerimenti sulla pianificazione dei trasferimenti di rete in background.

Precarica dati

Il precaricamento dei dati è un altro modo efficace per ridurre il numero di sessioni indipendenti di trasferimento di dati eseguite dalla tua app. Con il precaricamento, quando l'utente esegue un'azione nella tua app, quest'ultima prevede i dati che molto probabilmente saranno necessari per la serie successiva di azioni utente e li recupera in un'unica burst, su una singola connessione, a piena capacità.

Mediante l'anticipazione dei tuoi trasferimenti, riduci il numero di attivazioni radio necessarie per scaricare i dati. Di conseguenza, non solo preserva la durata della batteria, ma migliori anche la latenza, diminuisci la larghezza di banda richiesta e i tempi di download.

Il precaricamento offre inoltre 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 interi soltanto quando l'utente vuole leggerli e le miniature mentre l'utente scorre la pagina fino alla visualizzazione.

Grazie a 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 leggeno gli articoli. Inoltre, il passaggio costante da uno stato di energia all'altro genera 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 delle notizie, assicurando un tempo di avvio a bassa latenza, e continuando con i titoli e le miniature rimanenti, nonché il testo dell'articolo per ogni articolo disponibile almeno dall'elenco dei titoli principale.

Un'altra alternativa è precaricare ogni titolo, miniatura, testo dell'articolo e possibilmente anche le immagini complete degli articoli, in genere in background secondo una programmazione prestabilita. Questo approccio rischia di spendere una larghezza di banda e una durata significativa della batteria per scaricare contenuti mai utilizzati, pertanto va implementato con cautela.

Considerazioni aggiuntive

Sebbene il precaricamento dei dati presenti molti vantaggi, un precaricamento troppo rigoroso comporta anche il rischio di aumentare il consumo della batteria e l'utilizzo della larghezza di banda, oltre che la quota di download, a causa del download dei dati che non vengono utilizzati. È inoltre importante assicurarsi che il precaricamento non ritarda l'avvio dell'applicazione mentre quest'ultima attende il completamento del precaricamento. In termini pratici, ciò potrebbe significare l'elaborazione progressiva dei dati o l'avvio di 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 di stato descritta in precedenza, per i dati che hanno una probabilità del 50% di essere utilizzati nella sessione utente corrente, in genere puoi effettuare un precaricamento di circa 6 secondi (circa 1-2 megabyte) prima che il costo potenziale del download di dati inutilizzati corrisponda al potenziale risparmio derivante dal mancato download dei dati.

In generale, è buona norma precaricare i dati in modo tale che sia sufficiente avviare un altro download ogni 2-5 minuti e nell'ordine di 1-5 megabyte.

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 di fatto solo i dati video che potrebbero essere visualizzati nei minuti successivi.

Una soluzione consiste nel pianificare il download completo in modo che venga eseguito solo quando il dispositivo è connesso al Wi-Fi ed eventualmente solo quando il dispositivo è in carica. L'API WorkManager supporta esattamente questo caso d'uso, consentendoti di limitare le operazioni in background finché il dispositivo non soddisfa i criteri specificati dallo sviluppatore, quali la ricarica e la connessione alla rete Wi-Fi.

Verifica la connettività prima di inviare richieste

La ricerca del segnale cellulare è una delle operazioni che consumano più energia su un dispositivo mobile. Una best practice per le richieste avviate dall'utente consiste nel verificare innanzitutto la presenza di una connessione utilizzando ConnectivityManager, come mostrato in Monitorare lo stato della connettività e il monitoraggio della connessione. Se non c'è alcuna rete, l'app può risparmiare batteria perché non obbliga la radio mobile a eseguire ricerche. La richiesta può quindi essere pianificata ed eseguita in un batch con altre richieste quando viene stabilita una connessione.

Connessioni del pool

Un'altra strategia che può essere utile, oltre al raggruppamento e al precaricamento, consiste nel pool delle connessioni di rete dell'app.

Riutilizzare le connessioni di rete esistenti è generalmente più efficiente che avviarne di nuove. Il riutilizzo delle connessioni consente inoltre alla rete di reagire in modo più intelligente alla congestione e ai problemi dei dati di rete correlati.

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

Riepilogo e visione al futuro

In questa sezione hai appreso molto sulla radio wireless e su alcune strategie che puoi applicare in generale per fornire un'esperienza utente rapida e reattiva riducendo al contempo il consumo della batteria.

Nella prossima sezione daremo un'occhiata in dettaglio a tre diversi tipi di interazione di rete comuni alla maggior parte delle app. Imparerai i driver per ciascuno di questi tipi, nonché tecniche e API moderne per gestire queste interazioni in modo efficiente.