Di Android 11, semua kode healthd
difaktorkan ulang menjadi
libhealthloop
dan libhealth2impl
, lalu diubah untuk menerapkan HAL
health@2.1. Kedua library ini ditautkan secara statis oleh health@2.0-impl-2.1
,
implementasi 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:
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 respons
BOARD_PERIODIC_CHORES_INTERVAL_*
adalah variabel khusus board yang digunakan untuk mem-build
healthd
. Sebagai bagian dari pemisahan build sistem/vendor, nilai khusus board
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 informasi tentang cara mengimplementasikan 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. Penautan 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 untuk memanggil HAL kesehatan secara langsung. Di Android 9 dan yang lebih tinggi, layanan binder
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 menggunakan instance layanan kesehatan cadangan darihealthd
.BatteryService
kemudian memproses peristiwa kesehatan melaluiIHealth.registerCallback
.Disimpan. Di Android 9 dan yang lebih tinggi,
storaged
menggunakanlibhealthhalutils
untuk menentukan apakah akan menggunakan instance layanan kesehatan default darivendor
atau menggunakan instance layanan kesehatan pencadangan darihealthd
.storaged
kemudian memproses peristiwa kesehatan melaluiIHealth.registerCallback
dan mengambil informasi penyimpanan.
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 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 Fitur 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 Fitur Kesehatan 2.1)/sys/class/power_supply/*/type
/sys/class/power_supply/*/voltage_max
/sys/class/power_supply/*/voltage_now
Setiap implementasi HAL kesehatan khusus perangkat yang menggunakan libbatterymonitor
mengakses antarmuka kernel ini secara default, kecuali jika diganti di 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 dikonfigurasi), 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 mem-build layanan Health HAL 2.1.
Pengujian
Android 11 menyertakan
pengujian VTS
baru yang ditulis khusus untuk HAL health@2.1. Jika perangkat mendeklarasikan
HAL health@2.1 dalam manifes perangkat, perangkat 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).
Persyaratan informasi baterai
HAL Health 2.0 menyatakan serangkaian persyaratan pada antarmuka HAL, tetapi pengujian VTS yang sesuai relatif longgar dalam menerapkannya. Di Android 11, pengujian VTS baru ditambahkan untuk menerapkan persyaratan berikut pada perangkat yang diluncurkan dengan Android 11 dan yang lebih tinggi:
- Satuan arus baterai instan dan rata-rata harus dalam mikroamper (μA).
- Tanda arus baterai instan dan rata-rata harus benar.
Secara khusus:
- saat ini == 0 saat status baterai
UNKNOWN
- current > 0 saat status baterai adalah
CHARGING
- current <= 0 saat status baterai adalah
NOT_CHARGING
- arus < 0 saat status baterai adalah
DISCHARGING
- Tidak diterapkan saat status baterai adalah
FULL
- saat ini == 0 saat status baterai
- Status baterai harus benar terkait apakah sumber listrik terhubung atau tidak. Secara khusus:
- status baterai harus berupa salah satu dari
CHARGING
,NOT_CHARGING
, atauFULL
jika dan hanya jika sumber daya terhubung; - status baterai harus
DISCHARGING
jika dan hanya jika sumber daya terputus.
- status baterai harus berupa 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. Hal ini
meliputi 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 mikroamper (μ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_now
dengan 1000 dan melaporkan nilai dalam millivolt (mV). Lihat @1.0::HealthInfo.
Untuk mengetahui detailnya, lihat Kelas catu daya Linux.