Mitigação térmica

Com o framework do Android, fabricantes de dispositivos e desenvolvedores de apps podem usar dados térmicos para garantir uma experiência do usuário (UX) consistente se um dispositivo começar a superaquecer. Por exemplo, quando um sistema passa por estresse térmico, os jobs jobscheduler são limitados e, se necessário, um desligamento térmico do framework é iniciado. Os apps que recebem notificações de estresse térmico por um callback registrado na classe PowerManager podem ajustar a experiência do usuário de maneira adequada.

HAL térmica

O Android 9 e versões anteriores usam uma interface de polling definida na HAL térmica 1.0 para receber leituras de temperatura. Essa HAL permitia que o framework do Android e outros clientes confiáveis, como a HAL de um fabricante de dispositivos, lessem a temperatura atual e os limites de redução e desligamento específicos da política do produto para cada sensor usando a mesma API.

O Android 10 introduziu um sistema térmico no framework do Android e uma nova versão da HAL, a Thermal HAL 2.0, que abstrai a interface para os dispositivos de hardware do subsistema térmico. A interface de hardware inclui sensores de temperatura e termistores para a pele, bateria, GPU, CPU e porta USB. A temperatura da superfície do dispositivo é o sistema mais importante para monitorar e manter a temperatura dentro dos limites térmicos especificados.

Além disso, a HAL térmica 2.0 fornece a vários clientes leituras de sensores térmicos e níveis de gravidade associados para indicar estresse térmico. A figura a seguir mostra duas mensagens de aviso da interface do sistema Android. Essas mensagens são exibidas quando a interface de callback IThermalEventListener para os sensores USB_PORT e SKIN, respectivamente, atinge o nível de gravidade THERMAL_STATUS_EMERGENCY.

Avisos de superaquecimento.

Figura 1. Avisos de superaquecimento.

As temperaturas atuais são recuperadas para os diferentes tipos de sensores térmicos usando IThermal HAL. Cada chamada de função retorna um valor de status de SUCCESS ou FAILURE. Se SUCCESS for retornado, o processo vai continuar. Se FAILURE for retornado, uma mensagem de erro legível será enviada para status.debugMessage.

Além de ser uma interface de pesquisa que retorna as temperaturas atuais, você pode usar o callback IThermalChangedCallback (HIDL, Android 10 a 13) ou IThermalChangedCallback (AIDL, Android 14 e versões mais recentes) com a interface de callback de clientes HAL térmicos, como o serviço térmico do framework. Por exemplo, RegisterIThermalChangedCallback e UnregisterIThermalChangedCallback para registrar ou cancelar o registro de eventos de gravidade alterada. Se a gravidade térmica de um determinado sensor mudar, o notifyThrottling vai enviar um callback de evento de redução térmica aos listeners de eventos térmicos.

Além das informações do sensor térmico, uma lista de dispositivos de resfriamento mitigados é exposta em getCurrentCoolingDevices. A ordem da lista é mantida, mesmo que um dispositivo de resfriamento fique off-line. Os fabricantes de dispositivos podem usar a lista para coletar métricas de statsd.

Para mais informações, consulte a implementação de referência.

Embora seja possível adicionar suas próprias extensões, não desative a função de mitigação térmica.

Serviço térmico

No Android 10 e versões mais recentes, o serviço térmico no framework oferece monitoramento constante usando os vários indicadores de mitigação da HAL térmica 2.0 e fornece feedback de gravidade de limitação aos clientes. Esses clientes incluem componentes internos e apps Android. O serviço usa duas interfaces de callback do binder, IThermalEventListener e IThermalStatusListener, expostas como callbacks. O primeiro é para uso interno da plataforma e do fabricante do dispositivo, e o segundo é para apps Android.

Usando as interfaces de callback, o status térmico atual de um dispositivo pode ser recuperado como um valor inteiro que varia de 0x00000000 (sem limitação) a 0x00000006 (desligamento do dispositivo). Somente um serviço de sistema confiável, como uma API Android ou do fabricante do dispositivo, pode acessar as informações detalhadas do sensor e do evento térmico. A figura a seguir mostra um modelo do fluxo do processo de redução de temperatura no Android 10 e versões mais recentes:

Fluxo do processo de mitigação térmica no Android 10 e versões mais recentes.

Figura 2. Fluxo do processo de mitigação térmica no Android 10 e versões mais recentes.

Diretrizes do fabricante do dispositivo

Para informar o sensor de temperatura do dispositivo e o status de limitação do Android 10 ao 13, os fabricantes de dispositivos precisam implementar o aspecto HIDL da HAL térmica 2.0 (IThermal.hal).

Para informar o sensor de temperatura do dispositivo e o status de limitação no Android 14, os fabricantes de dispositivos precisam implementar o aspecto AIDL da HAL térmica 2.0 (IThermal.aidl).

Qualquer coisa que reduza o desempenho do dispositivo, incluindo restrições de energia da bateria, precisa ser informada pela HAL térmica. Para garantir que isso aconteça, coloque todos os sensores que possam indicar uma necessidade de mitigação (com base em mudanças de status) no HAL térmico e informe a gravidade de todas as ações de mitigação realizadas. O valor de temperatura retornado de uma leitura do sensor não precisa ser a temperatura real, desde que reflita com precisão o limite de gravidade correspondente. Por exemplo, é possível transmitir valores numéricos diferentes em vez dos valores reais de limite de temperatura ou criar guardbanding nas especificações de limite para fornecer histerese. No entanto, a gravidade correspondente a esse valor precisa corresponder ao que é necessário nesse limite. Por exemplo, você pode decidir retornar 72 °C como o limite de temperatura crítica quando a temperatura real for 65 °C e corresponder à gravidade crítica especificada. O nível de gravidade precisa ser preciso para ter a melhor funcionalidade da estrutura térmica.

Para ler mais sobre os níveis de limite no framework e como eles correspondem às ações de mitigação, consulte Usar códigos de status térmico.

Usar APIs térmicas

Os apps podem adicionar e remover listeners e acessar informações de status térmico pela classe PowerManager. A interface IThermal fornece toda a funcionalidade necessária, incluindo o retorno dos valores de status térmico. A interface do binder IThermal é encapsulada como a interface OnThermalStatusChangedListener, que os apps podem usar ao registrar ou remover listeners de status térmico.

As APIs térmicas do Android têm métodos de callback e polling para que os apps sejam notificados dos níveis de gravidade térmica por códigos de status, que são definidos na classe PowerManager. Os métodos são:

Usar códigos de status térmico

Os códigos de status térmico se traduzem em níveis específicos de limitação, que podem ser usados para coletar dados e projetar uma UX ideal. Por exemplo, os apps podem receber um status de 0x00000000 (THERMAL_STATUS_NONE), que pode mudar depois para 0x00000001 (THERMAL_STATUS_LIGHT). Marcar o estado 0x00000000 como t0 e medir o tempo decorrido do status THERMAL_STATUS_NONE para o status THERMAL_STATUS_LIGHT como t1 permite que os fabricantes de dispositivos projetem e testem estratégias de mitigação para casos de uso específicos. A tabela a seguir descreve maneiras sugeridas de usar os códigos de status térmico:

Código de status térmico Descrição e uso sugerido
THERMAL_STATUS_NONE (0x00000000) Sem limitação. Use esse status para implementar ações de proteção, como detectar o início do período (t0 a t1) de THERMAL_STATUS_NONE (0) a THERMAL_STATUS_LIGHT (1).
THERMAL_STATUS_LIGHT (0x00000001) Limitação leve, a experiência do usuário não é afetada. Use a mitigação suave de dispositivos para esta etapa. Por exemplo, pule o aumento ou o uso de frequências ineficientes, mas apenas em núcleos grandes.
THERMAL_STATUS_MODERATE (0x00000002) Limitação moderada, a experiência do usuário não é muito afetada. A mitigação térmica afeta as atividades em primeiro plano, então os apps precisam reduzir o consumo de energia imediatamente.
THERMAL_STATUS_SEVERE (0x00000003) Limitação grave. A experiência do usuário é muito afetada. Nessa etapa, a mitigação térmica do dispositivo limita a capacidade do sistema. Esse estado pode causar efeitos colaterais, como instabilidade na tela e instabilidade no áudio.
THERMAL_STATUS_CRITICAL (0x00000004) A plataforma fez tudo para reduzir o consumo de energia. O software de mitigação térmica do dispositivo colocou todos os componentes para funcionar na capacidade mínima.
THERMAL_STATUS_EMERGENCY (0x00000005) Os principais componentes da plataforma estão sendo desligados devido a condições térmicas, e a funcionalidade do dispositivo está limitada. Esse código de status representa o último aviso antes do desligamento do dispositivo. Nesse estado, algumas funções, como o modem e os dados móveis, são completamente desativadas.
THERMAL_STATUS_SHUTDOWN (0x00000006) Desligue imediatamente. Devido à gravidade dessa etapa, os apps talvez não consigam receber essa notificação.

Os fabricantes de dispositivos precisam passar no teste de VTS para HAL térmico e podem usar emul_temp da interface kernel sysfs para simular mudanças de temperatura.