건강 2.1 구현

Android 11에서 모든 healthd 코드는 libhealthlooplibhealth2impl 로 리팩터링된 다음 health@2.1 HAL을 구현하도록 수정됩니다. 이 두 라이브러리는 health@2.0-impl-2.1 , health 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 대신 healthd 를 통해 hwbinder 와 통신합니다.
  3. framework 및 storaged 에 대한 코드는 사용 가능한 경우 인스턴스를 "기본값"으로 가져온 다음 "백업"으로 가져오도록 변경됩니다.
    • C++ 클라이언트 코드는 libhealthhalutils 에 정의된 논리를 사용합니다.
    • Java 클라이언트 코드는 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에서 공급업체는 health 구현 클래스 생성자에 전달하기 전에 healthd_config 구조체에서 이러한 두 가지 주기적인 집안일 간격 값을 재정의할 수 있습니다. 상태 구현 클래스는 android::hardware::health::V2_1::implementation::Health 에서 상속해야 합니다.

Health 2.1 서비스 구현

Health 2.1 서비스 구현에 대한 정보는 hardware/interfaces/health/2.1/README.md 를 참조하십시오.

건강 클라이언트

health@2.x에는 다음 클라이언트가 있습니다.

  • 충전기 . libbatterymonitorhealthd_common 코드의 사용은 health@2.0-impl 에 래핑됩니다.
  • 회복 . health@2.0-impl 에 대한 연결은 libbatterymonitor 로 래핑됩니다. BatteryMonitor 에 대한 모든 호출은 Health 구현 클래스에 대한 호출로 대체됩니다.
  • 배터리 관리자 . BatteryManager.queryProperty(int id)IBatteryPropertiesRegistrar.getProperty 의 유일한 클라이언트였습니다. IBatteryPropertiesRegistrar.getPropertyhealthd 에서 제공했으며 직접 /sys/class/power_supply 를 읽습니다.

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

  • 배터리 서비스 . Android 9 이상에서 BatteryServiceHealthServiceWrapper 를 사용하여 vendor기본 건강 서비스 인스턴스를 사용할지 또는 healthd백업 건강 서비스 인스턴스를 사용할지 결정합니다. 그런 다음 BatteryServiceIHealth.registerCallback 을 통해 상태 이벤트를 수신합니다.

  • 저장됨 . 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 (상태 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 (상태 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 (상태 2.1에 추가됨)
  • /sys/class/power_supply/*/type
  • /sys/class/power_supply/*/voltage_max
  • /sys/class/power_supply/*/voltage_now

상태 구현 클래스 생성자에서 재정의되지 않는 한 libbatterymonitor 를 사용하는 모든 장치별 상태 HAL 구현은 기본적으로 이러한 커널 인터페이스에 액세스합니다.

이러한 파일이 없거나 healthd 또는 기본 서비스에서 액세스할 수 없는 경우(예: 파일이 잘못 구성된 SELinux 정책으로 인해 액세스를 거부하는 공급업체별 폴더에 대한 심볼릭 링크임) 파일이 올바르게 작동하지 않을 수 있습니다. 따라서 기본 구현이 사용되더라도 추가 공급업체별 SELinux 변경이 필요할 수 있습니다.

/sys/class/power_supply/*/capacity_level/sys/class/power_supply/*/time_to_full_now 와 같이 Health 2.1에서 사용되는 일부 커널 인터페이스는 선택 사항일 수 있습니다. 그러나 누락된 커널 인터페이스로 인한 잘못된 프레임워크 동작을 방지하려면 상태 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 를 1000으로 나누고 값을 밀리볼트(mV) 단위로 보고합니다. @1.0::HealthInfo를 참조하십시오.

자세한 내용은 Linux 전원 공급 장치 클래스 를 참조하십시오.