Внедрить Здоровье 2.1

В 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. Обратная совместимость со старыми образами поставщиков обеспечивается графиком прекращения поддержки .

Чтобы обеспечить обратную совместимость:

  1. healthd регистрирует IHealth в hwservicemanager несмотря на то, что он является системным демоном. IHealth добавляется в системный манифест с именем экземпляра «резервная копия».
  2. Фреймворк и storaged взаимодействуют с healthd через hwbinder а не через binder .
  3. Код для framework и storaged изменен, чтобы получить экземпляр «по умолчанию», если он доступен, а затем «резервную копию».
    • Клиентский код C++ использует логику, определенную в libhealthhalutils .
    • Клиентский код Java использует логику, определенную в HealthServiceWrapper .
  4. После того как 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
  • Состояние батареи должно соответствовать тому, подключен ли источник питания. Конкретно:
    • состояние батареи должно быть одним из 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 .