Android 11에서 모든 healthd
코드는 libhealthloop
및 libhealth2impl
로 리팩터링된 다음 health@2.1 HAL을 구현하도록 수정됩니다. 이 두 라이브러리는 health@2.0-impl-2.1
, health 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
대신healthd
를 통해hwbinder
와 통신합니다. - framework 및
storaged
에 대한 코드는 사용 가능한 경우 인스턴스를 "기본값"으로 가져온 다음 "백업"으로 가져오도록 변경됩니다.- C++ 클라이언트 코드는
libhealthhalutils
에 정의된 논리를 사용합니다. - Java 클라이언트 코드는
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에서 공급업체는 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에는 다음 클라이언트가 있습니다.
- 충전기 .
libbatterymonitor
및healthd_common
코드의 사용은health@2.0-impl
에 래핑됩니다. - 회복 .
health@2.0-impl
에 대한 연결은libbatterymonitor
로 래핑됩니다.BatteryMonitor
에 대한 모든 호출은Health
구현 클래스에 대한 호출로 대체됩니다. 배터리 관리자 .
BatteryManager.queryProperty(int id)
는IBatteryPropertiesRegistrar.getProperty
의 유일한 클라이언트였습니다.IBatteryPropertiesRegistrar.getProperty
는healthd
에서 제공했으며 직접/sys/class/power_supply
를 읽습니다.보안 고려 사항으로 앱은 상태 HAL을 직접 호출할 수 없습니다. Android 9 이상에서는 바인더 서비스
IBatteryPropertiesRegistrar
가healthd
대신BatteryService
에서 제공됩니다.BatteryService
는 요청된 정보를 검색하기 위해 상태 HAL에 호출을 위임합니다.배터리 서비스 . Android 9 이상에서
BatteryService
는HealthServiceWrapper
를 사용하여vendor
의 기본 건강 서비스 인스턴스를 사용할지 또는healthd
의 백업 건강 서비스 인스턴스를 사용할지 결정합니다. 그런 다음BatteryService
는IHealth.registerCallback
을 통해 상태 이벤트를 수신합니다.저장됨 . 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
(상태 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 전원 공급 장치 클래스 를 참조하십시오.