Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Thực hiện Y tế 2.1

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

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 , việc triển khai truyền qua sức khỏe 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à thăm dò. Trong init, health@2.1-service đăng ký việc 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 bởi 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 vào hwservicemanager mặc dù là một daemon hệ thống. IHealth được thêm vào tệp kê khai hệ thống, với tên phiên bản là "backup".
  2. Khung và lưu trữ giao tiếp với storaged thông qua healthd hwbinderbinder .
  3. Mã cho khuôn khổ và storaged trữ được thay đổi để tìm nạp phiên bản "mặc định" nếu có, sau đó là "sao lưu".
    • Mã ứng dụng C ++ sử dụng logic được định nghĩa trong libhealthhalutils .
    • Mã máy khách Java sử dụng logic được định nghĩa 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, 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 hội đồng quản trị cho Healthd

BOARD_PERIODIC_CHORES_INTERVAL_* là các biến dành riêng cho bảng được sử dụng để tạo healthd . Là một phần của phân chia xây 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 healthd_board_init không dùng nữa.

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 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ụ Y tế 2.1

Để biết thông tin về việc 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 libbatterymonitor và mã healthd_common được bao bọc trong health@2.0-impl .
  • phục hồi . Liên kết với 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 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ụ 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.

  • PinService . 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ụ sức khỏe dự phòng từ healthd . Sau đó, BatteryService 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ụ 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 . sau đó lưu trữ IHealth.registerCallback storaged truy xuất thông tin lưu trữ.

SELinux thay đổi

Health@2.1 HAL bao gồm các thay đổi sau của SELinux 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ể là 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à triển khai mặc định android.hardware.health@2.0-impl-2.1 truy cập các giao diện hạt nhân sau để truy xuất thông tin về pin:

  • /sys/class/power_supply/*/capacity_level (bổ sung 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 (bổ sung 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 (bổ sung 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 tình trạng cụ thể cho thiết bị nào sử dụng libbatterymonitor truy cập các giao diện hạt nhân này theo mặc định, trừ khi bị ghi đè trong hàm tạo lớp triển khai tình trạng.

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 một 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), chúng có thể không hoạt động chính xác. Do đó, các thay đổi SELinux dành riêng cho nhà cung cấp có thể cần thiết ngay cả khi việc triển khai mặc định được sử dụng.

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.

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ị, thiết bị đó phải vượt qua các bài kiểm tra VTS tương ứng. Các bài kiểm tra được viết cho cả phiên bản mặc định (để đảm bảo rằng thiết bị triển khai HAL một cách chính xác) và phiên bản sao lưu (để đảm bảo rằng healthd tiếp tục hoạt động chính xác trước khi nó bị xóa).

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

Sức khỏe 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 bài kiểm tra 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 qua da 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 đúng. Đặc biệt:
    • hiện tại == 0 khi trạng thái pin là UNKNOWN
    • hiện tại> 0 khi trạng thái pin đang CHARGING
    • hiện tại <= 0 khi trạng thái pin NOT_CHARGING
    • hiện tại <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 đúng với 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 những 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 DISCHARGING nếu và chỉ khi nguồn điện bị ngắt.

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 hạt nhân, 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 với đú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
    • Giá trị dương cho biết dòng điện vào pin.
    • Giá trị phải tính bằng microampe (μA).
  • Đảm bảo điện áp của 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ị bằng milivôn (mV). Xem @ 1.0 :: HealthInfo .

Để biết chi tiết, hãy xem lớp cấp nguồn Linux .