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 para Android 9.
Mejoras en el Ahorro de batería
Cuando está activado el ahorro de batería, 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 en que se usan y la frecuencia de uso. En función de los patrones de uso de las apps, se coloca cada una en uno de los cinco grupos de prioridad. El sistema limita los recursos del dispositivo que están disponibles para cada app según el intervalo en el que estas se encuentran.

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

Activo

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

Conjunto de tareas

Una app está en el bucket 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 área 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 intervalo 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 en 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 ese hotel puede 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 buckets correspondientes. Si no está la app del sistema en el dispositivo, el sistema establece de forma predeterminada el orden 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 y hacen 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, la frecuencia con la que la app puede activar alarmas y la frecuencia con la que la app puede recibir mensajes de alta prioridad de Firebase Cloud Messaging (FCM). Estas restricciones se aplican solo cuando el dispositivo funciona con batería; el sistema no impone estas restricciones a las apps cuando se está cargando 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 identificar en qué intervalo se encuentra llamando al nuevo método UsageStatsManager.getAppStandbyBucket().

Prácticas recomendadas

Si tu app ya sigue las prácticas recomendadas para Descanso y App Standby, controlar las nuevas funciones de administración de batería no debería ser difícil. 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 bucket. 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. Tal vez te convenga rediseñar tu app para tener 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 rediseñes 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 ella 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 incorrecta un mensaje de FCM como de prioridad alta cuando no activa la interacción del usuario, puede haber otras consecuencias negativas. Por ejemplo, puede hacer que tu app agote su cuota, lo que hace 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 intentar mantener tu app en el intervalo 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 más información, 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.

Prueba y solución de problemas

Las nuevas funciones de administración de batería afectan a todas las apps que se ejecutan en dispositivos Android 9, independientemente de si las apps se orientan a Android 9. 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