Thực hiện Y tế 2.1

Trong Android 11, tất cả mã healthd được tái cấu trúc thành libhealthlooplibhealth2impl , sau đó sửa đổi để triển khai health@2.1 HAL. Hai thư viện này được liên kết tĩnh bởi health@2.0-impl-2.1 , quá trình triển khai chuyển tiếp của health 2.1. Các 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à bỏ phiếu. Trong init, health@2.1-service đăng ký triển khai giao diện IHealth tới hwservicemanager . Khi nâng cấp thiết bị có hình ảnh nhà cung cấp Android 8.x hoặc 9 và khung Android 11, hình ảnh nhà cung cấp có thể không cung cấp dịch vụ health@2.1. Khả năng tương thích ngược với hình ảnh cũ của nhà cung cấp được thực thi theo lịch trình ngừng sử dụng .

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

  1. healthd đăng ký IHealth cho hwservicemanager mặc dù là một daemon hệ thống. IHealth được thêm vào bảng kê khai hệ thống, với tên phiên bản là "sao lưu".
  2. Khung 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 phiên bản "mặc định" nếu có, sau đó "sao lưu".
    • Mã máy khách C++ sử dụng logic được xác định trong libhealthhalutils .
    • Mã máy khách Java sử dụng logic được xác định trong HealthServiceWrapper .
  4. Sau khi IHealth/default được phổ biến rộng rãi và hình ảnh của nhà cung cấp Android 8.1 không được dùng nữa thì IHealth/backup và healthd có thể không được dùng nữa. Để biết thêm chi tiết, hãy xem Khấu hao health@1.0 .

Các biến xây dựng dành riêng cho từng bảng cho healthd

BOARD_PERIODIC_CHORES_INTERVAL_* là các biến dành riêng cho bảng được sử dụng để xây dựng healthd . Là một phần của quá trình phân chia bản dựng hệ thống/nhà cung cấp, không thể xác định các giá trị dành riêng cho bo mạch cho các mô-đun hệ thống. Những giá trị này từng được 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 khi chuyển đến hàm tạo của lớp triển khai sức khỏe. Lớp triển khai sức khỏe phải kế thừa từ android::hardware::health::V2_1::implementation::Health .

Triển khai dịch vụ Sức khỏe 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 khỏe/2.1/README.md .

Khách hàng sức khỏe

health@2.x có các khách hàng sau:

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

    Vì lý do bảo mật, các ứng dụng không được phép gọi trực tiếp đến HAL sức khỏe. Trong Android 9 trở lên, dịch vụ liên kết IBatteryPropertiesRegistrar được cung cấp bởi BatteryService thay vì healthd . BatteryService ủy quyền cuộc gọi đến HAL sức khỏe để truy xuất thông tin được yêu cầu.

  • Dịch vụ Pin . Trong Android 9 trở lên, BatteryService sử dụng HealthServiceWrapper để xác định xem nên sử dụng phiên bản dịch vụ y tế mặc định từ vendor hay sử dụng phiên bản dịch vụ y tế dự phòng từ healthd . Sau đó, BatteryService sẽ lắng nghe các sự kiện sức khỏe thông qua IHealth.registerCallback .

  • Đã lưu trữ . Trong Android 9 trở lên, storaged sử dụng libhealthhalutils để xác định xem nên sử dụng phiên bản dịch vụ y tế mặc định từ vendor hay sử dụng phiên bản dịch vụ y tế dự phòng từ healthd . storaged sau đó lắng nghe các sự kiện sức khỏe thông qua IHealth.registerCallback và truy xuất thông tin lưu trữ.

Những thay đổi của SELinux

Health@2.1 HAL bao gồm các thay đổi SELinux sau 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 SELinux của nhà cung cấp có thể cần thiết. 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 hạt nhân

Daemon healthd và cách triển khai mặc định android.hardware.health@2.0-impl-2.1 truy cập các giao diện kernel sau để lấy thông tin về pin:

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

Bất kỳ triển khai HAL sức khỏe dành riêng cho thiết bị nào sử dụng libbatterymonitor đều truy cập các giao diện kernel này theo mặc định, trừ khi bị ghi đè trong hàm tạo của lớp triển khai sức khỏe.

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à một liên kết tượng trưng đến thư mục dành riêng cho nhà cung cấp từ chối quyền truy cập do chính sách SELinux bị định cấu hình sai), chúng có thể không hoạt động chính xác. Do đó, các thay đổi SELinux bổ sung dành riêng cho nhà cung cấp có thể cần thiết ngay cả khi sử dụng triển khai mặc định.

Một số giao diện hạt 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à tùy chọn. 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 hạt nhân, bạn nên chọn CL 1398913 trước khi xây dựng dịch vụ HAL 2.1 sức khỏe.

Kiểm tra

Android 11 bao gồm các bài kiểm tra VTS mới được viết riêng cho health@2.1 HAL. Nếu một thiết bị khai báo health@2.1 HAL trong bảng kê khai thiết bị thì thiết bị đó phải vượt qua các bài kiểm tra VTS tương ứng. Các thử nghiệm được viết cho cả phiên bản mặc định (để đảm bảo rằng thiết bị triển khai HAL chính xác) và phiên bản dự phòng (để đảm bảo rằng healthd tiếp tục hoạt động chính xác trước khi bị xóa).

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

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

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

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

  • Đảm bảo dòng điện của pin được báo cáo bằng ký hiệu và đơn vị chính xác. Điều 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 đi vào pin.
    • Các giá trị phải ở dạ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:
    • /sys/class/power_supply/*/voltage_max
    • /sys/class/power_supply/*/voltage_now
    • Lưu ý rằng việc 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 milivolt (mV). Xem @1.0::HealthInfo .

Để biết chi tiết, xem lớp cung cấp năng lượng Linux .