Di Android 11, semua kode healthd difaktorkan ulang menjadi libhealthloop dan libhealth2impl, lalu diubah untuk menerapkan health@2.1 HAL. Kedua library ini ditautkan secara statis oleh health@2.0-impl-2.1, implementasi passthrough Health 2.1. Library yang ditautkan secara statis
memungkinkan health@2.0-impl-2.1 melakukan pekerjaan yang sama seperti healthd, seperti menjalankan
healthd_mainloop dan polling. Dalam init, health@2.1-service mendaftarkan implementasi antarmuka IHealth ke hwservicemanager. Saat mengupgrade perangkat dengan image vendor Android 8.x atau 9 dan framework Android 11, image vendor mungkin tidak menyediakan layanan health@2.1. Kompatibilitas mundur dengan image vendor lama diberlakukan oleh jadwal penghentian.
Untuk memastikan kompatibilitas mundur:
healthdmendaftarkanIHealthkehwservicemanagermeskipun merupakan daemon sistem.IHealthditambahkan ke manifes sistem, dengan nama instance "backup".- Framework dan
storagedberkomunikasi denganhealthdmelaluihwbinderbukanbinder. - Kode untuk framework dan
storageddiubah 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
healthddapat tidak digunakan lagi.
Variabel build khusus papan untuk healthd
BOARD_PERIODIC_CHORES_INTERVAL_* adalah variabel khusus papan yang digunakan untuk membuat healthd. Sebagai bagian dari pemisahan build sistem/vendor, nilai khusus papan tidak dapat ditentukan untuk modul sistem. Nilai ini sebelumnya diganti dalam fungsi healthd_board_init yang tidak digunakan lagi.
Di health@2.1, vendor dapat mengganti dua nilai interval tugas berkala ini dalam struct healthd_config sebelum meneruskan ke konstruktor class implementasi kesehatan. Class implementasi kesehatan harus mewarisi dari android::hardware::health::V2_1::implementation::Health.
Mengimplementasikan layanan Health 2.1
Untuk mengetahui informasi tentang cara mengimplementasikan layanan Health 2.1, lihat hardware/interfaces/health/2.1/README.md.
Klien kesehatan
health@2.x memiliki klien berikut:
- charger. Penggunaan kode
libbatterymonitordanhealthd_commondienkapsulasi dalamhealth@2.0-impl. - recovery. Penautan ke
libbatterymonitordienkapsulasi dalamhealth@2.0-impl. Semua panggilan keBatteryMonitordiganti dengan panggilan ke class implementasiHealth. BatteryManager.
BatteryManager.queryProperty(int id)adalah satu-satunya klienIBatteryPropertiesRegistrar.getProperty.IBatteryPropertiesRegistrar.getPropertydisediakan olehhealthddan langsung membaca/sys/class/power_supply.Sebagai pertimbangan keamanan, aplikasi tidak diizinkan untuk memanggil health HAL secara langsung. Di Android 9 dan yang lebih tinggi, layanan binder
IBatteryPropertiesRegistrardisediakan olehBatteryService, bukanhealthd.BatteryServicemendelegasikan panggilan ke health HAL untuk mengambil informasi yang diminta.BatteryService. Di Android 9 dan yang lebih tinggi,
BatteryServicemenggunakanHealthServiceWrapperuntuk menentukan apakah akan menggunakan instance layanan kesehatan default darivendoratau menggunakan instance layanan kesehatan cadangan darihealthd.BatteryServicekemudian memproses peristiwa kesehatan melaluiIHealth.registerCallback.Storaged. Di Android 9 dan yang lebih tinggi,
storagedmenggunakanlibhealthhalutilsuntuk menentukan apakah akan menggunakan instance layanan kesehatan default darivendoratau menggunakan instance layanan kesehatan cadangan darihealthd.storagedkemudian memproses peristiwa kesehatan melaluiIHealth.registerCallbackdan mengambil informasi penyimpanan.
Perubahan SELinux
health@2.1 HAL mencakup perubahan SELinux berikut di platform:
- Menambahkan
android.hardware.health@2.1-servicekefile_contexts.
Untuk perangkat dengan implementasinya sendiri, beberapa perubahan SELinux vendor mungkin diperlukan. Contoh:
# 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
Daemon healthd dan implementasi default android.hardware.health@2.0-impl-2.1 mengakses antarmuka kernel berikut untuk mengambil informasi baterai:
/sys/class/power_supply/*/capacity_level(ditambahkan di Health 2.1)/sys/class/power_supply/*/capacity/sys/class/power_supply/*/charge_counter/sys/class/power_supply/*/charge_full/sys/class/power_supply/*/charge_full_design(ditambahkan di Health 2.1)/sys/class/power_supply/*/current_avg/sys/class/power_supply/*/current_max/sys/class/power_supply/*/current_now/sys/class/power_supply/*/cycle_count/sys/class/power_supply/*/health/sys/class/power_supply/*/online/sys/class/power_supply/*/present/sys/class/power_supply/*/status/sys/class/power_supply/*/technology/sys/class/power_supply/*/temp/sys/class/power_supply/*/time_to_full_now(ditambahkan di Health 2.1)/sys/class/power_supply/*/type/sys/class/power_supply/*/voltage_max/sys/class/power_supply/*/voltage_now
Implementasi health HAL khusus perangkat yang menggunakan libbatterymonitor mengakses antarmuka kernel ini secara default, kecuali jika diganti dalam konstruktor class implementasi kesehatan.
Jika file ini tidak ada atau tidak dapat diakses dari healthd atau dari layanan default (misalnya, file adalah symlink ke folder khusus vendor yang menolak akses karena kebijakan SELinux yang salah konfigurasi), file tersebut mungkin tidak berfungsi dengan benar. Jadi, perubahan SELinux khusus vendor tambahan mungkin diperlukan meskipun implementasi default digunakan.
Beberapa antarmuka kernel yang digunakan di Health 2.1, seperti /sys/class/power_supply/*/capacity_level dan /sys/class/power_supply/*/time_to_full_now, mungkin bersifat opsional. Namun, untuk
mencegah perilaku framework yang salah akibat antarmuka kernel yang tidak ada,
sebaiknya pilih
CL 1398913
sebelum membuat layanan Health HAL 2.1.
Pengujian
Android 11 menyertakan pengujian
VTS baru
yang ditulis khusus untuk health@2.1 HAL. Jika perangkat mendeklarasikan health@2.1 HAL dalam manifes perangkat, perangkat tersebut harus lulus pengujian VTS yang sesuai.
Pengujian ditulis untuk instance default (untuk memastikan perangkat mengimplementasikan HAL dengan benar) dan instance cadangan (untuk memastikan healthd terus berfungsi dengan benar sebelum dihapus).
Persyaratan informasi baterai
Health 2.0 HAL menyatakan serangkaian persyaratan pada antarmuka HAL, tetapi pengujian VTS yang sesuai relatif longgar dalam menegakkannya. Di Android 11, pengujian VTS baru ditambahkan untuk menerapkan persyaratan berikut pada perangkat yang diluncurkan dengan Android 11 dan yang lebih tinggi:
- Unit arus baterai sesaat dan rata-rata harus mikroampere (μA).
- Tanda arus baterai sesaat dan rata-rata harus benar.
Khususnya:
- current == 0 saat status baterai adalah
UNKNOWN - current > 0 saat status baterai adalah
CHARGING - current <= 0 saat status baterai adalah
NOT_CHARGING - current < 0 saat status baterai adalah
DISCHARGING - Tidak diterapkan saat status baterai adalah
FULL
- current == 0 saat status baterai adalah
- Status baterai harus benar terhadap apakah sumber listrik terhubung atau tidak. Khususnya:
- status baterai harus salah satu dari
CHARGING,NOT_CHARGING, atauFULLjika dan hanya jika sumber listrik terhubung; - status baterai harus
DISCHARGINGjika dan hanya jika sumber listrik terputus.
- status baterai harus salah satu dari
Jika Anda menggunakan libbatterymonitor dalam implementasi dan meneruskan nilai dari antarmuka kernel, pastikan node sysfs melaporkan nilai yang benar:
- Pastikan arus baterai dilaporkan dengan tanda dan unit yang benar. Hal ini mencakup node sysfs berikut:
/sys/class/power_supply/*/current_avg/sys/class/power_supply/*/current_max/sys/class/power_supply/*/current_now- Nilai positif menunjukkan arus masuk ke baterai.
- Nilai harus dalam mikroampere (μA).
- Pastikan voltase baterai dilaporkan dalam mikrovolt (μV). Hal ini mencakup node sysfs berikut:
/sys/class/power_supply/*/voltage_max/sys/class/power_supply/*/voltage_now- Perhatikan bahwa implementasi HAL default membagi
voltage_nowdengan 1000 dan melaporkan nilai dalam milivolt (mV). Lihat @1.0::HealthInfo.
Untuk mengetahui detailnya, lihat class catu daya Linux.