Cómo solucionar problemas de red

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.