การใช้สุขภาพ 2.0

โค้ด 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 สิ่งนี้บังคับใช้โดย กำหนดการเลิกใช้งาน

เพื่อแก้ไขปัญหานี้:

  1. healthd ลงทะเบียน IHealth กับ hwservicemanager (แม้จะเป็น daemon ระบบก็ตาม) IHealth ถูกเพิ่มเข้าไปในรายการระบบ โดยมีชื่ออินสแตนซ์ "สำรอง"
  2. กรอบงานและ storaged ข้อมูลสื่อสารกับ healthd ผ่าน hwbinder แทน binder
  3. รหัสสำหรับเฟรมเวิร์กและ storaged มีการเปลี่ยนแปลงเพื่อดึงอินสแตนซ์ "ค่าเริ่มต้น" หากมี จากนั้นจึงดึงข้อมูล "สำรอง"
    • รหัสไคลเอ็นต์ C++ ใช้ตรรกะที่กำหนดไว้ใน libhealthhalutils
    • รหัสไคลเอ็นต์ Java ใช้ตรรกะที่กำหนดไว้ใน HealthServiceWrapper
  4. หลังจากที่ 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, 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, 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

ลูกค้าด้านสุขภาพ

ดู ลูกค้าสุขภาพเพื่อสุขภาพ 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 ในรายการอุปกรณ์ อุปกรณ์นั้นจะต้องผ่านการทดสอบ VTS ที่เกี่ยวข้อง การทดสอบถูกเขียนสำหรับทั้งอินสแตนซ์เริ่มต้น (เพื่อให้แน่ใจว่าอุปกรณ์ใช้งาน HAL อย่างถูกต้อง) และอินสแตนซ์สำรอง (เพื่อให้แน่ใจว่า healthd ยังคงทำงานได้อย่างถูกต้องก่อนที่จะถูกลบออก)

ข้อกำหนดข้อมูลแบตเตอรี่

ดู ข้อกำหนดข้อมูลแบตเตอรี่