Mitigazione termica

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.

Avvisi di surriscaldamento.

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:

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:

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.