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, é necessário medi-lo e identificar a origem dele. As solicitações de rede podem vir diretamente de uma ação do usuário, do próprio código do 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 acompanhar as solicitações de rede do seu aplicativo. Você pode monitorar como e quando seu app transfere dados e otimizar o código subjacente adequadamente.
Figura 1. Acompanhamento do tráfego de rede. O padrão de tráfego de rede sugere que a eficiência pode ser drasticamente melhorada ao pré-buscar solicitações ou agrupar uploads.
Ao monitorar a frequência das suas transferências de dados e a quantidade de dados transferidos durante cada conexão, você pode identificar áreas do aplicativo que podem ser mais eficientes em termos de bateria. Em geral, você precisa procurar picos curtos que possam ser atrasados.
Para identificar melhor a causa dos picos de transferência, a API Traffic Stats permite que você marque 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 sockets.
Depois que a tag de encadeamento é definida, é possível marcar e desmarcar manualmente soquetes individuais
usando
TrafficStats.tagSocket()
e
TrafficStats.untagSocket()
.
Uma tag também é 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á qualquer tag que o soquete tinha quando os pacotes de rede foram enviados ou recebidos. Isso pode ser diferente de quando o usuário gravou ou leu os dados, devido ao buffer e às retransmissões.
Por exemplo, é possível definir constantes para representar diferentes tipos de tráfego de rede, conforme mostrado neste exemplo de código:
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, marque suas solicitações de rede de acordo com o seguinte:
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 os soquetes quando é reciclada por meio de pools com sinal de atividade, 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 de rede frequente 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 ele realiza uma tarefa específica no app ou distribuído de forma desigual enquanto o usuário solicita mais informações que o app precisa disponibilizar. Sua meta 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 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 de rede do app, procure períodos de inatividade e determine se é possível aumentá-los. Se você notar padrões de acesso consistente à rede do 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 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 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 durante um período. Use essa ferramenta para analisar como sua atividade de rede afeta o consumo de 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 o uso do Battery Historian, consulte Perfil de uso da bateria com o Batterystats e o Battery Historian.