Android 9 inclut android.hardware.health
HAL 2.0, une mise à niveau majeure par rapport à la version HAL health@1.0. Ce nouveau HAL présente les avantages suivants :
- Séparation plus nette entre le framework et le code du fournisseur.
- Déprécie le démon
healthd
inutile. - Plus de liberté pour la personnalisation des fournisseurs dans les rapports sur les informations de santé.
- Plus d'informations sur l'état de l'appareil que la batterie.
Android 11 inclut la version 2.1 du HAL android.hardware.health
, une mise à niveau mineure de la version 2.0 du HAL health@. Ce nouveau HAL présente les avantages suivants :
- Plus facile à implémenter
- Conformité améliorée avec les API HAL 2.0 existantes
- Meilleure séparation des aigus dans le code de recharge en mode hors connexion
- Meilleure prise en charge du framework pour indiquer l'état de la batterie de l'appareil
Android 13 inclut le HAL AIDL android.hardware.health
, une conversion du HAL health@2.1. Ce nouveau HAL présente les avantages suivants:
- Suppression des API inutilisées liées au chargeur
- Suppression des
StorageAttribute
et des champs associés inutilisés - Prise en charge de la recharge sur station d'accueil.
Conditions requises
Appareils équipés d'Android 9 et d'Android 10
Les appareils lancés avec Android 9 doivent fournir le HAL 2.x (et non le HAL 1.0) ou le HAL AIDL. Les appareils qui ne démarrent pas avec Android 9, mais qui prévoient de mettre à jour l'image du fournisseur vers la version 3 de la matrice de compatibilité du framework cible (publiée dans Android 9) doivent supprimer les implémentations HAL 1.0 existantes et fournir le HAL 2.x ou le HAL AIDL.
AOSP comprend plusieurs bibliothèques d'aide conçues pour vous aider à implémenter le HAL 2.0 et la transition de l'ancienne HAL 1.0.
Appareils fonctionnant sous Android 11 et Android 12
Les appareils lancés avec Android 11 doivent fournir le HAL 2.1 (et ne doivent pas fournir le HAL 1.0 ou 2.0) ou le HAL AIDL. Les appareils qui ne sont pas lancés avec Android 11, mais qui prévoient de mettre à jour l'image du fournisseur vers la version 5 de la matrice de compatibilité du framework cible (publiée dans Android 11) doivent supprimer les implémentations HAL 2.0 existantes et fournir le HAL 2.1 ou le HAL AIDL. Les appareils qui ne sont pas lancés avec Android 11 et qui ne prévoient pas de mettre à jour l'image du fournisseur sont également recommandés pour fournir la version HAL 2.1.
AOSP comprend plusieurs bibliothèques d'aide conçues pour vous aider à implémenter le HAL 2.1 et la transition de l'ancienne HAL 1.0.
Appareils équipés d'Android 13 ou version ultérieure
Les appareils équipés d'Android 13 doivent fournir le HAL AIDL (et non le HAL HIDL). Les appareils qui ne sont pas lancés avec Android 13, mais qui prévoient de mettre à jour l'image du fournisseur vers la version 7 de la matrice de compatibilité du framework cible (publiée dans Android 13) doivent supprimer les implémentations HAL HIDL existantes et fournir le HAL AIDL. Il est également recommandé de fournir le HAL AIDL pour les appareils qui ne sont pas lancés avec Android 13 et qui ne prévoient pas de mettre à jour l'image du fournisseur.
Les appareils ne doivent pas fournir le HAL HIDL 1.0.
AOSP inclut plusieurs bibliothèques d'assistance conçues pour vous aider à implémenter le HAL AIDL et la transition depuis les anciens HAL HIDL.
Terminologie
- health@1.0: abréviation de
android.hardware.health@1.0
. Fait référence à la version 1.0 de la HAL HIDL de santé publiée dans Android 8.0. - health@2.0: abréviation de
android.hardware.health@2.0
. Fait référence à la version 2.0 de la HAL HIDL de santé publiée dans Android 9. - health@2.1 : abréviation de
android.hardware.health@2.1
. Fait référence à la version 2.1 de la HAL HIDL de santé publiée dans Android 11. - HAL AIDL de santé : abréviation de
android.hardware.health
.- La version 1 est publiée sous Android 13.
- charger : exécutable exécuté en mode de charge hors tension qui affiche l'animation de recharge du téléphone.
- recovery : exécutable exécuté en mode de récupération qui doit récupérer des informations sur la batterie.
- healthd : ancien daemon exécuté dans Android qui récupère des informations sur l'état et les fournit au framework.
- storaged : daemon exécuté dans Android qui récupère les informations de stockage et les fournit au framework.
Santé sur Android 8.x
Sous Android 8.x, le composant d'état fonctionne comme indiqué dans le schéma suivant :
Figure 1 : Santé dans Android 8.x
Dans ce diagramme :
- Le framework utilise un appel de liaison et un appel hwbinder pour communiquer avec le matériel.
healthd
établit des liens statiques aveclibhealthd_android
,libbatterymonitor
etlibbatteryservice
.- health@1.0-impl est associé de manière statique à
libhealthd.BOARD
.
Chaque carte peut personnaliser un libhealthd.BOARD
différent. Le chargeur, health@1.0-impl et le lien de récupération sont déterminés au moment de la compilation.
Pour les autres modes:
Figure 2. Santé sous Android 8.x, recharge hors connexion et mode Recovery.
- le chargeur est associé de manière statique à
libhealthd.BOARD
,libhealthd_charger
etlibbatterymonitor
. - La récupération établit des liens statiques avec
libhealthd.BOARD
etlibbatterymonitor
.
Santé dans Android 9
Sous Android 9, le composant d'état fonctionne comme indiqué dans le schéma suivant :
Figure 3. Santé dans Android 9
Le framework tente de récupérer le service health@2.0 à partir de hwservicemanager
.
En cas d'échec, il appelle health@1.0 (sous Android 8.x). L'ancien chemin de code est conservé afin que l'image système Android 9 soit compatible avec l'image du fournisseur Android 8.x. Le framework ne récupère pas d'informations auprès des deux HAL, car une seule version de service (1.0 ou 2.0) peut exister sur l'appareil.
Pour les autres modes :
Figure 4. Santé dans Android 9, recharge hors tension et mode récupération
Santé dans Android 11
Dans Android 11, le composant Santé fonctionne comme indiqué dans le schéma suivant :
[system]
| getService()
V
[health@2.1-service]
| getService(stub=true)
V
[ health@2.0-impl-2.1-<device>.so ]
| | (device-dependent linkage)
V V
+---------Helper libs for impl--------+ [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl) ] |
| [libbatterymonitor (battery) ] |
+-------------------------------------+
Si l'implémentation de l'état 2.1 n'existe pas, le système revient à l'ancien chemin de code, comme décrit dans les sections précédentes.
Pour les autres modes:
[ charger ]
| getService() | (legacy code path)
V +-------------------------------------------------+
[health@2.1-service] |
| getService(stub=true) |
V |
[ health@2.0-impl-2.1-<device>.so ] |
| | (device-dependent linkage) |
V V |
+---------Helper libs for impl--------+ [libhealthd.device] |
| [libhealthloop (uevent, wakealarm)] | |
| [libhealth2impl (IHealth impl) ] | <---------------------------------+
| [libbatterymonitor (battery) ] |
+-------------------------------------+
[recovery]
| getService() w/o hwservicemanager
V
[ health@2.0-impl-2.1-<device>.so ]
| | (device-dependent linkage)
V V
+---------Helper libs for impl--------+ [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl) ] |
| [libbatterymonitor (battery) ] |
+-------------------------------------+
Consultez le schéma simplifié suivant pour les différents modes :
Figure 5. Infrastructure Health HAL 2.1
Santé dans Android 13
Dans Android 13, le HAL AIDL de santé est introduit. Le composant d'état fonctionne comme indiqué dans le schéma suivant:
Figure 6. Infrastructure HAL de l'AIDL Santé.
Interface HAL HIDL 2.0
Le HAL health@2.0 fournit au framework les mêmes fonctionnalités que l'ancien daemon healthd. Il fournit également des API similaires à celles que healthd fournissait auparavant en tant que service de liaison (IBatteryPropertiesRegistrar, par exemple).
L'interface principale, IHealth, fournit les fonctions suivantes :
registerCallback
, pour remplacerIBatteryPropertiesRegistrar.registerListener
unregisterCallback
, pour remplacerIBatteryPropertiesRegistrar.unregisterListener
update
, pour remplacerIBatteryPropertiesRegistrar.scheduleUpdate
IBatteryPropertiesRegistrar.getProperties
sont remplacés par les éléments suivants :getChargeCounter
getCurrentNow
getCurrentAverage
getCapacity
getEnergyCounter
getChargeStatus
getHealthInfo
De plus, IHealth
fournit les nouvelles API suivantes pour que storaged
puisse récupérer des informations spécifiques au fournisseur concernant le stockage :
getStorageInfo
getDiskStats
Un nouveau struct, @2.0::HealthInfo
, est renvoyé via des rappels et getHealthInfo
.
Cette structure contient toutes les informations sur l'état de l'appareil disponibles via le HAL health@2.0, y compris les éléments suivants :
- Informations sur la recharge (courant alternatif/USB/sans fil, courant, tension, etc.)
- Informations sur la batterie (présence, niveau de batterie, courant, tension, charge, technologie, etc.)
- Informations sur le stockage (informations sur le périphérique de stockage, statistiques sur le disque)
Pour en savoir plus sur l'implémentation du service Santé 2.0, consultez la section Implémenter Santé 2.0.
Interface HAL HIDL 2.1
La HAL health@2.1 est compatible avec la recharge hors mode et fournit plus d'informations sur la batterie.
L'interface principale, IHealth, fournit les fonctions supplémentaires suivantes :
getHealthConfig
: pour récupérer la configuration de ce HALgetHealthInfo_2_1
: mise à niveau vers une version mineure degetHealthInfo
shouldKeepScreenOn
: permet de déterminer si l'écran doit rester allumé en mode chargeur.
En outre, l'implémentation de @2.1::IHealth
est requise pour prendre en charge @2.1::IHealthInfoCallback
pour ses fonctions registerCallback
et unregisterCallback
héritées. La nouvelle interface de rappel renvoie des informations de santé au client à l'aide de sa fonction healthInfoChanged_2_1
au lieu de la fonction healthInfoChanged
héritée.
Une nouvelle struct, @2.1::HealthInfo
, est renvoyée via des rappels et getHealthInfo_2_1
. Cette struct contient des informations supplémentaires sur l'état de l'appareil disponibles via le HAL health@2.0, y compris les éléments suivants :
- Niveau de charge de la batterie
- Temps de recharge de la batterie pour la remplir complètement (en secondes)
- Capacité de conception de la batterie à pleine charge (en μAh)
Consultez le schéma UML suivant pour connaître les classes utiles à l'implémentation de HAL pour l'état de santé:
Figure 7. Schéma UML de Health HAL 2.1.
Pour en savoir plus sur l'implémentation du service Santé 2.1, consultez la section Implémenter Santé 2.1.
Interface HAL AIDL version 1
Modifications apportées à l'API
Le HAL de la version 1 d'AIDL est compatible avec des API similaires à celles du HAL HIDL 2.1. Par rapport à l'interface HIDL 2.1, les modifications suivantes ont été apportées dans l'API:
- Les API liées au chargeur introduites dans le HAL HIDL 2.1 ne sont pas portées vers le HAL AIDL. Étant donné que la fonctionnalité de facturation hors mode ne réside que sur la partition
/vendor
, les API de l'interface fournisseur ne sont pas nécessaires. Pour implémenter correctement la recharge hors mode, consultez charger ci-dessous. - Le type
StorageAttribute
et les champs associés sont supprimés, car ils ne sont pas utilisés. chargerDockOnline
a été ajouté àHealthInfo
pour permettre la recharge sur la station d'accueil.
Implémentation
Consultez le schéma UML suivant pour connaître les classes utiles à l'implémentation de HAL pour l'état de santé:
Figure 8. Diagramme UML HAL de Health AIDL.
Pour en savoir plus sur l'implémentation du service AIDL Santé, consultez la section Implémenter le HAL AIDL Santé.
Récupération
Android 13 prend en charge le binder pour la récupération. L'installation du service AIDL Santé dans la récupération lui permet de s'exécuter en mode récupération.
Pour savoir comment installer le service AIDL de santé en mode récupération, consultez les ressources suivantes :
Chargeur
La fonctionnalité de recharge hors mode est déplacée de /system
vers /vendor
. Pour les appareils lancés avec Android 13, s'ils sont compatibles avec la recharge hors tension, le binaire du service HAL doit être compatible avec le mode chargeur. Pour ce faire, reportez-vous à la section Mettre en œuvre un chargeur.
Propriétés du système de chargeur
Les propriétés ro.charger.*
ne sont plus lisibles par le binaire charger
dans /vendor
. Si l'une des propriétés système ro.charger.*
est définie sur votre appareil, consultez les propriétés système pour le chargeur.