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와의 호환성 향상
- 오프 모드 충전 코드에서 더 나은 고음 분리
- 장치의 배터리 상태를 나타내는 프레임워크에 대한 더 나은 지원
Android 13에는 health@2.1 HAL에서 변환된 android.hardware.health
AIDL HAL이 포함되어 있습니다. 이 새로운 HAL에는 다음과 같은 장점이 있습니다.
- 사용하지 않는 충전기 관련 API 제거
- 사용하지 않는
StorageAttribute
및 관련 필드 제거 - 도크 충전을 지원합니다.
요구 사항
Android 9 및 Android 10을 실행하는 기기
Android 9로 출시되는 기기는 2.x HAL(1.0 HAL은 제공하지 않음) 또는 AIDL HAL을 제공해야 합니다. Android 9로 출시되지 않지만 공급업체 이미지를 Target Framework Compatibility Matrix 버전 3(Android 9에서 출시됨)으로 업데이트하려는 기기는 기존 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로 출시되지 않지만 공급업체 이미지를 Target Framework Compatibility Matrix 버전 5(Android 11에서 출시됨)로 업데이트하려는 기기는 기존 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으로 출시되지 않지만 공급업체 이미지를 Target Framework Compatibility Matrix 버전 7(Android 13에서 출시됨)로 업데이트하려는 기기는 기존 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에서 출시되었습니다.
- 충전기 : 전화 충전 애니메이션을 표시하는 오프 모드 충전에서 실행되는 실행 파일입니다.
- 복구 : 배터리 정보를 검색해야 하는 복구 모드에서 실행되는 실행 파일입니다.
- healthd : 건강 관련 정보를 검색하여 프레임워크에 제공하는 Android에서 실행되는 레거시 데몬입니다.
- storaged : 스토리지 정보를 검색하여 프레임워크에 제공하는 Android에서 실행되는 데몬입니다.
Android 8.x의 건강
Android 8.x에서 상태 구성 요소는 다음 다이어그램에 자세히 설명된 대로 작동합니다.
그림 1 . Android 8.x의 건강
이 다이어그램에서:
- 하나의 바인더 호출과 하나의 hwbinder 호출은 프레임워크에서 하드웨어와 통신하는 데 사용됩니다.
-
healthd
는libhealthd_android
,libbatterymonitor
및libbatteryservice
에 정적으로 연결됩니다. - health@1.0-impl은 libhealthd에 정적으로 연결됩니다
libhealthd. BOARD
.
각 보드는 다른 libhealthd. BOARD
; 충전기, health@1.0-impl 및 복구 링크가 빌드 시 결정됩니다.
다른 모드의 경우:
그림 2. Android 8.x의 상태, 오프 모드 충전 및 복구 모드
- 충전기는
libhealthd. BOARD
,libhealthd_charger
및libbatterymonitor
. - 복구는
libhealthd. BOARD
및libbatterymonitor
.
Android 9의 건강
Android 9에서 상태 구성 요소는 다음 다이어그램에 자세히 설명된 대로 작동합니다.
그림 3 . Android 9의 건강
프레임워크는 hwservicemanager에서 hwservicemanager
서비스를 검색하려고 시도합니다. 실패하면 health@1.0(Android 8.x)을 호출합니다. Android 9 시스템 이미지가 Android 8.x 공급업체 이미지와 호환되도록 레거시 코드 경로가 유지됩니다. 장치에는 하나의 서비스 버전(1.0 또는 2.0)만 존재할 수 있으므로 프레임워크는 두 HAL에서 정보를 검색하지 않습니다.
다른 모드의 경우:
그림 4. Android 9의 상태, 오프 모드 충전 및 복구 모드
Android 11의 건강
Android 11에서 상태 구성 요소는 다음 다이어그램에 자세히 설명된 대로 작동합니다.
[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) ] |
+-------------------------------------+
상태 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의 건강
Android 13에서는 건강 AIDL HAL이 도입되었습니다. 상태 구성 요소는 다음 다이어그램에 자세히 설명된 대로 작동합니다.
그림 6. Health AIDL HAL 인프라
HIDL HAL 인터페이스 2.0
health@2.0 HAL은 이전 healthd 데몬과 동일한 기능을 프레임워크에 제공합니다. 또한 healthd가 이전에 바인더 서비스로 제공한 것과 유사한 API를 제공합니다(즉 , IBatteryPropertiesRegistrar ).
기본 인터페이스인 IHealth 는 다음 기능을 제공합니다.
-
IBatteryPropertiesRegistrar.registerListener
를 대체하기 위한registerCallback
-
unregisterCallback
,IBatteryPropertiesRegistrar.unregisterListener
대체 -
update
,IBatteryPropertiesRegistrar.scheduleUpdate
대체 -
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)
상태 HAL 구현에 유용한 클래스는 다음 UML 다이어그램을 참조하세요.
그림 7. Health HAL 2.1 UML 다이어그램
건강 서비스 2.1 구현에 대한 정보는 건강 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
에 추가되었습니다.
구현
상태 HAL 구현에 유용한 클래스는 다음 UML 다이어그램을 참조하세요.
그림 8. Health AIDL HAL UML 다이어그램
건강 AIDL 서비스 구현에 대한 정보는 건강 AIDL HAL 구현 을 참조하십시오.
회복
Android 13은 복구 시 바인더를 지원합니다. Health AIDL 서비스를 복구에 설치하면 복구 모드에서 실행할 수 있습니다.
복구를 위해 Health AIDL 서비스를 설치하는 방법에 대한 정보는 다음을 참조하십시오.
충전기
오프 모드 충전 기능이 /system
에서 /vendor
로 이동되었습니다. Android 13으로 출시되는 기기의 경우 오프 모드 충전을 지원하는 경우 HAL 서비스 바이너리가 충전기 모드를 지원해야 합니다. 이렇게 하려면 충전기 구현 을 참조하세요.
충전기 시스템 속성
ro.charger.*
속성은 더 이상 /vendor
의 charger
바이너리에서 읽을 수 없습니다. 장치에 ro.charger.*
시스템 속성이 설정되어 있는 경우 충전기의 시스템 속성을 참조하십시오.