โค้ด healthd
ทั้งหมดได้รับการปรับโครงสร้างใหม่เป็น health@2.0-impl และ libhealthservice
จากนั้นปรับเปลี่ยนเพื่อใช้ health@2.0 HAL ไลบรารีทั้งสองนี้เชื่อมโยงกันแบบคงที่โดย health@2.0-service ทำให้สามารถทำงานได้ก่อนหน้านี้โดย healthd
(นั่นคือ เรียกใช้ healthd_mainloop
และทำการสำรวจ) ในการเริ่มต้น health@2.0-service จะลงทะเบียนการใช้งานอินเทอร์เฟซ IHealth
กับ hwservicemanager
เมื่ออัปเกรดอุปกรณ์ด้วยอิมเมจของผู้จำหน่าย Android 8.x และเฟรมเวิร์ก Android 9 อิมเมจของผู้จำหน่ายอาจไม่ได้ให้บริการ health@2.0 สิ่งนี้บังคับใช้โดย กำหนดการเลิกใช้งาน
เพื่อแก้ไขปัญหานี้:
-
healthd
ลงทะเบียนIHealth
กับhwservicemanager
(แม้จะเป็น daemon ระบบก็ตาม)IHealth
ถูกเพิ่มเข้าไปในรายการระบบ โดยมีชื่ออินสแตนซ์"backup"
- กรอบงานและ
storaged
สื่อสารกับhealthd
ผ่านhwbinder
แทนที่จะเป็นbinder
- รหัสสำหรับเฟรมเวิร์กและ
storaged
มีการเปลี่ยนแปลงเพื่อดึงอินสแตนซ์"default"
หากมี จากนั้นจึง"backup"
- รหัสไคลเอ็นต์ C++ ใช้ตรรกะที่กำหนดไว้ใน
libhealthhalutils
- รหัสไคลเอ็นต์ Java ใช้ตรรกะที่กำหนดไว้ใน
HealthServiceWrapper
- รหัสไคลเอ็นต์ C++ ใช้ตรรกะที่กำหนดไว้ใน
- หลังจากที่ IHealth/default พร้อมใช้งานอย่างกว้างขวางและอิมเมจของผู้จำหน่าย Android 8.1 เลิกใช้งานแล้ว IHealth/backup และ
healthd
ก็สามารถเลิกใช้งานได้ สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ Deprecating health@1.0
ตัวแปรบิวด์เฉพาะบอร์ดเพื่อสุขภาพ
BOARD_PERIODIC_CHORES_INTERVAL_*
เป็นตัวแปรเฉพาะของบอร์ดที่ใช้ในการสร้าง healthd
เนื่องจากเป็นส่วนหนึ่งของการแยกการสร้างระบบ/ผู้จัดจำหน่าย จึง ไม่สามารถ กำหนดค่าเฉพาะบอร์ดสำหรับโมดูลระบบได้ ใน health@2.0 ผู้จำหน่ายสามารถแทนที่ค่าทั้งสองนี้ใน healthd_mode_ops->init
(โดยยกเลิกการพึ่งพา libhealthservice
ใน health@2.0-service.<device>
และนำฟังก์ชันนี้ไปใช้ใหม่)
ไลบรารีการใช้งานแบบคงที่
แตกต่างจากไลบรารีการใช้งาน HAL อื่นๆ ไลบรารีการใช้งาน health@2.0-impl เป็นไลบรารี แบบสแตติก ที่มีลิงก์ health@2.0-service, ที่ชาร์จ, การกู้คืน และสุขภาพแบบเดิม
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, charger และ healthd
และการเรียกเข้าสู่วิธี IHealth แทนที่จะเป็น BatteryMonitor
ใช้บริการ 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 ในการกู้คืนโดยการติดตั้งการใช้งานแบบส่งผ่านไปยังอิมเมจการกู้คืน ตัวอย่าง:
// 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
ใหม่ health@2.0 HAL รวมถึงการเปลี่ยนแปลง 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 ใหม่ที่เขียนขึ้นโดยเฉพาะสำหรับ health@2.0 HAL หากอุปกรณ์ประกาศว่าจะให้ health@2.0 HAL ในรายการอุปกรณ์ อุปกรณ์นั้นจะต้องผ่านการทดสอบ VTS ที่เกี่ยวข้อง การทดสอบถูกเขียนสำหรับทั้งอินสแตนซ์เริ่มต้น (เพื่อให้แน่ใจว่าอุปกรณ์ใช้งาน HAL อย่างถูกต้อง) และอินสแตนซ์สำรอง (เพื่อให้แน่ใจว่า healthd
ยังคงทำงานได้อย่างถูกต้องก่อนที่จะถูกลบออก)