모든 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 서비스를 제공하지 못할 수 있습니다. 이는 지원 중단 일정에 따라 적용됩니다.
이 문제를 해결하려면 다음 단계를 따르세요.
healthd
는IHealth
를hwservicemanager
에 등록합니다 (시스템 데몬).IHealth
는 시스템 매니페스트에 추가되고 인스턴스 이름은 'backup'입니다.- 프레임워크 및
storaged
는binder
대신hwbinder
를 통해healthd
와 통신합니다. - 프레임워크 및
storaged
의 코드가 변경되어 가능한 경우 'default' 인스턴스를 가져온 다음 'backup'을 가져옵니다.- C++ 클라이언트 코드는
libhealthhalutils
에 정의된 로직을 사용합니다. - 자바 클라이언트 코드는
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
에서 재정의할 수 있습니다 (health@2.0-service.<device>
에서 libhealthservice
종속 항목을 삭제하고 이 함수를 다시 구현).
정적 구현 라이브러리
다른 HAL 구현 라이브러리와 달리 구현 라이브러리 health@2.0-impl은 health@2.0-service, charger, recovery 및 legacy healthd 링크가 포함된 정적 라이브러리입니다.
health@2.0.impl은 위에 설명된 대로 IHealth
를 구현하며, libbatterymonitor
와 libhealthd.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_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>
자세한 내용은 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_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에는 health@2.0 HAL 전용으로 작성된 새로운 VTS 테스트가 포함되어 있습니다. 기기가 기기 매니페스트에서 health@2.0 HAL을 제공한다고 선언하면 기기가 해당하는 VTS 테스트를 통과해야 합니다.
테스트는 기본 인스턴스 (기기가 HAL을 올바르게 구현할 수 있도록)와 백업 인스턴스(healthd
가 삭제되기 전에 올바르게 계속 작동하도록)에 대해 모두 작성되었습니다.
배터리 정보 요구사항
배터리 정보 요구사항을 참고하세요.