Di Android 11, semua kode yang libhealthloop healthd libhealth2impl , lalu dimodifikasi untuk mengimplementasikan health@2.1 HAL. Kedua perpustakaan ini dihubungkan secara statis oleh health@2.0-impl-2.1 , melalui implementasi health 2.1. Pustaka yang ditautkan secara statis memungkinkan health@2.0-impl-2.1 untuk 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 mundur:
-
healthdmendaftarkanIHealthkehwservicemanagermeskipun merupakan daemon sistem.IHealthditambahkan ke manifes sistem, dengan nama instance "cadangan". - Kerangka kerja dan
storagedberkomunikasi denganhealthdmelaluihwbinderalih-alihbinder. - Kode untuk framework dan
storageddiubah untuk mengambil instance "default" jika tersedia, lalu "backup".- Kode klien C++ menggunakan logika yang didefinisikan dalam
libhealthhalutils. - Kode klien Java menggunakan logika yang ditentukan dalam
HealthServiceWrapper.
- Kode klien C++ menggunakan logika yang didefinisikan dalam
- Setelah IHealth/default tersedia secara luas dan gambar vendor Android 8.1 tidak digunakan lagi, IHealth/backup dan
healthddapat dihentikan. Untuk detail selengkapnya, lihat Menghentikan kesehatan@1.0 .
Variabel build khusus papan untuk healthd
BOARD_PERIODIC_CHORES_INTERVAL_* adalah variabel khusus papan yang digunakan untuk membangun healthd . Sebagai bagian dari sistem/vendor build split, 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 periodik 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 Health 2.1, lihat hardware/interfaces/health/2.1/README.md .
klien kesehatan
health@2.x memiliki klien berikut:
- pengisi daya . Penggunaan kode
libbatterymonitordanhealthd_commondibungkus denganhealth@2.0-impl. - pemulihan . Tautan ke
libbatterymonitordibungkus denganhealth@2.0-impl. Semua panggilan keBatteryMonitordigantikan oleh panggilan ke kelas implementasiHealth. Manajer Baterai .
BatteryManager.queryProperty(int id)adalah satu-satunya klienIBatteryPropertiesRegistrar.getProperty.IBatteryPropertiesRegistrar.getPropertydisediakan olehhealthddan langsung dibaca/sys/class/power_supply.Sebagai pertimbangan keamanan, aplikasi tidak diizinkan untuk memanggil HAL kesehatan secara langsung. Di Android 9 dan lebih tinggi, layanan pengikat
IBatteryPropertiesRegistrardisediakan olehBatteryServicealih-alihhealthd.BatteryServicemendelegasikan panggilan ke HAL kesehatan untuk mengambil informasi yang diminta.Layanan Baterai . Di Android 9 dan yang lebih tinggi,
BatteryServicemenggunakanHealthServiceWrapperuntuk menentukan apakah akan menggunakan instans layanan kesehatan default darivendoratau menggunakan instans layanan kesehatan cadangan darihealthd.BatteryServicekemudian mendengarkan acara kesehatan melaluiIHealth.registerCallback.disimpan Di Android 9 dan yang lebih tinggi,
storagedmenggunakanlibhealthhalutilsuntuk menentukan apakah akan menggunakan instans layanan kesehatan default darivendoratau menggunakan instans layanan kesehatan cadangan darihealthd.storagedkemudian mendengarkan peristiwa kesehatan melaluiIHealth.registerCallbackdan mengambil informasi penyimpanan.
SELinux berubah
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
healthd yang sehat 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 dalam 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 dalam 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 diganti dalam konstruktor kelas implementasi kesehatan.
Jika file-file ini hilang 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), mereka mungkin tidak berfungsi dengan benar. Oleh karena itu, 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 opsional. Namun, untuk mencegah perilaku kerangka kerja yang salah akibat antarmuka kernel yang hilang, disarankan untuk memilih CL 1398913 sebelum membangun layanan HAL 2.1 yang sehat.
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 uji 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 tes VTS yang sesuai relatif santai 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 intataneous dan rata-rata harus microamps (μA).
- Tanda arus baterai sesaat dan rata-rata harus benar. Secara khusus:
- saat ini == 0 saat status baterai
UNKNOWN - saat ini> 0 saat status baterai sedang
CHARGING - saat ini <= 0 saat status baterai
NOT_CHARGING - saat ini < 0 saat status baterai
DISCHARGING - Tidak diberlakukan saat status baterai
FULL
- saat ini == 0 saat status baterai
- Status baterai harus benar terhadap apakah sumber daya tersambung atau tidak. Secara khusus:
- status baterai harus salah satu
CHARGING,NOT_CHARGING, atauFULLjika dan hanya jika sumber daya tersambung; - status baterai harus
DISCHARGINGjika dan hanya jika sumber listrik diputus.
- status baterai harus salah satu
Jika Anda menggunakan libbatterymonitor dalam implementasi dan melewati nilai dari antarmuka kernel, pastikan node sysfs melaporkan nilai yang benar:
- Pastikan arus baterai dilaporkan dengan tanda dan unit 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 yang masuk ke baterai.
- Nilai harus dalam microamps (μA).
-
- Pastikan voltase baterai 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_nowdengan 1000 dan melaporkan nilai dalam milivolt (mV). Lihat @1.0::Info Kesehatan .
-
Untuk detailnya, lihat kelas catu daya Linux .