Il traffico di rete generato da un'app può avere un impatto significativo sulla durata della batteria del dispositivo. Per ottimizzare questo traffico, devi misurarlo e identificare la sua sorgente. Le richieste di rete possono provenire direttamente da un'azione dell'utente, dal codice della tua app o da un server che comunica con la tua app.
Questo documento mostra come monitorare e classificare il traffico di rete e fornisce indicazioni su come identificare e risolvere i problemi.
Utilizza Network Profiler per monitorare le richieste
Utilizza Network Profiler per monitorare le richieste di rete della tua applicazione. Puoi monitorare come e quando la tua app trasferisce i dati e ottimizzare il codice sottostante di conseguenza.
Monitorando la frequenza dei trasferimenti di dati e la quantità di dati trasferiti durante ogni connessione, puoi identificare le aree della tua applicazione che possono essere rese più efficienti dal punto di vista della batteria. In genere, cercherai picchi brevi che possono essere ritardati.
Per identificare meglio la causa dei picchi di trasferimento, l'API Traffic Stats ti consente di taggare i trasferimenti di dati che si verificano da un socket all'interno di un determinato thread utilizzando TrafficStats.setThreadStatsTag().
La chiamata di questa funzione non tagga automaticamente tutto il traffico per un determinato thread; i tag devono essere applicati ai socket.
Una volta impostato il tag del thread, puoi taggare e rimuovere manualmente i tag dai singoli socket utilizzando TrafficStats.tagSocket() e TrafficStats.untagSocket().
Un tag viene applicato anche se un socket viene aperto sul thread o se un socket server
accetta una connessione.
L'accesso simultaneo allo stesso socket da parte di più thread utilizzerà il tag che il socket aveva quando i pacchetti di rete sono stati inviati o ricevuti (che potrebbe essere diverso da quando l'utente ha scritto o letto i dati, a causa del buffering e delle ritrasmissioni).
Ad esempio, puoi definire costanti per rappresentare diversi tipi di traffico di rete, come mostrato nel seguente esempio di codice:
const val USER_INITIATED = 0x1000 const val APP_INITIATED = 0x2000 const val SERVER_INITIATED = 0x3000
Puoi quindi taggare le richieste di rete di conseguenza:
TrafficStats.setThreadStatsTag(USER_INITIATED) try { TrafficStats.tagSocket(outputSocket) try { // Transfer data using socket. } finally { TrafficStats.untagSocket(outputSocket) } } finally { TrafficStats.clearThreadStatsTag() }
La libreria HttpURLConnection
assegna automaticamente i tag ai socket in base al valore
TrafficStats.getThreadStatsTag()
corrente. La libreria aggiunge e rimuove i tag dai socket anche quando vengono riciclati tramite pool keep-alive, come mostrato nel seguente esempio di codice:
class IdentifyTransferSpikeTask { @WorkerThread fun request(url: String) { TrafficStats.setThreadStatsTag(APP_INITIATED) try { // Make network request using HttpURLConnection.connect(). val connection = URL(url).openConnection() as HttpURLConnection try { connection.connect() // ... } finally { connection.disconnect() } } finally { TrafficStats.clearThreadStatsTag() } } }
Analizza i tipi di traffico di rete
Quando esamini il traffico di rete generato dalla tua app, devi comprendere l'origine del traffico per poterlo ottimizzare in modo appropriato. Un'attività di rete frequente generata dalla tua app potrebbe essere del tutto appropriata se risponde alle azioni dell'utente, ma completamente inappropriata se l'app non è in primo piano o se il dispositivo è in una tasca o in una borsa.
Analizza il traffico avviato dagli utenti
Il traffico di rete avviato dall'utente può essere raggruppato in modo efficiente mentre un utente esegue un'attività specifica all'interno della tua app o distribuito in modo non uniforme quando l'utente richiede informazioni aggiuntive che l'app deve recuperare. Il tuo obiettivo nell'analizzare il traffico di rete avviato dall'utente è cercare pattern di utilizzo frequente della rete nel tempo e tentare di ridurne la frequenza raggruppando le richieste.
L'imprevedibilità delle richieste degli utenti rende difficile ottimizzare questo tipo di utilizzo della rete nella tua app. Inoltre, gli utenti si aspettano risposte rapide quando utilizzano attivamente un'app, pertanto ritardare le richieste per motivi di efficienza può portare a esperienze utente scadenti. In generale, quando un utente interagisce direttamente con la tua app, devi dare la priorità a una risposta rapida rispetto a un utilizzo efficiente della rete.
Per suggerimenti su come ottimizzare il traffico avviato dagli utenti, consulta Ottimizza le richieste avviate dagli utenti.
Analizza il traffico avviato dall'app
Il traffico di rete avviato dall'app è in genere un'area in cui puoi avere un impatto significativo sull'utilizzo efficiente della larghezza di banda della rete. Quando analizzi l'attività di rete della tua app, cerca i periodi di inattività e determina se possono essere aumentati. Se noti pattern di accesso alla rete coerenti dalla tua app, prova a raggruppare questo traffico per consentire alla radio del dispositivo di tornare alla modalità a basso consumo tra i periodi di attività.
Per i consigli su come ottimizzare il traffico avviato dall'app, consulta Ottimizza le richieste avviate dall'app.
Analizza il traffico avviato dal server
L'attività di rete avviata dai server che comunicano con la tua app è un'altra area in cui puoi avere un impatto significativo sull'utilizzo efficiente della larghezza di banda della rete. Firebase Cloud Messaging (FCM) è un meccanismo leggero utilizzato per trasmettere dati da un server a una particolare istanza dell'app. Utilizzando FCM, il tuo server può notificare alla tua app in esecuzione su un determinato dispositivo che sono disponibili nuovi dati.
Per suggerimenti su come ottimizzare il traffico avviato dal server, consulta Ottimizza le richieste avviate dal server.
Utilizza Battery Historian per visualizzare gli effetti del traffico di rete
Battery Historian è uno strumento che visualizza il consumo della batteria di un dispositivo in un periodo di tempo. Puoi utilizzare questo strumento per analizzare l'impatto dell'attività di rete sul consumo della batteria. Ad esempio, Battery Historian può mostrarti se la tua app utilizza il segnale radio cellulare più spesso del previsto. Per saperne di più sull'utilizzo di Battery Historian, consulta Profila l'utilizzo della batteria con Batterystats e Battery Historian.