La energía del subsistema del dispositivo suele medirse y registrarse en un entorno de laboratorio para varias condiciones de estado estable, como cuando la pantalla está encendida o el dispositivo está en un estado de energía inactivo. Esto funciona para subsistemas con una demanda de energía constante o en condiciones que se miden fácilmente en entornos de lab, pero no para ciertos casos de uso, como cuando una pantalla muestra un video.
IPower.hal 1.0
proporciona una interfaz para pasar
sugerencias de energía y generar informes de datos acumulativos sobre las métricas de estado de suspensión del subsistema.
En Android 10 y versiones posteriores, la función de informes de estadísticas acumulativas reside en las APIs de recopilación de estadísticas de energía de IPowerStats.hal
y proporciona una forma de recuperar datos de uso de energía en el dispositivo. Esto reemplaza la parte de recopilación de estadísticas acumulativas de la interfaz IPower.hal
para lograr una separación más clara de la funcionalidad.
Las lecturas del servicio IPowerStats
no son periódicas. Ocurren en momentos clave, como cuando hay una disminución del 1% de la batería. Las lecturas son menos frecuentes cuando el agotamiento de la batería es bajo y más frecuentes cuando es alto. Los datos se pueden
volver a enviar a los servidores y se pueden usar en informes de errores para el análisis y la clasificación.
Esto respalda los esfuerzos continuos para reducir el consumo de energía y aumentar la duración de batería.
IPower.hal y IPowerStats.hal
Las interfaces IPower.hal
y
IPowerStats.hal
están disponibles en Android 10, pero la funcionalidad de recopilación de stats de IPower.hal
solo está disponible desde la interfaz IPowerStats.hal
. La funcionalidad de IPowerStats.hal
incluye APIs para adquirir y usar los datos recopilados a partir de mediciones de energía en el dispositivo para dispositivos compatibles:
- Realiza mediciones de energía a nivel del riel para clientes de baja frecuencia (
getRailInfo
) y de alta frecuencia (streamEnergyData
), y registra la energía acumulada desde el inicio. - Genera informes con información relacionada con cada
PowerEntity
compatible para el que haya datos disponibles. UnPowerEntity
es un subsistema de plataforma, un periférico o un dominio de energía que afecta el consumo total de energía del dispositivo. - Genera informes sobre el conjunto de estados de la entidad de energía (
getPowerEntityStateInfo
) para los que las entidades especificadas proporcionan datos de residencia y, luego, genera informes sobre los datos acumulados de cadaPowerEntity
especificado.
Los siguientes clientes usan las APIs de IPowerStats.hal
:
Statsd
para recopilar métricas de consumo de energía por riel.Perfetto
para correlacionar el consumo de energía con la actividad de la CPU.Batterystats
, para mejorar la atribución de batería con datos medidos en lugar de estimar el consumo de batería a partir de constantes predefinidas enpower_profile.xml.
Con Android 10 y versiones posteriores, el fabricante de un dispositivo puede elegir entre las funciones IPower.hal
y IPowerStats.hal
, pero todos los clientes deben recurrir a IPower.hal
si no se implementa IPowerStats.hal
.
Opciones de implementación de IPowerStats.hal
Solo las funciones de IPower.hal
están disponibles en Android 7 a Android 9. Los dispositivos que se actualizaron a Android 10 deben tener un subsistema de supervisión de energía de hardware o algún otro medio disponible para supervisar y registrar las estadísticas de energía. Algunos SoCs recopilan estadísticas de uso de energía por ti, o bien puedes obtener información de residencia de estado de la entidad de energía a través de software. El hardware de supervisión de energía solo es necesario para admitir getRailInfo()
, getEnergyData()
y streamEnergyData()
.
Si implementas IPowerStats.hal
sin hardware de supervisión de energía, getRailInfo(), getEnergyData()
y streamEnergyData()
muestran NOT_SUPPORTED
. Del mismo modo, getPowerEntityInfo(), getPowerEntityStateInfo()
y getPowerEntityStateResidencyData()
también pueden mostrar NOT_SUPPORTED
si no se pretende usarlo.
Estos son algunos ejemplos de datos que muestran las APIs de supervisión de trenes:
- El riel de energía de la pantalla consumió X µW.
- El riel de alimentación del módem consumió Y µW.
Estos son algunos ejemplos de datos que devuelven las APIs de estado de suspensión del subsistema:
- El módem estuvo inactivo durante X ms.
- El SoC estuvo en el estado de colapso de energía durante Y ms.
- La GPU estuvo en estado de suspensión durante Z ms.
Usa un subsistema de supervisión de energía de hardware
Si el diseño de tu dispositivo tiene un subsistema de supervisión de energía de hardware, implementa IPowerStats.hal
creando un solo nodo sysfs desde el que PowerStats.hal
pueda analizar datos, o bien crea una colección de llamadas al sistema de tipo ioctl.
Debes implementar el controlador de kernel de manera que evite el desbordamiento del acumulador. El algoritmo que se usa depende del diseño único del subsistema de supervisión de energía del hardware, que debe proporcionar mediciones instantáneas y promedio del voltaje y la corriente del bus. El controlador del kernel debe capturar estos datos de una manera que no borre los acumuladores de energía y debe mantener los datos de energía acumulados para cada subriel desde el inicio, en forma de una variable de 64 bits que se incrementa con la lectura de energía de cada consulta del acumulador.
Las estadísticas de un componente determinado (o, de manera opcional, de varios componentes) deben estar en un solo nodo. Si bien este no es un uso convencional de sysfs (que normalmente limita cada nodo a un solo valor), garantiza que todos los datos sean coherentes.
Orientación de diseño
- Mantén la latencia baja (1 ms como máximo) cuando leas desde el nodo sysfs o realices llamadas al sistema.
- Asegúrate de que la funcionalidad de estadísticas de compatibilidad no aumente de manera mesurable el consumo de energía:
- No aumentes los activadores del punto de acceso (AP) ni del subsistema para hacer un seguimiento de parámetros, como el tiempo que se pasa en el modo de suspensión.
- Transfiere estadísticas entre el procesador de apps y el firmware de manera oportunista con otro tráfico cuando sea posible.
- Si es necesario, el subsistema puede usar las siguientes funciones del controlador:
- Almacenamiento en caché de datos de forma interna para evitar latencia o activaciones a costa de datos ligeramente inactivos
- Realizar una extrapolación cuando el subsistema está inactivo para proporcionar un tiempo de inactividad actualizado sin activarlo
Elige componentes, subsistemas y estadísticas
Cuando elijas los componentes o subsistemas de los que recopilarás datos de IPowerStats.hal
, selecciona cualquier elemento del dispositivo que consuma una corriente significativa (5 mA o más) o que admita varios modos de consumo de energía, como los siguientes:
- Subsistemas de SoC individuales
- Subsistemas que se encuentran parcial o totalmente fuera del SoC, como Wi-Fi, el procesador de imágenes o el procesador de seguridad
- Periféricos, como cámaras y LED de alta potencia
- Dominios de energía que usan diferentes modos (como el dominio de energía para el SoC en su totalidad)
Personalización
Esta función opcional se puede personalizar. Diseña casos de uso y personaliza tu uso:
- Decide qué rieles medir y con qué frecuencia hacerlo.
- Decide cuándo leer los datos y cómo interpretarlos.
- Decide qué medidas tomar y cuándo hacerlo en función de tus datos.
Validación
Las pruebas de VTS garantizan que se cumplan los requisitos de Android. Los comentarios en IPowerStats.hal
se usan para verificar que un dispositivo cumpla con los requisitos.
Por ejemplo, si llamas a getRailInfo()
y no muestra nada,
la prueba de VTS falla porque no recibiste información sobre los rieles
supervisados ni un estado devuelto de SUCCESS
. Del mismo modo, si recibiste información de rieles, pero se acompañó de una respuesta NON_SUPPORTED
o FILE_SYSTEM_ERROR
, también se trata de un error. VTS verifica que se cumpla con la especificación del fabricante del dispositivo en el archivo HAL con los requisitos de los comentarios IPower.hal y IPowerStats.hal. A continuación, se muestra un ejemplo de los comentarios que se usan en las pruebas de VTS:
/** * Rail information: * Reports information related to the rails being monitored. * * @return rails Information about monitored rails. * @return status SUCCESS on success or NOT_SUPPORTED if * feature is not enabled or FILESYSTEM_ERROR on filesystem nodes * access error. */ getRailInfo() generates(vec<e;RailInfo>e; rails, Status status);