Ottimizza l'accesso alla rete

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

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

La macchina a stati della radio

La radio wireless sul dispositivo dell'utente ha funzionalità di risparmio energetico integrate che aiutano a ridurre al minimo la quantità di energia della batteria che consuma. Quando è completamente attiva, la radio wireless consuma una quantità significativa di energia, ma quando è inattiva o in standby, ne consuma pochissima.

Un fattore importante da ricordare è che la radio non può passare dallo stato di standby a quello di piena attività istantaneamente. Esiste un periodo di latenza associato all'"accensione" della radio. Pertanto, la batteria passa lentamente dagli stati di energia più elevati a quelli di energia più bassi 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 radio di rete 3G è costituita da tre stati di energia:

  • Piena potenza: utilizzata quando una connessione è attiva, consentendo al dispositivo di trasferire i dati alla massima velocità possibile.
  • Bassa potenza: 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.

Sebbene gli stati di bassa potenza e standby consumino molta meno batteria, introducono anche una latenza significativa nelle richieste di rete. Il passaggio dallo stato di bassa potenza a quello di piena potenza richiede circa 1,5 secondi, mentre il passaggio dallo stato di standby a quello di piena potenza può richiedere più di 2 secondi.

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


Figura 1. Macchina a stati della radio wireless 3G tipica.

La macchina a stati della radio su ogni dispositivo, in particolare il ritardo di transizione associato ("tempo di coda") e la latenza di avvio, variano in base alla tecnologia radio wireless utilizzata (3G, LTE, 5G e così via) e vengono definiti e configurati dalla rete dell'operatore su cui opera il dispositivo.

Questa pagina descrive una macchina a stati rappresentativa per una tipica radio wireless 3G, basata sui dati forniti da AT&T. Tuttavia, i principi generali e le best practice risultanti sono applicabili a tutte le implementazioni di radio wireless.

Questo approccio è particolarmente efficace per la tipica navigazione web mobile, in quanto impedisce la latenza indesiderata durante la navigazione sul web. 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 a app inefficienti su sistemi operativi per smartphone moderni come Android, in cui le app vengono eseguite sia in primo piano (dove la latenza è importante) sia in background (dove la durata della batteria dovrebbe avere la priorità).

In che modo le app influiscono sulla macchina a stati della radio

Ogni volta che crei una nuova connessione di rete, la radio passa allo stato di piena potenza. Nel caso della tipica macchina a stati della radio 3G descritta in precedenza, rimarrà a piena potenza per la durata del trasferimento, più 5 secondi aggiuntivi di tempo di coda, seguiti da 12 secondi nello stato di bassa energia. Pertanto, per un tipico dispositivo 3G, ogni sessione di trasferimento dati farà sì che la radio consumi 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 sempre attiva, riportandola a piena potenza non appena entra in modalità standby.


Figura 2. Utilizzo relativo dell'energia della radio wireless per un trasferimento di un secondo eseguito tre volte al minuto. La figura esclude la latenza di "accensione" tra le esecuzioni.

Al contrario, se la stessa app raggruppasse i trasferimenti di dati, eseguendo un singolo trasferimento di tre secondi al minuto, la radio rimarrebbe nello stato di piena potenza per un totale di soli 20 secondi al minuto. In questo modo, la radio rimarrebbe in standby per 40 secondi al minuto, con una conseguente riduzione significativa del consumo della batteria.


Figura 3. Utilizzo relativo dell'energia della 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, parliamo di alcune cose che puoi fare per ridurre il consumo eccessivo della batteria, fornendo al contempo un'esperienza utente rapida e fluida.

Raggruppa i trasferimenti di dati

Come indicato nella sezione precedente, raggruppare i trasferimenti di dati in modo da trasferire più dati meno spesso è uno dei modi migliori per migliorare l'efficienza della batteria.

Naturalmente, non è sempre possibile farlo se la tua app deve ricevere o inviare dati immediatamente in risposta a un'azione dell'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 avviati dall'app non urgenti, si prestano molto bene al raggruppamento e al raggruppamento in batch. Per suggerimenti sulla pianificazione dei trasferimenti di rete in background, consulta la sezione Ottimizzare le attività avviate dall'app.

Precarica i dati

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

Precaricando i trasferimenti, riduci il numero di attivazioni della radio necessarie per scaricare i dati. Di conseguenza, non solo risparmi la durata della batteria, ma migliori anche la latenza, riduci la larghezza di banda richiesta e riduci i tempi di download.

Il precaricamento offre anche un'esperienza utente migliorata 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 solo quando l'utente vuole leggerli e le miniature solo quando scorrono nella visualizzazione.

Utilizzando questo approccio, la radio è costretta a rimanere attiva per la maggior parte della sessione di lettura delle notizie degli utenti mentre scorrono i titoli, cambiano categoria e leggono gli articoli. Non solo, il passaggio costante tra gli stati di energia comporta una latenza significativa quando si cambiano le categorie o si leggono gli articoli.

Un approccio migliore consiste nel precaricare una quantità ragionevole di dati all'avvio, iniziando con il primo set di titoli e miniature delle notizie, garantendo 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 principali.

Un'altra alternativa consiste nel precaricare ogni titolo, miniatura, testo dell'articolo e, possibilmente, anche le immagini degli articoli completi, in genere in background secondo una pianificazione predeterminata. Questo approccio rischia di consumare una quantità significativa di larghezza di banda e durata della batteria per scaricare contenuti che non vengono mai utilizzati, pertanto deve essere implementato con cautela.

Considerazioni aggiuntive

Sebbene il precaricamento dei dati comporti molti vantaggi, se utilizzato in modo troppo aggressivo comporta anche il rischio di aumentare il consumo eccessivo della batteria e l'utilizzo della larghezza di banda, nonché la quota di download, scaricando dati che non vengono utilizzati. È anche importante assicurarsi che il precaricamento non ritardi l'avvio dell'applicazione mentre l'app attende il completamento del precaricamento. In termini pratici, ciò potrebbe significare elaborare i dati in modo progressivo o avviare trasferimenti consecutivi con priorità in modo che i dati necessari per l'avvio dell'applicazione vengano scaricati ed elaborati per primi.

L'aggressività con cui precarichi i 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 nella sessione utente corrente, in genere puoi precaricare per circa 6 secondi (circa 1-2 megabyte) prima che il costo potenziale del download di dati non utilizzati corrisponda al potenziale risparmio di non scaricare questi dati, per iniziare.

In generale, è consigliabile precaricare i dati in modo da dover avviare un altro download solo ogni 2-5 minuti e nell'ordine di 1-5 megabyte.

Seguendo questo principio, i download di grandi dimensioni, come i file video, devono essere scaricati in blocchi a intervalli regolari (ogni 2-5 minuti), precaricando di fatto solo i dati video che probabilmente verranno visualizzati nei prossimi minuti.

Una soluzione consiste nel pianificare il download completo in modo che avvenga solo quando è connesso alla rete Wi-Fi e, possibilmente, solo quando il dispositivo è in carica. L' API WorkManager supporta esattamente questo caso d'uso, consentendoti di limitare il lavoro in background finché 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 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 la misurazione della connessione. Se non è presente alcuna rete, l'app può risparmiare batteria non forzando la ricerca della radio mobile. La richiesta può quindi essere pianificata ed eseguita in batch con altre richieste quando viene stabilita una connessione.

Raggruppa le connessioni

Una strategia aggiuntiva che può essere utile, oltre al raggruppamento in batch e al precaricamento, è il raggruppamento delle connessioni di rete della tua app.

In genere è più efficiente riutilizzare le connessioni di rete esistenti che avviare nuove connessioni. Il riutilizzo delle connessioni consente inoltre alla rete di reagire in modo più intelligente alla congestione e ai problemi relativi ai dati di rete.

HttpURLConnection e la maggior parte dei client HTTP , come OkHttp, abilitano il raggruppamento delle connessioni per impostazione predefinita e riutilizzano la stessa connessione per più richieste.

Riepilogo e prospettive future

In questa sezione hai imparato molto sul segnale radio wireless e su alcune strategie che puoi applicare in generale per offrire un'esperienza utente rapida e reattiva riducendo al contempo il consumo eccessivo della batteria.

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