Semua kode healthd
telah difaktorkan ulang menjadi health@2.0-impl dan
libhealthservice
, lalu diubah untuk menerapkan health@2.0 HAL. Kedua library ini
ditautkan secara statis oleh health@2.0-service, sehingga dapat melakukan
pekerjaan yang sebelumnya dilakukan oleh healthd
(yaitu, menjalankan healthd_mainloop
dan melakukan
polling). Dalam init, layanan health@2.0 mendaftarkan penerapan
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 diterapkan
oleh
jadwal penghentian penggunaan.
Untuk menyelesaikan masalah ini:
healthd
mendaftarkanIHealth
kehwservicemanager
(meskipun merupakan daemon sistem).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
tidak digunakan lagi, IHealth/backup dan
healthd
dapat tidak digunakan lagi. Untuk mengetahui detail selengkapnya, lihat Penghentian health@1.0.
Variabel build khusus board untuk healthd
BOARD_PERIODIC_CHORES_INTERVAL_*
adalah variabel khusus board yang digunakan untuk mem-build
healthd
. Sebagai bagian dari pemisahan build 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 menghapus dependensi
libhealthservice
di health@2.0-service.<device>
dan menerapkan ulang fungsi ini).
Library implementasi statis
Tidak seperti library implementasi HAL lainnya, library implementasi health@2.0-impl adalah library statis yang ditautkan oleh health@2.0-service, charger, recovery, dan healthd lama.
health@2.0.impl mengimplementasikan IHealth
seperti yang dijelaskan di atas dan dimaksudkan untuk mencakup
libbatterymonitor
dan libhealthd.BOARD
. Pengguna
health@2.0-impl ini tidak boleh menggunakan BatteryMonitor
atau fungsi di
libhealthd
secara langsung. Sebagai gantinya, panggilan ini harus diganti dengan panggilan ke
class Health
, yang merupakan implementasi antarmuka IHealth
. Untuk lebih umum, 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 memanggil metode IHealth, bukan BatteryMonitor.
Mengimplementasikan layanan Health 2.0
Saat menerapkan layanan health@2.0 untuk perangkat, jika penerapan defaultnya adalah:
- Cukup untuk perangkat, gunakan
android.hardware.health@2.0-service
secara langsung. Tidak memadai untuk perangkat, buat file
android.hardware.health@2.0-service.(device)
yang dapat dieksekusi dan sertakan:#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 fungsi
healthd_board_init
danhealthd_board_battery_update
.
Jika variabel
BOARD_PERIODIC_CHORES_INTERVAL_*
khusus board:- Ditentukan, membuat
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, membuat
Jika perangkat:
- Harus mengimplementasikan
getStorageInfo
dangetDiskStats
API, berikan implementasi dalam fungsiget_storage_info
danget_disk_stats
. - Tidak boleh menerapkan API tersebut, tautkan ke
libstoragehealthdefault
secara statis.
- Harus mengimplementasikan
Perbarui izin SELinux yang diperlukan.
Terapkan HAL dalam pemulihan dengan menginstal implementasi passthrough pada 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 HAL Health 2.1.
Perubahan SELinux
Health@2.0 HAL baru menyertakan perubahan SELinux berikut:
- Menambahkan layanan health@2.0 ke
file_contexts
. - Mengizinkan
system_server
danstoraged
menggunakanhal_health
. - Mengizinkan
system_server
(BatteryService
) mendaftarkanbatteryproperties_service
(IBatteryPropertiesRegistrar
). - Mengizinkan
healthd
untuk menyediakanhal_health
. - Menghapus aturan yang memungkinkan
system_server
danstoraged
memanggilhealthd
melalui binder. - Menghapus aturan yang memungkinkan
healthd
mendaftarkanbatteryproperties_service
(IBatteryPropertiesRegistrar
).
Untuk perangkat dengan penerapannya 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 HAL Health 2.1.
Pengujian
Android 9 menyertakan pengujian VTS baru
yang ditulis khusus untuk HAL health@2.0. Jika perangkat mendeklarasikan untuk menyediakan
HAL health@2.0 dalam manifes perangkat, perangkat tersebut harus lulus pengujian VTS yang sesuai.
Pengujian ditulis untuk instance default (untuk memastikan bahwa perangkat
mengimplementasikan HAL dengan benar) dan instance pencadangan (untuk memastikan bahwa healthd
terus berfungsi dengan benar sebelum dihapus).