Trong Android 11, tất cả mã healthd
đều được tái cấu trúc thành
libhealthloop
và libhealth2impl
, 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:
healthd
đăng kýIHealth
vớihwservicemanager
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".- Khung này 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 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
.
- Mã ứng dụng C++ sử dụng logic được xác định trong
- 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ã
libbatterymonitor
vàhealthd_common
được gói tronghealth@2.0-impl
. - khôi phục. Mối liên kết với
libbatterymonitor
được góihealth@2.0-impl
Tất cả các lệnh gọi đếnBatteryMonitor
sẽ được thay thế bằng các lệnh gọi vào lớp triển khaiHealth
. BatteryManager.
BatteryManager.queryProperty(int id)
là người duy nhất khách hàng củaIBatteryPropertiesRegistrar.getProperty
.IBatteryPropertiesRegistrar.getProperty
được cung cấp bởihealthd
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
doBatteryService
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ụngHealthServiceWrapper
để 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 quaIHealth.registerCallback
.Đã lưu trữ. Trong Android 9 trở lên,
storaged
sử dụnglibhealthhalutils
để 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 quaIHealth.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àofile_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
và
/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
- dòng điện == 0 khi trạng thái pin là
- 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ặcFULL
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.
- trạng thái pin phải là
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.