Внедрение Здоровье 2.0

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

Чтобы решить эту проблему:

  1. healthd регистрирует IHealth в hwservicemanager (несмотря на то, что он является системным демоном). IHealth добавляется в системный манифест с именем экземпляра «резервная копия».
  2. Framework и 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 . В рамках разделения сборки системы и поставщика для системных модулей невозможно определить значения, специфичные для платы. В 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.

Внедрение службы «Здоровье 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 .
  • Обновите необходимые разрешения 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 .

Медицинские клиенты

См. раздел «Клиенты здравоохранения для здоровья 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.

Интерфейсы ядра

См. Интерфейсы ядра для работоспособности 2.1 HAL .

Тестирование

Android 9 включает новые тесты VTS , написанные специально для HAL health@2.0. Если устройство заявляет о предоставлении HAL health@2.0 в манифесте устройства, оно должно пройти соответствующие тесты VTS. Тесты пишутся как для экземпляра по умолчанию (чтобы убедиться, что устройство правильно реализует HAL), так и для резервного экземпляра (чтобы убедиться, что healthd продолжает работать правильно перед его удалением).

Требования к информации о батарее

См. Требования к информации о батарее .