Semua kode healthd
telah difaktorkan ulang menjadi health@2.0-impl dan libhealthservice
, kemudian dimodifikasi untuk mengimplementasikan health@2.0 HAL. Kedua perpustakaan ini dihubungkan secara statis oleh health@2.0-service, memungkinkannya melakukan pekerjaan yang sebelumnya dilakukan oleh healthd
(yaitu, menjalankan healthd_mainloop
dan melakukan polling). Di init, 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 image vendor. Hal ini ditegakkan oleh jadwal penghentian .
Untuk mengatasi masalah ini:
-
healthd
mendaftarkanIHealth
kehwservicemanager
(meskipun merupakan daemon sistem).IHealth
ditambahkan ke manifes sistem, dengan nama instan"backup"
. - Kerangka kerja dan
storaged
berkomunikasi denganhealthd
melaluihwbinder
alih-alihbinder
. - Kode untuk framework dan
storaged
diubah untuk mengambil instance"default"
jika tersedia, lalu"backup"
.- Kode klien C++ menggunakan logika yang ditentukan dalam
libhealthhalutils
. - Kode klien Java menggunakan logika yang ditentukan dalam
HealthServiceWrapper
.
- Kode klien C++ menggunakan logika yang ditentukan dalam
- Setelah IHealth/default tersedia secara luas dan image vendor Android 8.1 tidak digunakan lagi, IHealth/backup dan
healthd
tidak lagi digunakan. Untuk detail selengkapnya, lihat Penghentian health@1.0 .
Variabel build khusus papan untuk healthd
BOARD_PERIODIC_CHORES_INTERVAL_*
adalah variabel khusus papan yang digunakan untuk membangun healthd
. Sebagai bagian dari pemisahan pembangunan 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 menghilangkan ketergantungan libhealthservice
di health@2.0-service.<device>
dan mengimplementasikan kembali fungsi ini).
Perpustakaan implementasi statis
Tidak seperti pustaka implementasi HAL lainnya, pustaka implementasi health@2.0-impl adalah pustaka statis yang terhubung dengan layanan health@2.0, pengisi daya, pemulihan, dan healthd lama.
health@2.0.impl mengimplementasikan IHealth
seperti dijelaskan di atas dan dimaksudkan untuk membungkus 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
, yang merupakan 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 layanan health@2.0, pengisi daya, dan healthd
serta panggilan ke metode IHealth, bukan BatteryMonitor.
Menerapkan layanan Kesehatan 2.0
Saat mengimplementasikan layanan health@2.0 untuk perangkat, jika implementasi defaultnya adalah:
- Cukup untuk perangkat, gunakan langsung
android.hardware.health@2.0-service
. Tidak cukup untuk perangkat, buat
android.hardware.health@2.0-service.(device)
dapat dieksekusi dan sertakan:#include <health2/service.h> int main() { return health_service_main(); }
Kemudian:
Jika
libhealthd:
- Apakah ada, tautkan ke sana.
- Tidak ada, berikan implementasi kosong untuk fungsi
healthd_board_init
danhealthd_board_battery_update
.
Jika variabel
BOARD_PERIODIC_CHORES_INTERVAL_*
khusus papan:- Didefinisikan, buat
HealthServiceCommon.cpp
khusus perangkat (disalin darihardware/interfaces/health/2.0/utils/libhealthservice
) dan sesuaikan dihealthd_mode_service_2_0_init
. - Tidak ditentukan, tautkan ke
libhealthservice
secara statis.
- Didefinisikan, buat
Jika perangkat:
- Harus mengimplementasikan API
getStorageInfo
dangetDiskStats
, menyediakan implementasi dalam fungsiget_storage_info
danget_disk_stats
. - Seharusnya tidak mengimplementasikan API tersebut, tautkan ke
libstoragehealthdefault
secara statis.
- Harus mengimplementasikan API
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 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 baru mencakup perubahan SELinux berikut:
- Menambahkan health@2.0-service ke
file_contexts
. - Mengizinkan
system_server
danstoraged
menggunakanhal_health
. - Mengizinkan
system_server
(BatteryService
) mendaftarkanbatteryproperties_service
(IBatteryPropertiesRegistrar
). - Mengizinkan
healthd
menyediakanhal_health
. - Menghapus aturan yang mengizinkan
system_server
danstoraged
memanggilhealthd
melalui binder. - Menghapus aturan yang mengizinkan
healthd
mendaftarkanbatteryproperties_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 tes VTS baru yang ditulis khusus untuk health@2.0 HAL. Jika perangkat menyatakan menyediakan health@2.0 HAL dalam manifes perangkat, perangkat tersebut harus lulus pengujian 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 .