Administración de energía

Android 9 (nivel de API 28) presenta características nuevas para mejorar la administración de energía del dispositivo. Estos cambios, junto con las funciones que ya estaban presentes en versiones anteriores, ayudan a garantizar que se proporcionen los recursos del sistema a las apps que más los necesitan.

Las características de administración de energía se pueden clasificar en dos categorías:

Intervalos de App Standby
El sistema limita el acceso de las apps a los recursos del dispositivo, como la CPU o la batería, según los patrones de uso del usuario. Esta es una función nueva de Android 9.
Mejoras en el ahorro de batería
Cuando el ahorro de batería está activado, el sistema impone restricciones en todas las apps. Esta es una función existente que se mejoró con Android 9.

Intervalos de App Standby

Android 9 presenta una característica nueva de administración de batería: App Standby Buckets. Esta función ayuda al sistema a priorizar las solicitudes de recursos que hacen las apps según el momento y la frecuencia en que se usan. Según los patrones de uso de las apps, se coloca cada una en uno de los cinco buckets de prioridad. El sistema limita los recursos del dispositivo que están disponibles para cada app según el bucket en el que estas se encuentran.

Los cinco depósitos priorizan las apps por grupos según las siguientes características:

Activas

Una app está en el bucket activo si el usuario la está usando, por ejemplo:

  • La app inició una actividad.
  • La app está ejecutando un servicio en primer plano.
  • La app tiene un adaptador de sincronización asociado con un proveedor de contenido que usa una app en primer plano.
  • El usuario hace clic en una notificación de la app.

Si una app está en el bucket activo, el sistema no impone restricciones en los trabajos, las alarmas ni los mensajes de FCM de la app.

Conjunto de tareas

Una app está en el intervalo del conjunto de tareas si se ejecuta con frecuencia, pero no está activa en ese momento. Por ejemplo, es probable que una app de redes sociales que el usuario inicia casi todos los días esté en el entorno de trabajo. Las apps también se incluyen en el conjunto de tareas si se usan de manera indirecta.

Si una app está en el conjunto de tareas, el sistema impone restricciones leves en cuanto a su capacidad para ejecutar trabajos y activar alarmas. A fin de obtener más información, consulta Restricciones para la administración de batería.

Frecuente

Una app está en el bucket frecuente si se usa con frecuencia, pero no necesariamente todos los días. Por ejemplo, se podría incluir en el bucket frecuente una app de seguimiento de entrenamiento que el usuario ejecuta en el gimnasio.

Si una app se encuentra en el bucket frecuente, el sistema impone restricciones más fuertes en cuanto a su capacidad para ejecutar trabajos y activar alarmas, y también impone un límite para los mensajes de FCM de alta prioridad. A fin de obtener más información, consulta Restricciones para la administración de batería.

Poco frecuente

Una app se encuentra en el depósito de poco frecuentes si no se usa a menudo. Por ejemplo, una app de hotel que el usuario solo ejecuta mientras se aloja en él podría estar en este bucket.

Si una app se encuentra en el bucket poco frecuente, el sistema impone restricciones estrictas en cuanto a su capacidad para ejecutar trabajos, activar alarmas y recibir mensajes de FCM de alta prioridad. Además, el sistema limita la capacidad de la app de conectarse a Internet. A fin de obtener más información, consulta Restricciones para la administración de batería.

Nunca

Las apps instaladas y nunca ejecutados se asignan al depósito de las nunca ejecutadas. El sistema impone restricciones severas sobre estas apps.

El sistema asigna de forma dinámica cada app a un bucket de prioridad y las reasigna según sea necesario. El sistema puede depender de una app precargada que utiliza el aprendizaje automático para determinar la probabilidad de uso de cada app y asigna las apps a los intervalos correspondientes. Si no está la app del sistema en el dispositivo, el sistema establece de forma predeterminada la ordenación de las apps en función de su uso reciente. Se asignan más apps activas a los buckets que dan mayor prioridad a las apps, lo que hace que haya más recursos del sistema disponibles para la app. En particular, el bucket determina la frecuencia con la que se ejecutan los trabajos de la app, con qué frecuencia la app puede activar alarmas y con qué frecuencia puede recibir mensajes de Firebase Cloud Messaging (FCM) de alta prioridad. Estas restricciones se aplican solo mientras el dispositivo funciona con batería; el sistema no impone estas restricciones a las apps mientras se carga el dispositivo.

Cada fabricante puede establecer sus propios criterios sobre cómo se asignan las apps no activas a los buckets. No debes intentar influir en a qué bucket se asigna tu app. En cambio, concéntrate en asegurarte de que tenga un buen funcionamiento en cualquier bucket en el que se encuentre. Tu app puede averiguar en qué intervalo se encuentra llamando al método nuevo UsageStatsManager.getAppStandbyBucket().

Prácticas recomendadas

Si tu app ya sigue las prácticas recomendadas para Descanso y App Standby, no debería resultar difícil controlar las nuevas funciones de administración de batería. Sin embargo, el comportamiento de algunas apps que antes funcionaban bien ahora puede causar problemas.

  • No intentes manipular el sistema para poner tu app en un solo intervalo. Los métodos de agrupamiento del sistema pueden cambiar, y cada fabricante de dispositivos puede optar por escribir su propia app de agrupamiento con su propio algoritmo. En cambio, debes asegurarte de que tu app se comporte de manera correcta, sin importar en qué bucket se encuentre.
  • Si una app no tiene una actividad de selector, es posible que nunca se incluya en el bucket activo. Te recomendamos que vuelvas a diseñar tu app para incluir esta actividad.
  • Si las notificaciones de la app no son prácticas, los usuarios no podrán activar su inclusión en el bucket activo cuando interactúen con las notificaciones. En este caso, te recomendamos que vuelvas a diseñar algunas notificaciones adecuadas para que permitan una respuesta del usuario. Para ver algunos lineamientos, consulta los patrones de diseño de las notificaciones de Material Design.
  • Del mismo modo, si la app no muestra una notificación cuando recibe un mensaje de FCM de alta prioridad, no le dará al usuario la oportunidad de interactuar con la app y, por lo tanto, incluirla en el bucket activo. De hecho, el único uso previsto para los mensajes de FCM de alta prioridad es enviar una notificación al usuario, por lo que esta situación nunca debería ocurrir. Si marcas de manera inapropiada un mensaje de FCM como de prioridad alta cuando no activa la interacción con el usuario, puede haber otras consecuencias negativas. Por ejemplo, puede hacer que tu app agote su cuota y hacer que los mensajes de FCM realmente urgentes se traten como de prioridad normal.

    Nota: Si el usuario descarta una notificación en forma reiterada, el sistema le brinda la opción de bloquear esa notificación en el futuro. No envíes spam al usuario con notificaciones solo para tratar de mantener tu app en el bucket activo.

  • Si se dividen las apps en varios paquetes, estos pueden estar en diferentes buckets y, por lo tanto, tener diferentes niveles de acceso. Debes asegurarte de probar esas apps con los paquetes asignados a varios buckets para asegurarte de que la app se comporte correctamente.

Mejoras en el ahorro de batería

En Android 9 se introducen varias mejoras en el modo de ahorro de batería. El fabricante del dispositivo determina las restricciones precisas que se imponen. Por ejemplo, en las compilaciones de AOSP, el sistema aplica las siguientes restricciones:

  • El sistema pone las apps en modo App Standby de manera más agresiva, en lugar de esperar a que estén inactivas.
  • Los límites de ejecución en segundo plano se aplican a todas las apps, independientemente de su nivel de API objetivo.
  • Los servicios de ubicación pueden inhabilitarse cuando la pantalla está apagada.
  • Las apps que se ejecutan en segundo plano no tienen acceso a la red.

A su vez, existen otras optimizaciones de energía específicas para dispositivos. Para obtener información detallada, consulta la página en la que se describen las restricciones para la administración de batería.

Como siempre, te recomendamos probar tu app mientras el Ahorro de batería esté activo. Puedes activar el ahorro de batería de forma manual desde la pantalla Configuración > Ahorro de batería del dispositivo.

Pruebas y solución de problemas

Las nuevas funciones de administración de batería afectan a todas las apps que se ejecutan en dispositivos con Android 9, independientemente de que se orienten a Android 9 o no. Es importante que te asegures de que tu app se comporte correctamente en estos dispositivos.

Asegúrate de probar los principales casos de uso de tu app en distintas condiciones para ver cómo las funciones de administración de batería interactúan entre sí. Puedes usar los comandos de Android Debug Bridge para activar y desactivar algunas de las funciones.

Comandos de Android Debug Bridge

Para probar varias de las funciones de administración de batería, puedes usar los comandos de shell de Android Debug Bridge.

Si deseas obtener información sobre cómo usar adb para poner el dispositivo en Descanso, consulta Pruebas con los modos Descanso y App Standby.

Intervalos de App Standby

Con App Standby, puedes asignar manualmente tu app a un intervalo de esta función. Para cambiar el bucket de una app, usa el siguiente comando:

$ adb shell am set-standby-bucket packagename active|working_set|frequent|rare

También puedes usar ese comando para configurar varios paquetes a la vez:

$ adb shell am set-standby-bucket package1 bucket1 package2 bucket2...

Para comprobar en qué intervalo se encuentra una app, ejecuta lo siguiente:

$ adb shell am get-standby-bucket [packagename]

Si no pasas un parámetro de packagename (nombre de paquete), el comando enumerará los intervalos de todas las apps. Una app también puede identificar su intervalo en el tiempo de ejecución llamando al nuevo método UsageStatsManager.getAppStandbyBucket().

Ahorro de batería

Existen varios comandos para probar la manera en que se comporta tu app en condiciones de bajo nivel de batería.

Para simular la desconexión del dispositivo de la corriente, usa el comando

$ adb shell dumpsys battery unplug

Para probar la manera en que se comporta el dispositivo en condiciones de bajo nivel de batería, usa este comando:

$ adb shell settings put global low_power 1

Una vez que hayas finalizado la prueba, puedes deshacer la configuración manual del dispositivo con este comando:

$ adb shell dumpsys battery reset