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 HAL health@2.1. Hai thư viện này được liên kết tĩnh bằng health@2.0-impl-2.1
, phương thức 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 một công việc như healthd
, chẳng hạn như chạy healthd_mainloop
và thăm dò ý kiến. Trong quá trình khởi tạo, health@2.1-service
sẽ đăng ký việc triển khai giao diện IHealth
cho hwservicemanager
. Khi nâng cấp thiết bị bằng 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 nhà cung cấp cũ được thực thi theo lịch 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 trình nền hệ thống.IHealth
được thêm vào tệp kê khai hệ thống, với tên thực thể là "backup".- 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 thực thể "mặc định" nếu có, sau đó là "bản 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 cung cấp 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/sao lưu và
healthd
có thể không còn được dùng nữa. Để biết thêm thông tin chi tiết, hãy xem phần Ngừng sử dụng health@1.0.
Biến bản dựng dành riêng cho bo mạch cho healthd
BOARD_PERIODIC_CHORES_INTERVAL_*
là các biến dành riêng cho bo mạch dùng để tạo healthd
. Trong quá trình phân tách bản dựng hệ thống/nhà cung cấp, bạn 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. Các giá trị này từng bị 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 truyền đến hàm khởi tạo lớp triển khai sức khoẻ. Lớp triển khai trạng thái sẽ 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 hardware/interfaces/health/2.1/README.md.
Ứng dụng sức khoẻ
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
. - recovery. Đường liên kết đến
libbatterymonitor
được gói tronghealth@2.0-impl
. Tất cả lệnh gọi đếnBatteryMonitor
đều được thay thế bằng lệnh gọi vào lớp triển khaiHealth
. BatteryManager.
BatteryManager.queryProperty(int id)
là ứng dụng duy nhất củaIBatteryPropertiesRegistrar.getProperty
.IBatteryPropertiesRegistrar.getProperty
dohealthd
cung cấp và trực tiếp đọc/sys/class/power_supply
.Để đảm bảo an toàn, các ứng dụng không được phép gọi trực tiếp vào HAL sức khoẻ. Trong Android 9 trở lên, dịch vụ liên kết
IBatteryPropertiesRegistrar
doBatteryService
cung cấp thay vìhealthd
.BatteryService
uỷ quyền lệnh gọi đến HAL sức khoẻ để 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
hay sử dụng thực thể dịch vụ sức khoẻ bản sao từhealthd
. Sau đó,BatteryService
sẽ theo dõi 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
hay sử dụng thực thể dịch vụ sức khoẻ bản sao từhealthd
. Sau đó,storaged
sẽ theo dõi các sự kiện sức khoẻ thông quaIHealth.registerCallback
và truy xuất thông tin bộ nhớ.
Thay đổi về SELinux
HAL health@2.1 bao gồm các thay đổi sau đây về SELinux 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 về 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 nhân
Trình nền healthd
và phương thức 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 sau để truy xuất thông tin pin:
/sys/class/power_supply/*/capacity_level
(đã thêm 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
(đã thêm 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
Mọi hoạt động triển khai HAL sức khoẻ dành riêng cho thiết bị sử dụng libbatterymonitor
đều truy cập vào các giao diện nhân này theo mặc định, trừ phi bị ghi đè trong hàm khởi tạo lớp triển khai sức khoẻ.
Nếu các tệp này bị thiếu hoặc không 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 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 không chính xác), thì các tệp này có thể không hoạt động đúng cách. Vì vậy, bạn có thể cần thực hiện thêm các thay đổi về SELinux dành riêng cho nhà cung cấp mặc dù đang sử dụng phương thức triển khai mặc định.
Một số giao diện nhân 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ể không bắt buộc. Tuy nhiên, để ngăn chặn hành vi khung 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 tạo dịch vụ Health HAL 2.1.
Thử nghiệm
Android 11 bao gồm các kiểm thử VTS mới được viết riêng cho HAL health@2.1. Nếu một thiết bị khai báo HAL health@2.1 trong tệp kê khai thiết bị, thì thiết bị đó phải vượt qua các bài kiểm thử 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 thiết bị triển khai HAL đúng cách) và thực thể sao lưu (để đảm bảo healthd
tiếp tục hoạt động đúng cách trước khi bị xoá).
Yêu cầu về thông tin pin
HAL Health 2.0 nêu ra một bộ yêu cầu trên giao diện HAL, nhưng các kiểm thử VTS tương ứng tương đối nới lỏng việc thực thi các yêu cầu đó. Trong Android 11, các kiểm thử VTS mới được thêm vào để thực thi các yêu cầu sau đây trên các thiết bị chạy Android 11 trở lên:
- Đơn vị của dòng điện tức thời và trung bình của pin phải là microampe (μA).
- Dấu của dòng điện pin tức thì và trung bình phải chính xác.
Cụ thể:
- current == 0 khi trạng thái pin là
UNKNOWN
- current > 0 khi trạng thái pin là
CHARGING
- current <= 0 khi trạng thái pin là
NOT_CHARGING
- current < 0 khi trạng thái pin là
DISCHARGING
- Không thực thi khi trạng thái pin là
FULL
- current == 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ó được kết nối hay không. Cụ thể:
- trạng thái pin phải là một trong các giá trị
CHARGING
,NOT_CHARGING
hoặcFULL
nếu và chỉ khi có nguồn điện được kết nối; - trạng thái pin phải là
DISCHARGING
nếu 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 giá trị
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 bằng dấu và đơn vị chính xác. 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 đang đi vào pin.
- Giá trị phải được tính bằng microampe (μA).
- Đảm bảo điện áp pin được báo cáo bằng microvolt (μV). 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 sẽ chia
voltage_now
cho 1000 và báo cáo các giá trị theo millivolt (mV). Xem @1.0::HealthInfo.
Để biết thông tin chi tiết, hãy xem Lớp nguồn điện Linux.