В 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 и опрашивать систему. В процессе инициализации health@2.1-service регистрирует реализацию интерфейса IHealth в hwservicemanager . При обновлении устройств с образом поставщика Android 8.x или 9 и фреймворком Android 11, образ поставщика может не предоставлять службу health@2.1. Обратная совместимость со старыми образами поставщиков обеспечивается графиком устаревания .
Для обеспечения обратной совместимости:
-
healthdрегистрируетIHealthвhwservicemanager, несмотря на то, что это системный демон.IHealthдобавляется в системный манифест с именем экземпляра "backup". - Взаимодействия между фреймворком и
storagedсоhealthdосуществляются черезhwbinderа не черезbinder. - В коде для framework и
storagedвнесены изменения, позволяющие получать экземпляр "default", если он доступен, а затем "backup".- Клиентский код на C++ использует логику, определенную в
libhealthhalutils. - Клиентский Java-код использует логику, определенную в
HealthServiceWrapper.
- Клиентский код на C++ использует логику, определенную в
- После того, как IHealth/default станет широко доступен, а образы поставщиков Android 8.1 будут признаны устаревшими, IHealth/backup и
healthdтакже могут быть признаны устаревшими.
Переменные сборки, специфичные для платы, для healthd
Переменные BOARD_PERIODIC_CHORES_INTERVAL_* являются специфичными для платы и используются для сборки healthd . В рамках разделения сборки на системную и производственную версии, значения, специфичные для платы, не могут быть определены для системных модулей. Ранее эти значения переопределялись в устаревшей функции healthd_board_init .
В health@2.1 поставщики могут переопределить значения интервалов этих двух периодических задач в структуре healthd_config перед передачей их конструктору класса реализации health. Класс реализации health должен наследовать от 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
BatteryManager.queryProperty(int id)был единственным клиентомIBatteryPropertiesRegistrar.getProperty.IBatteryPropertiesRegistrar.getPropertyпредоставлялсяhealthdи напрямую считывал данные/sys/class/power_supply.В целях безопасности приложениям запрещено напрямую обращаться к health HAL. В Android 9 и выше служба привязки
IBatteryPropertiesRegistrarпредоставляется сервисомBatteryService, а неhealthd.BatteryServiceделегирует вызов health HAL для получения запрошенной информации.BatteryService. В Android 9 и выше
BatteryServiceиспользуетHealthServiceWrapperдля определения того, следует ли использовать экземпляр службы мониторинга состояния по умолчанию отvendorили резервный экземпляр службы мониторинга состояния отhealthd. ЗатемBatteryServiceпрослушивает события мониторинга состояния черезIHealth.registerCallback.Storaged. В Android 9 и выше
storagedиспользуетlibhealthhalutilsдля определения того, следует ли использовать экземпляр службы мониторинга состояния по умолчанию отvendorили резервный экземпляр службы мониторинга состояния отhealthd. Затемstoragedпрослушивает события мониторинга состояния черезIHealth.registerCallbackи получает информацию о хранилище.
Изменения в SELinux
В HAL health@2.1 внесены следующие изменения в 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. Если устройство объявляет HAL health@2.1 в манифесте устройства, оно должно пройти соответствующие тесты VTS. Тесты написаны как для экземпляра по умолчанию (чтобы убедиться, что устройство корректно реализует HAL), так и для резервного экземпляра (чтобы убедиться, что healthd продолжает корректно работать до его удаления).
Требования к информации о батарее
HAL Health 2.0 устанавливает ряд требований к интерфейсу HAL, но соответствующие тесты VTS относительно лояльно относятся к их соблюдению. В Android 11 добавлены новые тесты VTS, обеспечивающие соблюдение следующих требований на устройствах, запускаемых с Android 11 и выше:
- Единицами измерения мгновенного и среднего тока батареи должны быть микроамперы (мкА).
- Знаки мгновенного и среднего тока батареи должны быть правильными. В частности:
- Текущий ток равен 0, когда состояние батареи
UNKNOWN - Текущий ток > 0, когда состояние батареи —
CHARGING - current <= 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» .