Risolvere i problemi di rete

Il traffico di rete generato da un'app può avere un impatto significativo sulla durata della batteria del dispositivo. Per ottimizzare il traffico, devi misurarlo e identificarne la 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 argomento mostra come monitorare e classificare il traffico di rete e fornisce indicazioni su come identificare e risolvere i problemi.

Utilizzare Profiler di rete 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 in modo appropriato.



Figura 1. Monitoraggio del traffico di rete. Il pattern di traffico di rete suggerisce che l'efficienza potrebbe essere notevolmente migliorata precaricando le richieste o raggruppando i caricamenti.

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 del consumo della batteria. In genere, cercherai picchi brevi che possono essere ritardati.

Per identificare meglio la causa dei picchi di trasferimento, l'API Traffic Stats 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 particolare thread; i tag devono essere applicati ai socket.

Una volta impostato il tag del thread, puoi taggare e rimuovere il tag manualmente dai singoli socket utilizzando TrafficStats.tagSocket() e TrafficStats.untagSocket(). Un tag viene applicato anche se viene aperta una socket sul thread o se una socket del server accetta una connessione.

L'accesso simultaneo allo stesso socket da parte di più thread utilizzerà il tag che il socket aveva al momento dell'invio o della ricezione dei pacchetti di rete (che potrebbe essere diverso da quello in cui 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:

Kotlin

const val USER_INITIATED = 0x1000
const val APP_INITIATED = 0x2000
const val SERVER_INITIATED = 0x3000

Java

public static final int USER_INITIATED = 0x1000;
public static final int APP_INITIATED = 0x2000;
public static final int SERVER_INITIATED = 0x3000;

A questo punto puoi taggare le richieste di rete di conseguenza:

Kotlin

TrafficStats.setThreadStatsTag(USER_INITIATED)
TrafficStats.tagSocket(outputSocket)
// Transfer data using socket
TrafficStats.untagSocket(outputSocket)

Java

TrafficStats.setThreadStatsTag(USER_INITIATED);
TrafficStats.tagSocket(outputSocket);
// Transfer data using socket
TrafficStats.untagSocket(outputSocket);

La libreria HttpURLConnection tagga automaticamente i socket in base al valore corrente di TrafficStats.getThreadStatsTag(). La libreria tagga e rimuove i tag dai socket anche quando vengono riciclati tramite pool keep-alive, come mostrato nel seguente esempio di codice:

Kotlin

class IdentifyTransferSpikeTask {
    @WorkerThread
    fun request(url: String) {
        TrafficStats.setThreadStatsTag(APP_INITIATED)
        // Make network request using HttpURLConnection.connect()
        ...
        TrafficStats.clearThreadStatsTag()
    }
}

Java

public class IdentifyTransferSpikeTask {
    @WorkerThread
    public void request(String url) {
        TrafficStats.setThreadStatsTag(APP_INITIATED);
        // Make network request using HttpURLConnection.connect()
        ...
        TrafficStats.clearThreadStatsTag();
    }
}

Analizzare 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. L'attività di rete frequente generata dalla tua app potrebbe essere del tutto appropriata se risponde alle azioni dell'utente, ma completamente inappropriata se la tua app non è in primo piano o se il dispositivo è in una tasca o in una borsa.

Analizzare il traffico avviato dagli utenti

Il traffico di rete avviato dall'utente può essere raggruppato in modo efficiente mentre l'utente esegue un'attività specifica all'interno dell'app o distribuito in modo irregolare man mano che l'utente richiede ulteriori informazioni che l'app deve ottenere. Il tuo obiettivo nell'analisi del traffico di rete avviato dall'utente è cercare pattern di utilizzo frequente della rete nel tempo e tentare di diminuirne 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, quindi ritardare le richieste per efficienza può portare a esperienze utente scadenti. In generale, devi dare la priorità a una risposta rapida all'utente rispetto all'uso efficiente della rete mentre un utente interagisce direttamente con la tua app.

Per i suggerimenti per ottimizzare il traffico avviato dagli utenti, consulta Ottimizzare le richieste avviate dagli utenti.

Analizzare il traffico avviato dall'app

Il traffico di rete avviato dalle app è in genere un'area in cui puoi avere un impatto significativo sull'uso efficiente della larghezza di banda della rete. Nell'analizzare l'attività di rete della tua app, cerca periodi di inattività e determina se possono essere aumentati. Se noti schemi di accesso alla rete coerenti dalla tua app, prova a raggruppare questo traffico per consentire alla radio del dispositivo di tornare in modalità a basso consumo energetico tra i periodi di attività.

Per suggerimenti sull'ottimizzazione del traffico avviato da app, consulta la sezione Ottimizzare le richieste avviate da app.

Analizzare il traffico avviato dal server

L'attività di rete avviata dai server che comunicano con la tua app è in genere un'area in cui puoi avere un impatto significativo sull'uso 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 server può notificare all'app in esecuzione su un determinato dispositivo che sono disponibili nuovi dati.

Per suggerimenti sull'ottimizzazione del traffico avviato dal server, consulta la sezione Ottimizzare le richieste avviate dal server.

Utilizzare 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 determinato periodo di tempo. Puoi utilizzare questo strumento per analizzare in che modo l'attività di rete influisce sul consumo della batteria. Ad esempio, Battery Historian può mostrare se la tua app utilizza la radio cellulare più spesso del previsto. Per ulteriori informazioni sull'utilizzo di Battery Historian, consulta Profilare l'utilizzo della batteria con Batterystats e Battery Historian.