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 questo traffico, devi misurarlo e identificarne l'origine. Le richieste di rete possono provenire direttamente da un'azione dell'utente, dal tuo codice dell'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 Network Profiler per monitorare le richieste

Utilizza Network Profiler per tenere traccia delle richieste di rete della tua applicazione. Puoi monitorare come e quando l'app trasferisce i dati e ottimizzare il codice sottostante in modo appropriato.



Figura 1. Monitoraggio del traffico di rete. Il modello 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 dell'applicazione che possono essere rese più efficienti dal punto di vista della batteria. In genere, si cercano picchi brevi che possono subire ritardi.

Per identificare meglio la causa dei picchi di trasferimenti, 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 di un particolare thread; i tag devono essere applicati ai socket.

Dopo aver impostato il tag thread, puoi taggare e rimuovere manualmente i singoli socket utilizzando TrafficStats.tagSocket() e TrafficStats.untagSocket(). Un tag viene applicato anche se un socket è aperto nel thread o se un socket del server accetta una connessione.

L'accesso simultaneo allo stesso socket da più thread utilizzerà qualsiasi tag presente nel socket quando sono stati inviati o ricevuti i 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 le 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;

Puoi quindi 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 codifica automaticamente i socket in base al valore corrente di TrafficStats.getThreadStatsTag(). La libreria tagga e annulla i tag 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 conoscerne la sorgente in modo da ottimizzarlo in modo appropriato. L'attività di rete frequente generata dalla tua app potrebbe essere del tutto appropriata se risponde alle azioni degli utenti, ma del tutto inappropriata se l'app non è in primo piano o se il dispositivo è in tasca.

Analizza il traffico avviato dall'utente

Il traffico di rete avviato dall'utente può essere raggruppato in modo efficiente mentre un utente svolge un'attività specifica all'interno dell'app o distribuito in modo non uniforme quando l'utente richiede le informazioni aggiuntive necessarie per ottenere l'app. L'obiettivo dell'analisi del traffico di rete avviato dall'utente è cercare modelli di utilizzo frequente della rete nel tempo e cercare di ridurne la frequenza raggruppando le richieste.

L'imprevedibilità delle richieste degli utenti rende difficile ottimizzare questo tipo di utilizzo della rete nell'app. Inoltre, gli utenti si aspettano risposte rapide quando utilizzano attivamente un'app, quindi ritardare le richieste di efficienza può portare a esperienze utente scadenti. In generale, dovresti dare priorità a una risposta rapida all'utente piuttosto che a un uso efficiente della rete mentre un utente interagisce direttamente con l'app.

Per suggerimenti su come ottimizzare il traffico avviato dall'utente, consulta Ottimizzare le richieste avviate dall'utente.

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 di rete. Nell'analisi dell'attività di rete della tua app, cerca i periodi di inattività e determina se possono essere aumentati. Se noti pattern di accesso alla rete coerente dalla tua app, prova a raggruppare questo traffico per consentire al segnale radio del dispositivo di tornare alla modalità a basso consumo tra un periodo di attività e l'altro.

Per suggerimenti su come ottimizzare il traffico avviato dall'app, consulta Richieste avviate dall'app di Optimize.

Analizza il traffico avviato dal server

Anche l'attività di rete avviata dai server che comunicano con la tua app rappresenta in genere un'area in cui puoi avere un impatto significativo sull'utilizzo efficiente della larghezza di banda di rete. Firebase Cloud Messaging (FCM) è un meccanismo leggero utilizzato per trasmettere i dati da un server a una determinata istanza di app. Con FCM, il server può inviare una notifica all'app in esecuzione su un determinato dispositivo per comunicare la disponibilità di nuovi dati.

Per suggerimenti su come ottimizzare il traffico avviato dal server, consulta Ottimizza le richieste avviate dal server.

Usare la cronologia della batteria per visualizzare gli effetti del traffico di rete

Battery History è uno strumento che mostra il consumo della batteria di un dispositivo in un determinato periodo di tempo. Puoi usare questo strumento per analizzare in che modo l'attività di rete influisce sul consumo della batteria. Ad esempio, la cronologia della batteria può mostrarti se la tua app usa la radio cellulare più spesso del previsto. Per ulteriori informazioni sull'utilizzo della funzionalità Storico della batteria, consulta Utilizzo della batteria dei profili con le statistiche sulla batteria e la cronologia della batteria.