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

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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

ตัวแปรบิลด์เฉพาะบอร์ดสำหรับ healthd

BOARD_PERIODIC_CHORES_INTERVAL_* เป็นตัวแปรเฉพาะของบอร์ดที่ใช้ในการสร้าง healthd เนื่องจากเป็นส่วนหนึ่งของการแยกบิลด์ระบบ/ผู้จำหน่าย ค่าเฉพาะบอร์ด ไม่ สามารถกำหนดสำหรับโมดูลระบบได้ ใน health@2.0 ผู้ขายสามารถแทนที่สองค่านี้ใน healthd_mode_ops->init (โดยทิ้งการพึ่งพา libhealthservice ใน health@2.0-service.<device> และนำฟังก์ชันนี้ไปใช้อีกครั้ง)

ไลบรารีการใช้งานแบบคงที่

ไลบรารีการนำไปใช้งาน health@2.0-impl ต่างจากไลบรารีการใช้งาน HAL อื่น ๆ เป็นไลบรารีส แตติก ที่ลิงก์ 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 แทน 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 APIs จัดเตรียมการใช้งานใน 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

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

พบ ลูกค้าด้านสุขภาพเพื่อสุขภาพ 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 ยังคงทำงานอย่างถูกต้องก่อนที่จะถูกลบออก)

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

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