Menerapkan Kesehatan 2.1

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:

  1. healthd mendaftarkan IHealth ke hwservicemanager meskipun merupakan sistem {i>daemon<i}. IHealth ditambahkan ke manifes sistem, dengan nama instance "cadangan".
  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 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 dan healthd_common digabungkan dalam health@2.0-impl.
  • pemulihan. Link 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 memanggil HAL kesehatan secara langsung. Di Android 9 dan yang lebih tinggi, binder layanan 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 untuk menggunakan pencadangan instance layanan kesehatan dari healthd. BatteryService lalu memproses peristiwa kesehatan hingga 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 untuk menggunakan pencadangan instance layanan kesehatan dari healthd. storaged kemudian memproses peristiwa kesehatan melalui IHealth.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 ke file_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
  • Status baterai harus benar terkait apakah sumber listrik terhubung. Khususnya:
    • status baterai harus salah satu dari CHARGING, NOT_CHARGING, atau FULL jika dan hanya jika sumber listrik terhubung;
    • status baterai harus DISCHARGING jika dan hanya jika sumber listrik terputus.

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.