Health 2.1 구현

Android 11에서는 모든 healthd 코드가 libhealthlooplibhealth2impl로 리팩터링된 후 health@2.1 HAL을 구현하도록 수정됩니다. 이 두 라이브러리는 health 2.1의 패스 스루 구현인 health@2.0-impl-2.1에 의해 정적으로 연결됩니다. 정적으로 연결된 라이브러리를 통해 health@2.0-impl-2.1healthd_mainloop 실행 및 폴링과 같은 healthd와 동일한 작업을 할 수 있습니다. init에서 health@2.1-service는 인터페이스 IHealth의 구현을 hwservicemanager에 등록합니다. Android 8.x 또는 9 공급업체 이미지와 Android 11 프레임워크로 기기를 업그레이드할 때 공급업체 이미지는 health@2.1 서비스를 제공하지 않을 수 있습니다. 이전 공급업체 이미지와의 하위 호환성은 지원 중단 일정에 따라 적용됩니다.

이전 버전과의 호환성을 보장하려면 다음 안내를 따르세요.

  1. healthd는 시스템 데몬인 경우에도 IHealthhwservicemanager에 등록합니다. IHealth는 시스템 매니페스트에 추가되고 인스턴스 이름은 'backup'입니다.
  2. 프레임워크 및 storagedbinder 대신 hwbinder를 통해 healthd와 통신합니다.
  3. 프레임워크의 코드 및 storaged가 변경되면 인스턴스의 '기본값'을 가져온 다음(있는 경우) '백업'을 가져옵니다.
    • C++ 클라이언트 코드는 libhealthhalutils에 정의된 로직을 사용합니다.
    • 자바 클라이언트 코드는 HealthServiceWrapper에 정의된 로직을 사용합니다.
  4. 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. libbatterymonitorhealthd_common 코드의 사용은 health@2.0-impl로 래핑됩니다.
  • recovery. libbatterymonitor에 대한 연결은 health@2.0-impl로 래핑됩니다. BatteryMonitor에 대한 모든 호출이 Health 구현 클래스의 호출로 대체됩니다.
  • BatteryManager. BatteryManager.queryProperty(int id)IBatteryPropertiesRegistrar.getProperty의 유일한 클라이언트였습니다. IBatteryPropertiesRegistrar.getPropertyhealthd에서 제공되었으며 /sys/class/power_supply를 직접 읽습니다.

    보안 고려 사항으로 인해 앱에서 직접 health HAL을 호출할 수 없습니다. Android 9 이상에서 바인더 서비스 IBatteryPropertiesRegistrarhealthd 대신 BatteryService에서 제공됩니다. BatteryService는 health HAL에 대한 호출을 위임하여 요청된 정보를 검색합니다.

  • BatteryService. Android 9 이상에서는 BatteryServiceHealthServiceWrapper를 사용하여 vendor기본 상태 서비스 인스턴스를 사용할지, 아니면 healthd백업 상태 서비스 인스턴스를 사용할지 결정합니다. 그러면 BatteryServiceIHealth.registerCallback을 통해 상태 이벤트를 수신 대기합니다.

  • Storaged. Android 9 이상에서는 storagedlibhealthhalutils를 사용하여 vendor기본 상태 서비스 인스턴스를 사용할지, 아니면 healthd백업 상태 서비스 인스턴스를 사용할지 결정합니다. 그러면 storagedIHealth.registerCallback을 통해 상태 이벤트를 수신 대기하고 스토리지 정보를 검색합니다.

SELinux 변경사항

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

  • file_contextsandroid.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 전원 공급 클래스를 참고하세요.