Di Android 11, semua kode healthd
difaktorkan ulang menjadi
libhealthloop
dan libhealth2impl
, lalu dimodifikasi untuk menerapkan health@2.1
HAL. Kedua library ini ditautkan secara statis oleh health@2.0-impl-2.1
,
passthrough implementasi Kesehatan 2.1. Library yang terhubung secara statis
mengaktifkan health@2.0-impl-2.1
untuk melakukan tugas yang sama seperti healthd
, seperti menjalankan
healthd_mainloop
dan polling. Pada init, health@2.1-service
mendaftarkan
implementasi antarmuka IHealth
ke hwservicemanager
. Saat mengupgrade
perangkat dengan Android 8.x atau 9
gambar vendor dan framework Android 11,
image vendor mungkin tidak memberikan layanan health@2.1. Mundur
kompatibilitas dengan image vendor lama diberlakukan oleh
jadwal penghentian.
Untuk memastikan kompatibilitas mundur:
healthd
mendaftarkanIHealth
kehwservicemanager
meskipun merupakan sistem {i>daemon<i}.IHealth
ditambahkan ke manifes sistem, dengan nama instance "cadangan".- 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 detail, lihat Penghentian 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. Nilai-nilai ini biasanya diganti
dalam fungsi healthd_board_init
yang tidak digunakan lagi.
Di health@2.1, vendor dapat mengganti
kedua nilai interval tugas berkala ini dalam struct healthd_config
sebelum
yang diteruskan ke konstruktor class penerapan kesehatan. Kesehatan
harus mewarisi dari
android::hardware::health::V2_1::implementation::Health
.
Menerapkan layanan Health 2.1
Untuk informasi tentang penerapan layanan Health 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
digabungkan dalamhealth@2.0-impl
. - pemulihan. Link ke
libbatterymonitor
digabungkan dalamhealth@2.0-impl
. Semua panggilan keBatteryMonitor
diganti dengan panggilan ke class implementasiHealth
. BatteryManager.
BatteryManager.queryProperty(int id)
adalah satu-satunya klienIBatteryPropertiesRegistrar.getProperty
.IBatteryPropertiesRegistrar.getProperty
disediakan olehhealthd
dan langsung membaca/sys/class/power_supply
.Sebagai pertimbangan keamanan, aplikasi tidak diizinkan memanggil HAL kesehatan secara langsung. Di Android 9 dan yang lebih tinggi, binder layanan
IBatteryPropertiesRegistrar
disediakan olehBatteryService
bukanhealthd
.BatteryService
mendelegasikan panggilan ke HAL kesehatan untuk mengambil informasi yang diminta.BatteryService. Di Android 9 dan yang lebih tinggi,
BatteryService
menggunakanHealthServiceWrapper
untuk menentukan apakah akan menggunakan Instance layanan kesehatan default darivendor
atau untuk menggunakan pencadangan instance layanan kesehatan darihealthd
.BatteryService
lalu memproses peristiwa kesehatan hinggaIHealth.registerCallback
.Disimpan. Di Android 9 dan yang lebih tinggi,
storaged
menggunakanlibhealthhalutils
untuk menentukan apakah akan menggunakan Instance layanan kesehatan default darivendor
atau untuk menggunakan pencadangan instance layanan kesehatan darihealthd
.storaged
kemudian memproses peristiwa kesehatan melaluiIHealth.registerCallback
dan mengambil informasi penyimpanan Anda.
Perubahan SELinux
HAL health@2.1 menyertakan perubahan SELinux berikut di 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 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 HAL kesehatan khusus perangkat apa pun yang menggunakan libbatterymonitor
yang mengakses antarmuka kernel ini secara default, kecuali jika diganti dalam bagian
konstruktor class penerapan otomatis.
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 konfigurasi kebijakan SELinux
yang salah konfigurasi), mereka mungkin tidak
apakah berfungsi dengan baik. Jadi, perubahan SELinux
khusus vendor tambahan mungkin
diperlukan meskipun implementasi {i>default<i} digunakan.
Beberapa antarmuka {i>kernel<i} yang digunakan
di Health 2.1, seperti
/sys/class/power_supply/*/capacity_level
dan
/sys/class/power_supply/*/time_to_full_now
, dapat bersifat opsional. Namun, untuk
mencegah perilaku kerangka kerja yang salah
karena antarmuka {i>kernel<i} yang hilang,
disarankan untuk
memilih {i>ceri<i}
CL 1398913
sebelum membangun layanan Health HAL 2.1.
Pengujian
Android 11 menyertakan
Pengujian VTS
yang ditulis khusus untuk health@2.1 HAL. Jika perangkat mendeklarasikan
health@2.1 HAL dalam manifes perangkat, harus lulus tes 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).
Persyaratan informasi baterai
Health 2.0 HAL menyatakan satu set persyaratan pada antarmuka HAL, tetapi tes VTS terkait relatif longgar dalam menegakkannya. Di Android 11, pengujian VTS baru ditambahkan untuk menegakkan persyaratan berikut pada perangkat yang diluncurkan dengan Android 11 dan lebih tinggi:
- Satuan arus baterai rata-rata dan intataus harus mikroamp (μA).
- Tanda arus baterai instan dan rata-rata harus benar.
Khususnya:
- saat ini == 0 saat status baterai
UNKNOWN
- saat ini > 0 jika status baterai
CHARGING
- saat ini <= 0 saat status baterai
NOT_CHARGING
- saat ini < 0 jika status baterai
DISCHARGING
- Tidak diterapkan saat status baterai
FULL
- saat ini == 0 saat status baterai
- Status baterai harus benar terkait apakah sumber listrik
terhubung. Khususnya:
- status baterai harus salah satu dari
CHARGING
,NOT_CHARGING
, atauFULL
jika dan hanya jika sumber listrik terhubung; - status baterai harus
DISCHARGING
jika dan hanya jika sumber listrik terputus.
- status baterai harus salah satu dari
Jika Anda menggunakan libbatterymonitor
dalam penerapan dan meneruskan nilai
dari antarmuka {i>kernel<i}, pastikan {i>
node sysfs<i} melaporkan nilai yang benar:
- Pastikan arus baterai dilaporkan dengan tanda dan unit yang benar. 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 yang masuk ke baterai.
- Nilai harus dalam mikroamp (μA).
- Pastikan voltase baterai dilaporkan dalam mikrovolt (μV). Pembaruan ini mencakup
node sysfs berikut:
/sys/class/power_supply/*/voltage_max
/sys/class/power_supply/*/voltage_now
- Perlu diketahui bahwa implementasi HAL default membagi
voltage_now
dengan 1.000 dan melaporkan nilai dalam milivolt (mV). Lihat @1.0::InfoKesehatan.
Untuk mengetahui detailnya, lihat Class catu daya Linux.