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

Android 9 có 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ó các ưu điểm sau:

  • Phân tách rõ ràng hơn giữa khung và mã của nhà cung cấp.
  • Ngừng sử dụng trình nền healthd không cần thiết.
  • Mức độ tự do cao hơn để nhà cung cấp tuỳ chỉnh trong báo cáo thông tin y tế.
  • Thông tin khác về tình trạng thiết bị ngoài 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ó các ưu điểm sau:

  • Dễ triển khai hơn
  • Tuân thủ tốt hơn các API HAL 2.0 hiện có
  • Tách Treble hiệu quả 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 lượt chuyển đổi từ health@2.1 HAL. HAL mới này có các ưu điểm sau:

  • 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 HAL 2.x (và không được cung cấp HAL 1.0) hoặc HAL AIDL. Các thiết bị không chạy Android 9 nhưng có kế hoạch cập nhật hình ảnh nhà cung cấp lên Target Framework Compatibility Matrix Version 3 (phát hành trong Android 9) phải xoá các phương thức triển khai HAL 1.0 hiện có và cung cấp HAL 2.x hoặc AIDL HAL.

AOSP bao gồm nhiều thư viện trợ giúp được thiết kế để giúp bạn triển khai HAL 2.0 và 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 HAL 2.1 (và không được cung cấp HAL 1.0 hoặc 2.0) hoặc AIDL HAL. Các thiết bị không chạy Android 11 nhưng dự định cập nhật hình ảnh nhà cung cấp lên Matrice Khả năng tương thích khung mục tiêu Phiên bản 5 (phát hành trong Android 11) phải xoá các phương thức triển khai HAL 2.0 hiện có và cung cấp HAL 2.1 hoặc HAL AIDL. Các thiết bị không chạy Android 11 và không có kế hoạch cập nhật hình ảnh nhà cung cấp cũng nên cung cấp HAL 2.1.

AOSP bao gồm nhiều thư viện trợ giúp được thiết kế để giúp bạn triển khai HAL 2.1 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 HIDL HAL). Những thiết bị không ra mắt bằng Android 13 nhưng dự định cập nhật hình ảnh của nhà cung cấp lên Matrice tương thích với khung mục tiêu phiên bản 7 (phát hành trong Android 13) phải xoá các phương thức triển khai HAL HIDL hiện có và cung cấp HAL AIDL. Bạn cũng nên cung cấp HAL AIDL cho 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 của nhà cung cấp.

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

AOSP bao gồm 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ừ các HAL HIDL cũ.

Thuật ngữ

  • health@1.0: viết tắt của android.hardware.health@1.0. Tham chiếu đến phiên bản 1.0 của HAL HIDL sức khoẻ được phát hành trong Android 8.0.
  • health@2.0: 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: viết tắt của android.hardware.health.
    • Phiên bản 1 được phát hành trong Android 13.
  • charger: tệp thực thi chạy ở chế độ sạc tắt màn hình hiển thị ảnh động sạc điện thoại.
  • recovery (khôi phục): tệp thực thi chạy ở chế độ khôi phục phải truy xuất thông tin pin.
  • healthd: trình nền cũ chạy trong Android, truy xuất thông tin liên quan đến sức khoẻ và cung cấp thông tin đó cho khung.
  • storaged: trình nền chạy trong Android, truy xuất thông tin bộ nhớ và cung cấp thông tin đó cho khung.

Health trong Android 8.x

Trong Android 8.x, thành phần trạng thái hoạt động theo cách chi tiết như trong sơ đồ sau:

Health trong Android 8.x

Hình 1 Health trong Android 8.x.

Trong sơ đồ này:

  • Khung này sử dụng một (1) lệnh gọi liên kết và một (1) lệnh gọi hwbinder để 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 với libhealthd.BOARD.

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

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

Chế độ sạc khi tắt máy và chế độ khôi phục trong Android 8.x

Hình 2. Trạng thái pin trong Android 8.x, chế độ sạc khi tắt máy và chế độ khôi phục.

  • charger liên kết tĩnh với libhealthd.BOARD, libhealthd_chargerlibbatterymonitor.
  • quá trình khôi phục liên kết tĩnh với libhealthd.BOARDlibbatterymonitor.

Health trong Android 9

Trong Android 9, thành phần sức khoẻ hoạt động như mô tả chi tiết trong sơ đồ sau: Sức khoẻ trong Android 9

Hình 3. Health 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, API này sẽ gọi vào health@1.0 (trong Android 8.x). Đường dẫn mã cũ đượ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:

Sạc và khôi phục ở 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.

Health trong Android 11

Trong Android 11, thành phần sức khoẻ hoạt động như mô tả chi tiết trong sơ đồ 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 không có hoạt động triển khai health 2.1, hệ thống sẽ quay lại đường dẫn mã cũ như 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 Health HAL 2.1

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

Health trong Android 13

Trong Android 13, chúng tôi ra mắt HAL AIDL sức khoẻ. Thành phần trạng thái hoạt động theo cách chi tiết như trong sơ đồ sau:

Cơ sở hạ tầng HAL AIDL về sức khoẻ

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

Giao diện HIDL HAL 2.0

HAL health@2.0 cung cấp chức năng tương tự cho khung như trình nền healthd cũ. API này cũng cung cấp các API tương tự như những API mà healthd cung cấp trước đây dưới dạng dịch vụ liên kết (tức là IBatteryPropertiesRegistrar).

Giao diện chính, IHealth, cung cấp các chức năng sau:

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

Ngoài ra, IHealth cung cấp các API mới sau đây cho 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 tất cả thông tin về tình trạng của thiết bị có sẵn thông qua HAL health@2.0, 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 (có hay không, 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 phần Triển khai Dịch vụ sức khoẻ 2.0.

Giao diện HIDL HAL 2.1

HAL health@2.1 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 thêm các hàm sau

  • getHealthConfig: để truy xuất cấu hình của HAL này
  • getHealthInfo_2_1: nâng cấp phiên bản nhỏ lên getHealthInfo
  • shouldKeepScreenOn: để xác định xem có nên giữ màn hình ở chế độ sạc hay không

Ngoài ra, bạn cần triển khai @2.1::IHealth để hỗ trợ @2.1::IHealthInfoCallback cho các hàm registerCallbackunregisterCallback kế thừa. Giao diện gọi lại mới trả về thông tin trạng thái cho ứng dụng 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 sẽ đượ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ó sẵn thông qua Health@2.0 HAL, bao gồm:

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

Hãy xem sơ đồ UML sau đây để biết các lớp hữu ích cho việc triển khai HAL sức khoẻ:

Sơ đồ UML HAL của Health 2.1

Hình 7. Sơ đồ UML của Health HAL 2.1.

Để biết thông tin về cách triển khai Dịch vụ sức khoẻ 2.1, hãy xem phần Triển khai Dịch vụ 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 với giao diện HIDL 2.1, những thay đổi sau đây 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 HAL. Vì chức năng sạc ở chế độ tắt chỉ tồn tại trên phân vùng /vendor, nên các API trên Giao diện nhà cung cấp là không cần thiết. Để triển khai tính năng sạc khi tắt máy đúng cách, hãy xem phần bộ sạc bên dưới.
  • Loại StorageAttribute và các trường liên quan sẽ bị xoá vì không được sử dụng.
  • Thêm chargerDockOnline vào HealthInfo để hỗ trợ sạc qua đế 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 HAL AIDL về sức khoẻ.

Để biết thông tin về cách triển khai dịch vụ AIDL sức khoẻ, hãy xem bài viết Triển khai Health AIDL HAL.

Khôi phục

Android 13 hỗ trợ trình liên kết trong quá trình khôi phục. Việc cài đặt dịch vụ AIDL sức khoẻ vào chế độ 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 nội dung sau:

Bộ sạc

Chức năng sạc ở chế độ tắt được di chuyển từ /system sang /vendor. Đối với các thiết bị chạy Android 13, nếu hỗ trợ sạc ở chế độ tắt, tệp nhị phân dịch vụ HAL phải hỗ trợ chế độ sạc. Để thực hiện việc này, hãy tham khảo phần triển khai bộ sạc.

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

Tệp nhị phân charger không còn đọc được các thuộc tính ro.charger.* trong /vendor. Nếu thiết bị của bạn đã đặt bất kỳ thuộc tính hệ thống ro.charger.* nào, hãy tham khảo thuộc tính hệ thống cho bộ sạc.