實施健康 2.0

所有healthd代碼已被重構到health@2.0-impl和libhealthservice ,然後修改以實現health@2.0 HAL。這兩個庫是由health@2.0-service靜態鏈接,使其能夠做以前所做的工作healthd (即運行healthd_mainloop做輪詢)。在初始化中,health@2.0-service註冊接口的實現IHealthhwservicemanager 。使用 Android 8.x 供應商映像和 Android 9 框架升級設備時,供應商映像可能不提供 health@2.0 服務。這是由執行折舊時間表

要解決此問題:

  1. healthd寄存器IHealthhwservicemanager (儘管是一個系統守護進程)。 IHealth被添加到系統清單,其實例名稱為“備份”。
  2. 框架和storaged溝通healthd通過hwbinder而不是binder
  3. 規範框架和storaged改變,以獲取實例“默認”如果有的話,那麼“備份”。
    • C ++的客戶端代碼使用中所定義的邏輯libhealthhalutils
    • Java客戶端代碼使用中所定義的邏輯HealthServiceWrapper
  4. IHealth後/默認是廣泛使用和Android 8.1供應商的圖片已被棄用,IHealth /備份和healthd可以棄用。有關詳細信息,請參閱貶health@1.0

healthd 的特定於板的構建變量

BOARD_PERIODIC_CHORES_INTERVAL_*用於建立特定板變量healthd 。作為系統/銷售商構建分割的一部分,板特異性值不能用於系統的模塊中定義。在health@2.0,供應商可以將覆蓋這兩個值healthd_mode_ops->init (通過丟棄libhealthservice在依賴health@2.0-service.<device>並重新實現此功能)。

靜態實現庫

不像其他的HAL實施庫,實現庫health@2.0-impl是一個靜態庫到health@2.0-service,充電器,恢復和傳統healthd鏈接。

health@2.0.impl實現IHealth如上所述並且是指環繞libbatterymonitorlibhealthd. BOARD 。 health@2.0-impl的這些用戶不能使用BatteryMonitor或功能libhealthd直接;相反,這些調用應與調用到更換Health課,的實現IHealth接口。為了進一步推廣, healthd_common代碼也包括在health@2.0-impl。新healthd_common包含health@2.0-service,充電器,以及之間的共同代碼的其餘部分healthd並調用IHealth方法而不是BatteryMonitor。

實施健康 2.0 服務

在為設備實現 health@2.0 服務時,如果默認實現是:

  • 充分的設備,使用android.hardware.health@2.0-service直接。
  • 不足以用於設備中,創建android.hardware.health@2.0-service.(device)可執行文件和包括:

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

然後:

  • 如果板特有libhealthd:

    • 是否存在,鏈接到它。
    • 不存在,為空實現healthd_board_inithealthd_board_battery_update功能。
  • 如果板特有BOARD_PERIODIC_CHORES_INTERVAL_*變量:

    • 被定義,創建一個設備專用HealthServiceCommon.cpp (從複製hardware/interfaces/health/2.0/utils/libhealthservice )和定制它在healthd_mode_service_2_0_init
    • 沒有定義,鏈接libhealthservice靜態。
  • 如果設備:

    • 應該實現getStorageInfogetDiskStats的API,提供在執行get_storage_infoget_disk_stats功能。
    • 如果不實現這些API,鏈接到libstoragehealthdefault靜態。
  • 更新必要的 SELinux 權限。

  • 通過將直通實現安裝到恢復映像,在恢復中實現 HAL。例子:

    // 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>
    

有關詳情,請參閱硬件/接口/健康/ 2.0 / README.md

健康客戶

健康的客戶對健康2.1 HAL

SELinux 的變化

新的 health@2.0 HAL 包括以下 SELinux 更改:

  • 添加health@2.0-service到file_contexts
  • 允許system_serverstoraged來使用hal_health
  • 允許system_serverBatteryService )來註冊batteryproperties_serviceIBatteryPropertiesRegistrar )。
  • 允許healthd提供hal_health
  • 移除了規則,允許system_server / storaged調入healthd通過粘合劑。
  • 移除了規則,允許healthd註冊batteryproperties_serviceIBatteryPropertiesRegistrar )。

對於有自己實現的設備,可能需要一些供應商 SELinux 更改。例子:

# 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 it links to board-specific libhealthd or implements storage APIs.

內核接口

健康2.1 HAL內核接口

測試

Android的9包括新的VTS測試專門為health@2.0 HAL寫的。如果設備在設備清單中聲明提供 health@2.0 HAL,則它必須通過相應的 VTS 測試。測試是兩者的默認實例書面(以確保設備實現了正確HAL)和備份實例(確保healthd繼續正常運行它被刪除之前)。

電池信息要求

電池信息的要求