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:
healthd
mendaftarkanIHealth
kehwservicemanager
(meskipun merupakan sistem {i>daemon<i}).IHealth
ditambahkan ke manifes sistem, dengan nama instance"backup"
.- Framework dan
storaged
berkomunikasi denganhealthd
melaluihwbinder
bukanbinder
. - 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
.
- Kode klien C++ menggunakan logika yang ditentukan di
- 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
danhealthd_board_battery_update
.
Jika variabel
BOARD_PERIODIC_CHORES_INTERVAL_*
khusus board:- Ditentukan, buat
HealthServiceCommon.cpp
khusus perangkat (disalin darihardware/interfaces/health/2.0/utils/libhealthservice
) dan menyesuaikannya dihealthd_mode_service_2_0_init
. - Tidak ditentukan, tautkan ke
libhealthservice
secara statis.
- Ditentukan, buat
Jika perangkat:
- Jika harus mengimplementasikan API
getStorageInfo
dangetDiskStats
, sediakan implementasi dalam fungsiget_storage_info
danget_disk_stats
. - Tidak boleh menerapkan API tersebut, tautkan ke
libstoragehealthdefault
secara statis.
- Jika harus mengimplementasikan API
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
danstoraged
menggunakanhal_health
. - Mengizinkan
system_server
(BatteryService
) untuk mendaftarbatteryproperties_service
(IBatteryPropertiesRegistrar
). - Mengizinkan
healthd
menyediakanhal_health
. - Menghapus aturan yang memungkinkan
system_server
danstoraged
untuk memanggilhealthd
melalui binder. - Menghapus aturan yang mengizinkan
healthd
untuk 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 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).