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

โค้ด healthd ทั้งหมดได้รับการแยกส่วนใหม่เป็น health@2.0-impl และ libhealthservice จากนั้นแก้ไขเพื่อติดตั้งใช้งาน HAL ของ health@2.0 ไลบรารี 2 รายการนี้มีการลิงก์แบบคงที่โดย health@2.0-service ซึ่งช่วยให้ทํางานได้เช่นเดียวกับที่ healthd ทําก่อนหน้านี้ (นั่นคือ เรียกใช้ healthd_mainloop และทำการโพล) ในเริ่มต้น บริการ Health@2.0 จะลงทะเบียนการใช้งานอินเทอร์เฟซ IHealth กับ hwservicemanager เมื่ออัปเกรดอุปกรณ์ที่มีภาพผู้ให้บริการ Android 8.x และเฟรมเวิร์ก Android 9 บริการ health@2.0 อาจไม่พร้อมใช้งานจากภาพผู้ให้บริการ การดำเนินการนี้จะบังคับใช้โดยกำหนดการเลิกใช้งาน

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

  1. healthd ลงทะเบียน IHealth กับ hwservicemanager (แม้ว่าจะเป็นระบบไดมอนก็ตาม) เพิ่ม 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> และติดตั้งใช้งานฟังก์ชันนี้อีกครั้ง)

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

ไลบรารีการใช้งาน health@2.0-impl ต่างจากไลบรารีการใช้งาน HAL อื่นๆ ตรงที่เป็นไลบรารีแบบคงที่ที่ 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, ที่ชาร์จ และ 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 แบบคงที่
  • หากอุปกรณ์

    • ควรใช้ getStorageInfo และ getDiskStats API ให้ระบุการใช้งานในฟังก์ชัน 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

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

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

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