Mit dem Android-Framework können Gerätehersteller und App-Entwickler mithilfe von Temperaturdaten für eine gleichbleibende Nutzererfahrung sorgen, wenn sich ein Gerät zu überhitzen beginnt. Wenn ein System beispielsweise einer thermischen Belastung ausgesetzt ist, werden jobscheduler
-Jobs gedrosselt und bei Bedarf wird ein thermischer Shutdown des Frameworks eingeleitet. Apps, die Benachrichtigungen zur thermischen Belastung über einen registrierten Rückruf in der Klasse PowerManager
erhalten, können ihre UX reibungslos anpassen.
Thermal HAL
Android 9 und niedriger verwenden eine Polling-Schnittstelle, die in Thermal HAL 1.0 definiert ist, um Temperaturwerte abzurufen. Mit dieser HAL konnten das Android-Framework und andere vertrauenswürdige Clients, z. B. die HAL eines Geräteherstellers, die aktuelle Temperatur und die produktrichtlinienspezifischen Drossel- und Abschaltungsgrenzwerte für jeden Sensor über dieselbe API lesen.
Android 10 führte ein Temperatursystem in das Android-Framework und eine neue Version des HAL, Thermal HAL 2.0, ein, die die Schnittstelle zu den Hardwaregeräten des thermischen Subsystems abstrahiert. Die Hardwareschnittstelle umfasst Temperatursensoren und Thermistoren für die Haut, den Akku, die GPU, die CPU und den USB-Anschluss. Die Geräte-Hauttemperatur ist das wichtigste System, das erfasst werden muss, um die Geräteoberflächentemperatur innerhalb der angegebenen thermischen Grenzwerte zu halten.
Darüber hinaus bietet Thermal HAL 2.0 mehreren Clients Messwerte des Wärmesensors und die zugehörigen Schweregrade, um die thermische Belastung anzuzeigen. Die folgende Abbildung zeigt zwei Warnmeldungen aus der Android-Benutzeroberfläche. Diese Meldungen werden angezeigt, wenn die IThermalEventListener
-Callback-Schnittstelle für die Sensoren USB_PORT
bzw. SKIN
den Schweregrad THERMAL_STATUS_EMERGENCY
erreicht.
Abbildung 1. Überhitzungswarnungen
Die aktuellen Temperaturen werden für die verschiedenen Arten von Thermosensoren über die IThermal HAL abgerufen. Jeder Funktionsaufruf gibt einen Statuswert von SUCCESS
oder FAILURE
zurück. Wenn SUCCESS
zurückgegeben wird, wird der Prozess fortgesetzt. Wenn FAILURE
zurückgegeben wird, wird eine Fehlermeldung, die visuell lesbar sein muss, an status.debugMessage
gesendet.
Neben der Polling-Schnittstelle, die die aktuellen Temperaturen zurückgibt, können Sie den Rückruf IThermalChangedCallback
(HIDL, Android 10 bis 13) oder IThermalChangedCallback
(AIDL, Android 14 und höher) mit der Rückrufschnittstelle von Thermal HAL-Clients wie dem thermischen Dienst des Frameworks verwenden. Beispielsweise RegisterIThermalChangedCallback
und UnregisterIThermalChangedCallback
, um Ereignisse mit geänderter Schwere zu registrieren oder abzumelden. Wenn sich die thermische Schwere eines bestimmten Sensors geändert hat, sendet notifyThrottling
einen Rückruf für thermische Drosselungsereignisse an Thermal-Ereignis-Listener.
Neben Informationen zu den Temperatursensoren wird in getCurrentCoolingDevices
eine Liste der Geräte mit reduzierter Kühlung angezeigt. Die Reihenfolge dieser Liste bleibt erhalten, auch wenn ein Kühlgerät offline ist. Gerätehersteller können die Liste verwenden, um statsd
-Messwerte zu erfassen.
Weitere Informationen finden Sie in der Referenzimplementierung.
Sie können zwar eigene Erweiterungen hinzufügen, sollten die Funktion zur thermischen Abschwächung jedoch nicht deaktivieren.
Thermoservice
Unter Android 10 und höher bietet der Temperaturdienst im Framework eine kontinuierliche Überwachung mithilfe der verschiedenen Minderungssignale von Thermal HAL 2.0 und gibt seinen Clients Feedback zur Schwere des Drosselns. Dazu gehören interne Komponenten und Android-Apps. Der Dienst verwendet zwei Binder-Callback-Schnittstellen, IThermalEventListener
und IThermalStatusListener
, die als Callbacks bereitgestellt werden. Letzteres ist für die interne Verwendung durch Plattform- und Gerätehersteller und Letzteres für Android-Apps vorgesehen.
Über die Rückrufschnittstellen kann der aktuelle thermische Status eines Geräts als Ganzzahlwert abgerufen werden, der von 0x00000000
(keine Drosselung) bis 0x00000006
(Geräteabschaltung) reicht. Nur ein vertrauenswürdiger Systemdienst, z. B. eine Android API oder eine API des Geräteherstellers, kann auf die detaillierten Informationen zum Thermosensor und zu den thermischen Ereignissen zugreifen. Die folgende Abbildung zeigt ein Modell des Ablaufs der thermischen Abschwächung in Android 10 und höher:
Abbildung 2. Ablauf der thermischen Abschwächung in Android 10 und höher
Richtlinien für Gerätehersteller
Um den Temperatursensor und den Drosselstatus des Geräts für Android 10 bis 13 zu melden, müssen Gerätehersteller den HIDL-Aspekt der Thermal HAL 2.0 (IThermal.hal
) implementieren.
Um den Temperatursensor und den Drosselstatus des Geräts für Android 14 zu melden, müssen Gerätehersteller den AIDL-Aspekt der Thermal HAL 2.0 (IThermal.aidl
) implementieren.
Alles, was die Geräteleistung drosselt, einschließlich Einschränkungen der Akkuleistung, muss über den Thermo-HAL gemeldet werden. Damit dies funktioniert, müssen Sie alle Sensoren in die thermische HAL aufnehmen, die aufgrund von Statusänderungen eine Maßnahme zur Risikobewältigung erfordern könnten, und den Schweregrad der ergriffenen Maßnahmen melden. Der Temperaturwert, der von einer Sensormessung zurückgegeben wird, muss nicht der tatsächlichen Temperatur entsprechen, solange er den entsprechenden Schweregradschwellenwert genau widerspiegelt. Sie können beispielsweise anstelle der tatsächlichen Temperaturgrenzwerte andere numerische Werte übergeben oder Sicherheitsbereiche in Grenzwertspezifikationen einbinden, um Hysterese zu ermöglichen. Die Schwere, die diesem Wert entspricht, muss jedoch dem entsprechen, was bei diesem Grenzwert erforderlich ist. Sie können beispielsweise 72 °C als Schwellenwert für die kritische Temperatur zurückgeben, wenn die tatsächliche Temperatur 65 °C beträgt und dies dem von Ihnen angegebenen kritischen Schweregrad entspricht. Der Schweregrad muss korrekt sein, damit das Thermal Framework optimal funktioniert.
Weitere Informationen zu den Grenzwerten im Framework und dazu, wie sie den Maßnahmen zur Risikobewältigung entsprechen, finden Sie unter Thermische Statuscodes verwenden.
Thermische APIs verwenden
Apps können Listener hinzufügen und entfernen sowie über die Klasse PowerManager
auf Informationen zum Temperaturstatus zugreifen.
Die IThermal
-Benutzeroberfläche bietet alle erforderlichen Funktionen, einschließlich der Rückgabe der Werte für den thermischen Status. Die IThermal-Binder-Oberfläche wird als OnThermalStatusChangedListener
-Oberfläche gekapselt, die Apps verwenden können, um Listener für den Temperaturstatus zu registrieren oder zu entfernen.
Die Android-Thermo-APIs bieten sowohl Rückruf- als auch Polling-Methoden, damit Apps über Statuscodes, die in der Klasse PowerManager
definiert sind, über die Schweregrade der Überhitzung informiert werden. Die Methoden sind:
getCurrentThermalStatus()
gibt den aktuellen thermischen Status des Geräts als Ganzzahl zurück, es sei denn, das Gerät wird gedrosselt.addThermalStatusListener()
fügt einen Listener hinzu.removeThermalStatusListener()
entfernt einen zuvor hinzugefügten Listener.
Temperatur-Statuscodes verwenden
Die Temperaturstatuscodes werden in bestimmte Drosselungsstufen umgewandelt, die Sie zum Erfassen von Daten und zum Entwerfen einer optimalen UX verwenden können. Apps können beispielsweise den Status 0x00000000
(THERMAL_STATUS_NONE
) erhalten, der sich später in 0x00000001
(THERMAL_STATUS_LIGHT
) ändern kann. Wenn der Status 0x00000000
als t0 markiert und dann die Zeit gemessen wird, die vom Status THERMAL_STATUS_NONE
zum Status THERMAL_STATUS_LIGHT
verstrichen ist, können Gerätehersteller Strategien zur Risikobewältigung für bestimmte Anwendungsfälle entwickeln und testen. In der folgenden Tabelle werden mögliche Verwendungen der Temperaturstatuscodes beschrieben:
Temperaturstatuscode | Beschreibung und empfohlene Verwendung |
---|---|
THERMAL_STATUS_NONE (0x00000000 ) |
Keine Drosselung. Verwenden Sie diesen Status, um Schutzmaßnahmen zu implementieren, z. B. den Beginn des Zeitraums (t0 bis t1) von THERMAL_STATUS_NONE (0 ) bis THERMAL_STATUS_LIGHT (1 ) zu erkennen. |
THERMAL_STATUS_LIGHT (0x00000001 ) |
Leichte Drosselung, die UX ist nicht betroffen. Verwenden Sie für diese Phase eine sanfte Risikominderung. Sie können beispielsweise den Turbomodus deaktivieren oder ineffiziente Taktfrequenzen nur auf großen Kernen verwenden. |
THERMAL_STATUS_MODERATE (0x00000002 ) |
Mäßige Drosselung, UX ist nicht stark beeinträchtigt. Die thermische Abschwächung wirkt sich auf die Aktivitäten im Vordergrund aus. Daher sollten Apps den Energieverbrauch sofort reduzieren. |
THERMAL_STATUS_SEVERE (0x00000003 ) |
Starke Drosselung; die UX ist stark beeinträchtigt. In dieser Phase sollte die thermische Auswirkung des Geräts die Systemkapazität begrenzen. Dieser Zustand kann zu Nebenwirkungen wie Rucklern im Display und Audiojitter führen. |
THERMAL_STATUS_CRITICAL (0x00000004 ) |
Die Plattform hat alles getan, um den Energieverbrauch zu reduzieren. Die Software zum Schutz vor Überhitzung des Geräts hat alle Komponenten auf die niedrigste Kapazität eingestellt. |
THERMAL_STATUS_EMERGENCY (0x00000005 ) |
Wichtige Komponenten der Plattform werden aufgrund von hohen Temperaturen heruntergefahren und die Gerätefunktionen sind eingeschränkt. Dieser Statuscode steht für die letzte Warnung vor dem Ausschalten des Geräts. In diesem Zustand sind einige Funktionen wie das Modem und die mobilen Daten vollständig deaktiviert. |
THERMAL_STATUS_SHUTDOWN (0x00000006 ) |
Fahren Sie das Gerät sofort herunter. Aufgrund des Schweregrads dieser Phase können Apps diese Benachrichtigung möglicherweise nicht empfangen. |
Gerätehersteller müssen den VTS-Test für die thermische HAL bestehen und können emul_temp
über die Kernel-sysfs-Schnittstelle verwenden, um Temperaturänderungen zu simulieren.