Cómo solucionar problemas de red

El tráfico de red generado por una app puede tener un impacto significativo en la duración de batería del dispositivo. Para optimizar ese tráfico, debes identificar su fuente y medirlo. Las solicitudes de red pueden provenir directamente de una acción del usuario, del código de la app o de un servidor que se comunica con ella.

En este tema, se muestra cómo supervisar y categorizar el tráfico de red, y se proporciona orientación 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 cómo y cuándo la app transfiere datos y optimiza el código subyacente de manera adecuada.



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 considerable mediante la precarga de solicitudes o el empaquetado de cargas.

Si supervisas la frecuencia de las transferencias de datos y la cantidad de datos transferidos durante cada conexión, podrás identificar las áreas de la aplicación en las que se puede hacer un uso más eficaz de la batería. Por lo general, buscarás picos cortos que se pueden retrasar.

Para identificar mejor la causa de los picos de transferencia, la API de estadísticas de tráfico te permite etiquetar las transferencias de datos que ocurren 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 se deben aplicar a los sockets.

Una vez que se establece la etiqueta de subproceso, puedes etiquetar y desmarcar manualmente los sockets individuales 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á cualquier etiqueta que el socket tenga cuando se envíen o reciban los paquetes de red (que puede ser diferente de cuando el usuario escribió o leyó los datos, debido al almacenamiento en búfer y a 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 los sockets automáticamente según el valor actual de TrafficStats.getThreadStatsTag(). La biblioteca también etiqueta y anula las etiquetas de sockets cuando se reciclan a través de grupos keep-alive, 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.

Cómo analizar el tráfico iniciado por el usuario

El tráfico de red iniciado por el usuario puede agruparse de manera eficiente mientras este realiza una tarea específica en tu app, o bien distribuirse de manera desigual 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 para optimizar el tráfico iniciado por el usuario, consulta Cómo optimizar las solicitudes que inicia el usuario.

Cómo analizar el tráfico iniciado por la app

El tráfico de red iniciado por la app suele 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 ahorro de batería entre períodos de actividad.

Para obtener recomendaciones para optimizar el tráfico iniciado por la app, consulta Cómo optimizar las solicitudes iniciadas por la app.

Cómo analizar 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 ligero que se usa para transmitir datos desde un servidor a una instancia de app en particular. Con FCM, el servidor puede notificar a la app en ejecución en un dispositivo en particular que hay nuevos datos disponibles para ella.

Para obtener recomendaciones para optimizar el tráfico iniciado por el servidor, consulta Cómo optimizar 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 celular con más frecuencia de la esperada. Para obtener más información sobre el uso de Battery Historian, consulta Cómo generar perfiles del uso de la batería con Batterystats y Battery Historian.