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 est soumis à une contrainte thermique, les tâches jobscheduler sont limitées et, si nécessaire, un arrêt thermique du framework est lancé. Les applications qui reçoivent des notifications de stress thermique via un rappel enregistré dans la classe PowerManager peuvent ajuster leur UX de manière fluide.

HAL thermique

Android 9 et les versions antérieures utilisent une interface d'interrogation définie dans Thermal HAL 1.0 pour obtenir des relevés de température. Cette HAL permettait au framework Android et à d'autres clients de confiance, tels que la HAL d'un fabricant d'appareils, de lire les seuils de limitation et d'arrêt spécifiques à la température actuelle et aux règles 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 la HAL, Thermal HAL 2.0, qui abstrait l'interface vers les périphériques matériels du sous-système thermique. L'interface matérielle inclut 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 lectures de capteurs thermiques et les niveaux de gravité associés pour indiquer le stress thermique. La figure suivante montre deux messages d'avertissement de l'UI 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 se poursuit. Si FAILURE est renvoyé, un message d'erreur lisible par un humain 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 versions ultérieures) avec l'interface de rappel des clients HAL thermiques, tels que le service thermique du framework. Par exemple, RegisterIThermalChangedCallback et UnregisterIThermalChangedCallback pour enregistrer ou désenregistrer les événements de modification de la gravité. 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 le capteur thermique, une liste des dispositifs de refroidissement atténués est exposée dans getCurrentCoolingDevices. L'ordre de cette liste est conservé, même si un appareil de refroidissement est hors connexion. Les fabricants d'appareils peuvent utiliser la liste pour collecter des métriques statsd.

Pour en savoir plus, consultez la documentation de référence sur l'implémentation.

Vous pouvez ajouter vos propres extensions, mais vous ne devez pas désactiver la fonction d'atténuation thermique.

Service thermique

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 fournit des informations 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 binder, IThermalEventListener et IThermalStatusListener, exposées en tant que rappels. Le premier est destiné à la plate-forme interne et aux fabricants d'appareils, tandis que 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 la forme d'une valeur entière allant de 0x00000000 (aucune limitation) à 0x00000006 (arrêt de l'appareil). Seul un service système de confiance, tel qu'une API Android ou une API du fabricant de l'appareil, peut accéder aux informations détaillées sur les capteurs thermiques et les événements thermiques. La figure suivante fournit un modèle du flux de processus d'atténuation thermique dans Android 10 et versions ultérieures :

Flux du processus d'atténuation thermique dans Android 10 et versions ultérieures.

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

Consignes du fabricant de l'appareil

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

Pour signaler l'état du capteur de température et de la limitation de la fréquence du processeur pour Android 14, les fabricants d'appareils doivent implémenter l'aspect AIDL du HAL thermique 2.0 (IThermal.aidl).

Tout ce qui limite les performances de l'appareil, y compris les contraintes liées à l'alimentation de la batterie, doit être signalé via le HAL thermique. Pour ce faire, placez tous les capteurs susceptibles d'indiquer une nécessité d'atténuation (en fonction des changements d'état) dans le HAL thermique et signalez la gravité des actions d'atténuation entreprises. La valeur de température renvoyée par une lecture de capteur ne doit pas nécessairement être la température réelle, à condition qu'elle reflète précisément 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 une bande de protection dans les spécifications de seuil pour fournir une hystérésis. Toutefois, 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 correspond à la gravité critique que vous avez spécifiée. Le niveau de gravité doit être précis pour que le framework thermique fonctionne de manière optimale.

Pour en savoir plus sur les seuils du framework et leur correspondance avec les actions d'atténuation, consultez Utiliser les codes d'état thermique.

Utiliser les 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 de liaison thermique est encapsulée en tant qu'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 de méthodes de rappel et d'interrogation pour que les applications soient informées des niveaux de gravité thermique par le biais de codes d'état, qui sont définis dans la classe PowerManager. Voici les méthodes :

Utiliser les codes d'état thermiques

Les codes d'état thermique correspondent à des niveaux de limitation spécifiques, que vous pouvez utiliser pour collecter des données et concevoir une UX optimale. Par exemple, les applications peuvent recevoir un état 0x00000000 (THERMAL_STATUS_NONE), qui peut ensuite passer à 0x00000001 (THERMAL_STATUS_LIGHT). Si l'état 0x00000000 est marqué comme t0, la mesure du temps écoulé entre l'état THERMAL_STATUS_NONE et l'état THERMAL_STATUS_LIGHT (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 des suggestions d'utilisation des codes d'état thermique :

Code d'état thermique Description et utilisation suggérée
THERMAL_STATUS_NONE (0x00000000) Aucune limitation. Utilisez cet état pour implémenter des actions de protection, comme la détection du début de la période (de t0 à t1) de THERMAL_STATUS_NONE (0) à THERMAL_STATUS_LIGHT (1).
THERMAL_STATUS_LIGHT (0x00000001) L'expérience utilisateur n'est pas affectée par la limitation de la luminosité. Utilisez une atténuation douce des appareils pour cette étape. Par exemple, évitez d'augmenter la fréquence ou d'utiliser des fréquences inefficaces, mais uniquement sur les grands cœurs.
THERMAL_STATUS_MODERATE (0x00000002) L'appareil est soumis à des limitations modérées, sans impact significatif sur l'expérience utilisateur. La réduction thermique a un impact sur les activités au premier plan. Les applications doivent donc réduire immédiatement la consommation d'énergie.
THERMAL_STATUS_SEVERE (0x00000003) L'appareil est soumis à des limitations sévères qui nuisent considérablement à l'expérience utilisateur. À ce stade, la réduction thermique de l'appareil doit limiter la capacité du système. Cet état peut entraîner des effets secondaires, tels que des saccades d'affichage et des tremblements audio.
THERMAL_STATUS_CRITICAL (0x00000004) La plate-forme a tout fait pour réduire la consommation d'énergie. Le logiciel d'atténuation thermique de l'appareil a placé tous les composants pour qu'ils fonctionnent à leur capacité minimale.
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 mobiles, sont complètement désactivées.
THERMAL_STATUS_SHUTDOWN (0x00000006) Arrêtez-le immédiatement. En raison de la gravité de cette étape, il est possible que les applications ne puissent pas recevoir cette notification.

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