tree: c5ad0a05f089f54f32899e4d4567fd6babcfd012 [path history] [tgz]
  1. default/
  2. utils/
  3. vts/
  4. Android.bp
  5. IHealth.hal
  6. IHealthInfoCallback.hal
  8. types.hal

Implement the 2.1 HAL instead!

It is strongly recommended that you implement the 2.1 HAL directly. See hardware/interfaces/health/2.1/ for more details.

Upgrading from Health 1.0 HAL

  1. Remove* from PRODUCT_PACKAGES in device/<manufacturer>/<device>/

  2. If the device does not have a vendor-specific libhealthd AND does not implement storage-related APIs, just do the following:


    Otherwise, continue to the next step.

  3. Create directory device/<manufacturer>/<device>/health

  4. Create device/<manufacturer>/<device>/health/Android.bp (or equivalent device/<manufacturer>/<device>/health/

    cc_binary {
        name: "<device>",
        init_rc: ["<device>.rc"],
        proprietary: true,
        relative_install_path: "hw",
        srcs: [
        cflags: [
        static_libs: [
        shared_libs: [
        header_libs: ["libhealthd_headers"],
        overrides: [
    1. (recommended) To remove healthd from the build, keep “overrides” section.
    2. To keep healthd in the build, remove “overrides” section.
  5. Create device/<manufacturer>/<device>/health/<device>.rc

    service /vendor/bin/hw/<device>
        class hal
        user system
        group system
        capabilities WAKE_ALARM
        file /dev/kmsg w
  6. Create device/<manufacturer>/<device>/health/HealthService.cpp:

    #include <health2/service.h>
    int main() { return health_service_main(); }
  7. libhealthd dependency:

    1. If the device has a vendor-specific libhealthd.<soc>, add it to static_libs.

    2. If the device does not have a vendor-specific libhealthd, add the following lines to HealthService.cpp:

      #include <healthd/healthd.h>
      void healthd_board_init(struct healthd_config*) {}
      int healthd_board_battery_update(struct android::BatteryProperties*) {
          // return 0 to log periodic polled battery status to kernel log
          return 0;
  8. Storage related APIs:

    1. If the device does not implement IHealth.getDiskStats and IHealth.getStorageInfo, add libhealthstoragedefault to static_libs.

    2. If the device implements one of these two APIs, add and implement the following functions in HealthService.cpp:

      void get_storage_info(std::vector<struct StorageInfo>& info) {
          // ...
      void get_disk_stats(std::vector<struct DiskStats>& stats) {
          // ...
  9. Update necessary SELinux permissions. For example,

    # device/<manufacturer>/<device>/sepolicy/vendor/file_contexts
    /vendor/bin/hw/android\.hardware\.health@2\.0-service\.<device> u:object_r:hal_health_default_exec:s0
    # device/<manufacturer>/<device>/sepolicy/vendor/hal_health_default.te
    # Add device specific permissions to hal_health_default domain, especially
    # if a device-specific libhealthd is used and/or device-specific storage related
    # APIs are implemented.
  10. Implementing health HAL in recovery. The health HAL is used for battery status checks during OTA for non-A/B devices. If the health HAL is not implemented in recovery, is_battery_ok() will always return true.

    1. If the device does not have a vendor-specific libhealthd, nothing needs to be done. A “backup” implementation is provided in, which is always installed to recovery image by default.

    2. If the device does have a vendor-specific libhealthd, implement the following module and include it in PRODUCT_PACKAGES (replace <device> with appropriate strings):

    // Android.bp
    cc_library_shared {
        name: "<device>",
        recovery_available: true,
        relative_install_path: "hw",
        static_libs: [
            // Include the following or implement device-specific storage APIs
        srcs: [
        overrides: [
    // HealthImpl.cpp
    #include <health2/Health.h>
    #include <healthd/healthd.h>
    using android::hardware::health::V2_0::IHealth;
    using android::hardware::health::V2_0::implementation::Health;
    extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) {
        const static std::string providedInstance{"default"};
        if (providedInstance != name) return nullptr;
        return Health::initInstance(&gHealthdConfig).get();
    PRODUCT_PACKAGES +=<device>