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 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 propia 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.

Cómo usar el Generador de perfiles de red para supervisar solicitudes

Usa el Generador de perfiles de red para realizar un seguimiento de las solicitudes de red de tu aplicación. Puedes supervisar la manera y el momento en que tu app transfiere datos y optimiza 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 drásticamente con la carga previa de solicitudes o la agrupación 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 eficiente de la batería. Por lo general, buscarás aumentos cortos que puedan retrasarse.

Para identificar mejor la causa de los aumentos 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 se deben aplicar a los sockets.

Una vez que se establece la etiqueta del subproceso, puedes etiquetar y desetiquetar de forma manual sockets individuales mediante TrafficStats.tagSocket() y TrafficStats.untagSocket(). También se aplica una etiqueta si un socket está abierto 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 el socket tenía 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 indica 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 quita la etiqueta de los 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 de forma adecuada. La actividad de red frecuente que genera tu app puede ser completamente apropiada si responde a las acciones del usuario, pero completamente inapropiada si la app no está 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 un usuario realiza una tarea específica dentro de tu app o extenderse de manera desigual a medida que el usuario solicita información adicional que tu app necesita obtener. El objetivo de analizar el tráfico de red iniciado por el usuario es buscar patrones de uso de red frecuente a lo largo del tiempo y tratar de disminuir su frecuencia agrupando las solicitudes.

La imprevisibilidad de las solicitudes de los usuarios 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 una respuesta rápida para el usuario sobre el uso eficiente de la red mientras un usuario interactúa directamente con tu app.

Si deseas obtener recomendaciones para optimizar el tráfico iniciado por el usuario, consulta Cómo optimizar solicitudes iniciadas por el usuario.

Cómo analizar 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, busca períodos de inactividad y determina si pueden aumentarse. Si ves patrones de acceso a la red coherentes desde tu app, intenta agrupar este tráfico para permitir que la radio del dispositivo vuelva al modo de bajo consumo entre períodos de actividad.

Si quieres obtener recomendaciones para optimizar el tráfico iniciado por la app, consulta Cómo optimizar 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 básico que se usa para transmitir datos de 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.

Si quieres obtener recomendaciones para optimizar el tráfico iniciado por el servidor, consulta Cómo optimizar las solicitudes iniciadas por el servidor.

Cómo usar Battery Historian para visualizar los efectos del tráfico de red

Battery Historian es una herramienta que permite visualizar el consumo de batería de un dispositivo durante un período. Puedes usar esta herramienta para analizar cómo la actividad de tu red afecta el consumo de batería. Por ejemplo, puede mostrarte si tu app usa la radio móvil con mayor frecuencia de la esperada. Si quieres obtener más información para usar Battery Historian, consulta Cómo generar perfiles del uso de batería con Batterystats y Battery Historian.