โค้ด healthd
ทั้งหมดเปลี่ยนโครงสร้างภายในโค้ด Health@2.0-impl และ
libhealthservice
จากนั้นแก้ไขเพื่อใช้ Health@2.0 HAL ทั้ง 2 อย่างนี้
ไลบรารีจะมีการเชื่อมโยงแบบคงที่โดย health@2.0-service เพื่อให้สามารถ
งานที่ healthd
ทำไว้ก่อนหน้านี้ (กล่าวคือ เรียกใช้ healthd_mainloop
และทำ
แบบสำรวจ) ใน init บริการ health@2.0 ได้ลงทะเบียนการใช้งาน
อินเทอร์เฟซ IHealth
เป็น hwservicemanager
เมื่ออัปเกรดอุปกรณ์ที่มี
รูปภาพผู้ให้บริการ Android 8.x และเฟรมเวิร์ก Android 9
รูปภาพผู้ให้บริการอาจไม่ได้ให้บริการ health@2.0 บังคับใช้แล้ว
โดย
กำหนดเวลาการเลิกใช้งาน
ในการแก้ไขปัญหานี้:
healthd
จะลงทะเบียนIHealth
ถึงhwservicemanager
(แม้ว่าจะเป็นระบบ Daemon) เพิ่ม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>
และนำฟังก์ชันนี้ไปใช้อีกครั้ง)
ไลบรารีการใช้งานแบบคงที่
ไลบรารีการใช้งานแตกต่างจากไลบรารีการใช้งาน 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,
ที่ชาร์จ และ 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
แบบคงที่
- มีการกำหนดแล้ว สร้าง
หากอุปกรณ์
- ควรใช้ API
getStorageInfo
และgetDiskStats
ให้ระบุ การใช้งานในฟังก์ชันget_storage_info
และget_disk_stats
- ไม่ควรใช้ API เหล่านั้น ให้ลิงก์ไปยัง
libstoragehealthdefault
แบบคงที่
- ควรใช้ API
อัปเดตสิทธิ์ 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
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.
อินเทอร์เฟซเคอร์เนล
โปรดดูอินเทอร์เฟซเคอร์เนลสำหรับสุขภาพ 2.1 HAL
การทดสอบ
Android 9 มีการทดสอบ VTS ใหม่
ที่เขียนขึ้นสำหรับ health@2.0 HAL โดยเฉพาะ หากอุปกรณ์ประกาศว่าจะจัดเตรียม
Health@2.0 HAL ในไฟล์ Manifest ของอุปกรณ์จะต้องผ่านการทดสอบ VTS ที่เกี่ยวข้อง
เราเขียนการทดสอบสำหรับทั้งอินสแตนซ์เริ่มต้น (เพื่อให้แน่ใจว่าอุปกรณ์
ใช้ HAL อย่างถูกต้อง) และอินสแตนซ์สำรอง (เพื่อให้มั่นใจว่า healthd
จะทำงานต่อไปได้อย่างถูกต้องก่อนที่จะถูกนำออก)