Atténuation thermique

Avec le framework Android, les fabricants d'appareils et les développeurs d'applications peuvent utiliser les données thermiques pour garantir une expérience utilisateur (UX) cohérente si un appareil commence à surchauffer. Par exemple, lorsqu'un système subit une contrainte thermique, les tâches jobscheduler sont limitées et, si nécessaire, un arrêt thermique du cadre est déclenché. Les applications qui reçoivent des notifications de contrainte thermique via un rappel enregistré dans la classe PowerManager peuvent ajuster gracieusement leur UX.

HAL thermique

Android 9 et versions antérieures utilisent une interface d'interrogation définie dans Thermal HAL 1.0 pour obtenir des relevés de température. Ce HAL a permis au framework Android et à d'autres clients de confiance, tels que le HAL d'un fabricant d'appareils, de lire la température actuelle et les seuils de limitation et d'arrêt spécifiques à la politique du produit pour chaque capteur via la même API.

Android 10 a introduit un système thermique dans le framework Android et une nouvelle version de HAL, Thermal HAL 2.0, qui résume l'interface avec les périphériques matériels du sous-système thermique. L'interface matérielle comprend des capteurs de température et des thermistances pour la peau, la batterie, le GPU, le CPU et le port USB. La température cutanée de l'appareil est le système le plus important à suivre pour maintenir la température de surface de l'appareil dans les limites thermiques spécifiées.

De plus, Thermal HAL 2.0 fournit à plusieurs clients des relevés de capteurs thermiques et des niveaux de gravité associés pour indiquer le stress thermique. La figure suivante montre deux messages d'avertissement provenant de l'interface utilisateur du système Android. Ces messages s'affichent lorsque l'interface de rappel IThermalEventListener pour les capteurs USB_PORT et SKIN , respectivement, atteint le niveau de gravité THERMAL_STATUS_EMERGENCY .

Avertissements de surchauffe.

Figure 1. Avertissements de surchauffe.

Les températures actuelles sont récupérées pour les différents types de capteurs thermiques via IThermal HAL . Chaque appel de fonction renvoie une valeur d'état SUCCESS ou FAILURE . Si SUCCESS est renvoyé, le processus continue. Si FAILURE est renvoyé, un message d'erreur, qui doit être lisible par l'homme, est envoyé à status.debugMessage .

En plus d'être une interface d'interrogation qui renvoie les températures actuelles, vous pouvez utiliser le rappel IThermalChangedCallback (HIDL, Android 10 à 13) ou IThermalChangedCallback (AIDL, Android 14 et supérieur) avec l'interface de rappel des clients thermiques HAL, tels que le framework. service thermique. Par exemple, RegisterIThermalChangedCallback et UnregisterIThermalChangedCallback pour enregistrer ou annuler l'enregistrement des événements de gravité modifiée. Si la gravité thermique d'un capteur donné a changé, notifyThrottling envoie un rappel d'événement de limitation thermique aux écouteurs d'événements thermiques.

En plus des informations sur les capteurs thermiques, une liste de dispositifs de refroidissement atténués est exposée dans getCurrentCoolingDevices . L'ordre de cette liste est persistant, même si un périphérique de refroidissement est hors ligne. Les fabricants d'appareils peuvent utiliser la liste pour collecter des métriques statsd .

Pour plus d’informations, consultez l’ implémentation de référence .

Bien que vous puissiez ajouter vos propres extensions, vous ne devez pas désactiver la fonction d'atténuation thermique.

Prestation thermale

Dans Android 10 et versions ultérieures, le service thermique du framework assure une surveillance constante à l'aide des différents signaux d'atténuation de Thermal HAL 2.0 et donne un retour d'information sur la gravité de la limitation à ses clients. Ces clients incluent des composants internes et des applications Android. Le service utilise deux interfaces de rappel de classeur, IThermalEventListener et IThermalStatusListener , exposées en tant que rappels. Le premier est destiné à l’usage interne de la plate-forme et du fabricant d’appareils, et le second est destiné aux applications Android.

Grâce aux interfaces de rappel, l'état thermique actuel d'un appareil peut être récupéré sous forme de valeur entière allant de 0x00000000 (pas de limitation) à 0x00000006 (arrêt de l'appareil). Seul un service système fiable, tel qu'une API Android ou une API du fabricant de l'appareil, peut accéder aux informations détaillées sur le capteur thermique et les événements thermiques. La figure suivante fournit un modèle du flux du processus d'atténuation thermique dans Android 10 et versions ultérieures :

Flux de processus d’atténuation thermique dans Android 10 et versions ultérieures.

Figure 2. Déroulement du processus d'atténuation thermique dans Android 10 et versions ultérieures.

Directives du fabricant de l'appareil

Pour signaler le capteur de température de l'appareil et l'état de limitation pour Android 10 à 13, les fabricants d'appareils doivent implémenter l'aspect HIDL de Thermal HAL 2.0 ( IThermal.hal ).

Pour signaler le capteur de température de l’appareil et l’état de limitation pour Android 14, les fabricants d’appareils doivent implémenter l’aspect AIDL de Thermal HAL 2.0 ( IThermal.aidl ).

Tout ce qui limite les performances de l'appareil, y compris les contraintes d'alimentation de la batterie, doit être signalé via le HAL thermique. Pour garantir que cela se produise, placez tous les capteurs susceptibles d'indiquer un besoin d'atténuation (en fonction des changements d'état) dans le HAL thermique et signalez la gravité de toutes les mesures d'atténuation prises. La valeur de température renvoyée par la lecture d'un capteur ne doit pas nécessairement être la température réelle, à condition qu'elle reflète avec précision le seuil de gravité correspondant. Par exemple, vous pouvez transmettre différentes valeurs numériques au lieu de vos valeurs de seuil de température réelles, ou vous pouvez intégrer des bandes de garde dans les spécifications de seuil pour fournir une hystérésis. Cependant, la gravité correspondant à cette valeur doit correspondre à ce qui est nécessaire à ce seuil. Par exemple, vous pouvez décider de renvoyer 72 °C comme seuil de température critique, alors que la température réelle est de 65 °C et qu'elle correspond à la gravité critique que vous avez spécifiée. Le niveau de gravité doit être précis pour une meilleure fonctionnalité du cadre thermique.

Pour en savoir plus sur les niveaux de seuil dans le cadre et sur la façon dont ils correspondent aux actions d'atténuation, voir Utiliser les codes d'état thermique .

Utiliser des API thermiques

Les applications peuvent ajouter et supprimer des écouteurs et accéder aux informations sur l'état thermique via la classe PowerManager . L'interface IThermal fournit toutes les fonctionnalités nécessaires, y compris le renvoi des valeurs d'état thermique. L' interface du classeur IThermal est encapsulée sous la forme de l'interface OnThermalStatusChangedListener , que les applications peuvent utiliser lors de l'enregistrement ou de la suppression des écouteurs d'état thermique.

Les API thermiques Android disposent à la fois de méthodes de rappel et d'interrogation permettant aux applications d'être informées des niveaux de gravité thermique via des codes d'état définis dans la classe PowerManager . Les méthodes sont :

Utiliser les codes d'état thermique

Les codes d'état thermique se traduisent par des niveaux de limitation spécifiques, que vous pouvez utiliser pour collecter des données et pour concevoir une UX optimale. Par exemple, les applications peuvent recevoir un état de 0x00000000 ( THERMAL_STATUS_NONE ), qui peut ensuite devenir 0x00000001 ( THERMAL_STATUS_LIGHT ). Marquer l'état 0x00000000 comme t0, puis mesurer le temps écoulé entre l'état THERMAL_STATUS_NONE et l'état THERMAL_STATUS_LIGHT comme t1 permet aux fabricants d'appareils de concevoir et de tester des stratégies d'atténuation pour des cas d'utilisation spécifiques. Le tableau suivant présente les façons suggérées d'utiliser les codes d'état thermique :

Code d'état thermique Description et utilisation suggérée
THERMAL_STATUS_NONE ( 0x00000000 ) Pas de limitation. Utilisez cet état pour mettre en œuvre des actions de protection, telles que la détection du début de la période (t0 à t1) de THERMAL_STATUS_NONE ( 0 ) à THERMAL_STATUS_LIGHT ( 1 ).
THERMAL_STATUS_LIGHT ( 0x00000001 ) Légère limitation, l'UX n'est pas impacté. Utilisez une atténuation douce des appareils pour cette étape. Par exemple, évitez de booster ou d'utiliser des fréquences inefficaces, mais uniquement sur les gros cœurs.
THERMAL_STATUS_MODERATE ( 0x00000002 ) Limitation modérée, l’UX n’est pas grandement impacté. L’atténuation thermique a un impact sur les activités de premier plan, les applications doivent donc réduire immédiatement la consommation d’énergie.
THERMAL_STATUS_SEVERE ( 0x00000003 ) Limitation sévère ; L’UX est largement impactée. À ce stade, l’atténuation thermique des appareils doit limiter la capacité du système. Cet état peut provoquer des effets secondaires, tels qu'un affichage saccadé et une gigue audio.
THERMAL_STATUS_CRITICAL ( 0x00000004 ) Platform a tout fait pour réduire la puissance. Le logiciel d'atténuation thermique de l'appareil a placé tous les composants pour qu'ils fonctionnent à leur capacité la plus basse.
THERMAL_STATUS_EMERGENCY ( 0x00000005 ) Les composants clés de la plate-forme s'arrêtent en raison des conditions thermiques et la fonctionnalité de l'appareil est limitée. Ce code d'état représente le dernier avertissement avant l'arrêt de l'appareil. Dans cet état, certaines fonctions, telles que le modem et les données cellulaires, sont complètement désactivées.
THERMAL_STATUS_SHUTDOWN ( 0x00000006 ) Arrêtez immédiatement. En raison de la gravité de cette étape, les applications pourraient ne pas être en mesure de recevoir cette notification.

Les fabricants d'appareils doivent réussir le test VTS pour HAL thermique et peuvent utiliser emul_temp depuis l'interface sysfs du noyau pour simuler les changements de température.