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ởi health@2.0-service, cho phép nó thực hiện công việc được thực hiện trước đó bởi healthd
(nghĩa là chạy healthd_mainloop
và thực hiện bỏ phiếu). Trong init, health@2.0-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 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. Điều này được thực thi bởi lịch trình khấu hao .
Để giải quyết vấn đề này:
-
healthd
đăng kýIHealth
chohwservicemanager
(mặc dù là daemon hệ thống).IHealth
được thêm vào bảng kê khai hệ thống, với tên ví dụ là"backup"
. - 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"default"
nếu có, sau đó"backup"
.- 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 dùng nữa thì IHealth/backup và
healthd
có thể không được dùng nữa. Để biết thêm chi tiết, hãy xem Khấu hao health@1.0 .
Các biến xây dựng dành riêng cho từng 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 quá trình 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 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 loại bỏ phần phụ thuộc libhealthservice
trong health@2.0-service.<device>
và triển khai lại chức năng 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à liên kết health@2.0-service, bộ sạc, khôi phục và healthd kế thừa.
health@2.0.impl triển khai IHealth
như được mô tả ở trên và nhằm mục đích bao bọc 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 chức năng trong libhealthd
; thay vào đó, những lệnh gọi này nên đượ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 hơn, mã healthd_common
cũng được bao gồm trong 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, bộ sạc và healthd
, đồng thời gọi các phương thức IHealth thay vì BatteryMonitor.
Triển khai dịch vụ Sức khỏe 2.0
Khi triển khai dịch vụ health@2.0 cho một thiết bị, nếu cách triển khai mặc định là:
- Đủ cho thiết bị, 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:
- Có tồn tại, liên kết với nó.
- Không tồn tại, cung cấp các triển khai trống cho các hàm
healthd_board_init
vàhealthd_board_battery_update
.
Nếu các biến
BOARD_PERIODIC_CHORES_INTERVAL_*
dành riêng cho bảng:- Được xác định, hãy tạo
HealthServiceCommon.cpp
dành riêng cho thiết bị (được sao chép từhardware/interfaces/health/2.0/utils/libhealthservice
) và tùy chỉnh nó tronghealthd_mode_service_2_0_init
. - Không được xác định, hãy liên kết đến
libhealthservice
một cách tĩnh.
- Được xác định, hãy tạo
Nếu thiết bị:
- Nên triển khai API
getStorageInfo
vàgetDiskStats
, cung cấp cách 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 tới
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 chuyển tiếp 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 chi tiết, hãy tham khảo phần cứng/giao diện/sức khỏe/2.0/README.md .
Khách hàng sức khỏe
Xem Khách hàng sức khỏe cho sức khỏe 2.1 HAL .
Những thay đổi của SELinux
HAL health@2.0 mới bao gồm các 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
. - Xóa các quy tắc cho phép
system_server
vàstoraged
gọi tớihealthd
thông qua chất kết dính. - Xóa 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 SELinux của nhà cung cấp có thể cần thiết. 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 hạt nhân
Xem Giao diện hạt nhân cho Sức khỏe 2.1 HAL .
Kiểm tra
Android 9 bao gồm các bài kiểm tra VTS mới được viết riêng cho health@2.0 HAL. Nếu một thiết bị tuyên bố cung cấp health@2.0 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ị triển khai HAL chính xác) và phiên bản dự phòng (để đảm bảo rằng healthd
tiếp tục hoạt động chính xác trước khi bị xóa).
Yêu cầu về thông tin pin
Xem Yêu cầu về thông tin pin .