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 stellt Thermal HAL 2.0 mehreren Clients Temperatursensormesswerte und zugehörige Schweregrade zur Verfügung, um die thermische Belastung anzugeben. 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 Vorgang fortgesetzt. Wenn FAILURE
zurückgegeben wird, wird eine Fehlermeldung, die für Menschen 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 erheben.
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. Erstere ist für die interne Nutzung durch Plattform- und Gerätehersteller gedacht, letztere für Android-Apps.
Ü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 die thermische HAL gemeldet werden. Damit dies funktioniert, müssen Sie alle Sensoren, die aufgrund von Statusänderungen eine Maßnahme zur Risikobewältigung erfordern könnten, in die thermische HAL aufnehmen 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 Schwellenwert erforderlich ist. Sie können beispielsweise 72 °C als kritischen Temperaturgrenzwert zurückgeben, wenn die tatsächliche Temperatur 65 °C beträgt und der kritischen Schwere entspricht, die Sie angegeben haben. 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.
Temperatur-APIs verwenden
Apps können Listener hinzufügen und entfernen sowie über die Klasse PowerManager
auf Informationen zum thermischen Status 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.- Mit
removeThermalStatusListener()
wird ein zuvor hinzugefügter Listener entfernt.
Temperaturstatuscodes 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 finden Sie Vorschläge zur Verwendung der Temperaturstatuscodes:
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 ) |
Die Drosselung ist gering und hat keine Auswirkungen auf die Nutzerfreundlichkeit. Verwenden Sie für diese Phase eine milde Geräteeinschränkung. Sie können beispielsweise den Turbomodus deaktivieren oder ineffiziente Taktfrequenzen nur auf großen Kernen verwenden. |
THERMAL_STATUS_MODERATE (0x00000002 ) |
Moderate Drosselung, die UX ist nicht stark beeinträchtigt. Die thermische Abschwächung wirkt sich auf 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 Stromverbrauch zu senken. Die Software zur Temperaturregelung des Geräts hat alle Komponenten auf die niedrigste Kapazität gesetzt. |
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 der Schwere dieser Phase können Apps diese Benachrichtigung möglicherweise nicht erhalten. |
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.