Con il framework Android, i produttori di dispositivi e gli sviluppatori di app possono utilizzare i dati termici per garantire un'esperienza utente (UX) coerente se un dispositivo inizia a surriscaldarsi. Ad esempio, quando un sistema è sottoposto a stress termico, i lavori jobscheduler
vengono limitati e, se necessario, viene avviato un arresto termico del framework. Le app che ricevono notifiche di stress termico tramite una richiamata registrata nella classe PowerManager
possono regolare con garbo la propria UX.
HAL termico
Android 9 e versioni precedenti utilizzano un'interfaccia di polling definita in Thermal HAL 1.0 per ottenere letture della temperatura. Questo HAL ha consentito al framework Android e ad altri client attendibili, come l'HAL di un produttore di dispositivi, di leggere la temperatura corrente e le soglie di limitazione e arresto specifiche della politica del prodotto per ciascun sensore tramite la stessa API.
Android 10 ha introdotto un sistema termico nel framework Android e una nuova versione dell'HAL, Thermal HAL 2.0, che astrae l'interfaccia ai dispositivi hardware del sottosistema termico. L'interfaccia hardware include sensori di temperatura e termistori per skin, batteria, GPU, CPU e porta USB. La temperatura cutanea del dispositivo è il sistema più importante da monitorare per mantenere la temperatura superficiale del dispositivo entro i limiti termici specificati.
Inoltre, Thermal HAL 2.0 fornisce a più client letture del sensore termico e livelli di gravità associati per indicare lo stress termico. La figura seguente mostra due messaggi di avviso dall'interfaccia utente del sistema Android. Questi messaggi vengono visualizzati quando l'interfaccia di callback IThermalEventListener
per i sensori USB_PORT
e SKIN
, rispettivamente, raggiunge il livello di gravità THERMAL_STATUS_EMERGENCY
.
Figura 1. Avvisi di surriscaldamento.
Le temperature attuali vengono recuperate per i diversi tipi di sensori termici tramite IThermal HAL . Ogni chiamata di funzione restituisce un valore di stato SUCCESS
o FAILURE
. Se viene restituito SUCCESS
, il processo continua. Se viene restituito FAILURE
, un messaggio di errore, che deve essere leggibile dall'uomo, viene inviato a status.debugMessage
.
Oltre ad essere un'interfaccia di polling che restituisce le temperature attuali, puoi utilizzare il callback IThermalChangedCallback
(HIDL, da Android 10 a 13) o IThermalChangedCallback
(AIDL, Android 14 e versioni successive) con l'interfaccia di callback dai client HAL termici, come quello del framework servizio termale. Ad esempio, RegisterIThermalChangedCallback
e UnregisterIThermalChangedCallback
per registrare o annullare la registrazione di eventi con gravità modificata. Se la gravità termica di un determinato sensore è cambiata, notifyThrottling
invia un callback dell'evento di limitazione termica ai listener di eventi termici.
Oltre alle informazioni sul sensore termico, in getCurrentCoolingDevices
è esposto un elenco di dispositivi di raffreddamento mitigato. L'ordine di questo elenco è persistente, anche se un dispositivo di raffreddamento è offline. I produttori di dispositivi possono utilizzare l'elenco per raccogliere parametri statsd
.
Per ulteriori informazioni, vedere l' implementazione di riferimento .
Anche se puoi aggiungere le tue estensioni, non dovresti disabilitare la funzione di mitigazione termica.
Servizio termale
In Android 10 e versioni successive, il servizio termico nel framework fornisce un monitoraggio costante utilizzando i vari segnali di mitigazione di Thermal HAL 2.0 e fornisce feedback sulla gravità della limitazione ai propri clienti. Questi client includono componenti interni e app Android. Il servizio utilizza due interfacce di callback del raccoglitore, IThermalEventListener
e IThermalStatusListener
, esposte come callback. Il primo è per l'utilizzo della piattaforma interna e del produttore del dispositivo, mentre il secondo è per le app Android.
Attraverso le interfacce di callback, lo stato termico corrente di un dispositivo è recuperabile come valore intero compreso tra 0x00000000
(nessuna limitazione) e 0x00000006
(spegnimento del dispositivo). Solo un servizio di sistema affidabile, come un'API Android o l'API del produttore del dispositivo, può accedere alle informazioni dettagliate sul sensore termico e sugli eventi termici. La figura seguente fornisce un modello del flusso del processo di mitigazione termica in Android 10 e versioni successive:
Figura 2. Flusso del processo di mitigazione termica in Android 10 e versioni successive.
Linee guida del produttore del dispositivo
Per segnalare il sensore di temperatura del dispositivo e lo stato di limitazione per Android da 10 a 13, i produttori di dispositivi devono implementare l'aspetto HIDL di Thermal HAL 2.0 ( IThermal.hal
).
Per segnalare il sensore di temperatura del dispositivo e lo stato di limitazione per Android 14, i produttori di dispositivi devono implementare l'aspetto AIDL di Thermal HAL 2.0 ( IThermal.aidl
).
Tutto ciò che limita le prestazioni del dispositivo, inclusi i limiti di alimentazione della batteria, deve essere segnalato tramite l'HAL termico. Per garantire che ciò accada, inserire tutti i sensori che potrebbero indicare la necessità di mitigazione (in base ai cambiamenti di stato) nell'HAL termico e segnalare la gravità di eventuali azioni di mitigazione intraprese. Il valore della temperatura restituito dalla lettura di un sensore non deve essere la temperatura effettiva, purché rifletta accuratamente la soglia di gravità corrispondente. Ad esempio, è possibile passare valori numerici diversi invece dei valori di soglia della temperatura effettiva oppure creare fasce di protezione nelle specifiche di soglia per fornire l'isteresi. Tuttavia, la gravità corrispondente a tale valore deve corrispondere a quanto necessario a tale soglia. Ad esempio, potresti decidere di restituire 72°C come soglia di temperatura critica, quando la temperatura effettiva è 65°C e corrisponde alla gravità critica specificata. Il livello di gravità deve essere accurato per la migliore funzionalità della struttura termica.
Per ulteriori informazioni sui livelli di soglia nel quadro e su come corrispondono alle azioni di mitigazione, vedere Utilizzare i codici di stato termico .
Utilizza API termiche
Le app possono aggiungere e rimuovere listener e accedere alle informazioni sullo stato termico tramite la classe PowerManager
. L'interfaccia IThermal
fornisce tutte le funzionalità necessarie, inclusa la restituzione dei valori dello stato termico. L' interfaccia del raccoglitore IThermal è racchiusa come interfaccia OnThermalStatusChangedListener
, che le app possono utilizzare durante la registrazione o la rimozione dei listener dello stato termico.
Le API termiche Android dispongono sia di metodi di callback che di polling per consentire alle app di ricevere notifiche sui livelli di gravità termica tramite codici di stato definiti nella classe PowerManager
. I metodi sono:
-
getCurrentThermalStatus()
restituisce lo stato termico corrente del dispositivo come numero intero, a meno che il dispositivo non sia sottoposto a limitazione. -
addThermalStatusListener()
aggiunge un ascoltatore. -
removeThermalStatusListener()
rimuove un ascoltatore aggiunto in precedenza.
Utilizzare i codici di stato termico
I codici di stato termico si traducono in livelli di limitazione specifici, che puoi utilizzare per raccogliere dati e progettare una UX ottimale. Ad esempio, le app potrebbero ricevere uno stato di 0x00000000
( THERMAL_STATUS_NONE
), che potrebbe successivamente cambiare in 0x00000001
( THERMAL_STATUS_LIGHT
). Contrassegnando lo stato 0x00000000
come t0, quindi misurando il tempo trascorso dallo stato THERMAL_STATUS_NONE
allo stato THERMAL_STATUS_LIGHT
come t1, consente ai produttori di dispositivi di progettare e testare strategie di mitigazione per casi d'uso specifici. La tabella seguente illustra le modalità suggerite per utilizzare i codici di stato termico:
Codice stato termico | Descrizione e utilizzo consigliato |
---|---|
THERMAL_STATUS_NONE ( 0x00000000 ) | Nessuna limitazione. Utilizzare questo stato per implementare azioni protettive, come il rilevamento dell'inizio del periodo di tempo (da t0 a t1) da THERMAL_STATUS_NONE ( 0 ) a THERMAL_STATUS_LIGHT ( 1 ). |
THERMAL_STATUS_LIGHT ( 0x00000001 ) | Leggero throttling, la UX non viene influenzata. Utilizza una mitigazione delicata del dispositivo per questa fase. Ad esempio, evita il potenziamento o l'utilizzo di frequenze inefficienti, ma solo su core di grandi dimensioni. |
THERMAL_STATUS_MODERATE ( 0x00000002 ) | Throttling moderato, la UX non è molto influenzata. La mitigazione termica influisce sulle attività in primo piano, quindi le app dovrebbero ridurre immediatamente la potenza. |
THERMAL_STATUS_SEVERE ( 0x00000003 ) | Grave strozzamento; La UX è ampiamente influenzata. In questa fase, la mitigazione termica del dispositivo dovrebbe limitare la capacità del sistema. Questo stato potrebbe causare effetti collaterali, come rallentamenti del display e jitter dell'audio. |
THERMAL_STATUS_CRITICAL ( 0x00000004 ) | La piattaforma ha fatto di tutto per ridurre la potenza. Il software di mitigazione termica del dispositivo ha impostato tutti i componenti in modo che funzionino alla capacità minima. |
THERMAL_STATUS_EMERGENCY ( 0x00000005 ) | I componenti chiave della piattaforma si stanno spegnendo a causa delle condizioni termiche e la funzionalità del dispositivo è limitata. Questo codice di stato rappresenta l'ultimo avviso prima dello spegnimento del dispositivo. In questo stato alcune funzioni, come il modem e la rete dati cellulare, sono completamente disattivate. |
THERMAL_STATUS_SHUTDOWN ( 0x00000006 ) | Spegnere immediatamente. A causa della gravità di questa fase, le app potrebbero non essere in grado di ricevere questa notifica. |
I produttori di dispositivi devono superare il test VTS per l'HAL termico e possono utilizzare emul_temp
dall'interfaccia sysfs del kernel per simulare i cambiamenti di temperatura.