Menerapkan Kesehatan 2.1

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:

  1. healthd mendaftarkan IHealth ke hwservicemanager meskipun merupakan daemon sistem. IHealth ditambahkan ke manifes sistem, dengan nama instance "backup".
  2. Framework dan storaged berkomunikasi dengan healthd melalui hwbinder, bukan binder.
  3. 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.
  4. 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 dan healthd_common digabungkan dalam health@2.0-impl.
  • pemulihan. Penautan ke libbatterymonitor digabungkan dalam health@2.0-impl. Semua panggilan ke BatteryMonitor diganti dengan panggilan ke class implementasi Health.
  • BatteryManager. BatteryManager.queryProperty(int id) adalah satu-satunya klien IBatteryPropertiesRegistrar.getProperty. IBatteryPropertiesRegistrar.getProperty disediakan oleh healthd 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 oleh BatteryService, bukan healthd. BatteryService mendelegasikan panggilan ke HAL kesehatan untuk mengambil informasi yang diminta.

  • BatteryService. Di Android 9 dan yang lebih tinggi, BatteryService menggunakan HealthServiceWrapper untuk menentukan apakah akan menggunakan instance layanan kesehatan default dari vendor atau menggunakan instance layanan kesehatan cadangan dari healthd. BatteryService kemudian memproses peristiwa kesehatan melalui IHealth.registerCallback.

  • Disimpan. Di Android 9 dan yang lebih tinggi, storaged menggunakan libhealthhalutils untuk menentukan apakah akan menggunakan instance layanan kesehatan default dari vendor atau menggunakan instance layanan kesehatan pencadangan dari healthd. storaged kemudian memproses peristiwa kesehatan melalui IHealth.registerCallback dan mengambil informasi penyimpanan.

Perubahan SELinux

HAL health@2.1 menyertakan perubahan SELinux berikut di platform:

  • Menambahkan android.hardware.health@2.1-service ke file_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
  • Status baterai harus benar terkait apakah sumber listrik terhubung atau tidak. Secara khusus:
    • status baterai harus berupa salah satu dari CHARGING, NOT_CHARGING, atau FULL jika dan hanya jika sumber daya terhubung;
    • status baterai harus DISCHARGING jika dan hanya jika sumber daya terputus.

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.