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 13에는 health@2.1 HAL의 변환인 android.hardware.health
AIDL HAL이 포함되어 있습니다. 이 새로운 HAL의 장점은 다음과 같습니다.
- 충전기 관련 API 중 사용하지 않는 API 삭제
- 사용하지 않는
StorageAttribute
및 관련 필드 삭제 - 도크 충전 지원
요구사항
Android 9와 Android 10을 실행하는 기기
Android 9로 출시되는 기기는 2.x HAL(1.0 HAL을 제공하면 안 됨) 또는 AIDL HAL을 제공해야 합니다. Android 9로 출시되지 않지만 Android 9에서 출시된 Target Framework Compatibility Matrix 버전 3으로 공급업체 이미지를 업데이트할 계획인 기기는 기존의 1.0 HAL 구현을 삭제하고 2.x HAL 또는 AIDL HAL을 제공해야 합니다.
AOSP에는 2.0 HAL을 구현하고 기존의 1.0 HAL에서 전환할 수 있도록 돕기 위해 설계된 여러 도우미 라이브러리가 포함되어 있습니다.
Android 11과 Android 12를 실행하는 기기
Android 11로 출시되는 기기는 2.1 HAL(1.0 또는 2.0 HAL을 제공하면 안 됨) 또는 AIDL HAL을 제공해야 합니다. Android 11로 출시되지 않지만 Android 11에서 출시된 Target Framework Compatibility Matrix 버전 5로 공급업체 이미지를 업데이트할 계획인 기기는 기존의 2.0 HAL 구현을 삭제하고 2.1 HAL 또는 AIDL HAL을 제공해야 합니다. Android 11로 출시되지 않고 공급업체 이미지를 업데이트할 계획이 없는 기기도 2.1 HAL을 제공하는 것이 좋습니다.
AOSP에는 2.1 HAL을 구현하고 기존의 1.0 HAL에서 전환할 수 있도록 돕기 위해 설계된 여러 도우미 라이브러리가 포함되어 있습니다.
Android 13 이상을 실행하는 기기
Android 13으로 출시되는 기기는 AIDL HAL을 제공해야 하며 HIDL HAL을 제공하면 안 됩니다. Android 13으로 출시되지 않지만 Android 13에서 출시된 Target Framework Compatibility Matrix 버전 7로 공급업체 이미지를 업데이트할 계획인 기기는 기존 HIDL HAL 구현을 삭제하고 AIDL HAL을 제공해야 합니다. Android 13으로 출시되지 않고 공급업체 이미지를 업데이트할 계획이 없는 기기도 AIDL HAL을 제공하는 것이 좋습니다.
기기는 HIDL 1.0 HAL을 제공하면 안 됩니다.
AOSP에는 AIDL HAL을 구현하고 기존의 HIDL 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을 참고하세요. - health AIDL HAL:
android.hardware.health
의 약어입니다.- 버전 1이 Android 13에서 출시되었습니다.
- charger: 휴대전화 충전 애니메이션이 표시되는, 오프 모드 충전 시 실행되는 파일입니다.
- recovery: 배터리 정보를 검색해야 하는 복구 모드에서 실행되는 파일입니다.
- healthd: Android에서 실행되는 기존 데몬이며, 상태 관련 정보를 검색하고 이를 프레임워크에 제공합니다.
- 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) ] |
+-------------------------------------+
각 모드에 관해 다음의 간단한 다이어그램을 참고하세요.
그림 5. Health HAL 2.1 인프라
Android 13의 Health
Android 13에서는 Health AIDL HAL을 도입했습니다. Health 구성요소는 다음 다이어그램과 같이 작동합니다.
그림 6. Health AIDL HAL 인프라
HIDL 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/무선, 전류, 전압 등)
- 배터리 정보(존재 여부, 배터리 잔량, 전류, 전압, 충전, 기술 등)
- 저장소 정보(저장소 기기 정보, 디스크 통계)
Health 서비스 2.0 구현에 관한 자세한 내용은 Health 2.0 구현을 참고하세요.
HIDL 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 HAL 구현에 유용한 클래스는 다음 UML 다이어그램을 참고하세요.
그림 7. Health HAL 2.1 UML 다이어그램
Health 서비스 2.1 구현에 관한 자세한 내용은 Health 2.1 구현을 참고하세요.
AIDL HAL 인터페이스 버전 1
API 변경사항
AIDL 버전 1 HAL은 HIDL 2.1 HAL과 유사한 API를 지원합니다. HIDL 2.1 인터페이스와 비교하여 API의 변경사항은 다음과 같습니다.
- HIDL HAL 2.1에 도입된 충전기 관련 API는 AIDL HAL에 포팅되지 않습니다. 오프 모드 충전 기능은
/vendor
파티션에만 제공되므로 공급업체 인터페이스의 API는 필요하지 않습니다. 오프 모드 충전을 제대로 구현하려면 아래 충전기를 참고하세요. StorageAttribute
유형 및 관련 필드는 사용되지 않으므로 삭제했습니다.- 도크 충전을 지원하기 위해
chargerDockOnline
을HealthInfo
에 추가했습니다.
구현
Health HAL 구현에 유용한 클래스는 다음 UML 다이어그램을 참고하세요.
그림 8. Health AIDL HAL UML 다이어그램
Health AIDL 서비스 구현에 관한 자세한 내용은 Health AIDL HAL 구현을 참고하세요.
복구
Android 13에서는 복구 시 바인더를 지원합니다. 복구하기 위해 Health AIDL 서비스를 설치하면 복구 모드(Recovery mode)에서 실행할 수 있습니다.
복구하기 위해 health AIDL 서비스를 설치하는 방법에 관한 자세한 내용은 다음을 참고하세요.
충전기
오프 모드 충전 기능을 /system
에서 /vendor
로 이동했습니다. Android 13으로 출시되는 기기에서는 오프 모드 충전을 지원하는 경우 HAL 서비스 바이너리가 충전기 모드를 지원해야 합니다. 충전기 모드를 지원하려면 충전기 구현을 참고하세요.
충전기 시스템 속성
/vendor
의 charger
바이너리에서 더 이상 ro.charger.*
속성을 읽을 수 없습니다. ro.charger.*
시스템 속성 집합 중 기기에 설정된 속성이 있다면 충전기용 시스템 속성을 참고하세요.