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
.
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:
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:
getCurrentThermalStatus()
retorna o status térmico atual do dispositivo como um número inteiro, a menos que o dispositivo esteja passando por uma limitação.addThermalStatusListener()
adiciona um listener.removeThermalStatusListener()
remove um listener adicionado anteriormente.
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.