Cómo optimizar el acceso a la red

El uso de la radio inalámbrica para transferir datos es quizás una de las fuentes más importantes de consumo de la batería de tu app. Con el fin de minimizar el consumo de la batería asociado con la actividad de red, es esencial que comprendas cómo el modelo de conectividad afecta al hardware subyacente de la radio.

En esta sección, se presenta la máquina de estado de la radio inalámbrica y se explica cómo el modelo de conectividad de la app interactúa con ella. Luego, ofrece varias técnicas lo que, cuando se siga, ayudará a minimizar el efecto de los datos de tu app consumo en la batería.

Máquina de estado de radio

La radio inalámbrica del dispositivo de tu usuario tiene funciones integradas de ahorro de energía que ayudan a minimizar la cantidad de batería que consume. Cuando está completamente activa, la radio inalámbrica consume una gran cantidad de energía, pero cuando está inactiva o en modo de espera, consume muy poca energía.

Es importante recordar que la radio no puede pasar del modo en espera totalmente activa instantáneamente. Hay un período de latencia asociado "encendiendo" la radio. Por lo tanto, la batería pasa de estados de energía más altos a estados de energía más bajos lentamente para conservar la energía cuando no está en uso, mientras se intenta minimizar la latencia asociada con el "encendido" de la radio.

La máquina de estado de una radio de red 3G típica consta de tres estados de energía:

  • Energía completa: Se utiliza cuando una conexión está activa, lo que permite que el dispositivo transfiera datos a la máxima velocidad posible.
  • Energía baja: Es un estado intermedio que reduce el consumo de energía de la batería en un cerca del 50%.
  • En espera: Es el estado de consumo de energía mínimo durante el cual no se requiere ni se activa ninguna conexión de red.

Si bien los estados "energía baja" y "en espera" consumen mucha menos batería, también presentan una latencia significativa para las solicitudes de red. Volviendo a la potencia completa de el estado bajo tarda alrededor de 1.5 segundos y pasa del modo de espera al de energía completa puede tardar más de 2 segundos.

Para minimizar la latencia, la máquina de estado usa un retraso para posponer la transición a estados de energía más baja. En la figura 1, se muestran los tiempos de AT&T para una radio 3G típica.


Figura 1: Máquina de estado de radio inalámbrica 3G convencional

La máquina de estado de radio en cada dispositivo, en particular la transición asociada ("tiempo de cola") y latencia de inicio variarán en función de la latencia tecnología utilizada (3G, LTE, 5G, etc.), y está definida y configurada por la red del operador a través de la cual funciona el dispositivo.

En esta página, se describe una máquina de estado representativa para una red inalámbrica 3G típica de radio, en función de los datos proporcionados por AT&T. Sin embargo, los principios generales y las prácticas recomendadas resultantes se aplican a todas las implementaciones de radio inalámbrica.

Este enfoque es muy eficaz para la navegación web típica en dispositivos móviles, ya que evita la latencia no deseada mientras los usuarios navegan por la Web. El tiempo de cola relativamente bajo también garantiza que, una vez que haya finalizado la sesión de navegación, la radio pueda pasar a un estado de menor energía.

Lamentablemente, este enfoque puede conducir a apps ineficaces en los sistemas operativos de smartphones modernos como Android, donde las apps se ejecutan tanto en primer plano (donde la latencia es importante) como en segundo plano (donde se debe priorizar la duración de la batería).

Qué tipo de impacto tienen las apps en la máquina de estado de radio

Cada vez que creas una nueva conexión de red, la radio pasa al estado de energía completa. En el caso de la típica máquina de estado de radio 3G descrita antes, permanecerá con energía completa durante tu transferencia, además 5 segundos adicionales de tiempo de cola, seguidos de 12 segundos en el para cada estado. Para un dispositivo 3G típico, cada sesión de transferencia de datos radio para extraer energía durante al menos 18 segundos.

En la práctica, esto significa que una app que realiza una transferencia de datos tres veces por minuto, mantendrá la radio inalámbrica siempre activa y la moverá cuando entra en modo de espera.


Figura 2: Uso de energía de radio inalámbrica relativa para una transferencia de un segundo que se ejecuta tres veces por minuto La figura no incluye la latencia de "encendido" entre ejecuciones.

En comparación, si la misma app empaqueta sus transferencias de datos y ejecuta un solo de tres segundos cada minuto, esto mantendría la radio en la un total de solo 20 segundos por minuto. Esto permitiría que la radio están en espera durante 40 segundos de cada minuto, lo que da como resultado una de reducción en el consumo de la batería.


Figura 3: Uso de energía de la radio inalámbrica relativa para transferencias de tres segundos se ejecuta una vez por minuto.

Técnicas de optimización

Ahora que comprendes cómo el acceso a la red afecta la duración de la batería, hablemos sobre algunas medidas que puedes tomar para reducir el consumo de batería y, al mismo tiempo, proporcionar una experiencia del usuario fluida y rápida.

Transferencias de datos de paquetes

Como se indicó en la sección anterior, es mejor agrupar sus transferencias de datos para transferir más datos con menos frecuencia es una de las mejores formas de mejorar la batería eficiencia.

Por supuesto, esto no siempre es posible si tu app necesita recibir o enviar datos de inmediato en respuesta a una acción del usuario. Para mitigar esto, puedes anticiparte y precargar los datos. Otras situaciones, como enviar registros o estadísticas a un servidor y otras transferencias de datos no urgentes que inicia la app, se prestan muy bien para el procesamiento por lotes y el empaquetado. Consulta Optimización iniciado por la app tareas para sugerencias para programar transferencias de red en segundo plano.

Carga previa de datos

La precarga de datos es otra forma eficaz de reducir el número de las sesiones de transferencia de datos que ejecuta tu app. Con la carga previa, cuando el usuario realiza una acción en tu app, esta anticipa qué datos es más probable necesarias para la siguiente serie de acciones del usuario y recupera esos datos de una sola en picos de actividad en una única conexión a su capacidad máxima.

Mediante la carga de las transferencias, se reduce la cantidad de activaciones de radio necesarias para descargar los datos. Como resultado, no solo se conserva la vida útil de la batería, sino que también se mejora la latencia, se reduce el ancho de banda requerido y se reducen los tiempos de descarga.

La carga previa también proporciona una experiencia del usuario mejorada, ya que minimiza la latencia en la app causada por esperar a que se completen las descargas antes de realizar una acción o mostrar datos.

Este es un ejemplo práctico.

Lector de noticias

Muchas apps de noticias intentan reducir el ancho de banda descargando titulares solo después de que se ha seleccionado una categoría, artículos completos solo cuando el usuario quiere leerlos y miniaturas cuando se desplaza la vista.

Con este enfoque, la radio se ve obligada a permanecer activa durante la sesión de lectura de noticias de la mayoría de los usuarios a medida que se desplazan por los titulares, cambian las categorías y leen artículos. Además, el cambio constante entre estados de energía genera una latencia significativa cuando se cambia de categoría o se leen artículos.

Un mejor enfoque es precargar una cantidad razonable de datos durante el inicio, comenzando con el primer conjunto de miniaturas y titulares de noticias (lo que garantiza un tiempo de inicio de baja latencia) y continuando con el resto de las miniaturas y titulares, así como el texto de cada artículo disponible, al menos, en la lista de titulares principal.

Otra alternativa es precargar todos los titulares; miniaturas; textos del artículo; y, posiblemente, imágenes completas del artículo (en general, en segundo plano y en un horario predeterminado). Con este enfoque, se corre el riesgo de dedicar una gran cantidad de ancho de banda y duración de la batería a la descarga de contenido que nunca se usará, por lo que debe implementarse con precaución.

Consideraciones adicionales

Si bien la precarga de datos tiene muchos beneficios, si se usa demasiado, también presenta el riesgo de aumentar el consumo de batería y el ancho de banda, así como la cuota de descarga, ya que se descargan datos que no se usan. También es importante garantizar que la precarga no retrase el inicio de la app mientras la app espera a que se complete. En términos prácticos, podría significar procesar datos de forma progresiva o iniciar transferencias consecutivas con prioridad para que los datos necesarios para el inicio de la aplicación se descarguen y se procesen antes de empezar.

La intensidad de la carga previa de los datos depende del tamaño de los datos descargado y la probabilidad de que se use. A modo de guía, en función del de estado descrita anteriormente para los datos que tienen un 50% de probabilidades de usarse en la sesión de usuario actual, puedes realizar una carga previa durante 6 segundos aproximadamente (aproximadamente entre 1 y 2 megabytes) antes del costo potencial de descargar archivos de datos coincide con el ahorro potencial de no descargarlos.

En términos generales, te recomendamos precargar los datos de modo que solo tengas que iniciar otra descarga cada 2 a 5 minutos y en el orden de 1 a 5 megabytes.

Según este principio, las descargas grandes, como los archivos de video, deben descargados en fragmentos a intervalos regulares (cada 2 a 5 minutos), de manera efectiva carga previa solo de los datos de video que se podrían ver en los próximos minutos

Una solución es programar la descarga completa para que se produzca solo cuando haya conexión a Wi-Fi y, posiblemente, solo cuando el dispositivo se esté cargando. El API de WorkManager admite exactamente este caso de uso, lo que permite restringir el trabajo en segundo plano hasta que el dispositivo cumpla con los criterios especificados por el desarrollador, como la carga y estableciendo conexión con la red Wi-Fi.

Comprueba la conectividad antes de realizar solicitudes

La búsqueda de señal celular es una de las operaciones que más consumen la batería de un dispositivo móvil. Una práctica recomendada para las solicitudes que inicia el usuario es comprobar primero si hay una conexión con ConnectivityManager, como se muestra en Cómo supervisar el estado de conectividad y la medición de la conexión. Si no hay ninguna red, la app puede evitar que la radio móvil realice búsquedas para ahorrar batería. La solicitud se puede programar y realizar en un lote con otras las solicitudes cuando se realiza una conexión.

Conexiones del grupo

Una estrategia adicional que puede ayudar, además de la agrupación por lotes y la precarga, es agrupar las conexiones de red de tu app.

En general, es más eficiente reutilizar las conexiones de red existentes que iniciar otras nuevas. La reutilización de conexiones también permite a la red de manera más inteligente ante la congestión y los problemas de datos de red relacionados.

HttpURLConnection y la mayoría de los clientes HTTP, como OkHttp, habilitan el grupo de conexiones de forma predeterminada y reutilizan la misma conexión para varias solicitudes.

Resumen y mirada al futuro

En esta sección, aprendiste mucho sobre la radio inalámbrica y algunas estrategias. que puedes aplicar de forma general para brindar una experiencia del usuario rápida y responsiva, a la vez que reduciendo el agotamiento de la batería.

En la próxima sección, veremos en detalle tres tipos distintos de interacciones de red comunes a la mayoría de las apps. Aprenderás los impulsores de cada uno de estos tipos, así como las técnicas y las APIs modernas para administrar estas interacciones de manera eficiente.