Android Health

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 구성요소는 다음 다이어그램과 같이 작동합니다.

Android 8.x의 Health

그림 1. Android 8.x의 Health

이 다이어그램에서,

  • 프레임워크는 하드웨어와 통신하기 위해 바인더 호출 1개와 hwbinder 호출 1개를 사용합니다.
  • healthdlibhealthd_android, libbatterymonitor, libbatteryservice에 정적으로 연결됩니다.
  • health@1.0-impl은 libhealthd.BOARD에 정적으로 연결됩니다.

각 보드는 다른 libhealthd.BOARD를 맞춤설정할 수 있으므로 빌드 시간에 charger, health@1.0-impl, 복구 링크가 결정됩니다.

기타 모드

Android 8.x의 오프 모드 충전 및 복구 모드

그림 2. Android 8.x의 Health, 오프 모드 충전 및 복구 모드

  • charger는 libhealthd.BOARD, libhealthd_charger, libbatterymonitor에 정적으로 연결됩니다.
  • recovery는 libhealthd.BOARDlibbatterymonitor에 정적으로 연결됩니다.

Android 9의 Health

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 모두에서 정보를 검색하지 않습니다.

기타 모드

Android 9의 오프 모드 충전 및 복구 모드

그림 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)      ] |
+-------------------------------------+

각 모드에 관해 다음의 간단한 다이어그램을 참고하세요.

Health HAL 2.1 인프라

그림 5. Health HAL 2.1 인프라

Android 13의 Health

Android 13에서는 Health AIDL HAL을 도입했습니다. Health 구성요소는 다음 다이어그램과 같이 작동합니다.

Health AIDL HAL 인프라

그림 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 구현은 상속된 registerCallbackunregisterCallback 함수의 @2.1::IHealthInfoCallback을 지원하는 데 필요합니다. 새 콜백 인터페이스는 상속된 healthInfoChanged 함수가 아닌 healthInfoChanged_2_1 함수를 사용하여 클라이언트에 상태 정보를 반환합니다.

새 구조체 @2.1::HealthInfo는 콜백과 getHealthInfo_2_1을 통해 반환됩니다. 이 구조체에는 다음을 포함하여 health@2.0 HAL을 통해 사용 가능한 추가 기기 상태 정보가 포함되어 있습니다.

  • 배터리 용량 수준
  • 배터리 충전 완료 시간(초)
  • 배터리 완전 충전 설계 용량(μAh)

health HAL 구현에 유용한 클래스는 다음 UML 다이어그램을 참고하세요.

Health 2.1 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 유형 및 관련 필드는 사용되지 않으므로 삭제했습니다.
  • 도크 충전을 지원하기 위해 chargerDockOnlineHealthInfo에 추가했습니다.

구현

Health HAL 구현에 유용한 클래스는 다음 UML 다이어그램을 참고하세요.

Health AIDL 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 서비스 바이너리가 충전기 모드를 지원해야 합니다. 충전기 모드를 지원하려면 충전기 구현을 참고하세요.

충전기 시스템 속성

/vendorcharger 바이너리에서 더 이상 ro.charger.* 속성을 읽을 수 없습니다. ro.charger.* 시스템 속성 집합 중 기기에 설정된 속성이 있다면 충전기용 시스템 속성을 참고하세요.