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.