Menerapkan Health 2.0

Semua kode healthd telah difaktorkan ulang menjadi health@2.0-impl dan libhealthservice, lalu diubah untuk menerapkan health@2.0 HAL. Kedua library ini ditautkan secara statis oleh health@2.0-service, sehingga dapat melakukan pekerjaan yang sebelumnya dilakukan oleh healthd (yaitu, menjalankan healthd_mainloop dan melakukan polling). Dalam init, layanan health@2.0 mendaftarkan penerapan antarmuka IHealth ke hwservicemanager. Saat mengupgrade perangkat dengan image vendor Android 8.x dan framework Android 9, layanan health@2.0 mungkin tidak disediakan oleh image vendor. Hal ini diterapkan oleh jadwal penghentian penggunaan.

Untuk menyelesaikan masalah ini:

  1. healthd mendaftarkan IHealth ke hwservicemanager (meskipun merupakan daemon sistem). IHealth ditambahkan ke manifes sistem, dengan nama instance "backup".
  2. Framework dan storaged berkomunikasi dengan healthd melalui hwbinder, bukan binder.
  3. Kode untuk framework dan storaged diubah untuk mengambil instance "default" jika tersedia, lalu "backup".
    • Kode klien C++ menggunakan logika yang ditentukan di libhealthhalutils.
    • Kode klien Java menggunakan logika yang ditentukan di HealthServiceWrapper.
  4. Setelah IHealth/default tersedia secara luas dan image vendor Android 8.1 tidak digunakan lagi, IHealth/backup dan healthd dapat tidak digunakan lagi. Untuk mengetahui detail selengkapnya, lihat Penghentian health@1.0.

Variabel build khusus board untuk healthd

BOARD_PERIODIC_CHORES_INTERVAL_* adalah variabel khusus board yang digunakan untuk mem-build healthd. Sebagai bagian dari pemisahan build sistem/vendor, nilai khusus papan tidak dapat ditentukan untuk modul sistem. Di health@2.0, vendor dapat mengganti kedua nilai ini di healthd_mode_ops->init (dengan menghapus dependensi libhealthservice di health@2.0-service.<device> dan menerapkan ulang fungsi ini).

Library implementasi statis

Tidak seperti library implementasi HAL lainnya, library implementasi health@2.0-impl adalah library statis yang ditautkan oleh health@2.0-service, charger, recovery, dan healthd lama.

health@2.0.impl mengimplementasikan IHealth seperti yang dijelaskan di atas dan dimaksudkan untuk mencakup libbatterymonitor dan libhealthd.BOARD. Pengguna health@2.0-impl ini tidak boleh menggunakan BatteryMonitor atau fungsi di libhealthd secara langsung. Sebagai gantinya, panggilan ini harus diganti dengan panggilan ke class Health, yang merupakan implementasi antarmuka IHealth. Untuk lebih umum, kode healthd_common juga disertakan dalam health@2.0-impl. healthd_common baru berisi kode umum lainnya antara layanan health@2.0, pengisi daya, dan healthd serta memanggil metode IHealth, bukan BatteryMonitor.

Mengimplementasikan layanan Health 2.0

Saat menerapkan layanan health@2.0 untuk perangkat, jika penerapan defaultnya adalah:

  • Cukup untuk perangkat, gunakan android.hardware.health@2.0-service secara langsung.
  • Tidak memadai untuk perangkat, buat file android.hardware.health@2.0-service.(device) yang dapat dieksekusi dan sertakan:

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

Lalu:

  • Jika libhealthd: khusus board

    • Ada, tautkan ke lokasi tersebut.
    • Tidak ada, berikan implementasi kosong untuk fungsi healthd_board_init dan healthd_board_battery_update.
  • Jika variabel BOARD_PERIODIC_CHORES_INTERVAL_* khusus board:

    • Ditentukan, membuat HealthServiceCommon.cpp khusus perangkat (disalin dari hardware/interfaces/health/2.0/utils/libhealthservice) dan menyesuaikannya di healthd_mode_service_2_0_init.
    • Tidak ditentukan, tautkan ke libhealthservice secara statis.
  • Jika perangkat:

    • Harus mengimplementasikan getStorageInfo dan getDiskStats API, berikan implementasi dalam fungsi get_storage_info dan get_disk_stats.
    • Tidak boleh menerapkan API tersebut, tautkan ke libstoragehealthdefault secara statis.
  • Perbarui izin SELinux yang diperlukan.

  • Terapkan HAL dalam pemulihan dengan menginstal implementasi passthrough pada image pemulihan. Contoh:

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

Untuk mengetahui detailnya, lihat hardware/interfaces/health/2.0/README.md.

Klien kesehatan

Lihat Klien Health untuk HAL Health 2.1.

Perubahan SELinux

Health@2.0 HAL baru menyertakan perubahan SELinux berikut:

  • Menambahkan layanan health@2.0 ke file_contexts.
  • Mengizinkan system_server dan storaged menggunakan hal_health.
  • Mengizinkan system_server (BatteryService) mendaftarkan batteryproperties_service (IBatteryPropertiesRegistrar).
  • Mengizinkan healthd untuk menyediakan hal_health.
  • Menghapus aturan yang memungkinkan system_server dan storaged memanggil healthd melalui binder.
  • Menghapus aturan yang memungkinkan healthd mendaftarkan batteryproperties_service (IBatteryPropertiesRegistrar).

Untuk perangkat dengan penerapannya sendiri, beberapa perubahan SELinux vendor mungkin diperlukan. Contoh:

# 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.

Antarmuka kernel

Lihat Antarmuka kernel untuk HAL Health 2.1.

Pengujian

Android 9 menyertakan pengujian VTS baru yang ditulis khusus untuk HAL health@2.0. Jika perangkat mendeklarasikan untuk menyediakan HAL health@2.0 dalam manifes perangkat, perangkat tersebut harus lulus pengujian VTS yang sesuai. Pengujian ditulis untuk instance default (untuk memastikan bahwa perangkat mengimplementasikan HAL dengan benar) dan instance pencadangan (untuk memastikan bahwa healthd terus berfungsi dengan benar sebelum dihapus).

Persyaratan informasi baterai

Lihat Persyaratan informasi baterai.