Android 9에는 health@1.0 HAL의 주 버전 업그레이드인 android.hardware.health
HAL 2.0이 포함되어 있습니다. 이 새로운 HAL의 장점은 다음과 같습니다.
- 프레임워크와 공급업체 코드 간의 명확한 구분
- 불필요한
healthd
데몬 지원 중단 - 상태 정보 보고서에서 공급업체 맞춤설정 사항 확대
- 배터리뿐 아니라 기기 상태 정보 세부화
Android 11에는 health@2.0 HAL의 부 버전 업그레이드인 android.hardware.health
HAL 2.1이 포함되어 있습니다. 이 새로운 HAL의 장점은 다음과 같습니다.
- 손쉬운 구현
- 기존 2.0 HAL API와의 적합성 개선
- 오프 모드 충전 코드에서 Treble 구분 개선
- 기기 배터리 상태를 나타내도록 프레임워크 지원 개선
요구사항
Android 9로 출시되는 기기는 2.0 HAL 버전을 제공해야 합니다(1.0 HAL을 제공하면 안 됩니다). Android 9에서 출시되지 않고 벤더 이미지를 Target Framework Compatibility Matrix 버전 3(Android 9에 출시됨)으로 업데이트할 계획인 기기는 기존 1.0 HAL 구현을 삭제하고 2.0 HAL을 제공해야 합니다.
Android 11로 출시되는 기기는 2.1 HAL을 제공해야 합니다(1.0 또는 2.0 HAL을 제공하면 안 됩니다). Android 11에서 출시되지 않고 벤더 이미지를 Target Framework Compatibility Matrix 버전 5(Android 11에 출시됨)로 업데이트할 계획인 기기는 기존 2.0 HAL 구현을 삭제하고 2.1 HAL을 제공해야 합니다. Android 11로 출시되지 않고 공급업체 이미지를 업데이트할 계획이 없는 기기는 2.1 HAL도 제공하는 것이 좋습니다.
AOSP에는 2.1 HAL을 구현하고 이전 1.0 HAL에서 이전할 수 있도록 돕기 위해 설계된 여러 도우미 라이브러리가 포함되어 있습니다.
용어
- health@1.0:
android.hardware.health@1.0
의 약어입니다. Android 8.0에서 출시된 health HIDL HAL 버전 1.0을 참고하세요. - health@2.0:
android.hardware.health@2.0
의 약어입니다. Android 9에서 출시된 health HIDL HAL 버전 2.0을 참고하세요. - health@2.1:
android.hardware.health@2.1
의 약어입니다. Android 11에서 출시된 health HIDL HAL 버전 2.1을 참고하세요. - charger: 휴대전화 충전 애니메이션이 표시되는 오프 모드 충전으로 실행되는 파일입니다.
- recovery: 배터리 정보를 검색해야 하는 복구 모드에서 실행되는 파일입니다.
- healthd: Android에서 실행되는 기존 데몬이며, health 관련 정보를 검색하고 이를 프레임워크에 제공합니다.
- storaged: Android에서 실행되는 데몬이며, 저장소 정보를 검색하여 프레임워크에 제공합니다.
Android 8.x의 Health
Android 8.x에서 health 구성요소는 다음 다이어그램과 같이 작동합니다.
그림 1. Android 8.x의 Health
이 다이어그램에서,
- 프레임워크는 하드웨어와 통신하기 위해 바인더 호출 1개와 hwbinder 호출 1개를 사용합니다.
healthd
는libhealthd_android
,libbatterymonitor
,libbatteryservice
에 정적으로 연결됩니다.- health@1.0-impl은
libhealthd.BOARD
에 정적으로 연결됩니다.
각 보드는 다른 libhealthd.BOARD
를 맞춤설정할 수 있으므로 빌드 시간에 charger, health@1.0-impl, 복구 링크가 결정됩니다.
기타 모드
그림 2. Android 8.x의 Health, 오프 모드 충전 및 복구 모드
- charger는
libhealthd.BOARD
,libhealthd_charger
,libbatterymonitor
에 정적으로 연결됩니다. - recovery는
libhealthd.BOARD
와libbatterymonitor
에 정적으로 연결됩니다.
Android 9의 Health
Android 9에서 health 구성요소는 다음 다이어그램과 같이 작동합니다.
그림 3. Android 9의 Health
프레임워크는 hwservicemanager
에서 health@2.0 서비스를 검색하려고 시도합니다.
실패하면 Android 8.x에서 health@1.0을 호출합니다. Android 9 시스템 이미지가 Android 8.x 공급업체 이미지와 호환되도록 기존 코드 경로가 보관됩니다. 기기에 하나의 서비스 버전(1.0 또는 2.0)만 존재할 수 있으므로 프레임워크는 두 개의 HAL 모두에서 정보를 검색하지 않습니다.
기타 모드
그림 4. Android 9의 Health, 오프 모드 충전 및 복구 모드
Android 11의 Health
Android 11에서 health 구성요소는 다음 다이어그램과 같이 작동합니다.
[system]
| getService()
V
[health@2.1-service]
| getService(stub=true)
V
[ health@2.0-impl-2.1-<device>.so ]
| | (device-dependent linkage)
V V
+---------Helper libs for impl--------+ [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl) ] |
| [libbatterymonitor (battery) ] |
+-------------------------------------+
health 2.1 구현이 없으면 시스템은 이전 섹션에서 설명한 것처럼 기존 코드 경로로 대체합니다.
기타 모드
[ charger ]
| getService() | (legacy code path)
V +-------------------------------------------------+
[health@2.1-service] |
| getService(stub=true) |
V |
[ health@2.0-impl-2.1-<device>.so ] |
| | (device-dependent linkage) |
V V |
+---------Helper libs for impl--------+ [libhealthd.device] |
| [libhealthloop (uevent, wakealarm)] | |
| [libhealth2impl (IHealth impl) ] | <---------------------------------+
| [libbatterymonitor (battery) ] |
+-------------------------------------+
[recovery]
| getService() w/o hwservicemanager
V
[ health@2.0-impl-2.1-<device>.so ]
| | (device-dependent linkage)
V V
+---------Helper libs for impl--------+ [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl) ] |
| [libbatterymonitor (battery) ] |
+-------------------------------------+
HAL 인터페이스 2.0
health@2.0 HAL은 프레임워크에 이전 healthd 데몬과 동일한 기능을 제공합니다. 또한 이전에 바인더 서비스로 제공된 healthd와 유사한 API도 제공합니다(IBatteryPropertiesRegistrar).
기본 인터페이스인 IHealth는 다음 함수를 제공합니다.
IBatteryPropertiesRegistrar.registerListener
를 대체하는registerCallback
IBatteryPropertiesRegistrar.unregisterListener
를 대체하는unregisterCallback
IBatteryPropertiesRegistrar.scheduleUpdate
를 대체하는update
IBatteryPropertiesRegistrar.getProperties
는 다음으로 대체됨getChargeCounter
getCurrentNow
getCurrentAverage
getCapacity
getEnergyCounter
getChargeStatus
getHealthInfo
또한 IHealth
는 공급업체별 저장소 관련 정보를 검색하도록 다음과 같은 storaged
의 새 API를 제공합니다.
getStorageInfo
getDiskStats
새 구조체 @2.0::HealthInfo
는 콜백과 getHealthInfo
를 통해 반환됩니다.
이 구조체에는 다음을 포함하여 health@2.0 HAL을 통해 사용 가능한 모든 기기 상태 정보가 포함되어 있습니다.
- 충전 정보(AC/USB/무선, 전류, 전압 등)
- 배터리 정보(존재 여부, 배터리 수준, 전류, 전압, 충전, 기술 등)
- 저장소 정보(저장소 기기 정보, 디스크 통계)
HAL 인터페이스 2.1
health@2.1 HAL은 오프 모드 충전을 지원하며 배터리에 관한 자세한 정보를 제공합니다.
기본 인터페이스인 IHealth는 다음 함수를 추가로 제공합니다.
getHealthConfig
: 이 HAL의 구성을 검색합니다.getHealthInfo_2_1
:getHealthInfo
로의 부 버전 업그레이드입니다.shouldKeepScreenOn
: 화면을 충전기 모드로 유지해야 하는지 판단합니다.
또한 @2.1::IHealth
구현은 상속된 registerCallback
및 unregisterCallback
함수의 @2.1::IHealthInfoCallback
을 지원하는 데 필요합니다. 새 콜백 인터페이스는 상속된 healthInfoChanged
함수가 아닌 healthInfoChanged_2_1
함수를 사용하여 클라이언트에 상태 정보를 반환합니다.
새 구조체 @2.1::HealthInfo
는 콜백과 getHealthInfo_2_1
을 통해 반환됩니다. 이 구조체에는 다음을 포함하여 health@2.0 HAL을 통해 사용 가능한 추가 기기 상태 정보가 포함되어 있습니다.
- 배터리 용량 수준
- 배터리 충전 완료 시간(초)
- 배터리 완전 충전 설계 용량(μAh)
Health 서비스 구현에 관한 자세한 내용은 Health 구현을 참고하세요.