ติดตั้งใช้งาน Health 2.0

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

ในการแก้ไขปัญหานี้:

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

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

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