Kesehatan sistem Android

Android 9 menyertakan android.hardware.health HAL 2.0, upgrade versi utama dari health@1.0 HAL. HAL baru ini memiliki keunggulan berikut:

  • Pemisahan yang lebih bersih antara kode framework dan vendor.
  • Menghentikan penggunaan daemon healthd yang tidak perlu.
  • Derajat kebebasan yang lebih besar untuk penyesuaian vendor dalam laporan informasi kesehatan.
  • Informasi kesehatan perangkat yang lebih lengkap, bukan hanya baterai.

Android 11 menyertakan android.hardware.health HAL 2.1, upgrade versi minor dari health@2.0 HAL. HAL baru ini memiliki keunggulan berikut:

  • Lebih mudah diterapkan
  • Kesesuaian yang lebih baik dengan 2.0 HAL API yang sudah ada
  • Pemisahan Treble yang lebih baik dalam kode pengisian daya mode nonaktif
  • Dukungan yang lebih baik untuk framework guna menunjukkan kondisi baterai perangkat

Android 13 menyertakan android.hardware.health AIDL HAL, konversi dari health@2.1 HAL. HAL baru ini memiliki keunggulan berikut:

  • Menghapus API terkait pengisi daya yang tidak digunakan
  • Hapus StorageAttribute yang tidak digunakan dan kolom terkait
  • Mendukung pengisian daya dok.

Persyaratan

Perangkat yang menjalankan Android 9 dan Android 10

Perangkat yang diluncurkan dengan Android 9 harus menyediakan 2.x HAL (dan tidak boleh menyediakan 1.0 HAL) atau HAL AIDL. Perangkat yang tidak diluncurkan dengan Android 9, tetapi berencana mengupdate image vendor ke Target Framework Compatibility Matrix Versi 3 (dirilis di Android 9) harus menghapus implementasi HAL 1.0 yang ada dan menyediakan HAL 2.x atau HAL AIDL.

AOSP menyertakan beberapa library helper yang dirancang untuk membantu Anda menerapkan HAL 2.0 dan transisi dari HAL 1.0 lama.

Perangkat yang menjalankan Android 11 dan Android 12

Perangkat yang diluncurkan dengan Android 11 harus menyediakan HAL 2.1 (dan tidak boleh menyediakan HAL 1.0 atau 2.0) atau HAL AIDL. Perangkat yang tidak diluncurkan dengan Android 11, tetapi berencana mengupdate image vendor ke Target Framework Compatibility Matrix Versi 5 (dirilis di Android 11) harus menghapus implementasi HAL 2.0 yang ada dan menyediakan HAL 2.1 atau HAL AIDL. Perangkat yang tidak diluncurkan dengan Android 11 dan tidak berencana mengupdate image vendor juga direkomendasikan untuk menyediakan HAL 2.1.

AOSP menyertakan beberapa library bantuan yang dirancang untuk membantu Anda menerapkan HAL 2.1 dan transisi dari HAL 1.0 lama.

Perangkat yang menjalankan Android 13 dan yang lebih baru

Perangkat yang diluncurkan dengan Android 13 harus menyediakan HAL AIDL (dan tidak boleh menyediakan HAL HIDL). Perangkat yang tidak diluncurkan dengan Android 13, tetapi berencana mengupdate image vendor ke Target Framework Compatibility Matrix Versi 7 (dirilis di Android 13) harus menghapus implementasi HIDL HAL yang sudah ada dan menyediakan HAL AIDL. Perangkat yang tidak diluncurkan dengan Android 13 dan tidak berencana mengupdate image vendor juga direkomendasikan untuk menyediakan HAL AIDL.

Perangkat tidak boleh menyediakan HAL HIDL 1.0.

AOSP menyertakan beberapa library bantuan yang dirancang untuk membantu Anda mengimplementasikan AIDL HAL dan transisi dari HIDL HAL lama.

Terminologi

  • health@1.0: singkatan dari android.hardware.health@1.0. Mengacu pada kesehatan HIDL HAL versi 1.0 yang dirilis di Android 8.0.
  • health@2.0: singkatan dari android.hardware.health@2.0. Mengacu pada health HIDL HAL versi 2.0 yang dirilis di Android 9.
  • health@2.1: singkatan dari android.hardware.health@2.1. Mengacu pada health HIDL HAL versi 2.1 yang dirilis di Android 11.
  • health AIDL HAL: singkatan dari android.hardware.health.
    • Versi 1 dirilis di Android 13.
  • charger: file yang dapat dieksekusi yang berjalan dalam pengisian daya mode nonaktif yang menampilkan animasi pengisian daya ponsel.
  • recovery: file yang dapat dieksekusi yang berjalan dalam mode pemulihan yang harus mengambil informasi baterai.
  • healthd: daemon lama yang berjalan di Android yang mengambil informasi terkait kesehatan dan menyediakannya ke framework.
  • storaged: daemon yang berjalan di Android yang mengambil informasi penyimpanan dan menyediakannya ke framework.

Health di Android 8.x

Di Android 8.x, komponen kesehatan berfungsi seperti yang dijelaskan dalam diagram berikut:

Health di Android 8.x

Gambar 1. Health di Android 8.x.

Dalam diagram ini:

  • Satu (1) panggilan binder dan satu (1) panggilan hwbinder digunakan oleh framework untuk berkomunikasi dengan hardware.
  • healthd ditautkan secara statis ke libhealthd_android, libbatterymonitor, dan libbatteryservice.
  • health@1.0-impl ditautkan secara statis ke libhealthd.BOARD.

Setiap board dapat menyesuaikan libhealthd.BOARD yang berbeda; ini ditentukan pada waktu build, charger, health@1.0-impl, dan link pemulihan yang akan dituju.

Untuk mode lainnya:

Pengisian daya dan mode pemulihan nonaktif mode di Android 8.x

Gambar 2. Kesehatan di Android 8.x, pengisian daya dalam mode nonaktif, dan mode pemulihan.

  • pengisi daya secara statis tertaut ke libhealthd.BOARD, libhealthd_charger, dan libbatterymonitor.
  • pemulihan secara statis menautkan ke libhealthd.BOARD dan libbatterymonitor.

Fitur Kesehatan di Android 9

Di Android 9, komponen kesehatan berfungsi seperti yang dijelaskan dalam diagram berikut: Fitur Kesehatan di Android 9

Gambar 3. Health di Android 9.

Framework mencoba mengambil layanan health@2.0 dari hwservicemanager. Jika gagal, aplikasi akan memanggil health@1.0 (di Android 8.x). Jalur kode lama dipertahankan sehingga image sistem Android 9 kompatibel dengan image vendor Android 8.x. Framework tidak mengambil informasi dari kedua HAL karena hanya satu versi layanan (1.0 atau 2.0) yang dapat ada di perangkat.

Untuk mode lainnya:

Pengisian daya dan pemulihan dalam mode nonaktif di Android 9

Gambar 4. Kesehatan di Android 9, pengisian daya dalam mode nonaktif, dan mode pemulihan.

Kesehatan di Android 11

Di Android 11, komponen kesehatan berfungsi seperti yang dijelaskan dalam diagram berikut:

[system]
    | getService()
    V
[health@2.1-service]
        | getService(stub=true)
        V
[      health@2.0-impl-2.1-<device>.so      ]
        |                                  | (device-dependent linkage)
        V                                  V
+---------Helper libs for impl--------+   [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl)    ] |
| [libbatterymonitor (battery)      ] |
+-------------------------------------+

Jika penerapan kondisi 2.1 tidak ada, sistem akan kembali ke jalur kode lama seperti yang dijelaskan di bagian sebelumnya

Untuk mode lainnya:

[       charger          ]
    | getService()      |  (legacy code path)
    V                   +-------------------------------------------------+
[health@2.1-service]                                                      |
        | getService(stub=true)                                           |
        V                                                                 |
[      health@2.0-impl-2.1-<device>.so      ]                             |
        |                                  | (device-dependent linkage)   |
        V                                  V                              |
+---------Helper libs for impl--------+   [libhealthd.device]             |
| [libhealthloop (uevent, wakealarm)] |                                   |
| [libhealth2impl (IHealth impl)    ] | <---------------------------------+
| [libbatterymonitor (battery)      ] |
+-------------------------------------+
[recovery]
        | getService() w/o hwservicemanager
        V
[      health@2.0-impl-2.1-<device>.so      ]
        |                                  | (device-dependent linkage)
        V                                  V
+---------Helper libs for impl--------+   [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl)    ] |
| [libbatterymonitor (battery)      ] |
+-------------------------------------+

Lihat diagram sederhana berikut untuk berbagai mode:

Infrastruktur Health HAL 2.1

Gambar 5. Infrastruktur Health HAL 2.1.

Kesehatan di Android 13

Di Android 13, HAL AIDL kesehatan diperkenalkan. Komponen health berfungsi seperti yang dijelaskan dalam diagram berikut:

Infrastruktur HAL AIDL Kesehatan

Gambar 6. Infrastruktur Health AIDL HAL.

Antarmuka HIDL HAL 2.0

HAL health@2.0 menyediakan fungsi yang sama ke framework seperti daemon kesehatan lama. Library ini juga menyediakan API yang mirip dengan API yang disediakan sebelumnya sebagai layanan binder (yaitu IBatteryPropertiesRegistrar).

Antarmuka utama, IHealth , menyediakan fungsi berikut:

  • registerCallback, untuk menggantikan IBatteryPropertiesRegistrar.registerListener
  • unregisterCallback, untuk menggantikan IBatteryPropertiesRegistrar.unregisterListener
  • update, untuk menggantikan IBatteryPropertiesRegistrar.scheduleUpdate
  • IBatteryPropertiesRegistrar.getProperties diganti dengan kode berikut:
    • getChargeCounter
    • getCurrentNow
    • getCurrentAverage
    • getCapacity
    • getEnergyCounter
    • getChargeStatus
    • getHealthInfo

Selain itu, IHealth menyediakan API baru berikut untuk storaged guna mengambil informasi terkait penyimpanan khusus vendor:

  • getStorageInfo
  • getDiskStats

Struktur baru, @2.0::HealthInfo, ditampilkan melalui callback dan getHealthInfo. Struktur ini berisi semua informasi kesehatan perangkat yang tersedia melalui HAL health@2.0, termasuk:

  • Informasi pengisian daya (AC/USB/nirkabel, arus, voltase, dll.)
  • Informasi baterai (kehadiran, level baterai, arus, voltase, pengisian daya, teknologi, dll.)
  • Informasi penyimpanan (informasi perangkat penyimpanan, statistik disk)

Untuk informasi tentang cara menerapkan layanan Kesehatan 2.0, lihat Menerapkan Kesehatan 2.0.

Antarmuka HIDL HAL 2.1

Health@2.1 HAL mendukung pengisian daya tidak aktif dan memberikan informasi selengkapnya tentang baterai.

Antarmuka utama, IHealth, menyediakan fungsi tambahan berikut

  • getHealthConfig: untuk mengambil konfigurasi HAL ini
  • getHealthInfo_2_1: upgrade versi minor ke getHealthInfo
  • shouldKeepScreenOn: untuk menentukan apakah layar harus tetap aktif dalam mode pengisi daya

Selain itu, implementasi @2.1::IHealth diperlukan untuk mendukung @2.1::IHealthInfoCallback untuk fungsi registerCallback dan unregisterCallback yang diwarisi. Antarmuka callback baru menampilkan informasi kesehatan ke klien menggunakan fungsi healthInfoChanged_2_1, bukan fungsi healthInfoChanged yang diwarisi.

Struct baru, @2.1::HealthInfo, ditampilkan melalui callback dan getHealthInfo_2_1. Struktur ini berisi informasi kesehatan perangkat tambahan yang tersedia melalui health@2.0 HAL, termasuk:

  • Level kapasitas baterai
  • Waktu pengisian daya baterai hingga penuh sekarang (dalam detik)
  • Kapasitas desain pengisian penuh baterai (dalam μAh)

Lihat diagram UML berikut untuk class yang berguna bagi implementasi HAL kesehatan:

Diagram UML HAL Health 2.1

Gambar 7. Diagram UML Health HAL 2.1.

Untuk informasi tentang cara menerapkan Fitur kesehatan 2.1, lihat Menerapkan Kesehatan 2.1.

Antarmuka AIDL HAL versi 1

Perubahan API

AIDL versi 1 HAL mendukung API yang serupa dengan HIDL 2.1 HAL. Dibandingkan dengan antarmuka HIDL 2.1, hal berikut di API:

  • API terkait pengisi daya yang diperkenalkan di HIDL HAL 2.1 tidak di-porting ke AIDL HAL. Karena fungsi pengisian daya tidak aktif hanya berada di partisi /vendor, API pada Antarmuka Vendor tidak diperlukan. Untuk menerapkan pengisian daya dalam mode nonaktif dengan benar, lihat pengisi daya di bawah.
  • Jenis StorageAttribute dan kolom terkait dihapus karena tidak digunakan.
  • chargerDockOnline ditambahkan ke HealthInfo untuk mendukung pengisian daya dok.

Implementasi

Lihat diagram UML berikut untuk class yang berguna bagi implementasi HAL kesehatan:

Diagram Health AIDL HAL UML

Gambar 8. Diagram Health AIDL HAL UML.

Untuk informasi tentang cara mengimplementasikan layanan AIDL kesehatan, lihat Menerapkan Health AIDL HAL.

Pemulihan

Android 13 mendukung binder dalam pemulihan. Menginstal layanan AIDL Kesehatan ke pemulihan memungkinkannya berjalan dalam mode pemulihan.

Untuk mengetahui informasi tentang cara menginstal layanan AIDL kesehatan ke pemulihan, lihat hal berikut:

Pengisi daya

Fungsi pengisian daya mode nonaktif dipindahkan dari /system ke /vendor. Untuk perangkat yang diluncurkan dengan Android 13, jika mendukung pengisian daya dalam mode nonaktif, biner layanan HAL harus mendukung mode pengisi daya. Untuk melakukannya, lihat mengimplementasikan pengisi daya.

Properti sistem pengisi daya

Properti ro.charger.* tidak lagi dapat dibaca oleh biner charger di /vendor. Jika perangkat Anda memiliki salah satu properti sistem ro.charger.* yang ditetapkan, lihat properti sistem untuk pengisi daya.