Mitigação térmica

Com o framework do Android, os fabricantes de dispositivos e os 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 UX de forma elegante.

HAL térmica

O Android 9 e versões anteriores usam uma interface de pesquisa definida na HAL térmica 1.0 para receber leituras de temperatura. Esse HAL permitiu que o framework do Android e outros clientes confiáveis, como o HAL de um fabricante de dispositivos, lessem os limites de interrupção e desligamento específicos da temperatura atual e da política do produto para cada sensor pela 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 capa, a bateria, a GPU, a CPU e a porta USB. A temperatura da pele do dispositivo é o sistema mais importante a ser monitorado para manter a temperatura da superfície do dispositivo dentro dos limites térmicos especificados.

Além disso, o Thermal HAL 2.0 oferece a vários clientes leituras do sensor térmico 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 dos sensores USB_PORT e SKIN, respectivamente, atinge o nível de gravidade THERMAL_STATUS_EMERGENCY.

Alertas de superaquecimento.

Figura 1. Avisos de superaquecimento.

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

.

Além de ser uma interface de polling que retorna as temperaturas atuais, é possível usar o callback IThermalChangedCallback (HIDL, Android 10 a 13) ou IThermalChangedCallback (AIDL, Android 14 e mais recentes) com a interface de callback de clientes da HAL térmica, como o serviço térmico do framework. Por exemplo, RegisterIThermalChangedCallback e UnregisterIThermalChangedCallback para registrar ou cancelar o registro de eventos com mudança de gravidade. Se a gravidade térmica de um determinado sensor mudar, o notifyThrottling vai enviar um callback de evento de limitação térmica para 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 dessa lista é persistente, mesmo se um dispositivo de resfriamento estiver off-line. Os fabricantes de dispositivos podem usar a lista para coletar métricas statsd.

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

Embora você possa adicionar suas próprias extensões, não é recomendável desativar 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 sinais de mitigação da HAL térmica 2.0 e fornece feedback de gravidade de limitação para os clientes. Esses clientes incluem componentes internos e apps Android. O serviço usa duas interfaces de callback de binder, IThermalEventListener e IThermalStatusListener, expostas como callbacks. O primeiro é para uso da plataforma interna e do fabricante do dispositivo, e o segundo é para apps Android.

Através das 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 API do fabricante do dispositivo, pode acessar informações detalhadas do sensor térmico e do evento térmico. A figura a seguir mostra um modelo do fluxo do processo de mitigação térmica 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 no Android 10 ao 13, os fabricantes 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 do Android 14, os fabricantes precisam implementar o aspecto AIDL da HAL térmica 2.0 (IThermal.aidl).

Tudo que limita o desempenho do dispositivo, incluindo restrições de energia da bateria, precisa ser informado pela HAL térmica. Para garantir que isso aconteça, coloque todos os sensores que possam indicar a necessidade de mitigação (com base nas 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 do limite de temperatura ou criar guardbanding em especificações de limite para fornecer histerese. No entanto, a gravidade correspondente a esse valor precisa corresponder ao necessário nesse limite. Por exemplo, você pode retornar 72 °C como seu limite de temperatura crítica, quando a temperatura real é de 65 °C, e corresponde à gravidade crítica especificada. O nível de gravidade precisa ser preciso para a melhor funcionalidade do framework térmico.

Para saber 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 oferece todas as funcionalidades necessárias, incluindo o retorno dos valores de status térmico. A interface de vinculação de IThermal é envolta 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 são traduzidos para 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 UX não é afetada. Use a mitigação suave do dispositivo para essa etapa. Por exemplo, pule a otimização ou use frequências ineficientes, mas apenas em núcleos grandes.
THERMAL_STATUS_MODERATE (0x00000002) Limitação moderada, a UX não é muito afetada. A mitigação térmica afeta as atividades em primeiro plano. Portanto, os apps precisam reduzir a energia imediatamente.
THERMAL_STATUS_SEVERE (0x00000003) Limitação severa. A UX é afetada em grande parte. Nessa fase, a mitigação térmica do dispositivo precisa limitar a capacidade do sistema. Esse estado pode causar efeitos colaterais, como instabilidade na tela e ruídos 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 serem executados com a capacidade mais baixa.
THERMAL_STATUS_EMERGENCY (0x00000005) Componentes principais da plataforma estão sendo desligados devido a condições térmicas e a funcionalidade do dispositivo é limitada. Esse código de status representa o último aviso antes do desligamento do dispositivo. Nesse estado, algumas funções, como modem e dados celulares, são desativadas completamente.
THERMAL_STATUS_SHUTDOWN (0x00000006) Desligue imediatamente. Devido à gravidade desse estágio, os apps podem não receber essa notificação.

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