Весь код healthd
был реорганизован в health@2.0-impl и libhealthservice
, а затем изменен для реализации health@2.0 HAL. Эти две библиотеки статически связаны службой health@2.0, что позволяет ей выполнять работу, ранее выполняемую healthd
(то есть запускать healthd_mainloop
и выполнять опрос). В init сервис health@2.0 регистрирует реализацию интерфейса IHealth
для hwservicemanager
. При обновлении устройств с образом поставщика Android 8.x и платформой Android 9 служба health@2.0 может не предоставляться образом поставщика. Это обеспечивается графиком устаревания .
Чтобы решить эту проблему:
-
healthd
регистрируетIHealth
вhwservicemanager
(несмотря на то, что он является системным демоном).IHealth
добавляется в системный манифест с именем экземпляра"backup"
. - Framework и
storaged
взаимодействуют сhealthd
черезhwbinder
а не черезbinder
. - Код для framework и
storaged
изменен, чтобы получить экземпляр"default"
если он доступен, а затем"backup"
.- Клиентский код C++ использует логику, определенную в
libhealthhalutils
. - Клиентский код Java использует логику, определенную в
HealthServiceWrapper
.
- Клиентский код C++ использует логику, определенную в
- После того как IHealth/default станет широко доступен и образы поставщиков Android 8.1 станут устаревшими, IHealth/backup и
healthd
могут стать устаревшими. Дополнительные сведения см. в разделе Прекращение поддержки health@1.0 .
Переменные сборки, специфичные для платы, для healthd
BOARD_PERIODIC_CHORES_INTERVAL_*
— это переменные, специфичные для платы, используемые для построения healthd
. В рамках разделения сборки системы и поставщика для системных модулей невозможно определить значения, специфичные для платы. В health@2.0 поставщики могут переопределить эти два значения в healthd_mode_ops->init
(путем удаления зависимости libhealthservice
в health@2.0-service.<device>
и повторной реализации этой функции).
Статическая библиотека реализации
В отличие от других библиотек реализации HAL, библиотека реализации health@2.0-impl является статической библиотекой, с которой связаны health@2.0-service, зарядное устройство, восстановление и устаревшая Healthd.
health@2.0.impl реализует IHealth
как описано выше, и предназначен для создания оболочки вокруг libbatterymonitor
и libhealthd. BOARD
. Эти пользователи health@2.0-impl не должны использовать BatteryMonitor
или функции libhealthd
напрямую; вместо этого эти вызовы следует заменить вызовами класса Health
, реализации интерфейса IHealth
. В качестве обобщения, код healthd_common
также включен в health@2.0-impl. Новый healthd_common
содержит остальную часть общего кода между сервисом health@2.0, зарядным устройством и healthd
и вызывает методы IHealth вместо BatteryMonitor.
Внедрить службу Health 2.0
При реализации службы health@2.0 для устройства, если реализация по умолчанию:
- Для устройства достаточно напрямую использовать
android.hardware.health@2.0-service
. Недостаточно для устройства, создайте исполняемый файл
android.hardware.health@2.0-service.(device)
и включите в него:#include <health2/service.h> int main() { return health_service_main(); }
Затем:
Если
libhealthd:
- Существует, ссылка на него.
- Не существует, предоставьте пустые реализации для функций
healthd_board_init
иhealthd_board_battery_update
.
Если переменные
BOARD_PERIODIC_CHORES_INTERVAL_*
специфичные для платы:- Определены, создайте файл
HealthServiceCommon.cpp
для конкретного устройства (скопированный изhardware/interfaces/health/2.0/utils/libhealthservice
) и настройте его вhealthd_mode_service_2_0_init
. - Не определены, ссылка на
libhealthservice
статическая.
- Определены, создайте файл
Если устройство:
- Следует реализовать API-интерфейсы
getStorageInfo
иgetDiskStats
, обеспечить реализацию в функцияхget_storage_info
иget_disk_stats
. - Не следует реализовывать эти API, используйте статическую ссылку на
libstoragehealthdefault
.
- Следует реализовать API-интерфейсы
Обновите необходимые разрешения SELinux.
Внедрите HAL при восстановлении, установив сквозную реализацию в образ восстановления. Пример:
// Android.bp cc_library_shared { name: "android.hardware.health@2.0-impl-<device>", recovery_available: true, relative_install_path: "hw", static_libs: [ "android.hardware.health@2.0-impl", "libhealthd.<device>" // Include the following or implement device-specific storage APIs "libhealthstoragedefault", ], srcs: [ "HealthImpl.cpp", ], overrides: [ "android.hardware.health@2.0-impl-default", ], }
// HealthImpl.cpp #include <health2/Health.h> #include <healthd/healthd.h> using android::hardware::health::V2_0::IHealth; using android::hardware::health::V2_0::implementation::Health; extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) { const static std::string providedInstance{"default"}; if (providedInstance != name) return nullptr; return Health::initInstance(&gHealthdConfig).get(); }
# device.mk PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>
Подробную информацию см. в файле hardware/interfaces/health/2.0/README.md .
Медицинские клиенты
См. раздел Клиенты Health для Health 2.1 HAL .
Изменения в SELinux
Новый HAL health@2.0 включает следующие изменения SELinux:
- Добавляет сервис health@2.0 в
file_contexts
. - Позволяет
system_server
иstoraged
использоватьhal_health
. - Позволяет
system_server
(BatteryService
) регистрироватьbatteryproperties_service
(IBatteryPropertiesRegistrar
). - Позволяет
healthd
предоставлятьhal_health
. - Удаляет правила, которые позволяют
system_server
иstoraged
обращаться кhealthd
через связыватель. - Удаляет правила, которые позволяют
healthd
регистрироватьbatteryproperties_service
(IBatteryPropertiesRegistrar
).
Для устройств с собственной реализацией могут потребоваться некоторые изменения SELinux от поставщика. Пример:
# device/<manufacturer>/<device>/sepolicy/vendor/file_contexts
/vendor/bin/hw/android\.hardware\.health@2\.0-service.<device> u:object_r:hal_health_default_exec:s0
# 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.
Интерфейсы ядра
См. Интерфейсы ядра для Health 2.1 HAL .
Тестирование
Android 9 включает новые тесты VTS, написанные специально для HAL health@2.0. Если устройство заявляет о предоставлении HAL health@2.0 в манифесте устройства, оно должно пройти соответствующие тесты VTS. Тесты пишутся как для экземпляра по умолчанию (чтобы убедиться, что устройство правильно реализует HAL), так и для резервного экземпляра (чтобы убедиться, что healthd
продолжает работать правильно перед его удалением).