Santé Android

Android 9 inclut android.hardware.health HAL 2.0, une mise à niveau majeure de la version health@1.0 HAL. Ce nouveau HAL présente les avantages suivants:

  • Une séparation plus nette entre le framework et le code fournisseur.
  • healthd démon healthd inutile.
  • Plus grand degré de liberté pour la personnalisation des fournisseurs dans les rapports d'informations sur la santé.
  • Plus d'informations sur la santé de l'appareil que la batterie.

Android 11 inclut android.hardware.health HAL 2.1, une mise à niveau de version mineure de health@2.0 HAL. Ce nouveau HAL présente les avantages suivants:

  • Plus facile à mettre en œuvre
  • Meilleure conformité avec les API HAL 2.0 existantes
  • Meilleure séparation des aigus dans le code de charge en mode arrêt
  • Meilleure prise en charge du framework pour indiquer la santé de la batterie de l'appareil

Conditions

Les appareils lancés avec Android 9 doivent fournir la version 2.0 HAL (et ne doivent pas fournir la version 1.0 HAL). Les appareils qui ne se lancent pas avec Android 9 mais prévoient de mettre à jour l'image du fournisseur vers Target Framework Compatibility Matrix version 3 (publié dans Android 9) doivent supprimer les implémentations 1.0 HAL existantes et fournir la 2.0 HAL.

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). Les appareils qui ne se lancent pas avec Android 11 mais prévoient de mettre à jour l'image du fournisseur vers Target Framework Compatibility Matrix version 5 (publiée dans Android 11) doivent supprimer les implémentations 2.0 HAL existantes et fournir la version 2.1 HAL. Il est également recommandé aux appareils qui ne se lancent pas avec Android 11 et ne prévoient pas de mettre à jour l'image du fournisseur de fournir la version 2.1 HAL.

AOSP comprend plusieurs bibliothèques d'assistance conçues pour vous aider à implémenter la version 2.1 HAL et la transition depuis l'ancienne version 1.0 HAL.

Terminologie

  • health@1.0 : abréviation de android.hardware.health@1.0 . Fait référence à la santé HIDL HAL version 1.0 publiée dans Android 8.0.
  • health@2.0 : abréviation de android.hardware.health@2.0 . Fait référence à la santé HIDL HAL version 2.0 publiée dans Android 9.
  • health@2.1 : abréviation de android.hardware.health@2.1 . Fait référence à la santé HIDL HAL version 2.1 publiée dans Android 11.
  • chargeur : exécutable fonctionnant en mode de charge éteint qui affiche l'animation de chargement du téléphone.
  • recovery : exécutable fonctionnant en mode recovery qui doit récupérer les informations de la batterie.
  • healthd : démon hérité fonctionnant sous Android qui récupère les informations relatives à la santé et les fournit au framework
  • storaged : démon fonctionnant sous Android qui récupère les informations de stockage et les fournit au framework.

Santé sous Android 8.x

Dans Android 8.x, le composant de santé fonctionne comme indiqué dans le diagramme suivant:

Santé sous Android 8.x

Graphique 1 . Santé sous Android 8.x

Dans ce diagramme:

  • Un (1) appel de classeur et un (1) appel de hwbinder sont utilisés par l'infrastructure pour communiquer avec le matériel.
  • healthd établit un lien statique vers libhealthd_android , libbatterymonitor et libbatteryservice .
  • health@1.0-impl établit un lien statique vers libhealthd. BOARD .

Chaque tableau peut personnaliser un libhealthd. BOARD différent libhealthd. BOARD ; il est déterminé au moment de la construction à quel chargeur, health@1.0-impl et lien de récupération.

Pour les autres modes:

Mode de chargement et de récupération en mode désactivé sous Android 8.x

Figure 2. Santé sous Android 8.x, mode de charge et de récupération hors mode

  • charger est lié statiquement à libhealthd. BOARD , libhealthd_charger et libbatterymonitor .
  • recovery est lié statiquement à libhealthd. BOARD et libbatterymonitor .

Santé sous Android 9

Dans Android 9, le composant de santé fonctionne comme indiqué dans le diagramme suivant: Santé sous Android 9

Graphique 3 . Santé sous 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). Le chemin du code hérité 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 les informations des deux HAL car une seule version de service (1.0 ou 2.0) peut exister sur l'appareil.

Pour les autres modes:

Charing et récupération hors mode sous Android 9

Figure 4. Santé sous Android 9, mode de charge et de récupération hors mode

Santé sous Android 11

Dans Android 11, le composant de santé fonctionne comme indiqué dans le diagramme 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 d'intégrité 2.1 n'existe pas, le système revient au chemin du code hérité 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)      ] |
+-------------------------------------+

Interface HAL 2.0

Le HAL health@2.0 fournit les mêmes fonctionnalités au framework que l'ancien démon healthd. Il fournit également des API similaires à celles fournies par healthd précédemment en tant que service de classeur (c'est-à-dire IBatteryPropertiesRegistrar ).

L'interface principale, IHealth , fournit les fonctions suivantes:

  • registerCallback , pour remplacer IBatteryPropertiesRegistrar.registerListener
  • unregisterCallback , à remplacer IBatteryPropertiesRegistrar.unregisterListener
  • update , pour remplacer IBatteryPropertiesRegistrar.scheduleUpdate
  • IBatteryPropertiesRegistrar.getProperties est remplacé par ce qui suit:
    • getChargeCounter
    • getCurrentNow
    • getCurrentAverage
    • getCapacity
    • getEnergyCounter
    • getChargeStatus
    • getHealthInfo

En outre, IHealth fournit les nouvelles API suivantes pour le storaged afin de récupérer les informations relatives au stockage spécifiques au fournisseur:

  • getStorageInfo
  • getDiskStats

Une nouvelle structure, @2.0::HealthInfo , est renvoyée via des rappels et getHealthInfo . Cette structure contient toutes les informations sur l'état de l'appareil disponibles via health@2.0 HAL, notamment:

  • Informations de charge (AC / USB / sans fil, courant, tension, etc.)
  • Informations sur la batterie (présence, niveau de batterie, courant, tension, charge, technologie, etc.)
  • Informations de stockage (informations sur le périphérique de stockage, statistiques du disque)

Interface HAL 2.1

Health@2.1 HAL prend en charge la charge en mode arrêt 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 cette HAL
  • getHealthInfo_2_1 : une mise à niveau de version mineure vers getHealthInfo
  • shouldKeepScreenOn : pour déterminer si l'écran doit rester shouldKeepScreenOn en mode chargeur

En outre, la mise en œuvre de @2.1::IHealth est nécessaire pour soutenir @2.1::IHealthInfoCallback pour ses héritées registerCallback et unregisterCallback fonctions. La nouvelle interface de rappel renvoie des informations sur l'état de santé au client à l'aide de sa fonction healthInfoChanged_2_1 au lieu de la fonction healthInfoChanged héritée.

Une nouvelle structure, @2.1::HealthInfo , est renvoyée via des callbacks et getHealthInfo_2_1 . Cette structure contient des informations supplémentaires sur l'état de l'appareil disponibles via health@2.0 HAL, notamment:

  • Niveau de capacité de la batterie
  • Temps de charge de la batterie au maximum maintenant (en secondes)
  • Capacité de conception de charge complète de la batterie (en μAh)

Pour plus d'informations sur l'implémentation du service de santé, consultez Implémentation de l'intégrité .