El tráfico de red que genera una app puede tener un impacto significativo en la duración de la batería del dispositivo. Para optimizar ese tráfico, debes medirlo e identificar su fuente. Las solicitudes de red pueden provenir directamente de una acción del usuario, del código de tu app o de un servidor que se comunica con tu app.
En este tema, se muestra cómo supervisar y categorizar el tráfico de red, y se proporcionan instrucciones para identificar y resolver problemas.
Usa el Generador de perfiles de red para supervisar las solicitudes
Usa el Generador de perfiles de red para hacer un seguimiento de las solicitudes de red de tu aplicación. Puedes supervisar la manera y el momento en que tu app transfiere datos, además de optimizar el código subyacente de manera correcta.
Figura 1: Seguimiento del tráfico de red El patrón de tráfico de red sugiere
que la eficiencia podría mejorarse de forma significativa si se realizan solicitudes de carga previa o
se agrupan las cargas.
Si supervisas la frecuencia de las transferencias de datos y la cantidad de datos que se transfieren durante cada conexión, puedes identificar las áreas de tu aplicación que se pueden mejorar para que consuman menos batería. Por lo general, buscarás picos cortos que se puedan retrasar.
Para identificar mejor la causa de los aumentos repentinos de transferencia, la API de Traffic Stats te permite etiquetar las transferencias de datos que se producen desde un socket dentro de un subproceso determinado con TrafficStats.setThreadStatsTag().
Llamar a esta función no etiqueta automáticamente todo el tráfico de un subproceso
en particular; las etiquetas deben aplicarse a los sockets.
Una vez que se establece la etiqueta de subproceso, puedes etiquetar y quitar etiquetas de sockets individuales de forma manual con TrafficStats.tagSocket() y TrafficStats.untagSocket().
También se aplica una etiqueta si se abre un socket en el subproceso o si un socket de servidor
acepta una conexión.
El acceso simultáneo al mismo socket por parte de varios subprocesos usará la etiqueta que tenía el socket cuando se enviaron o recibieron los paquetes de red (que puede ser diferente de cuando el usuario escribió o leyó los datos, debido al almacenamiento en búfer y las retransmisiones).
Por ejemplo, puedes definir constantes para representar diferentes tipos de tráfico de red, como se muestra en la siguiente muestra 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;
Luego, puedes etiquetar tus solicitudes de red según corresponda:
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 biblioteca HttpURLConnection etiqueta automáticamente los sockets según el valor actual de TrafficStats.getThreadStatsTag(). La biblioteca también etiqueta y quita las etiquetas de los sockets cuando se reciclan a través de grupos de conexiones persistentes, como se muestra en la siguiente muestra 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(); } }
Analiza tipos de tráfico de red
Cuando observas el tráfico de red que genera tu app, debes comprender de dónde proviene para poder optimizarlo correctamente. La actividad de red frecuente que genera tu app podría ser completamente razonable si responde a las acciones del usuario, pero completamente innecesaria si tu app no se está ejecutando en primer plano o si el dispositivo está guardado en un bolsillo o bolso.
Analiza el tráfico iniciado por el usuario
El tráfico de red iniciado por el usuario podría agruparse eficazmente mientras este realiza una tarea específica en tu app, o bien separarse en intervalos desiguales a medida que el usuario solicita información adicional que tu app debe obtener. El objetivo de tu análisis del tráfico de red iniciado por el usuario es buscar patrones de uso de red frecuentes en el tiempo y tratar de disminuir su frecuencia agrupando las solicitudes.
La imprevisibilidad de las solicitudes del usuario dificulta la optimización de este tipo de uso de red en tu app. Además, los usuarios esperan respuestas rápidas cuando usan activamente una app, por lo que retrasar las solicitudes por razones de eficiencia puede perjudicar la experiencia del usuario. En general, debes priorizar la respuesta rápida para el usuario sobre el uso eficiente de la red en los casos en los que el usuario interactúa de manera directa con tu app.
Para obtener recomendaciones sobre cómo optimizar el tráfico iniciado por el usuario, consulta Optimiza las solicitudes iniciadas por el usuario.
Analiza el tráfico iniciado por la app
El tráfico de red iniciado por la app suele ser un área en la que puedes tener un impacto significativo en el uso eficiente del ancho de banda de red. Cuando analices la actividad de red de tu app, identifica los períodos de inactividad y determina si puedes extenderlos. Si ves patrones de acceso a la red constantes, intenta agrupar este tráfico para permitir que la radio del dispositivo vuelva al modo de bajo consumo entre los períodos de actividad.
Para obtener recomendaciones sobre cómo optimizar el tráfico iniciado por la app, consulta Optimiza las solicitudes iniciadas por la app.
Analiza el tráfico iniciado por el servidor
La actividad de red iniciada por los servidores que se comunican con tu app también puede tener un impacto significativo en la eficiencia del ancho de banda de red. Firebase Cloud Messaging (FCM) es un mecanismo liviano que se usa para transmitir datos de un servidor a una instancia de app en particular. Con FCM, tu servidor puede notificar a la app que se ejecuta en un dispositivo específico que hay datos nuevos disponibles para ella.
Para obtener recomendaciones sobre cómo optimizar el tráfico iniciado por el servidor, consulta Optimiza las solicitudes iniciadas por el servidor.
Usa Battery Historian para visualizar los efectos del tráfico de red
Battery Historian es una herramienta que visualiza el consumo de batería de un dispositivo durante un período. Puedes usar esta herramienta para analizar cómo la actividad de red afecta el consumo de batería. Por ejemplo, Battery Historian puede mostrarte si tu app usa la radio móvil con más frecuencia de la esperada. Para obtener más información sobre cómo usar Battery Historian, consulta Cómo generar perfiles del uso de batería con Batterystats y Battery Historian.