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 job jobscheduler
vengono limitati e, se necessario, viene avviato
un arresto termico del framework. Le app che ricevono notifiche di stress termico
tramite un callback registrato nella
classe PowerManager
possono regolare in modo ottimale la propria UX.
HAL termico
Android 9 e versioni precedenti utilizzano un'interfaccia di polling definita in Thermal HAL 1.0 per ottenere le letture della temperatura. Questa HAL consentiva al framework Android e ad altri client attendibili, come la HAL di un produttore di dispositivi, di leggere la temperatura attuale e le soglie di limitazione e spegnimento specifiche per le norme relative ai prodotti per ogni 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 con i dispositivi hardware del sottosistema termico. L'interfaccia hardware include sensori di temperatura e termistori per pelle, batteria, GPU, CPU e porta USB. La temperatura cutanea del dispositivo è il sistema più importante da monitorare per mantenere la temperatura della superficie 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 dell'interfaccia utente
di Android System. 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 pari a SUCCESS
o FAILURE
. Se viene restituito SUCCESS
, il processo continua. Se viene restituito FAILURE
, a status.debugMessage
viene inviato un messaggio di errore leggibile.
Oltre a essere un'interfaccia di polling che restituisce le temperature attuali, puoi utilizzare il callback
IThermalChangedCallback
(HIDL, Android 10-13) o
IThermalChangedCallback
(AIDL, Android 14 e versioni successive)
con l'interfaccia di callback dei client HAL termici, ad esempio il servizio termico del framework. 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 thermal-event.
Oltre alle informazioni del sensore termico, in getCurrentCoolingDevices
viene visualizzato un elenco dei dispositivi di raffreddamento mitigati. L'ordine di questo elenco è persistente, anche
se un dispositivo di raffreddamento è offline. I produttori di dispositivi possono utilizzare l'elenco per
raccogliere metriche statsd
.
Per ulteriori informazioni, consulta l'implementazione di riferimento.
Anche se puoi aggiungere le tue estensioni, non devi disattivare la funzione di mitigazione termica.
Servizio termico
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 un feedback sulla gravità della limitazione ai suoi client. Questi client includono componenti interni e app per Android. Il servizio utilizza due interfacce di callback del binder, IThermalEventListener
e IThermalStatusListener
, esposte come callback. Il
primo è destinato all'uso interno da parte di piattaforme e produttori di dispositivi, mentre il secondo
è per le app per Android.
Tramite le interfacce di callback, lo stato termico attuale di un dispositivo è
recuperabile come valore intero compreso tra 0x00000000
(nessuna limitazione) e
0x00000006
(spegnimento del dispositivo). Solo un servizio di sistema attendibile, ad esempio un'API Android o un'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 lo stato del sensore di temperatura e della limitazione delle prestazioni del dispositivo per Android 10-13, i produttori di dispositivi devono implementare l'aspetto HIDL di Thermal HAL 2.0 (IThermal.hal
).
Per segnalare lo stato del sensore di temperatura del dispositivo e della limitazione per Android
14, i produttori di dispositivi devono implementare l'aspetto AIDL
di Thermal HAL 2.0 (IThermal.aidl
).
Qualsiasi elemento che limiti le prestazioni del dispositivo, inclusi i vincoli di alimentazione della batteria, deve essere segnalato tramite l'HAL termico. Per assicurarti che ciò avvenga, inserisci tutti i sensori che potrebbero indicare la necessità di una mitigazione (in base alle modifiche dello stato) nell'HAL termico e segnala la gravità di eventuali azioni di mitigazione intraprese. Il valore della temperatura restituito da una lettura del sensore non deve essere la temperatura effettiva, purché rifletta con precisione la soglia di gravità corrispondente. Ad esempio, puoi trasmettere valori numerici diversi invece dei valori effettivi della soglia di temperatura oppure puoi incorporare la banda di protezione nelle specifiche della soglia per fornire isteresi. Tuttavia, la gravità corrispondente a quel valore deve corrispondere a quella necessaria per quella soglia. Ad esempio, potresti decidere di impostare 72 °C come soglia di temperatura critica, quando la temperatura effettiva è 65 °C e corrisponde alla gravità critica che hai specificato. Il livello di gravità deve essere accurato per garantire la migliore funzionalità del framework termico.
Per saperne di più sui livelli di soglia nel framework e su come corrispondono alle azioni di mitigazione, consulta Utilizzare i codici di stato termico.
Utilizzare le 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 di stato termico. L'interfaccia del raccoglitore termico è inclusa nell'interfaccia OnThermalStatusChangedListener
, che le app possono utilizzare durante la registrazione o la rimozione dei listener di stato termico.
Le API termiche di Android dispongono di metodi di callback e 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 attuale del dispositivo come numero intero, a meno che il dispositivo non sia in fase di throttling.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 un'esperienza utente ottimale. Ad esempio, le app potrebbero
ricevere lo stato 0x00000000
(THERMAL_STATUS_NONE
), che potrebbe poi
cambiare in 0x00000001
(THERMAL_STATUS_LIGHT
). Se contrassegni lo stato 0x00000000
come t0 e misuri il tempo trascorso dallo stato THERMAL_STATUS_NONE
allo
stato THERMAL_STATUS_LIGHT
come t1, i produttori di dispositivi possono progettare e
testare strategie di mitigazione per casi d'uso specifici. La seguente tabella illustra
i modi suggeriti per utilizzare i codici di stato termico:
Codice di stato termico | Descrizione e uso suggerito |
---|---|
THERMAL_STATUS_NONE (0x00000000 ) |
Nessuna limitazione. Utilizza questo stato per implementare azioni protettive, ad esempio rilevare l'inizio del periodo di tempo (da t0 a t1) da THERMAL_STATUS_NONE (0 ) a THERMAL_STATUS_LIGHT (1 ). |
THERMAL_STATUS_LIGHT (0x00000001 ) |
Limitazione della luce, l'esperienza utente non è interessata. Utilizza una mitigazione delicata del dispositivo per questa fase. Ad esempio, evita di aumentare la frequenza o di utilizzare frequenze inefficienti, ma solo sui core grandi. |
THERMAL_STATUS_MODERATE (0x00000002 ) |
Limitazione moderata, l'esperienza utente non è molto interessata. La mitigazione termica influisce sulle attività in primo piano, pertanto le app devono ridurre immediatamente il consumo energetico. |
THERMAL_STATUS_SEVERE (0x00000003 ) |
Limitazione severa; l'esperienza utente è fortemente compromessa. In questa fase, la mitigazione termica del dispositivo dovrebbe limitare la capacità del sistema. Questo stato potrebbe causare effetti collaterali, come scatti nella visualizzazione e instabilità dell'audio. |
THERMAL_STATUS_CRITICAL (0x00000004 ) |
La piattaforma ha fatto tutto il possibile per ridurre il consumo energetico. Il software di mitigazione termica del dispositivo ha impostato tutti i componenti in modo che funzionino alla capacità più bassa. |
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 i dati mobili, sono completamente disattivate. |
THERMAL_STATUS_SHUTDOWN (0x00000006 ) |
Arrestati 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
kernel sysfs
per simulare i cambiamenti di temperatura.