Trong Android 11, tất cả mã healthd
được cấu trúc lại 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
, 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:
-
healthd
đăng kýIHealth
chohwservicemanager
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". - Framework 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 đó 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
.
- 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ò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ã
libbatterymonitor
vàhealthd_common
được gói gọn tronghealth@2.0-impl
. - phục hồi . Liên kết đến
libbatterymonitor
được bao bọc tronghealth@2.0-impl
. Tất cả các cuộc gọi đếnBatteryMonitor
được thay thế bằng các cuộc 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 đọ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ở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ụ 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 quaIHealth.registerCallback
.Lưu trữd . 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ụ 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 quaIHealth.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àofile_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
và /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
- hiện tại == 0 khi trạng thái pin
- 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ặcFULL
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.
- trạng thái pin phải là
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 .