Thực hiện Y tế 2.1

Trong Android 11, tất cả mã healthd được cấu trúc lại thành libhealthlooplibhealth2impl , sau đó được 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 , triển khai thông qua 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 phần đầu, 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ủa nhà cung cấp cũ được thực thi theo lịch trình không dùng nữa .

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

  1. healthd đăng ký IHealth cho hwservicemanager mặc dù là trình nền hệ thống. IHealth được thêm vào bảng kê khai hệ thống, với tên phiên bản "sao lưu".
  2. Framework 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 đó là "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òn được dùng nữa, IHealth/backup và healthd có thể không được dùng nữa. Để biết thêm chi tiết, hãy xem Không dùng nữa health@1.0 .

Các biến xây dựng dành riêng cho 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 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 bảng 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 thực hiện 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 nê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 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:

  • sạc . Việc sử dụng mã libbatterymonitorhealthd_common được gói gọn trong health@2.0-impl .
  • phục hồi . Liên kết đến libbatterymonitor được bao bọc trong health@2.0-impl . Tất cả các cuộc gọi đến BatteryMonitor được thay thế bằng các cuộc 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 đọ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 vào 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ụ sức khỏe mặc định từ vendor hay sử dụng phiên bản dịch vụ tình trạng 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ữd . 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ụ sức khỏe mặc định từ vendor hay sử dụng phiên bản dịch vụ sức khỏe dự phòng từ healthd . storaged sau đó lắng nghe các sự kiện sức khỏe qua IHealth.registerCallback và truy xuất thông tin lưu trữ.

SELinux thay đổi

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ó 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

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

  • /sys/class/power_supply/*/capacity_level (được thêm vào trong 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 trong 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 (đã thêm trong Health 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 hạt nhân này theo mặc định, trừ khi được 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à 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 được định cấu hình sai), thì chúng có thể không hoạt động bình thường. Do đó, các thay đổi SELinux dành riêng cho nhà cung cấp bổ sung có thể cần thiết ngay cả khi triển khai mặc định được sử dụng.

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à tùy chọn. Tuy nhiên, để ngăn các hành vi khuôn khổ không chính xác do thiếu giao diện nhân, bạn nên chọn CL 1398913 trước khi xây dựng dịch vụ HAL 2.1 về sức khỏe.

thử nghiệm

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ị thực hiện đúng HAL) và phiên bản dự phòng (để đảm bảo rằng healthd tiếp tục hoạt động bình thường trước khi bị xóa).

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

Health 2.0 HAL nêu một tập hợp các 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 khi 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à microamp (μ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 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 là NOT_CHARGING
    • hiện tại < 0 khi trạng thái pin đang DISCHARGING
    • Không thực thi khi trạng thái pin FULL
  • Trạng thái pin phải chính xác dù có kết nối nguồn điện hay không. Đặc biệt:
    • trạng thái pin phải là 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 là 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 của mình và chuyển qua các giá trị từ giao diện kernel, hãy đảm bảo rằng 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 ắc quy được báo đúng ký hiệu và đơn vị. Đ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
    • Các giá trị dương cho biết dòng điện đi vào pin.
    • Các giá trị phải tính bằng microamp (μA).
  • Đảm bảo điện áp pin được báo cáo bằng micrô vôn (μ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 milivôn (mV). Xem @1.0::HealthInfo .

Để biết chi tiết, hãy xem lớp cung cấp điện Linux .