Resolver problemas de rede

O tráfego de rede gerado por um app pode ter um impacto significativo na duração da bateria do dispositivo. Para otimizar esse tráfego, você precisa medi-lo e identificar a origem dele. As solicitações de rede podem vir diretamente de uma ação do usuário, do código do seu app ou de um servidor que se comunica com o app.

Este tópico mostra como monitorar e categorizar o tráfego de rede e fornece orientações sobre como identificar e resolver problemas.

Usar o Network Profiler para monitorar solicitações

Use o Network Profiler para rastrear as solicitações de rede do aplicativo. É possível monitorar como e quando o app transfere dados e otimizar o código de forma adequada.



Figura 1. Monitoramento do tráfego de rede. O padrão de tráfego de rede sugere que a eficiência pode ser drasticamente melhorada com a pré-busca de solicitações ou o agrupamento de uploads.

Ao monitorar a frequência das transferências de dados e a quantidade de dados transferidos durante cada conexão, é possível identificar áreas do aplicativo que podem ser mais eficientes em termos de bateria. Em geral, você vai procurar picos curtos que podem ser atrasados.

Para identificar melhor a causa dos picos de transferência, a API Traffic Stats permite marcar as transferências de dados que ocorrem de um soquete em uma determinada linha de execução usando TrafficStats.setThreadStatsTag(). Chamar essa função não marca automaticamente todo o tráfego de uma determinada linha de execução. As tags precisam ser aplicadas aos soquetes.

Depois que a tag de linha de execução for definida, você poderá marcar e desmarcar manualmente soquetes individuais usando TrafficStats.tagSocket() e TrafficStats.untagSocket(). Uma tag também é aplicada se um soquete é aberto na linha de execução ou se um soquete de servidor aceita uma conexão.

O acesso simultâneo ao mesmo soquete por várias linhas de execução usará qualquer tag que o soquete tinha quando os pacotes de rede foram enviados ou recebidos (que pode ser diferente de quando o usuário gravou ou leu os dados, devido ao armazenamento em buffer e às retransmissões).

Por exemplo, é possível definir constantes para representar diferentes tipos de tráfego de rede, conforme mostrado no exemplo de código a seguir:

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;

Em seguida, você pode marcar as solicitações de rede de acordo:

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);

A biblioteca HttpURLConnection marca automaticamente os soquetes com base no valor atual de TrafficStats.getThreadStatsTag(). A biblioteca também marca e desmarca soquetes quando reciclados por pools de keep-alive, conforme mostrado no exemplo de código a seguir:

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();
    }
}

Analisar tipos de tráfego de rede

Ao analisar o tráfego de rede gerado pelo app, é preciso entender a origem do tráfego para poder otimizá-lo corretamente. A atividade frequente de rede gerada pelo app poderá ser totalmente correta se estiver respondendo a ações do usuário, mas completamente incorreta se o app não estiver no primeiro plano ou se o dispositivo estiver dentro do bolso ou da mochila.

Analisar o tráfego iniciado pelo usuário

O tráfego de rede iniciado pelo usuário pode ser agrupado de forma eficiente enquanto o usuário está realizando uma tarefa específica no app ou distribuído de forma desigual conforme o usuário solicita mais informações que o app precisa receber. Sua meta ao analisar o tráfego de rede iniciado pelo usuário é observar padrões de uso frequente da rede ao longo do tempo e tentar diminuir a frequência deles agrupando as solicitações.

A imprevisibilidade das solicitações do usuário dificulta a otimização desse tipo de uso de rede no app. Além disso, os usuários esperam respostas rápidas quando estão usando um aplicativo. Portanto, atrasar as solicitações para aumentar a eficiência pode resultar em experiências insatisfatórias. Em geral, priorize uma resposta rápida em detrimento do uso eficiente da rede enquanto o usuário interage diretamente com o app.

Para recomendações sobre como otimizar o tráfego iniciado pelo usuário, consulte Otimizar solicitações iniciadas pelo usuário.

Analisar o tráfego iniciado pelo app

Em geral, o tráfego de rede iniciado pelo app é uma área em que pode haver um impacto significativo sobre o uso eficiente da largura de banda da rede. Ao analisar a atividade da rede do app, procure períodos de inatividade e determine se eles podem ser aumentados. Se você notar padrões de acesso persistente à rede no app, tente agrupar esse tráfego para permitir que o rádio do dispositivo volte ao modo de baixo consumo de energia entre os períodos de atividade.

Para recomendações sobre como otimizar o tráfego iniciado pelo app, consulte Otimizar solicitações iniciadas pelo app.

Analisar o tráfego iniciado pelo servidor

A atividade da rede iniciada por servidores que se comunicam com o app também costuma ser uma área em que pode haver um impacto significativo sobre o uso eficiente da largura de banda da rede. O Firebase Cloud Messaging (FCM) é um mecanismo leve usado para transmitir dados de um servidor para uma instância de app específica. Com o FCM, seu servidor pode notificar o app em execução em um dispositivo específico de que há novos dados disponíveis para ele.

Para recomendações sobre como otimizar o tráfego iniciado pelo servidor, consulte Otimizar solicitações iniciadas pelo servidor.

Usar o Battery Historian para visualizar os efeitos do tráfego de rede

O Battery Historian é uma ferramenta que mostra o consumo de bateria de um dispositivo ao longo de um período. Use essa ferramenta para analisar como a atividade da rede afeta o consumo da bateria. Por exemplo, o Battery Historian pode mostrar se o app está usando o rádio celular com mais frequência do que o esperado. Para mais informações sobre como usar o Battery Historian, consulte Gerar perfil do uso da bateria com Batterystats e Battery Historian.