Android 9 includes android.hardware.health
HAL 2.0,
a major version upgrade from health@1.0 HAL. This new HAL has the following
advantages:
- Cleaner separation between framework and vendor code.
- Deprecates the unnecessary
healthd
daemon. - Greater degrees of freedom for vendor customization in health information reports.
- More device health information than just battery.
Android 11 includes android.hardware.health
HAL 2.1,
a minor version upgrade from health@2.0 HAL. This new HAL has the following
advantages:
- Easier to implement
- Better conformance with existing 2.0 HAL APIs
- Better Treble separation in off-mode charging code
- Better support for the framework to indicate the battery health of the device
Android 13 includes android.hardware.health
AIDL HAL,
a conversion from health@2.1 HAL. This new HAL has the following
advantages:
- Remove unused charger-related APIs
- Remove unused
StorageAttribute
and related fields - Support dock charging.
Requirements
Devices running Android 9 and Android 10
Devices launching with Android 9 must provide the 2.x HAL (and must not provide the 1.0 HAL) or the AIDL HAL. Devices not launching with Android 9 but planning to update the vendor image to Target Framework Compatibility Matrix Version 3 (released in Android 9) must remove existing 1.0 HAL implementations and provide the 2.x HAL or the AIDL HAL.
AOSP includes multiple helper libraries designed to help you implement the 2.0 HAL and the transition from the old 1.0 HAL.
Devices running Android 11 and Android 12
Devices launching with Android 11 must provide the 2.1 HAL (and must not provide the 1.0 or 2.0 HAL) or the AIDL HAL. Devices not launching with Android 11 but planning to update the vendor image to Target Framework Compatibility Matrix Version 5 (released in Android 11) must remove existing 2.0 HAL implementations and provide the 2.1 HAL or the AIDL HAL. Devices not launching with Android 11 and not planning to update the vendor image are also recommended to provide the 2.1 HAL.
AOSP includes multiple helper libraries designed to help you implement the 2.1 HAL and the transition from the old 1.0 HAL.
Devices running Android 13 and higher
Devices launching with Android 13 must provide the AIDL HAL (and must not provide HIDL HAL). Devices not launching with Android 13 but planning to update the vendor image to Target Framework Compatibility Matrix Version 7 (released in Android 13) must remove existing HIDL HAL implementations and provide the AIDL HAL. Devices not launching with Android 13 and not planning to update the vendor image are also recommended to provide the AIDL HAL.
Devices must not provide the HIDL 1.0 HAL.
AOSP includes multiple helper libraries designed to help you implement the AIDL HAL and the transition from the old HIDL HALs.
Terminology
- health@1.0: abbreviation of
android.hardware.health@1.0
. Refers to health HIDL HAL version 1.0 released in Android 8.0. - health@2.0: abbreviation of
android.hardware.health@2.0
. Refers to health HIDL HAL version 2.0 released in Android 9. - health@2.1: abbreviation of
android.hardware.health@2.1
. Refers to health HIDL HAL version 2.1 released in Android 11. - health AIDL HAL: abbreviation of
android.hardware.health
.- Version 1 is released in Android 13.
- charger: executable running in off-mode charging that displays the phone-charging animation.
- recovery: executable running in recovery mode that must retrieve battery information.
- healthd: legacy daemon running in Android that retrieves health-related information and provides it to framework.
- storaged: daemon running in Android that retrieves storage information and provides it to framework.
Health in Android 8.x
In Android 8.x, the health component works as detailed in the following diagram:
Figure 1. Health in Android 8.x.
In this diagram:
- One (1) binder call and one (1) hwbinder call are used by the framework to communicate with hardware.
healthd
statically links tolibhealthd_android
,libbatterymonitor
, andlibbatteryservice
.- health@1.0-impl statically links to
libhealthd.BOARD
.
Each board can customize a different libhealthd.BOARD
;
it is determined at build time what charger, health@1.0-impl, and recovery link
to.
For other modes:
Figure 2. Health in Android 8.x, off-mode charging and recovery mode.
- charger statically links to
libhealthd.BOARD
,libhealthd_charger
andlibbatterymonitor
. - recovery statically links to
libhealthd.BOARD
andlibbatterymonitor
.
Health in Android 9
In Android 9, the health component works as detailed in the following diagram:
Figure 3. Health in Android 9.
The framework attempts to retrieve health@2.0 service from hwservicemanager
.
If it fails, it calls into health@1.0 (in Android 8.x). The legacy code path is
kept so the Android 9 system image is compatible with
the Android 8.x vendor image. The framework does not retrieve information from
both HALs because only one service version (1.0 or 2.0) can exist on the device.
For other modes:
Figure 4. Health in Android 9, off-mode charging and recovery mode.
Health in Android 11
In Android 11, the health component works as detailed in the following diagram:
[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) ] |
+-------------------------------------+
If the health 2.1 implementation doesn't exist, the system falls back to the legacy code path as described in previous sections
For other modes:
[ 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) ] |
+-------------------------------------+
See the following simplified diagram for different modes:
Figure 5. Health HAL 2.1 infrastructure.
Health in Android 13
In Android 13, the health AIDL HAL is introduced. The health component works as detailed in the following diagram:
Figure 6. Health AIDL HAL infrastructure.
HIDL HAL interface 2.0
The health@2.0 HAL provides the same functionality to the framework as the old healthd daemon. It also provides APIs that are similar to what healthd previously provided as a binder service (i.e. IBatteryPropertiesRegistrar).
The main interface, IHealth , provides the following functions:
registerCallback
, to replaceIBatteryPropertiesRegistrar.registerListener
unregisterCallback
, to replaceIBatteryPropertiesRegistrar.unregisterListener
update
, to replaceIBatteryPropertiesRegistrar.scheduleUpdate
IBatteryPropertiesRegistrar.getProperties
are replaced by the following:getChargeCounter
getCurrentNow
getCurrentAverage
getCapacity
getEnergyCounter
getChargeStatus
getHealthInfo
In addition, IHealth
provides the following new APIs for storaged
to
retrieve vendor-specific storage related information:
getStorageInfo
getDiskStats
A new struct, @2.0::HealthInfo
, is returned via callbacks and getHealthInfo
.
This struct contains all device health information available through health@2.0
HAL, including:
- Charging information (AC/USB/wireless, current, voltage, etc.)
- Battery information (presence, battery level, current, voltage, charge, technology, etc.)
- Storage information (storage device information, disk statistics)
For information on implementing the Health service 2.0, see Implementing Health 2.0.
HIDL HAL interface 2.1
The health@2.1 HAL supports off-mode charging and provides more information about the battery.
The main interface, IHealth, provides the following additional functions
getHealthConfig
: to retrieve the configuration of this HALgetHealthInfo_2_1
: a minor version upgrade togetHealthInfo
shouldKeepScreenOn
: to determine whether the screen should be kept on in charger mode
In addition, the implementation of @2.1::IHealth
is required to support
@2.1::IHealthInfoCallback
for its inherited registerCallback
and
unregisterCallback
functions. The new callback interface returns health health
information to the client using its healthInfoChanged_2_1
function instead of
the inherited healthInfoChanged
function.
A new struct, @2.1::HealthInfo
, is returned via callbacks and
getHealthInfo_2_1
. This struct contains additional device health information
available through health@2.0 HAL, including:
- Battery capacity level
- Battery charge time to full now (in seconds)
- Battery full charge design capacity (in μAh)
See the following UML diagram for the classes useful to the health HAL implementation:
Figure 7. Health HAL 2.1 UML diagram.
For information on implementing the Health service 2.1, see Implementing Health 2.1.
AIDL HAL interface version 1
API changes
The AIDL version 1 HAL supports similar APIs to the HIDL 2.1 HAL. Compared to the HIDL 2.1 interface, the following are changed in the API:
- Charger-related APIs introduced in HIDL HAL 2.1 are not ported to the AIDL
HAL. Because the functionality of off-mode charging lives only on the
/vendor
partition, APIs on the Vendor Interface are not necessary. To implement off-mode charging properly, see charger below. - Type
StorageAttribute
and related fields are removed because they are unused. chargerDockOnline
is added toHealthInfo
to support dock charging.
Implementation
See the following UML diagram for the classes useful to the health HAL implementation:
Figure 8. Health AIDL HAL UML diagram.
For information on implementing the health AIDL service, see Implementing Health AIDL HAL.
Recovery
Android 13 supports binder in recovery. Installing the Health AIDL service to recovery allows it to run in recovery mode.
For information on installing the health AIDL service to recovery, see the following:
Charger
The functionality of off-mode charging is moved from /system
to /vendor
. For
devices launching with Android 13, if they support
off-mode charging, the HAL service binary must support charger mode. To do so,
refer to
implementing charger.
Charger system properties
The properties ro.charger.*
are no longer readable by the charger
binary in
/vendor
. If your device has any of the ro.charger.*
system properties set,
refer to
system properties for charger.