Tình trạng hệ thống Android

Android 9 bao gồm android.hardware.health HAL 2.0, một bản nâng cấp phiên bản lớn từ Health@1.0 HAL. HAL mới này có: ưu điểm:

  • Phân tách rõ ràng hơn giữa mã khung và mã nhà cung cấp.
  • Ngừng sử dụng trình nền healthd không cần thiết.
  • Có nhiều mức độ tự do hơn để tuỳ chỉnh thông tin sức khoẻ cho nhà cung cấp .
  • Nhiều thông tin về tình trạng thiết bị hơn là chỉ pin.

Android 11 bao gồm android.hardware.health HAL 2.1, một bản nâng cấp phiên bản nhỏ từ Health@2.0 HAL. HAL mới này có: ưu điểm:

  • Dễ triển khai hơn
  • Tuân thủ tốt hơn các API HAL 2.0 hiện có
  • Tính năng phân tách Treble tốt hơn trong mã sạc ở chế độ tắt
  • Hỗ trợ tốt hơn cho khung để cho biết tình trạng pin của thiết bị

Android 13 bao gồm android.hardware.health AIDL HAL, một chuyển đổi từ health@2.1 HAL. HAL mới này có: ưu điểm:

  • Xoá các API liên quan đến bộ sạc không dùng đến
  • Xoá StorageAttribute không dùng đến và các trường liên quan
  • Hỗ trợ sạc đế.

Yêu cầu

Thiết bị chạy Android 9 và Android 10

Các thiết bị chạy Android 9 phải cung cấp phiên bản 2.x HAL (và không được cung cấp HAL 1.0) hoặc HAL AIDL. Thiết bị không chạy với Android 9 nhưng đang lên kế hoạch cập nhật hình ảnh nhà cung cấp để Nhắm mục tiêu ma trận tương thích khung phiên bản 3 (phát hành trong Android 9) phải loại bỏ các triển khai HAL 1.0 hiện có và cung cấp HAL 2.x hoặc AIDL HAL.

AOSP có nhiều thư viện trợ giúp được thiết kế để giúp bạn triển khai 2.0 HAL và quá trình chuyển đổi từ HAL 1.0 cũ.

Thiết bị chạy Android 11 và Android 12

Các thiết bị chạy Android 11 phải cung cấp phiên bản 2.1 HAL (và không được cung cấp HAL 1.0 hoặc 2.0) hoặc HAL AIDL. Thiết bị không ra mắt cùng với Android 11 nhưng dự định cập nhật hình ảnh nhà cung cấp cho Target Framework Compatibility Matrix Phiên bản 5 (phát hành trong Android 11) phải loại bỏ HAL 2.0 hiện có và cung cấp HAL 2.1 hoặc AIDL HAL. Thiết bị không chạy với Android 11 và không có ý định cập nhật nhà cung cấp này hình ảnh cũng được khuyến nghị cung cấp HAL 2.1.

AOSP có nhiều thư viện trợ giúp được thiết kế để giúp bạn triển khai 2.1 HAL và quá trình chuyển đổi từ HAL 1.0 cũ.

Thiết bị chạy Android 13 trở lên

Các thiết bị chạy Android 13 phải cung cấp AIDL HAL (và không được cung cấp HAL HIDL). Thiết bị không chạy Android 13 nhưng dự định cập nhật hình ảnh nhà cung cấp lên Target Ma trận tương thích khung phiên bản 7 (được phát hành trong Android 13) phải xóa các triển khai HIDL HAL hiện có và cung cấp HAL AIDL. Các thiết bị không chạy Android 13 và không có kế hoạch cập nhật hình ảnh nhà cung cấp cũng bạn nên cung cấp HAL AIDL.

Thiết bị không được cung cấp HIDL 1.0 HAL.

AOSP có nhiều thư viện trợ giúp được thiết kế để giúp bạn triển khai AIDL HAL và quá trình chuyển đổi từ HAL HIDL cũ.

Thuật ngữ

  • health@1.0: chữ viết tắt của android.hardware.health@1.0. Đề cập đến Health HIDL HAL phiên bản 1.0 được phát hành trong Android 8.0.
  • health@2.0: chữ viết tắt của android.hardware.health@2.0. Đề cập đến Health HIDL HAL phiên bản 2.0 được phát hành trong Android 9.
  • health@2.1: chữ viết tắt của android.hardware.health@2.1. Đề cập đến Health HIDL HAL phiên bản 2.1 được phát hành trong Android 11
  • health AIDL HAL: chữ viết tắt của android.hardware.health.
    • Phiên bản 1 đã được phát hành trong Android 13.
  • bộ sạc: tệp thực thi chạy ở chế độ sạc tắt chế độ hiển thị ảnh động về trạng thái sạc điện thoại.
  • recovery: tệp thực thi chạy ở chế độ khôi phục phải truy xuất pin của bạn.
  • healthd (trình nền) cũ chạy trong Android giúp truy xuất các báo cáo liên quan đến sức khoẻ thông tin và cung cấp thông tin đó cho khung làm việc.
  • storaged (đã lưu trữ): trình nền chạy trong Android truy xuất thông tin bộ nhớ và cung cấp nó cho khung.

Sức khoẻ trong Android 8.x

Trong Android 8.x, thành phần sức khoẻ hoạt động như được nêu chi tiết trong sơ đồ sau:

Sức khoẻ trong Android 8.x

Hình 1 Sức khoẻ trong Android 8.x.

Trong sơ đồ này:

  • Một (1) lệnh gọi liên kết và một (1) lệnh gọi hwbinder được khung sử dụng để giao tiếp với phần cứng.
  • healthd liên kết tĩnh với libhealthd_android, libbatterymonitorlibbatteryservice.
  • Health@1.0-impl liên kết tĩnh đến libhealthd.BOARD.

Mỗi bảng có thể tuỳ chỉnh một libhealthd.BOARD khác nhau; nó được xác định tại thời điểm xây dựng liên kết bộ sạc, Health@1.0-impl và khôi phục sang.

Đối với các chế độ khác:

Chế độ truy cập và khôi phục ở chế độ tắt trong Android 8.x

Hình 2. Sức khoẻ trong Android 8.x, chế độ sạc và khôi phục ở chế độ tắt.

  • bộ sạc liên kết tĩnh với libhealthd.BOARD, libhealthd_chargerlibbatterymonitor.
  • khôi phục liên kết tĩnh với libhealthd.BOARDlibbatterymonitor

Sức khoẻ trong Android 9

Trong Android 9, thành phần sức khoẻ hoạt động ở dạng chi tiết trong biểu đồ sau: Sức khoẻ trong Android 9

Hình 3. Sức khoẻ trong Android 9.

Khung này cố gắng truy xuất dịch vụ health@2.0 từ hwservicemanager. Nếu không thành công, nó sẽ gọi vào health@1.0 (trong Android 8.x). Đường dẫn mã cũ là được giữ lại để ảnh hệ thống Android 9 tương thích với ảnh nhà cung cấp Android 8.x. Khung này không truy xuất thông tin từ cả hai HAL vì chỉ có một phiên bản dịch vụ (1.0 hoặc 2.0) có thể tồn tại trên thiết bị.

Đối với các chế độ khác:

Khôi phục và theo dõi ở chế độ tắt trong Android 9

Hình 4. Sức khoẻ trong Android 9, chế độ sạc và khôi phục ở chế độ tắt.

Sức khoẻ trên Android 11

Trong Android 11, thành phần sức khoẻ hoạt động theo cách chi tiết trong biểu đồ sau:

[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)      ] |
+-------------------------------------+

Nếu việc triển khai Health 2.1 không tồn tại, hệ thống sẽ quay lại đường dẫn mã cũ như được mô tả trong các phần trước

Đối với các chế độ khác:

[       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)      ] |
+-------------------------------------+

Hãy xem sơ đồ được đơn giản hoá sau đây cho các chế độ khác nhau:

Cơ sở hạ tầng HAL 2.1 trong lĩnh vực sức khoẻ

Hình 5. Cơ sở hạ tầng HAL 2.1 trong lĩnh vực sức khoẻ.

Sức khoẻ trong Android 13

Trong Android 13, AIDL HAL (Lớp trừu tượng phần cứng) cho sức khoẻ được ra mắt. Chiến lược phát hành đĩa đơn thành phần sức khoẻ hoạt động như được nêu chi tiết trong sơ đồ sau:

Cơ sở hạ tầng HAL AIDL trong lĩnh vực sức khoẻ

Hình 6. Cơ sở hạ tầng HAL AIDL trong lĩnh vực sức khoẻ.

Giao diện HIDL HAL 2.0

Health@2.0 HAL cung cấp chức năng tương tự cho khung như cũ Healthd daemon. API này cũng cung cấp các API tương tự như API trước đây được cung cấp dưới dạng dịch vụ liên kết (ví dụ: IBatteryProperties).

Giao diện chính, IHealth , cung cấp các hàm sau:

  • registerCallback, để thay thế IBatteryPropertiesRegistrar.registerListener
  • unregisterCallback, để thay thế IBatteryPropertiesRegistrar.unregisterListener
  • update, để thay thế IBatteryPropertiesRegistrar.scheduleUpdate
  • IBatteryPropertiesRegistrar.getProperties được thay thế bằng:
    • getChargeCounter
    • getCurrentNow
    • getCurrentAverage
    • getCapacity
    • getEnergyCounter
    • getChargeStatus
    • getHealthInfo

Ngoài ra, IHealth còn cung cấp các API mới sau đây để storaged truy xuất thông tin liên quan đến bộ nhớ theo nhà cung cấp cụ thể:

  • getStorageInfo
  • getDiskStats

Một cấu trúc mới là @2.0::HealthInfo sẽ được trả về thông qua các lệnh gọi lại và getHealthInfo. Cấu trúc này chứa mọi thông tin về tình trạng thiết bị có sẵn thông qua Health@2.0 HAL, bao gồm:

  • Thông tin sạc (AC/USB/không dây, dòng điện, điện áp, v.v.)
  • Thông tin về pin (sự hiện diện, mức pin, dòng điện, điện áp, mức sạc, công nghệ, v.v.)
  • Thông tin bộ nhớ (thông tin thiết bị lưu trữ, số liệu thống kê về ổ đĩa)

Để biết thông tin về cách triển khai Dịch vụ sức khoẻ 2.0, hãy xem Triển khai Health 2.0.

Giao diện HIDL HAL 2.1

Health@2.1 HAL hỗ trợ sạc ở chế độ tắt và cung cấp thêm thông tin về pin.

Giao diện chính, IHealth, cung cấp các hàm bổ sung sau

  • getHealthConfig: để truy xuất cấu hình của HAL này
  • getHealthInfo_2_1: một bản nâng cấp nhỏ lên getHealthInfo
  • shouldKeepScreenOn: để xác định xem có nên tiếp tục bật màn hình trong chế độ sạc

Ngoài ra, bạn cần triển khai @2.1::IHealth để hỗ trợ @2.1::IHealthInfoCallback cho registerCallback kế thừa và Các hàm unregisterCallback. Giao diện gọi lại mới trả về tình trạng thông tin cho máy khách bằng cách sử dụng hàm healthInfoChanged_2_1 thay vì hàm healthInfoChanged kế thừa.

Một cấu trúc mới là @2.1::HealthInfo được trả về thông qua các lệnh gọi lại và getHealthInfo_2_1 Cấu trúc này chứa thông tin bổ sung về tình trạng của thiết bị được cung cấp thông qua Health@2.0 HAL, bao gồm:

  • Mức dung lượng pin
  • Thời gian sạc đầy pin ngay bây giờ (tính bằng giây)
  • Dung lượng pin theo thiết kế khi sạc đầy (tính bằng μAh)

Hãy xem sơ đồ UML sau đây cho các lớp hữu ích cho việc triển khai HAL (Lớp trừu tượng phần cứng) cho tình trạng sức khoẻ:

Sơ đồ UML Health 2.1

Hình 7. Sơ đồ UML HAL 2.1 trong Health.

Để biết thông tin về cách triển khai Dịch vụ sức khoẻ 2.1, hãy xem Triển khai sức khoẻ 2.1.

Giao diện AIDL HAL phiên bản 1

Nội dung thay đổi đối với API

AIDL phiên bản 1 HAL hỗ trợ các API tương tự như HIDL 2.1 HAL. So sánh với giao diện HIDL 2.1, những nội dung sau đây được thay đổi trong API:

  • Các API liên quan đến bộ sạc được giới thiệu trong HIDL HAL 2.1 không được chuyển sang AIDL Lớp trừu tượng phần cứng (HAL). Bởi vì chức năng sạc ở chế độ tắt chỉ hoạt động trên phân vùng /vendor, API trên Giao diện nhà cung cấp là không cần thiết. Người nhận thực hiện sạc không ở chế độ đúng cách, hãy xem phần bộ sạc bên dưới.
  • Loại StorageAttribute và các trường có liên quan sẽ bị xoá vì chúng không sử dụng.
  • chargerDockOnline được thêm vào HealthInfo để hỗ trợ sạc đế.

Triển khai

Hãy xem sơ đồ UML sau đây cho các lớp hữu ích cho việc triển khai HAL (Lớp trừu tượng phần cứng) cho tình trạng sức khoẻ:

Sơ đồ UML AIDL HAL trong Health

Hình 8. Sơ đồ UML AIDL HAL UML dành cho sức khoẻ.

Để biết thông tin về cách triển khai dịch vụ AIDL sức khoẻ, hãy xem Triển khai lớp trừu tượng phần cứng (HAL) cho ứng dụng Health AIDL.

Khôi phục

Android 13 hỗ trợ liên kết trong quá trình khôi phục. Cài đặt Dịch vụ Health AIDL để khôi phục cho phép dịch vụ này chạy ở chế độ khôi phục.

Để biết thông tin về cách cài đặt dịch vụ AIDL sức khoẻ để khôi phục, hãy xem sau:

Bộ sạc

Chức năng sạc ở chế độ tắt sẽ được chuyển từ /system sang /vendor. Cho thiết bị chạy Android 13 (nếu có hỗ trợ) sạc ở chế độ tắt, tệp nhị phân của dịch vụ HAL phải hỗ trợ chế độ sạc. Để làm như vậy, tham chiếu đến triển khai bộ sạc.

Thuộc tính của hệ thống bộ sạc

Các thuộc tính ro.charger.* không còn đọc được bằng tệp nhị phân charger trong /vendor. Nếu thiết bị của bạn đã đặt thuộc tính hệ thống ro.charger.*, tham chiếu đến thuộc tính hệ thống của bộ sạc.