platform_hardware_interfaces/health/2.0
Felix 1fe2196f11 health: Add CAP_WAKE_ALARM to service
health/2.0/default/healthd_common.cpp wants to use
timerfd_create() to register a wakealarm.

To use the timerfd_create() syscall with CLOCK_BOOTTIME_ALARM,
CAP_WAKE_ALARM is needed.

Update the README to reflect the needed cap in the init file,
see also https://r.android.com/861532

Since the v1.0 HAL is in passthrough mode, the cap is needed for the 1.0
service as well.

Change-Id: I0e71da125eeef1360b5fd8bc7a69285e0b786511
Signed-off-by: Felix <google@ix5.org>
2019-01-06 16:07:50 +00:00
..
default healthd_common.cpp: use epoll_create1 2018-12-15 11:36:47 -08:00
utils libhealthhalutils is recovery_available 2018-08-13 12:55:36 -07:00
vts pack VTS cc_test binaries as general-tests 2018-12-07 10:49:56 -08:00
Android.bp Update makefiles. 2018-01-23 19:44:19 +00:00
IHealth.hal Merge changes from topic "health_report_api" 2018-01-18 18:04:18 +00:00
IHealthInfoCallback.hal Modify IHealthInfoCallback interface to return V2.0 HealthInfo 2018-01-18 21:24:12 +00:00
README health: convert README to markdown format. 2018-08-08 11:06:51 -07:00
README.md health: Add CAP_WAKE_ALARM to service 2019-01-06 16:07:50 +00:00
types.hal Modify IHealthInfoCallback interface to return V2.0 HealthInfo 2018-01-18 21:24:12 +00:00

Upgrading from Health 1.0 HAL

  1. Remove android.hardware.health@1.0* from PRODUCT_PACKAGES in device/<manufacturer>/<device>/device.mk

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

    PRODUCT_PACKAGES += android.hardware.health@2.0-service
    

    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/Android.mk)

    cc_binary {
        name: "android.hardware.health@2.0-service.<device>",
        init_rc: ["android.hardware.health@2.0-service.<device>.rc"],
        proprietary: true,
        relative_install_path: "hw",
        srcs: [
            "HealthService.cpp",
        ],
    
        cflags: [
            "-Wall",
            "-Werror",
        ],
    
        static_libs: [
            "android.hardware.health@2.0-impl",
            "android.hardware.health@1.0-convert",
            "libhealthservice",
            "libbatterymonitor",
        ],
    
        shared_libs: [
            "libbase",
            "libcutils",
            "libhidlbase",
            "libhidltransport",
            "libutils",
            "android.hardware.health@2.0",
        ],
    
        header_libs: ["libhealthd_headers"],
    
        overrides: [
            "healthd",
        ],
    }
    
    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/android.hardware.health@2.0-service.<device>.rc

    service vendor.health-hal-2-0 /vendor/bin/hw/android.hardware.health@2.0-service.<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 android.hardware.health@2.0-impl-default, 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: "android.hardware.health@2.0-impl-<device>",
        recovery_available: true,
        relative_install_path: "hw",
        static_libs: [
            "android.hardware.health@2.0-impl",
            "libhealthd.<device>"
            // Include the following or implement device-specific storage APIs
            "libhealthstoragedefault",
        ],
        srcs: [
            "HealthImpl.cpp",
        ],
        overrides: [
            "android.hardware.health@2.0-impl-default",
        ],
    }
    
    // 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();
    }
    
    # device.mk
    PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>