โค้ด healthd
ทั้งหมดได้รับการแยกส่วนใหม่เป็น health@2.0-impl และ libhealthservice
จากนั้นแก้ไขเพื่อติดตั้งใช้งาน HAL ของ health@2.0 ไลบรารี 2 รายการนี้มีการลิงก์แบบคงที่โดย health@2.0-service ซึ่งช่วยให้ทํางานได้เช่นเดียวกับที่ healthd
ทําก่อนหน้านี้ (นั่นคือ เรียกใช้ healthd_mainloop
และทำการโพล) ในเริ่มต้น บริการ Health@2.0 จะลงทะเบียนการใช้งานอินเทอร์เฟซ IHealth
กับ hwservicemanager
เมื่ออัปเกรดอุปกรณ์ที่มีภาพผู้ให้บริการ Android 8.x และเฟรมเวิร์ก Android 9 บริการ health@2.0 อาจไม่พร้อมใช้งานจากภาพผู้ให้บริการ การดำเนินการนี้จะบังคับใช้โดยกำหนดการเลิกใช้งาน
ในการแก้ไขปัญหานี้:
healthd
ลงทะเบียนIHealth
กับhwservicemanager
(แม้ว่าจะเป็นระบบไดมอนก็ตาม) เพิ่มIHealth
ลงในไฟล์ Manifest ของระบบด้วยชื่ออินสแตนซ์"backup"
- เฟรมเวิร์กและ
storaged
จะสื่อสารกับhealthd
ผ่านhwbinder
แทนbinder
- เปลี่ยนโค้ดสําหรับเฟรมเวิร์กและ
storaged
เพื่อดึงข้อมูลอินสแตนซ์"default"
หากมี มิเช่นนั้นให้ดึงข้อมูล"backup"
- โค้ดไคลเอ็นต์ C++ ใช้ตรรกะที่กําหนดไว้ใน
libhealthhalutils
- โค้ดไคลเอ็นต์ Java ใช้ตรรกะที่กําหนดไว้ใน
HealthServiceWrapper
- โค้ดไคลเอ็นต์ C++ ใช้ตรรกะที่กําหนดไว้ใน
- หลังจาก IHealth/ค่าเริ่มต้นพร้อมให้บริการในวงกว้างและเลิกใช้งานภาพผู้ให้บริการ Android 8.1 แล้ว คุณจะเลิกใช้งาน IHealth/backup และ
healthd
ได้ ดูรายละเอียดเพิ่มเติมได้ที่การเลิกใช้งาน health@1.0
ตัวแปรบิลด์เฉพาะบอร์ดสำหรับประสิทธิภาพ
BOARD_PERIODIC_CHORES_INTERVAL_*
คือตัวแปรเฉพาะบอร์ดที่ใช้สร้าง
healthd
คุณจะไม่สามารถกำหนดค่าเฉพาะบอร์ดสําหรับโมดูลของระบบได้ เนื่องจากเป็นส่วนหนึ่งของการแยกบิลด์ระบบ/เวนเดอร์ ใน health@2.0 ผู้ให้บริการสามารถลบล้างค่า 2 รายการนี้ใน healthd_mode_ops->init
(โดยการยกเลิกการอ้างอิง libhealthservice
ใน health@2.0-service.<device>
และติดตั้งใช้งานฟังก์ชันนี้อีกครั้ง)
ไลบรารีการติดตั้งใช้งานแบบคงที่
ไลบรารีการใช้งาน health@2.0-impl ต่างจากไลบรารีการใช้งาน HAL อื่นๆ ตรงที่เป็นไลบรารีแบบคงที่ที่ health@2.0-service, charger, recovery และ healthd รุ่นเดิมลิงก์ถึง
health@2.0.impl ใช้ IHealth
ตามที่อธิบายไว้ข้างต้นและมีไว้เพื่อตัดตอนlibbatterymonitor
และ libhealthd.BOARD
ผู้ใช้ health@2.0-impl เหล่านี้ต้องไม่ใช้ BatteryMonitor
หรือฟังก์ชันใน libhealthd
โดยตรง แต่ควรแทนที่การเรียกใช้เหล่านี้ด้วยการเรียกใช้คลาส Health
ซึ่งเป็นการใช้งานอินเทอร์เฟซ IHealth
หากต้องการใช้กับกรณีทั่วไป ให้รวมโค้ด healthd_common
ไว้ใน health@2.0-impl ด้วย healthd_common
ใหม่จะมีโค้ดทั่วไปที่เหลือระหว่าง health@2.0-service, ที่ชาร์จ และ healthd
รวมถึงการเรียกใช้เมธอดของ IHealth แทนการตรวจสอบแบตเตอรี่
ใช้บริการ Health 2.0
เมื่อติดตั้งใช้งานบริการ health@2.0 สําหรับอุปกรณ์ หากการติดตั้งใช้งานเริ่มต้นเป็น
- เพียงพอสำหรับอุปกรณ์ ให้ใช้
android.hardware.health@2.0-service
โดยตรง ไม่เพียงพอสำหรับอุปกรณ์ ให้สร้างไฟล์ประมวลผล
android.hardware.health@2.0-service.(device)
และใส่ข้อมูลต่อไปนี้#include <health2/service.h> int main() { return health_service_main(); }
จากนั้นให้ทำดังนี้
หากเป็นเฉพาะกระดาน
libhealthd:
- มี ให้ลิงก์กับบัญชีนั้น
- ไม่มีอยู่ ให้ระบุการติดตั้งใช้งานที่ว่างเปล่าสำหรับฟังก์ชัน
healthd_board_init
และhealthd_board_battery_update
หากเป็นตัวแปร
BOARD_PERIODIC_CHORES_INTERVAL_*
เฉพาะกระดาน ให้ทำดังนี้- มีการกําหนดแล้ว ให้สร้าง
HealthServiceCommon.cpp
สำหรับอุปกรณ์โดยเฉพาะ (คัดลอกจากhardware/interfaces/health/2.0/utils/libhealthservice
) และปรับแต่งในhealthd_mode_service_2_0_init
- ไม่ได้กําหนด ลิงก์กับ
libhealthservice
แบบคงที่
- มีการกําหนดแล้ว ให้สร้าง
หากอุปกรณ์
- ควรใช้
getStorageInfo
และgetDiskStats
API ให้ระบุการใช้งานในฟังก์ชันget_storage_info
และget_disk_stats
- ไม่ควรติดตั้งใช้งาน API เหล่านั้น ให้ลิงก์กับ
libstoragehealthdefault
แบบคงที่
- ควรใช้
อัปเดตสิทธิ์ SELinux ที่จำเป็น
ใช้ HAL ในการกู้คืนโดยติดตั้งการใช้งาน Passthrough ลงในอิมเมจการกู้คืน ตัวอย่าง
// 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>
ดูรายละเอียดได้ที่ hardware/interfaces/health/2.0/README.md
ลูกค้าด้านสุขภาพ
โปรดดูไคลเอ็นต์สุขภาพสำหรับ Health 2.1 HAL
การเปลี่ยนแปลง SELinux
HAL ของ health@2.0 ใหม่มีการเปลี่ยนแปลง SELinux ดังต่อไปนี้
- เพิ่ม health@2.0-service ลงใน
file_contexts
- อนุญาตให้
system_server
และstoraged
ใช้hal_health
- อนุญาตให้
system_server
(BatteryService
) ลงทะเบียนbatteryproperties_service
(IBatteryPropertiesRegistrar
) - อนุญาตให้
healthd
ระบุhal_health
- นำกฎที่อนุญาตให้
system_server
และstoraged
โทรเข้าhealthd
ผ่าน Binder ออก - นำกฎที่อนุญาตให้
healthd
ลงทะเบียนbatteryproperties_service
ออก (IBatteryPropertiesRegistrar
)
สำหรับอุปกรณ์ที่มีการติดตั้งใช้งานของตนเอง คุณอาจต้องทำการเปลี่ยนแปลง SELinux ของผู้ให้บริการบางรายการ ตัวอย่าง
# 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.
อินเทอร์เฟซเคอร์เนล
โปรดดูอินเทอร์เฟซเคอร์เนลสำหรับ Health 2.1 HAL
การทดสอบ
Android 9 มีการทดสอบ VTS ใหม่ซึ่งเขียนขึ้นสำหรับ HAL ของ health@2.0 โดยเฉพาะ หากอุปกรณ์ประกาศว่าจะให้บริการ HAL ของ health@2.0 ในไฟล์ Manifest ของอุปกรณ์ อุปกรณ์จะต้องผ่านการทดสอบ VTS ที่เกี่ยวข้อง
การทดสอบจะเขียนขึ้นสำหรับทั้งอินสแตนซ์เริ่มต้น (เพื่อให้แน่ใจว่าอุปกรณ์ใช้ HAL อย่างถูกต้อง) และอินสแตนซ์สํารอง (เพื่อให้แน่ใจว่า healthd
จะยังคงทํางานอย่างถูกต้องก่อนที่จะถูกนําออก)