Android 11에서는 모든 healthd
코드가 libhealthloop
및 libhealth2impl
로 리팩터링된 후 health@2.1 HAL을 구현하도록 수정됩니다. 이 두 라이브러리는 health 2.1의 패스 스루 구현인 health@2.0-impl-2.1
에 의해 정적으로 연결됩니다. 정적으로 연결된 라이브러리를 통해 health@2.0-impl-2.1
는 healthd_mainloop
실행 및 폴링과 같은 healthd
와 동일한 작업을 할 수 있습니다. init에서 health@2.1-service
는 인터페이스 IHealth
의 구현을 hwservicemanager
에 등록합니다. Android 8.x 또는 9 공급업체 이미지와 Android 11 프레임워크로 기기를 업그레이드할 때 공급업체 이미지는 health@2.1 서비스를 제공하지 않을 수 있습니다. 이전 공급업체 이미지와의 하위 호환성은 지원 중단 일정에 따라 적용됩니다.
이전 버전과의 호환성을 보장하려면 다음 안내를 따르세요.
healthd
는 시스템 데몬인 경우에도IHealth
를hwservicemanager
에 등록합니다.IHealth
는 시스템 매니페스트에 추가되고 인스턴스 이름은 'backup'입니다.- 프레임워크 및
storaged
는binder
대신hwbinder
를 통해healthd
와 통신합니다. - 프레임워크의 코드 및
storaged
가 변경되면 인스턴스의 '기본값'을 가져온 다음(있는 경우) '백업'을 가져옵니다.- C++ 클라이언트 코드는
libhealthhalutils
에 정의된 로직을 사용합니다. - 자바 클라이언트 코드는
HealthServiceWrapper
에 정의된 로직을 사용합니다.
- C++ 클라이언트 코드는
- IHealth/default가 널리 사용 가능하고 Android 8.1 공급업체 이미지가 지원 중단된 경우 IHealth/backup 및
healthd
는 지원이 중단될 수 있습니다. 자세한 내용은 health@1.0 지원 중단을 참고하세요.
healthd의 보드별 빌드 변수
BOARD_PERIODIC_CHORES_INTERVAL_*
는 healthd
를 빌드하는 데 사용되는 보드별 변수입니다. 보드별 값은 시스템/공급업체 빌드 분할의 일부로, 시스템 모듈에 대해 정의할 수 없습니다. 이러한 값은 과거에는 지원 중단된 함수 healthd_board_init
에서 재정의되었습니다.
health@2.1에서는 공급업체가 healthd_config
구조체에서 이 두 가지 주기적 작업의 간격 값을 상태 구현 클래스 생성자에 전달하기 전에 재정의할 수 있습니다. 상태 구현 클래스는 android::hardware::health::V2_1::implementation::Health
에서 상속해야 합니다.
Health 2.1 서비스 구현
Health 2.1 서비스 구현에 대한 자세한 내용은 hardware/interfaces/health/2.1/README.md를 참고하세요.
Health 클라이언트
health@2.x에는 다음 클라이언트가 있습니다.
- charger.
libbatterymonitor
및healthd_common
코드의 사용은health@2.0-impl
로 래핑됩니다. - recovery.
libbatterymonitor
에 대한 연결은health@2.0-impl
로 래핑됩니다.BatteryMonitor
에 대한 모든 호출이Health
구현 클래스의 호출로 대체됩니다. BatteryManager.
BatteryManager.queryProperty(int id)
는IBatteryPropertiesRegistrar.getProperty
의 유일한 클라이언트였습니다.IBatteryPropertiesRegistrar.getProperty
는healthd
에서 제공되었으며/sys/class/power_supply
를 직접 읽습니다.보안 고려 사항으로 인해 앱에서 직접 health HAL을 호출할 수 없습니다. Android 9 이상에서 바인더 서비스
IBatteryPropertiesRegistrar
는healthd
대신BatteryService
에서 제공됩니다.BatteryService
는 health HAL에 대한 호출을 위임하여 요청된 정보를 검색합니다.BatteryService. Android 9 이상에서는
BatteryService
가HealthServiceWrapper
를 사용하여vendor
의 기본 상태 서비스 인스턴스를 사용할지, 아니면healthd
의 백업 상태 서비스 인스턴스를 사용할지 결정합니다. 그러면BatteryService
가IHealth.registerCallback
을 통해 상태 이벤트를 수신 대기합니다.Storaged. Android 9 이상에서는
storaged
가libhealthhalutils
를 사용하여vendor
의 기본 상태 서비스 인스턴스를 사용할지, 아니면healthd
의 백업 상태 서비스 인스턴스를 사용할지 결정합니다. 그러면storaged
가IHealth.registerCallback
을 통해 상태 이벤트를 수신 대기하고 스토리지 정보를 검색합니다.
SELinux 변경사항
health@2.1 HAL에는 다음과 같은 SELinux 변경사항이 포함됩니다.
file_contexts
에android.hardware.health@2.1-service
을 추가합니다.
자체적으로 구현된 기기의 경우 일부 공급업체 SELinux 변경사항이 필요할 수 있습니다. 예:
# 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.
커널 인터페이스
healthd
데몬과 기본 구현 android.hardware.health@2.0-impl-2.1
는 다음 커널 인터페이스에 액세스하여 배터리 정보를 검색합니다.
/sys/class/power_supply/*/capacity_level
(health 2.1에 추가됨)/sys/class/power_supply/*/capacity
/sys/class/power_supply/*/charge_counter
/sys/class/power_supply/*/charge_full
/sys/class/power_supply/*/charge_full_design
(health 2.1에 추가됨)/sys/class/power_supply/*/current_avg
/sys/class/power_supply/*/current_max
/sys/class/power_supply/*/current_now
/sys/class/power_supply/*/cycle_count
/sys/class/power_supply/*/health
/sys/class/power_supply/*/online
/sys/class/power_supply/*/present
/sys/class/power_supply/*/status
/sys/class/power_supply/*/technology
/sys/class/power_supply/*/temp
/sys/class/power_supply/*/time_to_full_now
(health 2.1에 추가됨)/sys/class/power_supply/*/type
/sys/class/power_supply/*/voltage_max
/sys/class/power_supply/*/voltage_now
libbatterymonitor
를 사용하는 모든 기기별 health HAL 구현은 상태 구현 클래스 생성자에서 재정의되지 않는 한 기본적으로 이러한 커널 인터페이스에 액세스합니다.
이러한 파일이 없거나 healthd
또는 기본 서비스에서 액세스할 수 없는 경우(예: 파일이 SELinux 정책이 잘못 구성되어 액세스를 거부하는 공급업체별 폴더의 심볼릭 링크인 경우) 제대로 작동하지 않을 수 있습니다. 따라서 기본 구현을 사용하더라도 추가 공급업체별 SELinux 변경이 필요할 수 있습니다.
Health 2.1에서 사용되는 /sys/class/power_supply/*/capacity_level
및 /sys/class/power_supply/*/time_to_full_now
와 같은 일부 커널 인터페이스는 선택사항입니다. 하지만 커널 인터페이스가 누락되었을 때 잘못된 프레임워크 동작이 발생하지 않도록 하려면 health HAL 2.1 서비스를 빌드하기 전에 CL 1398913을 선별하는 것이 좋습니다.
테스트
Android 11에는 health@2.1 HAL 전용으로 작성된 새로운 VTS 테스트가 포함되어 있습니다. 기기가 기기 매니페스트에서 health@2.1 HAL을 선언하는 경우 해당하는 VTS 테스트를 통과해야 합니다.
테스트는 기본 인스턴스(기기가 HAL을 올바르게 구현할 수 있도록)와 백업 인스턴스(healthd
가 삭제되기 전에 올바르게 계속 작동하도록)에 대해 모두 작성되었습니다.
배터리 정보 요구사항
health 2.0 HAL은 HAL 인터페이스에 대한 일련의 요구사항을 설명하지만 해당 VTS 테스트는 이러한 적용에 있어 비교적 완화됩니다. Android 11에는 Android 11 이상을 실행하는 기기에 다음 요구사항을 적용하기 위해 새로운 VTS 테스트가 추가되었습니다.
- 순간 및 평균 배터리의 전류의 단위는 마이크로암페어(μA)여야 합니다.
- 순간 및 평균 배터리 전류의 신호는 정확해야 합니다.
구체적으로는 다음과 같습니다.
- 배터리 상태가
UNKNOWN
인 경우 전류 == 0 - 배터리 상태가
CHARGING
인 경우 전류 > 0 - 배터리 상태가
NOT_CHARGING
인 경우 전류 <= 0 - 배터리 상태가
DISCHARGING
인 경우 전류 < 0 - 배터리 상태가
FULL
인 경우 적용되지 않음
- 배터리 상태가
- 배터리 상태는 전원 연결 여부에 상관없이 정확해야 합니다. 구체적으로는 다음과 같습니다.
- 전원이 연결된 경우에만 배터리 상태가
CHARGING
,NOT_CHARGING
또는FULL
중 하나여야 합니다. - 전원 연결이 해제된 경우에만 배터리 상태가
DISCHARGING
여야 합니다.
- 전원이 연결된 경우에만 배터리 상태가
구현에서 libbatterymonitor
을 사용하고 커널 인터페이스의 값을 통과하는 경우 sysfs 노드가 올바른 값을 보고하는지 확인합니다.
- 배터리 전류가 올바른 신호와 단위로 보고되는지 확인합니다. 여기에는 다음 sysfs 노드가 포함됩니다.
/sys/class/power_supply/*/current_avg
/sys/class/power_supply/*/current_max
/sys/class/power_supply/*/current_now
- 양수 값은 배터리의 수신 전류를 나타냅니다.
- 값은 마이크로암페어(μA)여야 합니다.
- 배터리 전압이 마이크로볼트(μV)로 보고되는지 확인합니다. 여기에는 다음 sysfs 노드가 포함됩니다.
/sys/class/power_supply/*/voltage_max
/sys/class/power_supply/*/voltage_now
- 기본 HAL 구현은
voltage_now
를 1,000으로 나누고 값을 밀리볼트(mV)로 보고합니다. @1.0::HealthInfo를 참고하세요.
자세한 내용은 Linux 전원 공급 클래스를 참고하세요.