В Android 11 весь код healthd
реорганизуется в libhealthloop
и libhealth2impl
, а затем модифицируется для реализации HAL health@2.1. Эти две библиотеки статически связаны с помощью health@2.0-impl-2.1
— сквозной реализации Health 2.1. Статически связанные библиотеки позволяют health@2.0-impl-2.1
выполнять ту же работу, что и healthd
, например запускать healthd_mainloop
и опрос. В init health@2.1-service
регистрирует реализацию интерфейса IHealth
для hwservicemanager
. При обновлении устройств с образом поставщика Android 8.x или 9 и платформой Android 11 образ поставщика может не предоставлять службу health@2.1. Обратная совместимость со старыми образами поставщиков обеспечивается графиком прекращения поддержки .
Чтобы обеспечить обратную совместимость:
-
healthd
регистрируетIHealth
вhwservicemanager
несмотря на то, что он является системным демоном.IHealth
добавляется в системный манифест с именем экземпляра «резервная копия». - Фреймворк и
storaged
взаимодействуют сhealthd
черезhwbinder
а не черезbinder
. - Код для framework и
storaged
изменен, чтобы получить экземпляр «по умолчанию», если он доступен, а затем «резервную копию».- Клиентский код C++ использует логику, определенную в
libhealthhalutils
. - Клиентский код Java использует логику, определенную в
HealthServiceWrapper
.
- Клиентский код C++ использует логику, определенную в
- После того как IHealth/default станет широко доступен и образы поставщиков Android 8.1 станут устаревшими, IHealth/backup и
healthd
могут стать устаревшими. Дополнительные сведения см. в разделе Прекращение поддержки health@1.0 .
Переменные сборки, специфичные для платы, для healthd
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.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 перед созданием службы Health HAL 2.1.
Тестирование
Android 11 включает новые тесты VTS , написанные специально для HAL health@2.1. Если в манифесте устройства указано Health@2.1 HAL, оно должно пройти соответствующие тесты VTS. Тесты пишутся как для экземпляра по умолчанию (чтобы убедиться, что устройство правильно реализует HAL), так и для резервного экземпляра (чтобы убедиться, что healthd
продолжает работать правильно перед его удалением).
Требования к информации о батарее
HAL Health 2.0 устанавливает набор требований к интерфейсу 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 .