Di Android 11, semua kode healthd
difaktorkan ulang menjadi libhealthloop
dan libhealth2impl
, lalu dimodifikasi untuk mengimplementasikan health@2.1 HAL. Kedua perpustakaan ini dihubungkan secara statis oleh health@2.0-impl-2.1
, implementasi passthrough dari Health 2.1. Pustaka yang tertaut secara statis memungkinkan health@2.0-impl-2.1
melakukan pekerjaan yang sama seperti healthd
, seperti menjalankan healthd_mainloop
dan polling. Di 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 gambar vendor lama diberlakukan oleh jadwal penghentian .
Untuk memastikan kompatibilitas ke belakang:
-
healthd
mendaftarkanIHealth
kehwservicemanager
meskipun merupakan daemon sistem.IHealth
ditambahkan ke manifes sistem, dengan nama instans "cadangan". - Kerangka kerja dan
storaged
berkomunikasi denganhealthd
melaluihwbinder
alih-alihbinder
. - Kode untuk framework dan
storaged
diubah untuk mengambil instance "default" jika tersedia, lalu "cadangan".- 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. Nilai-nilai ini dulunya diganti dalam fungsi healthd_board_init
yang tidak digunakan lagi.
Di health@2.1, vendor dapat mengganti dua nilai interval tugas berkala ini di struct healthd_config
sebelum diteruskan ke konstruktor kelas implementasi kesehatan. Kelas implementasi kesehatan harus mewarisi dari android::hardware::health::V2_1::implementation::Health
.
Melaksanakan layanan Kesehatan 2.1
Untuk informasi tentang penerapan layanan Kesehatan 2.1, lihat hardware/interfaces/health/2.1/README.md .
Klien kesehatan
health@2.x memiliki klien berikut:
- pengisi daya. Penggunaan kode
libbatterymonitor
danhealthd_common
dibungkus dalamhealth@2.0-impl
. - pemulihan. Tautan ke
libbatterymonitor
dibungkus dalamhealth@2.0-impl
. Semua panggilan keBatteryMonitor
digantikan dengan panggilan ke kelas implementasiHealth
. Manajer Baterai.
BatteryManager.queryProperty(int id)
adalah satu-satunya klienIBatteryPropertiesRegistrar.getProperty
.IBatteryPropertiesRegistrar.getProperty
disediakan olehhealthd
dan langsung dibaca/sys/class/power_supply
.Sebagai pertimbangan keamanan, aplikasi tidak diperbolehkan memanggil HAL kesehatan secara langsung. Di Android 9 dan lebih tinggi, layanan pengikat
IBatteryPropertiesRegistrar
disediakan olehBatteryService
, bukanhealthd
.BatteryService
mendelegasikan panggilan ke HAL kesehatan untuk mengambil informasi yang diminta.Layanan Baterai. Di Android 9 dan lebih tinggi,
BatteryService
menggunakanHealthServiceWrapper
untuk menentukan apakah akan menggunakan instance layanan kesehatan default darivendor
atau menggunakan instance layanan kesehatan cadangan darihealthd
.BatteryService
kemudian mendengarkan peristiwa kesehatan melaluiIHealth.registerCallback
.Penyimpanand. Di Android 9 dan lebih tinggi,
storaged
menggunakanlibhealthhalutils
untuk menentukan apakah akan menggunakan instance layanan kesehatan default darivendor
atau menggunakan instance layanan kesehatan cadangan darihealthd
.storaged
kemudian mendengarkan peristiwa kesehatan melaluiIHealth.registerCallback
dan mengambil informasi penyimpanan.
SELinux berubah
health@2.1 HAL mencakup perubahan SELinux berikut dalam platform:
- Menambahkan
android.hardware.health@2.1-service
kefile_contexts
.
Untuk perangkat dengan implementasinya sendiri, beberapa perubahan vendor SELinux 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 Kesehatan 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 Kesehatan 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 Kesehatan 2.1) -
/sys/class/power_supply/*/type
-
/sys/class/power_supply/*/voltage_max
-
/sys/class/power_supply/*/voltage_now
Implementasi HAL kesehatan khusus perangkat apa pun yang menggunakan libbatterymonitor
mengakses antarmuka kernel ini secara default, kecuali jika diganti dalam konstruktor kelas implementasi kesehatan.
Jika file ini hilang atau tidak dapat diakses dari healthd
atau dari layanan default (misalnya, file tersebut adalah symlink ke folder khusus vendor yang menolak akses karena kebijakan SELinux yang salah dikonfigurasi), file tersebut mungkin tidak berfungsi dengan benar. Jadi perubahan SELinux tambahan khusus vendor 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 kerangka kerja yang salah akibat hilangnya antarmuka kernel, disarankan untuk memilih CL 1398913 sebelum membangun layanan Health HAL 2.1.
Pengujian
Android 11 menyertakan tes 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 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
Health 2.0 HAL menyatakan serangkaian persyaratan pada antarmuka HAL, tetapi pengujian VTS terkait relatif longgar dalam menerapkannya. Di Android 11, pengujian VTS baru ditambahkan untuk menerapkan persyaratan berikut pada perangkat yang diluncurkan dengan Android 11 dan lebih tinggi:
- Satuan arus baterai intan dan rata-rata harus mikroamp (μA).
- Tanda arus baterai sesaat dan rata-rata harus benar. Secara khusus:
- arus == 0 ketika status baterai
UNKNOWN
- arus > 0 saat status baterai sedang
CHARGING
- saat ini <= 0 ketika status baterai
NOT_CHARGING
- arus <0 saat status baterai
DISCHARGING
- Tidak diterapkan ketika status baterai
FULL
- arus == 0 ketika status baterai
- Status baterai harus benar terhadap apakah sumber listrik tersambung atau tidak. Secara khusus:
- status baterai harus salah satu dari
CHARGING
,NOT_CHARGING
, atauFULL
jika dan hanya jika sumber listrik tersambung; - status baterai harus
DISCHARGING
jika 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 satuan yang benar. Ini termasuk 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 microamps (μA).
-
- Pastikan volume bateraitage dilaporkan dalam mikrovolt (μV). Ini termasuk node sysfs berikut:
-
/sys/class/power_supply/*/voltage_max
-
/sys/class/power_supply/*/voltage_now
- Perhatikan bahwa implementasi HAL default membagi
voltage_now
dengan 1000 dan melaporkan nilai dalam milivolt (mV). Lihat @1.0::HealthInfo .
-
Untuk detailnya, lihat kelas catu daya Linux .