Health 2.0 구현

모든 healthd 코드가 health@2.0-impl 및 libhealthservice로 리팩터링된 후 health@2.0 HAL을 구현하도록 수정되었습니다. 이 두 라이브러리는 health@2.0-service에 의해 정적으로 연결되므로 healthd이 이전에 수행한 작업을 수행할 수 있습니다 (예: healthd_mainloop 실행 및 폴링 수행). init에서 health@2.0-service는 IHealth 인터페이스의 구현을 hwservicemanager에 등록합니다. Android 8.x 공급업체 이미지 및 Android 9 프레임워크로 기기를 업그레이드할 때 공급업체 이미지에서 health@2.0 서비스를 제공하지 못할 수 있습니다. 이는 지원 중단 일정에 따라 적용됩니다.

이 문제를 해결하려면 다음 단계를 따르세요.

  1. healthdIHealthhwservicemanager에 등록합니다 (시스템 데몬). IHealth는 시스템 매니페스트에 추가되고 인스턴스 이름은 'backup'입니다.
  2. 프레임워크 및 storagedbinder 대신 hwbinder를 통해 healthd와 통신합니다.
  3. 프레임워크 및 storaged의 코드가 변경되어 가능한 경우 'default' 인스턴스를 가져온 다음 'backup'을 가져옵니다.
    • C++ 클라이언트 코드는 libhealthhalutils에 정의된 로직을 사용합니다.
    • 자바 클라이언트 코드는 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에서 재정의할 수 있습니다 (health@2.0-service.<device>에서 libhealthservice 종속 항목을 삭제하고 이 함수를 다시 구현).

정적 구현 라이브러리

다른 HAL 구현 라이브러리와 달리 구현 라이브러리 health@2.0-impl은 health@2.0-service, charger, recovery 및 legacy healthd 링크가 포함된 정적 라이브러리입니다.

health@2.0.impl은 위에 설명된 대로 IHealth를 구현하며, libbatterymonitorlibhealthd.BOARD를 묶는 데 사용됩니다. health@2.0-impl의 사용자는 BatteryMonitor 또는 libhealthd의 함수를 직접 사용해서는 안 됩니다. 대신 이러한 호출은 IHealth 인터페이스의 구현인 Health 클래스의 호출로 교체해야 합니다. 일반화를 위해 healthd_common 코드도 health@2.0-impl에 포함되어 있습니다. 새 healthd_common에는 health@2.0-service, charger, healthd 사이의 나머지 일반 코드가 포함되며 BatteryMonitor 대신 IHealth 메서드 호출이 포함됩니다.

Health 2.0 서비스 구현

기기에 health2.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_inithealthd_board_battery_update 함수에 빈 구현을 제공합니다.
  • 보드별 BOARD_PERIODIC_CHORES_INTERVAL_* 변수가 다음과 같은 경우:

    • 정의된 경우, 기기별 HealthServiceCommon.cpp (hardware/interfaces/health/2.0/utils/libhealthservice에서 복사)를 생성하고 healthd_mode_service_2_0_init에서 맞춤설정합니다.
    • 정의되지 않은 경우 libhealthservice에 정적으로 연결합니다.
  • 기기가 다음을 구현해야 하는지에 따라,

    • getStorageInfogetDiskStats API를 구현해야 하는 경우 get_storage_infoget_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를 참고하세요.

Health 클라이언트

health 2.1 HAL용 Health 클라이언트를 참고하세요.

SELinux 변경사항

새로운 health@2.0 HAL에는 다음과 같은 SELinux 변경사항이 포함됩니다.

  • health@2.0-service가 file_contexts에 추가됩니다.
  • system_serverstoraged에서 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에는 health@2.0 HAL 전용으로 작성된 새로운 VTS 테스트가 포함되어 있습니다. 기기가 기기 매니페스트에서 health@2.0 HAL을 제공한다고 선언하면 기기가 해당하는 VTS 테스트를 통과해야 합니다. 테스트는 기본 인스턴스 (기기가 HAL을 올바르게 구현할 수 있도록)와 백업 인스턴스(healthd가 삭제되기 전에 올바르게 계속 작동하도록)에 대해 모두 작성되었습니다.

배터리 정보 요구사항

배터리 정보 요구사항을 참고하세요.