Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

實施健康

所有運行healthd代碼都已重構為health@2.0-impl和libhealthservice ,然後進行了修改,以實現health@2.0 HAL。這兩個庫通過health@2.0-service靜態鏈接,從而使其能夠執行healthd以前完成的工作(即運行healthd_mainloop並進行輪詢)。在初始狀態下,health IHealth - hwservicemanager將接口IHealth的實現註冊到hwservicemanager 。使用Android 8.x供應商映像和Android 9框架升級設備時,供應商映像可能未提供health@2.0服務。這是由棄用時間表強制執行的。

解決此問題的方法:

  1. healthd寄存器IHealthhwservicemanager (儘管是一個系統守護進程)。 IHealth將添加到系統清單中,實例名稱為“ backup”。
  2. 框架和storaged通過hwbinder而不是binderhealthd通信。
  3. 更改了框架代碼和storaged代碼,以獲取實例“默認”(如果有),然後獲取“備份”。
    • C ++客戶端代碼使用libhealthhalutils定義的邏輯。
    • Java客戶端代碼使用HealthServiceWrapper定義的邏輯。
  4. 在廣泛使用IHealth / default並棄用了Android 8.1供應商映像之後,就可以棄用IHealth / backup和healthd 。有關更多詳細信息,請參見棄用health@1.0

特定於委員會的健康構建變量

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

靜態實現庫

與其他HAL實施庫不同,實施庫health@2.0-impl是一個靜態庫,Health@2.0-service,充電器,恢復和舊的運行狀況良好的鏈接指向該庫。

health@2.0.impl如上所述實現了IHealth ,旨在包裝libbatterymonitorlibhealthd. BOARD這些health@2.0-impl用戶不能直接使用BatteryMonitorlibhealthd的功能;相反,應將這些調用替換為對Health類( IHealth接口的實現)的IHealth 。為了進一步概括, healthd_common中還包含了healthd_common代碼。新的healthd_common包含health @ 2.0-service,charger和healthd之間的其餘通用代碼,並調用IHealth方法而不是BatteryMonitor。

實施Health 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:主板的libhealthd:

    • 是否存在,鏈接到它。
    • 不存在,請為healthd_board_inithealthd_board_battery_update函數提供空的實現。
  • 如果特定BOARD_PERIODIC_CHORES_INTERVAL_*電路板的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>
     

有關詳細信息,請參閱hardware / interfaces / health / 2.0 / README.md

健康客戶

health@2.0具有以下客戶端:

  • 充電器libbatterymonitorhealthd_common代碼的用法包裝在health@2.0-impl中。
  • 恢復 。與libbatterymonitor的鏈接包裝在health@2.0-impl中。對BatteryMonitor所有調用將替換為對Health實現類的調用。
  • BatteryManagerBatteryManager.queryProperty(int id)是唯一的客戶端IBatteryPropertiesRegistrar.getProperty其通過提供healthd和直接讀取/sys/class/power_supply

    出於安全考慮,不允許應用直接調用Health HAL。在Android中9,粘結劑服務IBatteryPropertiesRegistrar由設BatteryService而不是healthdBatteryService代表調用健康HAL檢索請求的信息。

  • BatteryService 。在Android 9中, BatteryService使用HealthServiceWrapper確定要使用的運行狀況服務實例(供應商的“默認”實例或運行狀況良好的“備份”實例)。然後,它通過IHealth.registerCallback偵聽健康事件。

  • 儲存 。在Android中9, storaged用途libhealthhalutils (從供應商或healthd“備份”實例“默認”的實例)確定衛生服務實例來使用。然後,它通過IHealth.registerCallback偵聽運行狀況事件,並檢索存儲信息。

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_service規則( IBatteryPropertiesRegistrar )。

對於具有自己實施的設備,可能需要對某些供應商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.
 

內核接口

healthd守護程序和默認實現android.hardware.health@2.0-service訪問以下內核接口以檢索電池信息:

  • /sys/class/power_supply/*/capacity
  • /sys/class/power_supply/*/charge_counter
  • /sys/class/power_supply/*/charge_full
  • /sys/class/power_supply/*/current_avg
  • /sys/class/power_supply/*/current_max
  • /sys/class/power_supply/*/current_now
  • /sys/class/power_supply/*/cycle_count
  • /sys/class/power_supply/*/health
  • /sys/class/power_supply/*/online
  • /sys/class/power_supply/*/present
  • /sys/class/power_supply/*/status
  • /sys/class/power_supply/*/technology
  • /sys/class/power_supply/*/temp
  • /sys/class/power_supply/*/type
  • /sys/class/power_supply/*/voltage_max
  • /sys/class/power_supply/*/voltage_now

除非在healthd_board_init(struct healthd_config*)覆蓋,否則任何使用libbatterymonitor的特定於設備的運行狀況HAL實現都會libbatterymonitor訪問這些內核接口。

如果這些文件丟失或無法從運行healthd的默認服務訪問或無法從默認服務訪問(例如,該文件是指向特定於供應商的文件夾的符號鏈接,由於SELinux策略配置錯誤而拒絕訪問),則它們可能無法正常運行。因此,即使使用了默認實現,也可能需要其他特定於供應商的SELinux更改。

測試中

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