Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Menerapkan Kesehatan 2.0

Semua healthd kode telah refactored ke health@2.0-impl dan libhealthservice , kemudian dimodifikasi untuk melaksanakan health@2.0 HAL. Kedua perpustakaan dihubungkan statis oleh health@2.0-service, memungkinkan untuk melakukan pekerjaan yang sebelumnya dilakukan oleh healthd (yaitu menjalankan healthd_mainloop dan melakukan pemungutan suara). Dalam init, health@2.0-service register merupakan implementasi dari antarmuka IHealth untuk hwservicemanager . Saat memutakhirkan perangkat dengan gambar vendor Android 8.x dan kerangka kerja Android 9, layanan health@2.0 mungkin tidak disediakan oleh gambar vendor. Ini diberlakukan oleh jadwal depresiasi .

Untuk mengatasi masalah ini:

  1. healthd register IHealth ke hwservicemanager (meskipun sistem daemon). IHealth ditambahkan ke sistem nyata, dengan nama misalnya "cadangan".
  2. Kerangka dan storaged berkomunikasi dengan healthd melalui hwbinder bukan binder .
  3. Kode untuk kerangka kerja dan storaged berubah untuk mengambil contoh "default" jika tersedia, maka "backup".
    • C ++ kode klien menggunakan logika didefinisikan dalam libhealthhalutils .
    • Kode klien Java menggunakan logika didefinisikan dalam HealthServiceWrapper .
  4. Setelah iHealth / default tersedia secara luas dan Android 8.1 penjual gambar yang usang, iHealth / backup dan healthd dapat ditinggalkan. Untuk lebih jelasnya, lihat mencela health@1.0 .

Variabel build khusus papan untuk healthd

BOARD_PERIODIC_CHORES_INTERVAL_* adalah variabel papan khusus yang digunakan untuk membangun healthd . Sebagai bagian dari sistem / vendor membangun split, nilai-nilai papan khusus tidak dapat didefinisikan 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 perpustakaan implementasi HAL lain, health@2.0-impl implementasi perpustakaan adalah perpustakaan statis yang health@2.0-service, charger, pemulihan, dan hubungan warisan healthd.

health@2.0.impl mengimplementasikan IHealth seperti dijelaskan di atas dan dimaksudkan untuk membungkus libbatterymonitor dan libhealthd. BOARD . Pengguna tersebut health@2.0-impl tidak harus menggunakan BatteryMonitor atau fungsi dalam libhealthd langsung; sebaliknya, panggilan ini harus diganti dengan panggilan ke Health kelas, sebuah implementasi dari IHealth antarmuka. Untuk menggeneralisasi lanjut, healthd_common kode juga termasuk dalam health@2.0-impl. Baru healthd_common berisi sisa kode umum antara health@2.0-service, charger, dan healthd dan panggilan ke metode iHealth bukan BatteryMonitor.

Menerapkan layanan Kesehatan 2.0

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

  • Yang cukup untuk perangkat, menggunakan android.hardware.health@2.0-service langsung.
  • Tidak cukup untuk perangkat, membuat android.hardware.health@2.0-service.(device) Executable dan meliputi:

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

Kemudian:

  • Jika papan tertentu libhealthd:

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

    • Didefinisikan, membuat perangkat khusus HealthServiceCommon.cpp (disalin dari hardware/interfaces/health/2.0/utils/libhealthservice ) dan menyesuaikannya di healthd_mode_service_2_0_init .
    • Tidak didefinisikan, link libhealthservice statis.
  • Jika perangkat:

    • Harus menerapkan getStorageInfo dan getDiskStats API, menyediakan implementasi di get_storage_info dan get_disk_stats fungsi.
    • Seharusnya tidak menerapkan mereka API, link ke libstoragehealthdefault statis.
  • Perbarui izin SELinux yang diperlukan.

  • Terapkan 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 rincian, lihat hardware / interface / kesehatan / 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:

  • Menambahkan health@2.0-service ke file_contexts .
  • Memungkinkan system_server dan storaged penggunaan hal_health .
  • Memungkinkan system_server ( BatteryService ) untuk mendaftarkan batteryproperties_service ( IBatteryPropertiesRegistrar ).
  • Memungkinkan healthd untuk memberikan hal_health .
  • Menghapus aturan yang memungkinkan system_server / storaged untuk panggilan ke healthd melalui pengikat.
  • Menghapus aturan yang memungkinkan healthd untuk mendaftar 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 interface Kernel untuk kesehatan 2.1 HAL .

Pengujian

Android 9 termasuk baru VTS tes ditulis secara khusus untuk HAL health@2.0. Jika perangkat menyatakan menyediakan health@2.0 HAL dalam manifes perangkat, perangkat tersebut harus lulus uji VTS yang sesuai. Tes tertulis untuk kedua contoh default (untuk memastikan bahwa perangkat alat HAL benar) dan contoh cadangan (untuk memastikan bahwa healthd terus berfungsi dengan benar sebelum dihapus).

Persyaratan informasi baterai

Lihat persyaratan Informasi baterai .