Google is committed to advancing racial equity for Black communities. See how.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Menerapkan Kesehatan 2.0

Semua kode healthd telah direfraktorisasi menjadi health@2.0-impl dan libhealthservice , kemudian dimodifikasi untuk mengimplementasikan health@2.0 HAL. Kedua pustaka ini dihubungkan secara statis oleh health@2.0-service, memungkinkannya untuk melakukan pekerjaan yang sebelumnya dilakukan oleh healthd (yaitu menjalankan healthd_mainloop dan melakukan polling). Dalam init, health@2.0-service mendaftarkan implementasi antarmuka IHealth ke hwservicemanager . Saat mengupgrade perangkat dengan gambar vendor Android 8.x dan framework Android 9, layanan health@2.0 mungkin tidak disediakan oleh gambar vendor. Ini diberlakukan 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 "backup".
  2. Kerangka dan storaged komunikasi 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 dihentikan. Untuk detail selengkapnya, lihat Menghentikan kesehatan@1.0 .

Variabel build khusus papan untuk kesehatand

BOARD_PERIODIC_CHORES_INTERVAL_* adalah variabel khusus papan yang digunakan untuk membangun healthd . Sebagai bagian dari pemisahan build sistem / vendor, nilai khusus papan tidak dapat ditentukan untuk modul sistem. Dalam health@2.0, vendor dapat menimpa kedua nilai di healthd_mode_ops->init (dengan menjatuhkan libhealthservice ketergantungan di health@2.0-service.<device> dan re-melaksanakan fungsi ini).

Pustaka implementasi statis

Tidak seperti pustaka implementasi HAL lainnya, pustaka implementasi health@2.0-impl adalah pustaka statis tempat health@2.0-service, pengisi daya, pemulihan, dan tautan healthd lama.

health@2.0.impl mengimplementasikan IHealth seperti dijelaskan di atas dan dimaksudkan untuk libbatterymonitor dan libhealthd. BOARD . Pengguna health@2.0-impl ini tidak boleh menggunakan BatteryMonitor atau fungsi di libhealthd secara langsung; sebaliknya, panggilan ini harus diganti dengan panggilan ke kelas Health , implementasi antarmuka IHealth . Untuk menggeneralisasi lebih lanjut, kode healthd_common juga disertakan dalam health@2.0-impl. healthd_common baru berisi kode umum lainnya antara health@2.0-service, charger, dan healthd dan panggilan ke metode IHealth, bukan BatteryMonitor.

Menerapkan layanan Health 2.0

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

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

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

Kemudian:

  • Jika libhealthd: khusus libhealthd:

    • Ada, tautkan ke sana.
    • Tidak ada, menyediakan implementasi kosong untuk healthd_board_init dan healthd_board_battery_update fungsi.
  • Jika variabel BOARD_PERIODIC_CHORES_INTERVAL_* khusus BOARD_PERIODIC_CHORES_INTERVAL_* :

    • HealthServiceCommon.cpp , buat HealthServiceCommon.cpp khusus HealthServiceCommon.cpp (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 menerapkan getStorageInfo dan getDiskStats API, menyediakan implementasi di get_storage_info dan get_disk_stats fungsi.
    • Sebaiknya tidak menerapkan API tersebut, tautkan ke libstoragehealthdefault secara statis.
  • Perbarui izin SELinux yang diperlukan.

  • Menerapkan HAL dalam pemulihan dengan menginstal implementasi passthrough ke citra 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 detailnya, lihat hardware / interfaces / health / 2.0 / README.md .

Klien kesehatan

Lihat Klien kesehatan untuk kesehatan 2.1 HAL .

SELinux berubah

Health@2.0 HAL yang baru mencakup perubahan SELinux berikut ini:

  • Menambahkan health@2.0-service ke file_contexts .
  • Mengizinkan system_server dan storaged untuk menggunakan hal_health .
  • Mengizinkan system_server ( BatteryService ) untuk mendaftarkan batteryproperties_service ( IBatteryPropertiesRegistrar ).
  • Izinkan healthd untuk menyediakan hal_health .
  • Menghapus aturan yang memungkinkan system_server / storaged untuk panggilan ke healthd melalui pengikat.
  • Menghapus aturan yang mengizinkan 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 .

Menguji

Android 9 menyertakan tes VTS baru yang ditulis khusus untuk health@2.0 HAL. Jika perangkat menyatakan untuk memberikan health@2.0 HAL dalam manifes perangkat, perangkat tersebut harus lulus tes 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 .