Triển khai Health 2.1

Trong Android 11, tất cả mã healthd đều được tái cấu trúc thành libhealthlooplibhealth2impl, sau đó được sửa đổi để triển khai health@2.1 Lớp trừu tượng phần cứng (HAL). Hai thư viện này được health@2.0-impl-2.1 liên kết tĩnh, triển khai thông qua Health 2.1. Thư viện được liên kết tĩnh cho phép health@2.0-impl-2.1 thực hiện công việc tương tự như healthd, chẳng hạn như chạy healthd_mainloop và thăm dò ý kiến. Trong init, health@2.1-service sẽ đăng ký một phương thức triển khai giao diện IHealth sang hwservicemanager. Khi nâng cấp thiết bị chạy Android 8.x hoặc 9 hình ảnh nhà cung cấp và khung Android 11, hình ảnh nhà cung cấp có thể không cung cấp dịch vụ health@2.1. Lùi lại và khả năng tương thích với hình ảnh của nhà cung cấp cũ được thực thi bằng lịch biểu ngừng sử dụng.

Để đảm bảo khả năng tương thích ngược:

  1. healthd đăng ký IHealth với hwservicemanager mặc dù là một hệ thống trình nền. IHealth được thêm vào tệp kê khai hệ thống cùng với tên thực thể "sao lưu".
  2. Khung này và storaged giao tiếp với healthd thông qua hwbinder thay vì binder.
  3. Mã cho khung và storaged được thay đổi để tìm nạp thực thể "mặc định" nếu có, hãy "sao lưu".
    • Mã ứng dụng C++ sử dụng logic được xác định trong libhealthhalutils.
    • Mã ứng dụng Java sử dụng logic được xác định trong HealthServiceWrapper.
  4. Sau khi IHealth/mặc định được phổ biến rộng rãi và hình ảnh của nhà cung cấp Android 8.1 được ngừng sử dụng IHealth/backup và healthd. Để biết thêm chi tiết, xem Giảm giá sức khoẻ@1.0.

Các biến bản dựng dành riêng cho bảng mạch cho dữ liệu được bảo dưỡng

BOARD_PERIODIC_CHORES_INTERVAL_* là các biến dành riêng cho từng bảng được dùng để tạo healthd Là một phần của phần phân tách bản dựng hệ thống/nhà cung cấp, các giá trị dành riêng cho bảng không thể xác định cho các mô-đun hệ thống. Các giá trị này từng bị ghi đè trong hàm không dùng nữa healthd_board_init.

Trong Health@2.1, nhà cung cấp có thể ghi đè hai giá trị khoảng thời gian công việc định kỳ này trong cấu trúc healthd_config trước chuyển đến hàm khởi tạo lớp triển khai sức khoẻ. Thông tin y tế lớp triển khai cần kế thừa từ android::hardware::health::V2_1::implementation::Health.

Triển khai dịch vụ Health 2.1

Để biết thông tin về cách triển khai dịch vụ Health 2.1, hãy xem phần cứng/giao diện/sức khoẻ/2.1/README.md.

Khách hàng trong lĩnh vực y tế

Health@2.x có các ứng dụng sau:

  • bộ sạc. Việc sử dụng mã libbatterymonitorhealthd_common được gói trong health@2.0-impl.
  • khôi phục. Mối liên kết với libbatterymonitor được gói health@2.0-impl Tất cả các lệnh gọi đến BatteryMonitor sẽ được thay thế bằng các lệnh gọi vào lớp triển khai Health.
  • BatteryManager. BatteryManager.queryProperty(int id) là người duy nhất khách hàng của IBatteryPropertiesRegistrar.getProperty. IBatteryPropertiesRegistrar.getProperty được cung cấp bởi healthd rồi trực tiếp đọc /sys/class/power_supply.

    Vì lý do bảo mật, ứng dụng không được phép gọi vào lớp trừu tượng phần cứng (HAL) cho ứng dụng sức khoẻ trực tiếp. Trong Android 9 trở lên, liên kết dịch vụ IBatteryPropertiesRegistrar do BatteryService cung cấp thay vì healthd. BatteryService uỷ quyền gọi cho HAL (Lớp trừu tượng phần cứng) y tế để truy xuất thông tin được yêu cầu.

  • BatteryService. Trong Android 9 trở lên, BatteryService sử dụng HealthServiceWrapper để xác định xem có sử dụng thực thể dịch vụ sức khoẻ mặc định từ vendor hoặc dùng bản sao lưu thực thể dịch vụ sức khoẻ từ healthd. BatteryService sau đó nghe các sự kiện sức khoẻ thông qua IHealth.registerCallback.

  • Đã lưu trữ. Trong Android 9 trở lên, storaged sử dụng libhealthhalutils để xác định xem có sử dụng thực thể dịch vụ sức khoẻ mặc định từ vendor hoặc dùng bản sao lưu thực thể dịch vụ sức khoẻ từ healthd. Sau đó là storaged theo dõi các sự kiện sức khoẻ thông qua IHealth.registerCallback và truy xuất thông tin về bộ nhớ.

Thay đổi SELinux

Health@2.1 HAL bao gồm những thay đổi SELinux sau đây trong nền tảng:

  • Thêm android.hardware.health@2.1-service vào file_contexts.

Đối với các thiết bị có cách triển khai riêng, một số thay đổi đối với SELinux có thể là nếu cần. Ví dụ:

# 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.

Giao diện kernel

Trình nền healthd và cách triển khai mặc định android.hardware.health@2.0-impl-2.1 truy cập vào các giao diện nhân hệ điều hành sau đây để truy xuất thông tin về pin:

  • /sys/class/power_supply/*/capacity_level (được thêm vào 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 (được thêm vào 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 (được thêm vào Health 2.1)
  • /sys/class/power_supply/*/type
  • /sys/class/power_supply/*/voltage_max
  • /sys/class/power_supply/*/voltage_now

Mọi phương thức triển khai lớp trừu tượng phần cứng (HAL) cho sức khoẻ dành riêng cho thiết bị có sử dụng libbatterymonitor truy cập các giao diện nhân này theo mặc định, trừ phi bị ghi đè trong phần hàm khởi tạo lớp triển khai.

Nếu các tệp này bị thiếu hoặc không thể truy cập được từ healthd hoặc từ dịch vụ mặc định (ví dụ: tệp là đường liên kết tượng trưng đến một thư mục của nhà cung cấp cụ thể từ chối quyền truy cập do chính sách SELinux bị định cấu hình sai), họ có thể không hoạt động chính xác. Vì vậy, những thay đổi khác đối với SELinux dành riêng cho nhà cung cấp có thể là mặc dù cần triển khai mặc định.

Một số giao diện nhân được sử dụng trong Health 2.1, chẳng hạn như /sys/class/power_supply/*/capacity_level/sys/class/power_supply/*/time_to_full_now, có thể là lựa chọn không bắt buộc. Tuy nhiên, để ngăn chặn các hành vi khung không chính xác do thiếu giao diện nhân, bạn nên chọn anh đào CL 1398913 trước khi xây dựng dịch vụ Health HAL 2.1.

Thử nghiệm

Android 11 có các tính năng mới Thử nghiệm VTS được viết riêng cho HAL@2.1. Nếu một thiết bị khai báo Health@2.1 HAL trong tệp kê khai thiết bị thì phải vượt qua các bài kiểm tra VTS tương ứng. Các bài kiểm thử được viết cho cả thực thể mặc định (để đảm bảo rằng thiết bị triển khai HAL (Lớp trừu tượng phần cứng) đúng cách) và thực thể sao lưu (để đảm bảo rằng healthd tiếp tục hoạt động chính xác trước khi bị xoá).

Yêu cầu về thông tin về pin

HAL Health 2.0 nêu một bộ yêu cầu về giao diện HAL, nhưng các thử nghiệm VTS tương ứng tương đối thoải mái khi thực thi chúng. Trong Android 11, các bài kiểm thử VTS mới được thêm vào để thực thi các yêu cầu sau đây trên thiết bị chạy Android 11 trở lên:

  • Đơn vị của dòng điện không đồng nhất và trung bình của pin phải là microampe (μA).
  • Dấu hiệu của dòng điện tức thời và trung bình của pin phải chính xác. Cụ thể:
    • dòng điện == 0 khi trạng thái pin là UNKNOWN
    • hiện tại > 0 khi trạng thái pin là CHARGING
    • dòng điện <= 0 khi trạng thái pin là NOT_CHARGING
    • hiện tại < 0 khi trạng thái pin là DISCHARGING
    • Không được thực thi khi trạng thái pin là FULL
  • Trạng thái pin phải chính xác so với việc nguồn điện có đã kết nối. Cụ thể:
    • trạng thái pin phải là CHARGING, NOT_CHARGING hoặc FULL nếu và chỉ khi nguồn điện được kết nối;
    • trạng thái pin phải là DISCHARGING khi và chỉ khi nguồn điện đang đã ngắt kết nối.

Nếu bạn sử dụng libbatterymonitor trong quá trình triển khai và truyền các giá trị từ giao diện nhân, hãy đảm bảo các nút sysfs đang báo cáo giá trị chính xác:

  • Đảm bảo dòng pin được báo cáo với ký hiệu và đơn vị chính xác. Chiến dịch này bao gồm các nút sysfs sau:
    • /sys/class/power_supply/*/current_avg
    • /sys/class/power_supply/*/current_max
    • /sys/class/power_supply/*/current_now
    • Giá trị dương cho biết dòng điện tới pin.
    • Giá trị phải tính bằng microamp (μA).
  • Đảm bảo điện áp pin được báo cáo bằng microvolt (μV). Điều này bao gồm các nút sysfs sau đây:
    • /sys/class/power_supply/*/voltage_max
    • /sys/class/power_supply/*/voltage_now
    • Lưu ý rằng quy trình triển khai HAL mặc định chia voltage_now cho 1000 và báo cáo các giá trị tính bằng millivolt (mV). Xem @1.0::HealthInfo.

Để biết thông tin chi tiết, hãy xem Lớp cung cấp điện cho Linux.