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

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

  • Sự tách biệt rõ ràng hơn giữa khung và mã nhà cung cấp.
  • Không dùng daemon healthd không cần thiết.
  • Mức độ tự do cao hơn trong việc tùy chỉnh nhà cung cấp trong các báo cáo thông tin sức khỏe.
  • 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 phiên bản nâng cấp nhỏ từ health@2.0 HAL. HAL mới này có những ưu điểm sau:

  • Dễ dàng thực hiện hơn
  • Tuân thủ tốt hơn với API 2.0 HAL hiện có
  • Tách âm Treble tốt hơn ở mã sạc ở chế độ tắt
  • Hỗ trợ tốt hơn cho framework để báo tình trạng pin của thiết bị

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

  • Xóa các API liên quan đến bộ sạc không sử dụng
  • Xóa StorageAttribute không sử dụng và các trường liên quan
  • Hỗ trợ sạc dock.

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 AIDL HAL. Các thiết bị không khởi chạy cùng Android 9 nhưng dự định cập nhật hình ảnh nhà cung cấp lên Ma trận tương thích khung mục tiêu Phiên bản 3 (được phát hành trong Android 9) phải xóa cá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 khởi chạy cùng Android 11 nhưng dự định cập nhật hình ảnh nhà cung cấp lên Ma trận tương thích khung mục tiêu Phiên bản 5 (được phát hành trong Android 11) phải xóa các triển khai HAL 2.0 hiện có và cung cấp HAL 2.1 hoặc AIDL HAL. Các thiết bị không khởi chạy Android 11 và không có kế hoạch cập nhật hình ảnh nhà cung cấp cũng được khuyến nghị 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à 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). Các 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 Ma trận tương thích khung mục tiêu phiên bản 7 (được phát hành trong Android 13) phải xóa các hoạt động triển khai HIDL HAL hiện có và cung cấp AIDL HAL. Các thiết bị không khởi chạy Android 13 và không có kế hoạch cập nhật hình ảnh nhà cung cấp cũng được khuyến nghị cung cấp AIDL HAL.

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

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à chuyển đổi từ HIDL HAL cũ.

Thuật ngữ

  • health@1.0 : viết tắt của android.hardware.health@1.0 . Đề cập đến sức khỏe HIDL HAL phiên bản 1.0 được phát hành trên Android 8.0.
  • health@2.0 : viết tắt của android.hardware.health@2.0 . Đề cập đến sức khỏe HIDL HAL phiên bản 2.0 được phát hành trên Android 9.
  • health@2.1 : viết tắt của android.hardware.health@2.1 . Đề cập đến sức khỏe HIDL HAL phiên bản 2.1 được phát hành trên Android 11.
  • sức khỏe AIDL HAL : viết tắt của android.hardware.health .
    • Phiên bản 1 được phát hành trên Android 13.
  • charger : tệp thực thi đang chạy ở chế độ sạc tắt, hiển thị hoạt ảnh đang sạc điện thoại.
  • recovery : tệp thực thi đang chạy ở chế độ recovery phải lấy thông tin về pin.
  • healthd : daemon kế thừa chạy trong Android lấy thông tin liên quan đến sức khỏe và cung cấp nó cho khung.
  • storaged : daemon chạy trong Android lấy thông tin lưu trữ và cung cấp cho framework.

Sức khỏe trong Android 8.x

Trong Android 8.x, thành phần sức khỏe hoạt động chi tiết như trong sơ đồ sau:

Sức khỏe trong Android 8.x

Hình 1 . Sức khỏe 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 tới libhealthd_android , libbatterymonitorlibbatteryservice .
  • health@1.0-impl liên kết tĩnh tới libhealthd. BOARD .

Mỗi bảng có thể tùy chỉnh một libhealthd. BOARD ; tại thời điểm xây dựng, nó được xác định liên kết tới bộ sạc, health@1.0-impl và recovery nào.

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

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

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

  • bộ sạc liên kết tĩnh với libhealthd. BOARD , libhealthd_chargerlibbatterymonitor .
  • recovery liên kết tĩnh đến libhealthd. BOARDlibbatterymonitor .

Sức khỏe trong Android 9

Trong Android 9, thành phần sức khỏe hoạt động như chi tiết trong sơ đồ sau: Sức khỏe trong Android 9

Hình 3 . Sức khỏe trong Android 9

Khung này cố gắng truy xuất dịch vụ health@2.0 từ hwservicemanager . Nếu thất bại, nó sẽ gọi tới health@1.0 (trong Android 8.x). Đường dẫn mã cũ được giữ lại để hình ảnh hệ thống Android 9 tương thích với hình ảnh nhà cung cấp Android 8.x. Khung 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à phục hồi ở chế độ tắt trong Android 9

Hình 4. Sức khỏe trong Android 9, chế độ sạc và phục hồi ngoài chế độ

Sức khỏe trong Android 11

Trong Android 11, thành phần sức khỏe hoạt động như 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 việc triển khai sức khỏe 2.1 không tồn tại, hệ thống sẽ quay trở 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)      ] |
+-------------------------------------+

Xem sơ đồ đơn giản hóa sau đây để biết các chế độ khác nhau:

Cơ sở hạ tầng Y tế HAL 2.1

Hình 5. Cơ sở hạ tầng Y tế HAL 2.1

Sức khỏe trong Android 13

Trong Android 13, AIDL HAL về sức khỏe được giới thiệu. Thành phần sức khỏe hoạt động như chi tiết trong sơ đồ sau:

Cơ sở hạ tầng AIDL HAL y tế

Hình 6. Cơ sở hạ tầng AIDL HAL của Y tế

Giao diện HIDL HAL 2.0

HAL health@2.0 cung cấp chức năng tương tự cho khung như daemon healthd cũ. Nó cũng cung cấp các API tương tự như những gì 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 cách sau:
    • getChargeCounter
    • getCurrentNow
    • getCurrentAverage
    • getCapacity
    • getEnergyCounter
    • getChargeStatus
    • getHealthInfo

Ngoài ra, IHealth cung cấp các API mới sau để storaged nhằm truy xuất thông tin liên quan đến lưu trữ dành riêng cho nhà cung cấp:

  • getStorageInfo
  • getDiskStats

Một cấu trúc mới, @2.0::HealthInfo , đượ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 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, sạc, công nghệ, v.v.)
  • Thông tin lưu trữ (thông tin thiết bị lưu trữ, thống kê đĩa)

Để biết thông tin về cách triển khai dịch vụ Y tế 2.0, hãy xem Triển khai Y tế 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 chức năng bổ sung sau

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

Ngoài ra, cần phải triển khai @2.1::IHealth để hỗ trợ @2.1::IHealthInfoCallback cho các hàm registerCallbackunregisterCallback được kế thừa của nó. Giao diện gọi lại mới trả về thông tin sức khỏe cho khách hà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, @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 tình trạng thiết bị bổ sung 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 ngay bây giờ (tính bằng giây)
  • Dung lượng thiết kế sạc đầy pin (tính bằng μAh)

Xem sơ đồ UML sau đây để biết các lớp hữu ích cho việc triển khai HAL về sức khỏe:

Sơ đồ UML sức khỏe 2.1 HAL

Hình 7. Sơ đồ UML Y tế HAL 2.1

Để biết thông tin về việc triển khai dịch vụ Y tế 2.1, hãy xem Triển khai Y tế 2.1 .

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

Thay đổ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 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. Để thực hiện sạc ở chế độ tắt đúng cách, hãy xem bộ sạc bên dưới.
  • Loại StorageAttribute và các trường liên quan sẽ bị xóa vì chúng không được sử dụng.
  • chargerDockOnline được thêm vào HealthInfo để hỗ trợ sạc dock.

Thực hiện

Xem sơ đồ UML sau đây để biết các lớp hữu ích cho việc triển khai HAL về sức khỏe:

Sơ đồ UML AIDL HAL Y tế

Hình 8. Sơ đồ UML AIDL HAL của Y tế

Để biết thông tin về việc triển khai dịch vụ AIDL sức khỏe, hãy xem Triển khai AIDL HAL sức khỏe .

Sự hồi phục

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

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

Bộ sạc

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

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

Các thuộc tính ro.charger.* không còn có thể đọc được bằng tệp nhị phân của bộ 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.* , hãy tham khảo các thuộc tính hệ thống cho bộ sạc .