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.

Neste tópico, mostramos 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 seu aplicativo. É possível monitorar como e quando seu app transfere dados e otimiza o código de forma adequada.



Figura 1. Rastreando o 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 suas transferências de dados e a quantidade de dados transferidos durante cada conexão, é possível identificar áreas do app que podem ser mais eficientes em termos de bateria. Geralmente, você procura picos curtos que podem atrasar.

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 linha de execução específica. As tags precisam ser aplicadas aos soquetes.

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

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

Por exemplo, você pode 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 suas solicitações de rede adequadamente:

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 TrafficStats.getThreadStatsTag() atual. A biblioteca também marca e desmarca os soquetes quando é reciclada por meio de pools de sinal de atividade, conforme mostrado neste exemplo de código:

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 otimizá-lo corretamente. A atividade frequente de rede gerada pelo app pode ser totalmente adequada se estiver respondendo a ações do usuário, mas completamente inapropriada se o app não estiver em 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 um usuário realiza uma tarefa específica no app ou distribuído de maneira desigual à medida que o usuário solicita mais informações que o app precisa coletar. Seu objetivo ao analisar o tráfego de rede iniciado pelo usuário é procurar padrões de uso frequente da rede ao longo do tempo e tentar diminuir a frequência 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 app. Portanto, atrasar as solicitações para aumentar a eficiência pode gerar experiências insatisfatórias. Em geral, priorize uma resposta rápida em vez do uso eficiente da rede enquanto o usuário interage diretamente com o app.

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

Analisar o tráfego iniciado pelo app

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

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

Analisar o tráfego iniciado pelo servidor

A atividade de 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. Usando o FCM, o servidor pode notificar seu app em execução em um dispositivo específico de que há novos dados disponíveis para ele.

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

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

O Battery Historian é uma ferramenta que visualiza o consumo de bateria de um dispositivo ao longo de um período. Você pode usar essa ferramenta para analisar como sua atividade de 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 saber mais sobre como usar o Battery Historian, consulte Criar perfil de uso da bateria com o Batterystats e o Battery Historian.