В Android 11 весь код healthd реорганизуется в libhealthloop и libhealth2impl , а затем модифицируется для реализации HAL health@2.1. Эти две библиотеки связаны статически с помощью health@2.0-impl-2.1 , сквозной реализации работоспособности 2.1. Статически связанные библиотеки позволяют health@2.0-impl-2.1 выполнять ту же работу, что и healthd , например, выполнять healthd_mainloop и опрос. В процессе инициализации health@2.1-service регистрирует реализацию интерфейса IHealth в hwservicemanager . При обновлении устройств с образом поставщика Android 8.x или 9 и платформой Android 11 образ поставщика может не предоставлять службу health@2.1. Обратная совместимость со старыми образами поставщиков обеспечивается графиком устаревания .
Чтобы обеспечить обратную совместимость:
-  healthdрегистрируетIHealthвhwservicemanager, несмотря на то, что является системным демоном.IHealthдобавляется в системный манифест с именем экземпляра «backup».
-  Фреймворк и storagedвзаимодействуют сhealthdчерезhwbinderа не черезbinder.
-  Код для фреймворка и storagedизменен, чтобы получить экземпляр «по умолчанию», если он доступен, а затем «резервную копию».-  Клиентский код C++ использует логику, определенную в libhealthhalutils.
-  Клиентский код Java использует логику, определенную в HealthServiceWrapper.
 
-  Клиентский код C++ использует логику, определенную в 
-  После того, как IHealth/default станет широко доступным, а образы поставщиков Android 8.1 устарели, IHealth/backup и healthdмогут быть объявлены устаревшими. Дополнительные сведения см. в разделе Прекращение поддержки health@1.0 .
Переменные сборки для платы для здоровья
 BOARD_PERIODIC_CHORES_INTERVAL_* — это переменные, специфичные для платы, которые используются для построения healthd . В связи с разделением сборки системы/поставщика значения, специфичные для платы, не могут быть определены для системных модулей. Раньше эти значения были переопределены в устаревшей функции healthd_board_init .
 В Health@2.1 поставщики могут переопределить эти два значения интервала периодической работы в структуре healthd_config перед передачей в конструктор класса реализации работоспособности. Класс реализации работоспособности должен наследоваться от android::hardware::health::V2_1::implementation::Health .
Внедрение службы Health 2.1
Для получения информации о внедрении службы Health 2.1 см. hardware/interfaces/health/2.1/README.md .
Клиенты здравоохранения
Health@2.x имеет следующие клиенты:
-  зарядное устройство . Использование libbatterymonitorи кодаhealthd_commonзаключено вhealth@2.0-impl.
-  восстановление . Связь с libbatterymonitorзаключена вhealth@2.0-impl. Все вызовыBatteryMonitorзаменяются вызовами класса реализацииHealth.
- BatteryManager . - BatteryManager.queryProperty(int id)был единственным клиентом- IBatteryPropertiesRegistrar.getProperty.- IBatteryPropertiesRegistrar.getPropertyбыл предоставлен- healthdи напрямую читал- /sys/class/power_supply.- Из соображений безопасности приложениям не разрешается напрямую обращаться к HAL работоспособности. В Android 9 и более поздних версиях служба - IBatteryPropertiesRegistrarпредоставляется- BatteryServiceвместо- healthd.- BatteryServiceделегирует вызов HAL работоспособности для получения запрошенной информации.
- АккумуляторСервис . В Android 9 и более поздних версиях - BatteryServiceиспользует- HealthServiceWrapper, чтобы определить, следует ли использовать экземпляр службы работоспособности по умолчанию от- vendorили использовать резервный экземпляр службы работоспособности из- healthd.- BatteryServiceпрослушивает события работоспособности с помощью- IHealth.registerCallback.
- Хранится . В Android 9 и более поздних версиях - storagedиспользует- libhealthhalutils, чтобы определить, следует ли использовать экземпляр службы работоспособности по умолчанию от- vendorили использовать резервный экземпляр службы работоспособности от- healthd.- storagedпрослушивает события работоспособности с помощью- IHealth.registerCallbackи извлекает информацию о хранилище.
Изменения SELinux
Health@2.1 HAL включает в себя следующие изменения SELinux в платформе:
-  Добавляет сервис android.hardware.health@2.1-serviceвfile_contexts.
Для устройств с собственной реализацией могут потребоваться некоторые изменения поставщика SELinux. Пример:
# device/<manufacturer>/<device>/sepolicy/vendor/hal_health_default.te
# Add device specific permissions to hal_health_default domain, especially
# if it links to board-specific libhealthd or implements storage APIs.
Интерфейсы ядра
 Демон healthd и реализация по умолчанию android.hardware.health@2.0-impl-2.1 получают доступ к следующим интерфейсам ядра для получения информации о батарее:
-  /sys/class/power_supply/*/capacity_level(добавлено в Health 2.1)
-  /sys/class/power_supply/*/capacity
-  /sys/class/power_supply/*/charge_counter
-  /sys/class/power_supply/*/charge_full
-  /sys/class/power_supply/*/charge_full_design(добавлено в Health 2.1)
-  /sys/class/power_supply/*/current_avg
-  /sys/class/power_supply/*/current_max
-  /sys/class/power_supply/*/current_now
-  /sys/class/power_supply/*/cycle_count
-  /sys/class/power_supply/*/health
-  /sys/class/power_supply/*/online
-  /sys/class/power_supply/*/present
-  /sys/class/power_supply/*/status
-  /sys/class/power_supply/*/technology
-  /sys/class/power_supply/*/temp
-  /sys/class/power_supply/*/time_to_full_now(добавлено в Health 2.1)
-  /sys/class/power_supply/*/type
-  /sys/class/power_supply/*/voltage_max
-  /sys/class/power_supply/*/voltage_now
 Любая реализация HAL работоспособности для конкретного устройства, использующая libbatterymonitor , по умолчанию обращается к этим интерфейсам ядра, если только это не переопределено в конструкторе класса реализации работоспособности.
 Если эти файлы отсутствуют или недоступны из healthd или из службы по умолчанию (например, файл является символической ссылкой на папку конкретного поставщика, доступ к которой запрещен из-за неправильно настроенной политики SELinux), они могут работать неправильно. Следовательно, могут потребоваться дополнительные изменения SELinux для конкретного поставщика, даже если используется реализация по умолчанию.
 Некоторые интерфейсы ядра, используемые в Health 2.1, такие как /sys/class/power_supply/*/capacity_level и /sys/class/power_supply/*/time_to_full_now , могут быть необязательными. Однако, чтобы предотвратить неправильное поведение фреймворка из-за отсутствия интерфейсов ядра, рекомендуется выбирать CL 1398913 перед сборкой службы работоспособности HAL 2.1.
Тестирование
 Android 11 включает новые тесты VTS, написанные специально для HAL Health@2.1. Если устройство объявляет HAL Health@2.1 в манифесте устройства, оно должно пройти соответствующие тесты VTS. Тесты написаны как для экземпляра по умолчанию (чтобы убедиться, что устройство правильно реализует HAL), так и для резервного экземпляра (чтобы убедиться, что healthd продолжает работать правильно, прежде чем он будет удален).
Требования к информации об аккумуляторе
Health 2.0 HAL устанавливает набор требований к интерфейсу HAL, но соответствующие тесты VTS относительно смягчены для их обеспечения. В Android 11 добавлены новые тесты VTS для обеспечения соблюдения следующих требований к устройствам, запускаемым с Android 11 и выше:
- Единицами мгновенного и среднего тока батареи должны быть микроампер (мкА).
-  Знак мгновенного и среднего тока батареи должен быть правильным. Конкретно:-  ток == 0, когда состояние батареи UNKNOWN
-  ток > 0, когда батарея находится в состоянии CHARGING
-  ток <= 0, когда состояние батареи NOT_CHARGING
-  ток < 0, когда батарея находится в состоянии DISCHARGING
-  Не применяется, когда состояние батареи FULL
 
-  ток == 0, когда состояние батареи 
-  Состояние батареи должно быть правильным независимо от того, подключен источник питания или нет. Конкретно:-  состояние батареи должно быть одним из CHARGING,NOT_CHARGINGилиFULLтогда и только тогда, когда подключен источник питания;
-  состояние батареи должно быть DISCHARGINGтогда и только тогда, когда источник питания отключен.
 
-  состояние батареи должно быть одним из 
 Если вы используете libbatterymonitor в своей реализации и передаете значения из интерфейсов ядра, убедитесь, что узлы sysfs сообщают правильные значения:
-  Убедитесь, что ток батареи указан с правильным знаком и единицами измерения. Сюда входят следующие узлы sysfs:-  /sys/class/power_supply/*/current_avg
-  /sys/class/power_supply/*/current_max
-  /sys/class/power_supply/*/current_now
- Положительные значения указывают на входящий ток в батарею.
- Значения должны быть в микроамперах (мкА).
 
-  
-  Убедитесь, что напряжение батареи указано в микровольтах (мкВ). Сюда входят следующие узлы sysfs:-  /sys/class/power_supply/*/voltage_max
-  /sys/class/power_supply/*/voltage_now
-  Обратите внимание, что реализация HAL по умолчанию делит voltage_nowна 1000 и сообщает значения в милливольтах (мВ). См. @1.0::HealthInfo .
 
-  
Подробнее см. в разделе Класс источника питания Linux .
