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 di 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 PowerManager classe possono regolare la propria UX in modo graduale.

HAL termico

Android 9 e versioni precedenti utilizzano un'interfaccia di polling definita in Thermal HAL 1.0 per ottenere le 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 attuale e le soglie di limitazione e arresto specifiche per le norme sui 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 per i dispositivi hardware del sottosistema termico. L'interfaccia hardware include sensori di temperatura e termistori per la pelle, la batteria, la GPU, la CPU e la 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 le letture dei sensori termici e i livelli di gravità associati per indicare lo stress termico. La figura seguente mostra due messaggi di avviso dell'interfaccia utente di 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.

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 SUCCESS o FAILURE. Se viene restituito SUCCESS, il processo continua. Se viene restituito FAILURE, viene inviato un messaggio di errore, che deve essere leggibile, a status.debugMessage.

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, come il servizio termico del framework. Ad esempio, RegisterIThermalChangedCallback e UnregisterIThermalChangedCallback per registrare o annullare la registrazione degli eventi di modifica della gravità. 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 sui sensori termici, in getCurrentCoolingDevices viene esposto un elenco di dispositivi di raffreddamento mitigati. L'ordine di questo elenco è persistente, anche se un dispositivo di raffreddamento è andato offline. I produttori di dispositivi possono utilizzare l'elenco per raccogliere le 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 indicatori di mitigazione di Thermal HAL 2.0 e fornisce feedback sulla gravità della limitazione ai suoi client. Questi client includono componenti interni e app Android. Il servizio utilizza due interfacce di callback del binder, IThermalEventListener e IThermalStatusListener, esposte come callback. La prima è per l'utilizzo interno della piattaforma e del produttore del dispositivo, mentre la seconda è per le app Android.

Tramite le interfacce di callback, lo stato termico attuale di un dispositivo può essere recuperato come valore intero compreso tra 0x00000000 (nessuna limitazione) e 0x00000006 (arresto del dispositivo). Solo un servizio di sistema attendibile, come un'API Android o un'API del produttore del dispositivo, può accedere alle informazioni dettagliate sui sensori termici 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 per i produttori di dispositivi

Per segnalare lo stato del sensore di temperatura e della limitazione 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 e della limitazione del dispositivo 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 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 passare valori numerici diversi anziché i valori effettivi della soglia di temperatura oppure puoi creare un margine di sicurezza nelle specifiche della soglia per fornire isteresi. Tuttavia, la gravità corrispondente a quel valore deve corrispondere a quella necessaria a quella soglia. Ad esempio, potresti decidere di restituire 72 °C come soglia di temperatura critica, quando la temperatura effettiva è di 65 °C e corrisponde alla gravità critica specificata. 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 si 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 PowerManager classe. L'interfaccia IThermal fornisce tutte le funzionalità necessarie, inclusa la restituzione dei valori di stato termico. L' interfaccia del binder IThermal è racchiusa nell'interfaccia OnThermalStatusChangedListener, che le app possono utilizzare durante la registrazione o la rimozione dei listener di stato termico.

Le API termiche di Android hanno metodi di callback e di polling per consentire alle app di essere notificate dei livelli di gravità termica tramite i 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 per progettare un'UX ottimale. Ad esempio, le app potrebbero ricevere uno stato 0x00000000 (THERMAL_STATUS_NONE), che in seguito potrebbe diventare 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 tabella seguente illustra i modi suggeriti per utilizzare i codici di stato termico:

Codice di stato termico Descrizione e utilizzo suggerito
THERMAL_STATUS_NONE (0x00000000) Nessuna limitazione. Utilizza questo stato per implementare azioni di protezione, 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 leggera, l'UX non è interessata. Utilizza una mitigazione leggera del dispositivo per questa fase. Ad esempio, salta il boosting o l'utilizzo di frequenze inefficienti, ma solo sui core di grandi dimensioni.
THERMAL_STATUS_MODERATE (0x00000002) Limitazione moderata, l'UX non è interessata in modo significativo. La mitigazione termica influisce sulle attività in primo piano, pertanto le app devono ridurre immediatamente il consumo di energia.
THERMAL_STATUS_SEVERE (0x00000003) Limitazione grave; l'UX è interessata in modo significativo. In questa fase, la mitigazione termica del dispositivo deve limitare la capacità del sistema. Questo stato potrebbe causare effetti collaterali, come scatti del display e jitter audio.
THERMAL_STATUS_CRITICAL (0x00000004) La piattaforma ha fatto di tutto per ridurre il consumo di energia. 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 dell'arresto del dispositivo. In questo stato, alcune funzioni, come il modem e i dati mobili, vengono disattivate completamente.
THERMAL_STATUS_SHUTDOWN (0x00000006) Arresta 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 le variazioni di temperatura.