Menerapkan Kesehatan 2.0

Semua kode kesehatan telah difaktorkan ulang menjadi healthd dan libhealthservice , kemudian dimodifikasi untuk mengimplementasikan [email protected] HAL. Kedua library ini dihubungkan secara statis oleh [email protected], memungkinkannya melakukan pekerjaan yang sebelumnya dilakukan oleh healthd (yaitu menjalankan healthd_mainloop dan melakukan polling). Di init, [email protected] mendaftarkan implementasi antarmuka IHealth ke hwservicemanager . Saat memutakhirkan perangkat dengan citra vendor Android 8.x dan kerangka kerja Android 9, layanan [email protected] mungkin tidak disediakan oleh citra vendor. Ini ditegakkan oleh jadwal penghentian .

Untuk mengatasi masalah ini:

  1. healthd mendaftarkan IHealth ke hwservicemanager (meskipun merupakan daemon sistem). IHealth ditambahkan ke manifes sistem, dengan nama instance "cadangan".
  2. Framework dan storaged berkomunikasi dengan healthd melalui hwbinder alih-alih binder .
  3. Kode untuk kerangka kerja dan storaged diubah untuk mengambil instance "default" jika tersedia, lalu "cadangan".
    • Kode klien C++ menggunakan logika yang didefinisikan dalam libhealthhalutils .
    • Kode klien Java menggunakan logika yang ditentukan dalam HealthServiceWrapper .
  4. Setelah IHealth/default tersedia secara luas dan gambar vendor Android 8.1 tidak digunakan lagi, IHealth/backup dan healthd dapat dihentikan. Untuk detail selengkapnya, lihat Menghentikan [email protected] .

Variabel build khusus papan untuk healthd

BOARD_PERIODIC_CHORES_INTERVAL_* adalah variabel khusus papan yang digunakan untuk membangun healthd . Sebagai bagian dari sistem/vendor build split, nilai khusus papan tidak dapat ditentukan untuk modul sistem. Di [email protected], vendor dapat mengganti dua nilai ini di healthd_mode_ops->init (dengan menghilangkan ketergantungan libhealthservice di [email protected].<device> dan mengimplementasikan kembali fungsi ini).

Pustaka implementasi statis

Tidak seperti library implementasi HAL lainnya, implementasi library [email protected] adalah library statis yang ditautkan [email protected], charger, recovery, dan legacy health.

[email protected] mengimplementasikan IHealth seperti dijelaskan di atas dan dimaksudkan untuk membungkus libbatterymonitor dan libhealthd. BOARD . Pengguna [email protected] ini tidak boleh menggunakan BatteryMonitor atau fungsi di libhealthd secara langsung; sebagai gantinya, panggilan ini harus diganti dengan panggilan ke kelas Health , sebuah implementasi dari antarmuka IHealth . Untuk menggeneralisasi lebih lanjut, kode healthd_common juga disertakan dalam [email protected]. healthd_common baru berisi sisa kode umum antara [email protected], charger, dan healthd dan panggilan ke metode IHealth alih-alih BatteryMonitor.

Menerapkan layanan Health 2.0

Saat menerapkan layanan [email protected] untuk perangkat, jika implementasi defaultnya adalah:

  • Cukup untuk perangkat, gunakan layanan [email protected] secara langsung.
  • Tidak cukup untuk perangkat, buat [email protected].(device) dapat dieksekusi dan sertakan:

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

Kemudian:

  • Jika libhealthd:

    • Apakah ada, link ke sana.
    • Tidak ada, berikan implementasi kosong untuk fungsi healthd_board_init dan healthd_board_battery_update .
  • Jika variabel BOARD_PERIODIC_CHORES_INTERVAL_* khusus papan:

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

    • Harus mengimplementasikan getStorageInfo dan getDiskStats API, menyediakan implementasi di fungsi get_storage_info dan get_disk_stats .
    • Seharusnya tidak mengimplementasikan API tersebut, tautkan ke libstoragehealthdefault secara statis.
  • Perbarui izin SELinux yang diperlukan.

  • Terapkan HAL dalam pemulihan dengan menginstal implementasi passthrough ke citra pemulihan. Contoh:

    // Android.bp
    cc_library_shared {
        name: "[email protected]<device>",
        recovery_available: true,
        relative_install_path: "hw",
        static_libs: [
            "[email protected]",
            "libhealthd.<device>"
            // Include the following or implement device-specific storage APIs
            "libhealthstoragedefault",
        ],
        srcs: [
            "HealthImpl.cpp",
        ],
        overrides: [
            "[email protected]",
        ],
    }
    
    // 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 += [email protected]<device>
    

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

klien kesehatan

Lihat Kesehatan klien untuk kesehatan 2.1 HAL .

SELinux berubah

[email protected] HAL yang baru mencakup perubahan SELinux berikut:

  • Menambahkan [email protected] ke file_contexts .
  • Mengizinkan system_server dan storaged untuk menggunakan hal_health .
  • Mengizinkan system_server ( BatteryService ) untuk mendaftarkan batteryproperties_service ( IBatteryPropertiesRegistrar ).
  • Memungkinkan healthd untuk memberikan hal_health .
  • Menghapus aturan yang memungkinkan system_server / storaged untuk memanggil healthd melalui binder.
  • Menghapus aturan yang memungkinkan healthd untuk mendaftarkan batteryproperties_service ( IBatteryPropertiesRegistrar ).

Untuk perangkat dengan implementasinya 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 kesehatan 2.1 HAL .

Pengujian

Android 9 menyertakan pengujian VTS baru yang ditulis khusus untuk [email protected] HAL. Jika perangkat menyatakan menyediakan [email protected] HAL dalam manifes perangkat, perangkat tersebut harus lulus uji VTS yang sesuai. Pengujian ditulis untuk instans default (untuk memastikan bahwa perangkat mengimplementasikan HAL dengan benar) dan instans cadangan (untuk memastikan bahwa healthd terus berfungsi dengan benar sebelum dihapus).

Persyaratan informasi baterai

Lihat Persyaratan informasi baterai .