Trong Android 11, tất cả mã healthd
được tái cấu trúc thành libhealthloop
và libhealth2impl
, 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
, 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:
-
healthd
đăng kýIHealth
chohwservicemanager
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". - Khung và
storaged
giao tiếp vớihealthd
thông quahwbinder
thay vìbinder
. - 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
.
- Mã máy khách C++ sử dụng logic được xác định trong
- 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ã
libbatterymonitor
vàhealthd_common
được gói tronghealth@2.0-impl
. - sự hồi phục. Liên kết tới
libbatterymonitor
được gói tronghealth@2.0-impl
. Tất cả các lệnh gọi đếnBatteryMonitor
được thay thế bằng các lệnh gọi vào lớp triển khaiHealth
. Trình quản lý pin.
BatteryManager.queryProperty(int id)
là ứng dụng khách duy nhất củaIBatteryPropertiesRegistrar.getProperty
.IBatteryPropertiesRegistrar.getProperty
được cung cấp bởihealthd
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ởiBatteryService
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ụngHealthServiceWrapper
để 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 quaIHealth.registerCallback
.Đã lưu trữ. Trong Android 9 trở lên,
storaged
sử dụnglibhealthhalutils
để 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 quaIHealth.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àofile_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 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
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 những 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. Vì vậy, 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
và /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 kernel, bạn nên chọn CL 1398913 trước khi xây dựng dịch vụ Health HAL 2.1.
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 KHÔNG
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
- hiện tại == 0 khi trạng thái pin KHÔNG
- 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ặcFULL
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.
- trạng thái pin phải là một trong các trạng
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 .