Con el marco de Android, los fabricantes de dispositivos y los desarrolladores de aplicaciones pueden utilizar datos térmicos para garantizar una experiencia de usuario (UX) consistente si un dispositivo comienza a sobrecalentarse. Por ejemplo, cuando un sistema sufre estrés térmico, los trabajos jobscheduler
se aceleran y, si es necesario, se inicia un apagado térmico del sistema. Las aplicaciones que reciben notificaciones de estrés térmico a través de una devolución de llamada registrada en la clase PowerManager
pueden ajustar elegantemente su UX.
HAL térmico
Android 9 y versiones anteriores utilizan una interfaz de sondeo definida en Thermal HAL 1.0 para obtener lecturas de temperatura. Este HAL permitió que el marco de Android y otros clientes confiables, como el HAL de un fabricante de dispositivos, leyeran la temperatura actual y los umbrales de aceleración y apagado específicos de la política del producto para cada sensor a través de la misma API.
Android 10 introdujo un sistema térmico en el marco de Android y una nueva versión de HAL, Thermal HAL 2.0, que abstrae la interfaz a los dispositivos de hardware del subsistema térmico. La interfaz de hardware incluye sensores de temperatura y termistores para la piel, la batería, la GPU, la CPU y el puerto USB. La temperatura de la piel del dispositivo es el sistema más importante a seguir para mantener la temperatura de la superficie del dispositivo dentro de los límites térmicos especificados.
Además, Thermal HAL 2.0 proporciona a múltiples clientes lecturas de sensores térmicos y niveles de gravedad asociados para indicar estrés térmico. La siguiente figura muestra dos mensajes de advertencia de la interfaz de usuario del sistema Android. Estos mensajes se muestran cuando la interfaz de devolución de llamada IThermalEventListener
para los sensores USB_PORT
y SKIN
, respectivamente, alcanza el nivel de gravedad THERMAL_STATUS_EMERGENCY
.
Figura 1. Advertencias de sobrecalentamiento.
Las temperaturas actuales se recuperan para los diferentes tipos de sensores térmicos a través de IThermal HAL . Cada llamada a función devuelve un valor de estado de SUCCESS
o FAILURE
. Si se devuelve SUCCESS
, el proceso continúa. Si se devuelve FAILURE
, se envía un mensaje de error, que debe ser legible por humanos, a status.debugMessage
.
Además de ser una interfaz de sondeo que devuelve las temperaturas actuales, puede usar la devolución de llamada IThermalChangedCallback
(HIDL, Android 10 a 13) o IThermalChangedCallback
(AIDL, Android 14 y superior) con la interfaz de devolución de llamada de clientes HAL térmicos, como el marco. servicio termal. Por ejemplo, RegisterIThermalChangedCallback
y UnregisterIThermalChangedCallback
para registrar o cancelar el registro de eventos con cambios de gravedad. Si la gravedad térmica de un sensor determinado ha cambiado, notifyThrottling
envía una devolución de llamada de evento de limitación térmica a los detectores de eventos térmicos.
Además de la información del sensor térmico, en getCurrentCoolingDevices
se expone una lista de dispositivos de enfriamiento mitigados. El orden de esta lista es persistente, incluso si un dispositivo de enfriamiento se ha desconectado. Los fabricantes de dispositivos pueden utilizar la lista para recopilar métricas statsd
.
Para obtener más información, consulte la implementación de referencia .
Si bien puedes agregar tus propias extensiones, no debes desactivar la función de mitigación térmica.
Servicio termal
En Android 10 y versiones posteriores, el servicio térmico en el marco proporciona monitoreo constante utilizando las diversas señales de mitigación de Thermal HAL 2.0 y brinda información sobre la gravedad de la limitación a sus clientes. Estos clientes incluyen componentes internos y aplicaciones de Android. El servicio utiliza dos interfaces de devolución de llamada de carpeta, IThermalEventListener
e IThermalStatusListener
, expuestas como devoluciones de llamada. El primero es para uso interno de la plataforma y del fabricante del dispositivo, y el segundo es para aplicaciones de Android.
A través de las interfaces de devolución de llamada, el estado térmico actual de un dispositivo se puede recuperar como un valor entero que oscila entre 0x00000000
(sin limitación) y 0x00000006
(apagado del dispositivo). Solo un servicio de sistema confiable, como una API de Android o una API del fabricante del dispositivo, puede acceder a la información detallada del sensor térmico y del evento térmico. La siguiente figura proporciona un modelo del flujo del proceso de mitigación térmica en Android 10 y versiones posteriores:
Figura 2. Flujo del proceso de mitigación térmica en Android 10 y versiones posteriores.
Directrices del fabricante del dispositivo
Para informar el sensor de temperatura del dispositivo y el estado de aceleración para Android 10 a 13, los fabricantes de dispositivos deben implementar el aspecto HIDL de Thermal HAL 2.0 ( IThermal.hal
).
Para informar el sensor de temperatura del dispositivo y el estado de aceleración para Android 14, los fabricantes de dispositivos deben implementar el aspecto AIDL de Thermal HAL 2.0 ( IThermal.aidl
).
Cualquier cosa que acelere el rendimiento del dispositivo, incluidas las limitaciones de energía de la batería, debe informarse a través del HAL térmico. Para garantizar que esto suceda, coloque todos los sensores que puedan indicar la necesidad de mitigación (según los cambios de estado) en el HAL térmico e informe la gravedad de las acciones de mitigación tomadas. El valor de temperatura devuelto por la lectura de un sensor no tiene que ser la temperatura real, siempre que refleje con precisión el umbral de gravedad correspondiente. Por ejemplo, puede pasar diferentes valores numéricos en lugar de los valores de umbral de temperatura reales, o puede crear bandas de protección en las especificaciones de umbral para proporcionar histéresis. Sin embargo, la gravedad correspondiente a ese valor debe coincidir con lo que se necesita en ese umbral. Por ejemplo, puede decidir devolver 72 °C como umbral de temperatura crítica, cuando la temperatura real es 65 °C y corresponde a la gravedad crítica que especificó. El nivel de gravedad debe ser preciso para lograr la mejor funcionalidad de la estructura térmica.
Para leer más sobre los niveles de umbral en el marco y cómo se corresponden con las acciones de mitigación, consulte Usar códigos de estado térmico .
Utilice API térmicas
Las aplicaciones pueden agregar y eliminar oyentes y acceder a información de estado térmico a través de la clase PowerManager
. La interfaz IThermal
proporciona toda la funcionalidad necesaria, incluida la devolución de los valores del estado térmico. La interfaz de carpeta IThermal está empaquetada como la interfaz OnThermalStatusChangedListener
, que las aplicaciones pueden usar al registrar o eliminar detectores de estado térmico.
Las API térmicas de Android tienen métodos de devolución de llamada y de sondeo para que las aplicaciones reciban notificaciones sobre los niveles de gravedad térmica a través de códigos de estado, que se definen en la clase PowerManager
. Los métodos son:
-
getCurrentThermalStatus()
devuelve el estado térmico actual del dispositivo como un número entero, a menos que el dispositivo esté siendo acelerado. -
addThermalStatusListener()
agrega un oyente. -
removeThermalStatusListener()
elimina un oyente agregado previamente.
Usar códigos de estado térmico
Los códigos de estado térmico se traducen en niveles de limitación específicos, que puede utilizar para recopilar datos y diseñar una UX óptima. Por ejemplo, las aplicaciones pueden recibir un estado de 0x00000000
( THERMAL_STATUS_NONE
), que luego podría cambiar a 0x00000001
( THERMAL_STATUS_LIGHT
). Marcar el estado 0x00000000
como t0 y luego medir el tiempo transcurrido desde el estado THERMAL_STATUS_NONE
hasta el estado THERMAL_STATUS_LIGHT
como t1 permite a los fabricantes de dispositivos diseñar y probar estrategias de mitigación para casos de uso específicos. La siguiente tabla describe formas sugeridas de utilizar los códigos de estado térmico:
Código de estado térmico | Descripción y uso sugerido |
---|---|
THERMAL_STATUS_NONE ( 0x00000000 ) | Sin estrangulamiento. Utilice este estado para implementar acciones protectoras, como detectar el inicio del período de tiempo (t0 a t1) de THERMAL_STATUS_NONE ( 0 ) a THERMAL_STATUS_LIGHT ( 1 ). |
THERMAL_STATUS_LIGHT ( 0x00000001 ) | Ligera aceleración, la UX no se ve afectada. Utilice una mitigación suave del dispositivo para esta etapa. Por ejemplo, omita el aumento o el uso de frecuencias ineficientes, pero solo en núcleos grandes. |
THERMAL_STATUS_MODERATE ( 0x00000002 ) | Limitación moderada, la UX no se ve muy afectada. La mitigación térmica afecta las actividades en primer plano, por lo que las aplicaciones deben reducir la energía de inmediato. |
THERMAL_STATUS_SEVERE ( 0x00000003 ) | Estrangulamiento severo; La UX se ve muy afectada. En esta etapa, la mitigación térmica del dispositivo debería limitar la capacidad del sistema. Este estado puede provocar efectos secundarios, como bloqueos de la pantalla y fluctuaciones del audio. |
THERMAL_STATUS_CRITICAL ( 0x00000004 ) | Platform ha hecho todo lo posible para reducir la potencia. El software de mitigación térmica del dispositivo ha colocado todos los componentes para que funcionen a su capacidad más baja. |
THERMAL_STATUS_EMERGENCY ( 0x00000005 ) | Los componentes clave de la plataforma se están apagando debido a condiciones térmicas y la funcionalidad del dispositivo es limitada. Este código de estado representa la última advertencia antes del apagado del dispositivo. En este estado, algunas funciones, como el módem y los datos móviles, están completamente desactivadas. |
THERMAL_STATUS_SHUTDOWN ( 0x00000006 ) | Apague inmediatamente. Debido a la gravedad de esta etapa, es posible que las aplicaciones no puedan recibir esta notificación. |
Los fabricantes de dispositivos deben pasar la prueba VTS para HAL térmico y pueden usar emul_temp
desde la interfaz sysfs del kernel para simular cambios de temperatura.