Внедрение Health 2.0

Все healthd код был переработан в health@2.0-impl и libhealthservice , затем модифицирован для реализации health@2.0 HAL. Эти две библиотеки связаны статически health@2.0-service, что позволяет ему выполнять работу , ранее проделанную healthd (т.е. запустить healthd_mainloop и сделать опрос). В инициализации, то health@2.0-service регистрирует реализацию интерфейса IHealth к hwservicemanager . При обновлении устройств с помощью образа поставщика Android 8.x и платформы Android 9 служба health@2.0 может не предоставляться образом поставщика. Это обеспечивается с помощью графика устаревания .

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

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

    • Если реализовать getStorageInfo и getDiskStats API - интерфейсов, обеспечивают реализацию в 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>
    

Для получения дополнительной информации обратитесь к аппаратным / интерфейсам / здоровья / 2.0 / README.md .

Клиенты здравоохранения

См клиентов здравоохранения для здоровья 2.1 HAL .

Изменения SELinux

Новый HAL health@2.0 включает следующие изменения SELinux:

  • Добавляет health@2.0-service к 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 тесты , написанные специально для health@2.0 HAL. Если в манифесте устройства указано, что устройство предоставляет health@2.0 HAL, оно должно пройти соответствующие тесты VTS. Тесты написаны как для экземпляра по умолчанию (для того, чтобы орудия устройства Халь правильно) и резервный экземпляр (для того , чтобы healthd продолжает функционировать правильно , прежде чем он будет удален).

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

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