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 thư viện này được liên kết tĩnh bằng health@2.0-service, cho phép thư viện này thực hiện công việc mà trước đây healthd
thực hiện (tức là chạy healthd_mainloop
và thăm dò ý kiến). Trong quá trình khởi động, health@2.0-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 và khung Android 9, hình ảnh nhà cung cấp có thể không cung cấp dịch vụ health@2.0. Việc này được thực thi
theo lịch trình ngừng sử dụng.
Để giải quyết sự cố này:
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ể"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 cung cấp rộng rãi và hình ảnh 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. 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 bỏ phần phụ thuộc libhealthservice
vào 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 liên kết với health@2.0-service, bộ sạc, tính năng khôi phục và healthd cũ.
health@2.0.impl triển khai IHealth
như mô tả ở trên và dùng để gói libbatterymonitor
và libhealthd.BOARD
. Những người dùng health@2.0-impl này không được sử dụng trực tiếp BatteryMonitor
hoặc các hàm trong libhealthd
; thay vào đó, các lệnh gọi này phải được thay thế bằng các lệnh gọi vào lớp Health
, một cách triển khai giao diện IHealth
. Để khái quát hoá thêm, mã healthd_common
cũng được đưa vào health@2.0-impl. healthd_common
mới chứa phần còn lại của mã chung giữa health@2.0-service, sạc và healthd
, đồng thời 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 phương thức triển khai mặc định là:
- Đủ cho thiết bị, hãy sử dụng trực tiếp
android.hardware.health@2.0-service
. Không đủ cho thiết bị, hãy tạo tệp thực thi
android.hardware.health@2.0-service.(device)
và bao gồm:#include <health2/service.h> int main() { return health_service_main(); }
Sau đó:
Nếu
libhealthd:
dành riêng cho bo mạch- Đã tồn tại, hãy liên kết với trang đó.
- Không tồn tại, cung cấp các phương thức triển khai trống cho hàm
healthd_board_init
vàhealthd_board_battery_update
.
Nếu biến
BOARD_PERIODIC_CHORES_INTERVAL_*
dành riêng cho bo mạch:- Được xác định, tạo một
HealthServiceCommon.cpp
dành riêng cho thiết bị (được sao chép từhardware/interfaces/health/2.0/utils/libhealthservice
) và tuỳ chỉnhHealthServiceCommon.cpp
đó tronghealthd_mode_service_2_0_init
. - Chưa được xác định, liên kết tĩnh với
libhealthservice
.
- Được xác định, tạo một
Nếu thiết bị:
- Nên triển khai API
getStorageInfo
vàgetDiskStats
, cung cấp phương thức triển khai 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 tĩnh đến
libstoragehealthdefault
.
- Nên triển khai 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 vào 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 mục 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 Ứng dụng Health cho HAL Health 2.1.
Thay đổi về 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, có thể bạn cần thực hiện một số thay đổi đối với SELinux của nhà cung cấp. 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 nhân
Xem Giao diện hạt nhân cho HAL Health 2.1.
Thử nghiệm
Android 9 bao gồm các kiểm thử VTS mới được viết riêng cho HAL health@2.0. Nếu một thiết bị khai báo cung cấp HAL health@2.0 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 chương trình kiểm thử được viết cho cả thực thể mặc định (để đảm bảo thiết bị triển khai HAL chính xác) và thực thể sao lưu (để đảm bảo 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.