Tất cả mã healthd
đã được tái cấu trúc thành health@2.0-impl và
libhealthservice
, sau đó được sửa đổi để triển khai health@2.0 HAL. Hai chiến dịch này
các thư viện được liên kết tĩnh bằng health@2.0-service, cho phép dịch vụ này thực hiện
công việc do healthd
thực hiện trước đây (nghĩa là chạy healthd_mainloop
và
thăm dò ý kiến). Trong init, health@2.0-service đăng ký triển khai
giao diện IHealth
sang hwservicemanager
. Khi nâng cấp thiết bị bằng
Hình ảnh nhà cung cấp Android 8.x và khung Android 9,
Dịch vụ Health@2.0 có thể không được hình ảnh nhà cung cấp cung cấp. Yêu cầu này đã được thực thi
theo
lịch biểu ngừng sử dụng.
Để giải quyết sự cố này:
healthd
đăng kýIHealth
thànhhwservicemanager
(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, kèm theo tên thực thể"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ể"default"
nếu có, sau đó là"backup"
.- 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 thông tin chi tiết, hãy xem phần 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. Trong Health@2.0, nhà cung cấp có thể ghi đè
hai giá trị này trong healthd_mode_ops->init
(bằng cách giảm libhealthservice
phần phụ thuộc trong health@2.0-service.<device>
và triển khai lại hàm này).
Thư viện triển khai tĩnh
Không giống như các thư viện triển khai HAL khác, thư viện triển khai health@2.0-impl là một thư viện tĩnh mà health@2.0-service, sạc, và đường liên kết đến trạng thái cũ.
Health@2.0.impl triển khai IHealth
như mô tả ở trên và nhằm gói gọn
khoảng libbatterymonitor
và libhealthd.BOARD
. Các
người dùng củahealth@2.0-impl không được sử dụng BatteryMonitor
hoặc các hàm trong
trực tiếp libhealthd
; mà sẽ thay thế chúng bằng các lệnh gọi vào
lớp Health
, một cách triển khai giao diện IHealth
. Tổng quát hoá
hơn nữa, mã healthd_common
cũng được bao gồm trong health@2.0-impl. Gói thuê bao mới
healthd_common
chứa phần còn lại của mã chung giữa health@2.0-service,
bộ sạc và healthd
cũng như gọi vào các phương thức IHealth thay vì BatteryMonitor.
Triển khai dịch vụ Health 2.0
Khi triển khai dịch vụ health@2.0 cho một thiết bị, nếu là phương thức triển khai mặc định là:
- Đủ cho thiết bị, sử dụng
android.hardware.health@2.0-service
trực tiếp. Không đủ cho thiết bị, hãy tạo
android.hardware.health@2.0-service.(device)
có thể thực thi và bao gồm:#include <health2/service.h> int main() { return health_service_main(); }
Sau đó:
Nếu
libhealthd:
dành riêng cho bảng- Đã tồn tại, hãy liên kết đến tệp đó.
- Không tồn tại, cung cấp các phương thức triển khai trống cho
healthd_board_init
vàhealthd_board_battery_update
.
Nếu biến
BOARD_PERIODIC_CHORES_INTERVAL_*
dành riêng cho bảng:- Đã được xác định, hãy tạo một
HealthServiceCommon.cpp
dành riêng cho thiết bị (đã sao chép) từhardware/interfaces/health/2.0/utils/libhealthservice
) và tuỳ chỉnh nó tronghealthd_mode_service_2_0_init
. - Không được xác định, hãy liên kết đến
libhealthservice
theo phương thức tĩnh.
- Đã được xác định, hãy tạo một
Nếu thiết bị:
- Sẽ triển khai các API
getStorageInfo
vàgetDiskStats
, cung cấp trong các hàmget_storage_info
vàget_disk_stats
. - Không nên triển khai các API đó, hãy liên kết với
libstoragehealthdefault
theo phương thức tĩnh.
- Sẽ triển khai các API
Cập nhật các quyền SELinux cần thiết.
Triển khai HAL trong quá trình khôi phục bằng cách cài đặt triển khai truyền qua cho hình ảnh khôi phục. Ví dụ:
// Android.bp cc_library_shared { name: "android.hardware.health@2.0-impl-<device>", recovery_available: true, relative_install_path: "hw", static_libs: [ "android.hardware.health@2.0-impl", "libhealthd.<device>" // Include the following or implement device-specific storage APIs "libhealthstoragedefault", ], srcs: [ "HealthImpl.cpp", ], overrides: [ "android.hardware.health@2.0-impl-default", ], }
// HealthImpl.cpp #include <health2/Health.h> #include <healthd/healthd.h> using android::hardware::health::V2_0::IHealth; using android::hardware::health::V2_0::implementation::Health; extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) { const static std::string providedInstance{"default"}; if (providedInstance != name) return nullptr; return Health::initInstance(&gHealthdConfig).get(); }
# device.mk PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>
Để biết thông tin chi tiết, hãy tham khảo phần cứng/giao diện/sức khoẻ/2.0/README.md.
Khách hàng trong lĩnh vực y tế
Xem phần Ứng dụng sức khoẻ dành cho sức khoẻ 2.1 HAL.
Thay đổi SELinux
Health@2.0 HAL mới bao gồm những thay đổi SELinux sau:
- Thêm Health@2.0-service vào
file_contexts
. - Cho phép
system_server
vàstoraged
sử dụnghal_health
. - Cho phép
system_server
(BatteryService
) đăng kýbatteryproperties_service
(IBatteryPropertiesRegistrar
). - Cho phép
healthd
cung cấphal_health
. - Xoá các quy tắc cho phép
system_server
vàstoraged
gọi vàohealthd
thông qua liên kết. - Xoá các quy tắc cho phép
healthd
đăng kýbatteryproperties_service
(IBatteryPropertiesRegistrar
).
Đố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/file_contexts
/vendor/bin/hw/android\.hardware\.health@2\.0-service.<device> u:object_r:hal_health_default_exec:s0
# 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
Hãy xem bài viết Giao diện Kernel dành cho Health 2.1 HAL.
Thử nghiệm
Android 9 cung cấp các thử nghiệm VTS mới
được viết riêng cho HAL@2.0. Nếu một thiết bị khai báo là cung cấp
Health@2.0 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
Hãy xem bài viết Yêu cầu về thông tin về pin.