Menerapkan Health 2.0

Semua kode healthd telah difaktorkan ulang menjadi health@2.0-impl dan libhealthservice, lalu diubah untuk mengimplementasikan health@2.0 HAL. Kedua alat ini library ditautkan secara statis oleh health@2.0-service, memungkinkannya untuk melakukan pekerjaan yang sebelumnya dilakukan oleh healthd (yaitu, menjalankan healthd_mainloop dan polling). Pada inisialisasi, layanan health@2.0 mendaftarkan implementasi 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 gambar vendor. Ketentuan ini diberlakukan dengan jadwal penghentian.

Untuk menyelesaikan masalah ini:

  1. healthd mendaftarkan IHealth ke hwservicemanager (meskipun merupakan sistem {i>daemon<i}). 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 akan tidak digunakan lagi, IHealth/pencadangan dan healthd tidak digunakan lagi. Untuk selengkapnya lihat detailnya, lihat Menghentikan penggunaan health@1.0.

Variabel build khusus board untuk respons

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

Library implementasi statis

Tidak seperti library implementasi HAL lainnya, library implementasi health@2.0-impl adalah library statis tempat health@2.0-service, pengisi daya, pemulihan, dan link kesehatan lama.

health@2.0.impl mengimplementasikan IHealth seperti yang dijelaskan di atas dan dimaksudkan untuk menggabungkan sekitar libbatterymonitor dan libhealthd.BOARD. Ini pengguna health@2.0-impl tidak boleh menggunakan BatteryMonitor atau fungsi di libhealthd secara langsung; sebagai gantinya, panggilan ini harus diganti dengan panggilan ke class Health, implementasi antarmuka IHealth. Untuk menggeneralisasi lebih lanjut, kode healthd_common juga disertakan dalam health@2.0-impl. Yang baru healthd_common berisi sisa kode umum antara health@2.0-service, pengisi daya, dan healthd serta memanggil metode IHealth, bukan BatteryMonitor.

Menerapkan layanan Health 2.0

Saat mengimplementasikan layanan health@2.0 untuk perangkat, jika implementasi default adalah:

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

    #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 healthd_board_init dan healthd_board_battery_update.
  • Jika variabel BOARD_PERIODIC_CHORES_INTERVAL_* khusus board:

    • Ditentukan, buat 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:

    • Jika harus mengimplementasikan API getStorageInfo dan getDiskStats, sediakan 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.

  • Implementasikan HAL dalam pemulihan dengan menginstal implementasi passthrough ke 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 Health 2.1 HAL.

Perubahan SELinux

Health@2.0 HAL baru menyertakan perubahan SELinux berikut:

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

Untuk perangkat dengan implementasinya sendiri, beberapa perubahan vendor SELinux 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 Health 2.1 HAL.

Pengujian

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

Persyaratan informasi baterai

Lihat Persyaratan informasi baterai.