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

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

หากต้องการตรวจสอบความเข้ากันได้แบบย้อนหลัง ให้ทำดังนี้

  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 เนื่องจากการแยกบิลด์ของระบบ/ผู้ให้บริการจะระบุค่าเฉพาะกระดานสำหรับโมดูลระบบไม่ได้ ค่าเหล่านี้เคยมีการลบล้างในฟังก์ชัน healthd_board_init ที่เลิกใช้งานแล้ว

ใน health@2.1 ผู้ให้บริการสามารถลบล้างค่าช่วงเวลาของงานประจําสองค่านี้ในโครงสร้าง healthd_config ก่อนที่จะส่งไปยังตัวสร้างคลาสการใช้งาน Health คลาสการใช้งานสุขภาพควรรับค่ามาจาก android::hardware::health::V2_1::implementation::Health

ใช้บริการ Health 2.1

ดูข้อมูลเกี่ยวกับการใช้งานบริการ Health 2.1 ได้ที่ hardware/interfaces/health/2.1/README.md

ไคลเอ็นต์สุขภาพ

health@2.x มีไคลเอ็นต์ต่อไปนี้

  • charger การใช้โค้ด libbatterymonitor และ healthd_common อยู่ภายใน health@2.0-impl
  • การกู้คืน การลิงก์กับ libbatterymonitor อยู่ภายใน health@2.0-impl การเรียก BatteryMonitor ทั้งหมดจะแทนที่ด้วยการเรียกใช้คลาสการใช้งาน Health
  • ประหยัดแบตเตอรี่ BatteryManager.queryProperty(int id) เป็นไคลเอ็นต์เดียว ของ IBatteryPropertiesRegistrar.getProperty IBatteryPropertiesRegistrar.getProperty มาจาก healthd และอ่าน /sys/class/power_supply โดยตรง

    แอปไม่ได้รับอนุญาตให้เรียกใช้ HAL สุขภาพโดยตรงเนื่องจากข้อควรพิจารณาด้านความปลอดภัย ใน Android 9 ขึ้นไป IBatteryPropertiesRegistrar บริการ Binder จะมาจาก BatteryService แทน healthd BatteryService จะมอบสิทธิ์การเรียกให้ HAL สุขภาพเพื่อดึงข้อมูลที่ขอ

  • BatteryService ใน Android 9 ขึ้นไป BatteryService จะใช้ HealthServiceWrapper เพื่อพิจารณาว่าจะใช้อินสแตนซ์บริการประสิทธิภาพเริ่มต้นจาก vendor หรือใช้อินสแตนซ์บริการสุขภาพสำรองจาก healthd จากนั้น BatteryService จะคอยฟังเหตุการณ์ด้านสุขภาพผ่าน IHealth.registerCallback

  • Storaged ใน Android 9 ขึ้นไป storaged จะใช้ libhealthhalutils เพื่อพิจารณาว่าจะใช้อินสแตนซ์บริการสุขภาพเริ่มต้นจาก vendor หรือใช้อินสแตนซ์บริการสุขภาพสำรองจาก healthd จากนั้น storaged จะคอยฟังเหตุการณ์ด้านประสิทธิภาพการทำงานผ่าน IHealth.registerCallback และดึงข้อมูลพื้นที่เก็บข้อมูล

การเปลี่ยนแปลง SELinux

HAL ของ health@2.1 มีการเปลี่ยนแปลง SELinux ต่อไปนี้ในแพลตฟอร์ม

  • เพิ่ม android.hardware.health@2.1-service ไปยัง file_contexts

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

# 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.

อินเทอร์เฟซเคอร์เนล

healthd daemon และการใช้งานเริ่มต้น android.hardware.health@2.0-impl-2.1 จะเข้าถึงอินเทอร์เฟซเคอร์เนลต่อไปนี้เพื่อดึงข้อมูลแบตเตอรี่

  • /sys/class/power_supply/*/capacity_level (เพิ่มใน Health 2.1)
  • /sys/class/power_supply/*/capacity
  • /sys/class/power_supply/*/charge_counter
  • /sys/class/power_supply/*/charge_full
  • /sys/class/power_supply/*/charge_full_design (เพิ่มใน Health 2.1)
  • /sys/class/power_supply/*/current_avg
  • /sys/class/power_supply/*/current_max
  • /sys/class/power_supply/*/current_now
  • /sys/class/power_supply/*/cycle_count
  • /sys/class/power_supply/*/health
  • /sys/class/power_supply/*/online
  • /sys/class/power_supply/*/present
  • /sys/class/power_supply/*/status
  • /sys/class/power_supply/*/technology
  • /sys/class/power_supply/*/temp
  • /sys/class/power_supply/*/time_to_full_now (เพิ่มใน Health 2.1)
  • /sys/class/power_supply/*/type
  • /sys/class/power_supply/*/voltage_max
  • /sys/class/power_supply/*/voltage_now

การใช้งาน HAL ของประสิทธิภาพเฉพาะอุปกรณ์ที่ใช้ libbatterymonitor จะเข้าถึงอินเทอร์เฟซเคอร์เนลเหล่านี้โดยค่าเริ่มต้น เว้นแต่จะมีการลบล้างในตัวสร้างคลาสการติดตั้งใช้งานที่มีประสิทธิภาพ

หากไฟล์เหล่านี้ขาดหายไปหรือไม่เข้าถึงได้จาก healthd หรือจากบริการเริ่มต้น (เช่น ไฟล์เป็นลิงก์สัญลักษณ์ไปยังโฟลเดอร์เฉพาะของผู้ให้บริการที่ปฏิเสธการเข้าถึงเนื่องจากนโยบาย SELinux กำหนดค่าไม่ถูกต้อง) ไฟล์เหล่านั้นอาจทำงานไม่ถูกต้อง ดังนั้นการเปลี่ยนแปลง SELinux เพิ่มเติมเฉพาะผู้ให้บริการอาจจำเป็นแม้ว่าจะใช้การใช้งานเริ่มต้นก็ตาม

อินเทอร์เฟซเคอร์เนลบางรายการที่ใช้ใน Health 2.1 เช่น /sys/class/power_supply/*/capacity_level และ /sys/class/power_supply/*/time_to_full_now อาจไม่บังคับ อย่างไรก็ตาม เราขอแนะนําให้คัดสรรCL 1398913 เฉพาะบางรายการเพื่อไม่ให้เฟรมเวิร์กทํางานอย่างไม่ถูกต้องเนื่องจากไม่มีอินเทอร์เฟซเคอร์เนล ก่อนสร้างบริการ Health HAL 2.1

การทดสอบ

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

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

HAL ของ Health 2.0 ระบุชุดข้อกำหนดในอินเทอร์เฟซ HAL แต่การทดสอบ VTS ที่เกี่ยวข้องจะบังคับใช้ข้อกำหนดดังกล่าวค่อนข้างผ่อนปรน ใน Android 11 จะมีการเพิ่มการทดสอบ VTS ใหม่เพื่อบังคับใช้ข้อกำหนดต่อไปนี้ในอุปกรณ์ที่เปิดตัวด้วย Android 11 ขึ้นไป

  • หน่วยของกระแสแบตเตอรี่ทันทีและโดยเฉลี่ยต้องเป็นไมโครแอมแปร์ (μA)
  • เครื่องหมายของกระแสแบตเตอรี่ทันทีและโดยเฉลี่ยต้องถูกต้อง กล่าวคือ
    • current == 0 เมื่อสถานะแบตเตอรี่คือ UNKNOWN
    • current > 0 เมื่อสถานะแบตเตอรี่คือ CHARGING
    • ปัจจุบัน <= 0 เมื่อสถานะแบตเตอรี่คือ NOT_CHARGING
    • current < 0 เมื่อสถานะแบตเตอรี่คือ DISCHARGING
    • ไม่ได้บังคับใช้เมื่อสถานะแบตเตอรี่คือ FULL
  • สถานะแบตเตอรี่ต้องถูกต้องไม่ว่าจะเชื่อมต่อแหล่งจ่ายไฟหรือไม่ก็ตาม กล่าวคือ
    • สถานะแบตเตอรี่ต้องเป็น CHARGING, NOT_CHARGING หรือ FULL หากเชื่อมต่อแหล่งจ่ายไฟอยู่เท่านั้น
    • สถานะแบตเตอรี่ต้องเป็น DISCHARGING เฉพาะในกรณีที่แหล่งจ่ายไฟถูกถอดออกเท่านั้น

หากคุณใช้ libbatterymonitor ในการติดตั้งใช้งานและส่งค่าจากอินเทอร์เฟซเคอร์เนล ให้ตรวจสอบว่าโหนด sysfs รายงานค่าที่ถูกต้อง

  • ตรวจสอบว่ามีการรายงานกระแสแบตเตอรี่ด้วยเครื่องหมายและหน่วยที่ถูกต้อง ซึ่งรวมถึงโหนด sysfs ต่อไปนี้
    • /sys/class/power_supply/*/current_avg
    • /sys/class/power_supply/*/current_max
    • /sys/class/power_supply/*/current_now
    • ค่าบวกแสดงกระแสไฟฟ้าที่ไหลเข้าแบตเตอรี่
    • ค่าควรเป็นไมโครแอมแปร์ (μA)
  • ตรวจสอบว่าแรงดันไฟฟ้าของแบตเตอรี่ได้รับการรายงานเป็นไมโครโวลต์ (μV) ซึ่งรวมถึงโหนด Sysfs ต่อไปนี้
    • /sys/class/power_supply/*/voltage_max
    • /sys/class/power_supply/*/voltage_now
    • โปรดทราบว่าการใช้งาน HAL เริ่มต้นจะหาร voltage_now ด้วย 1,000 และรายงานค่าเป็นมิลลิโวลต์ (mV) โปรดดู @1.0::HealthInfo

โปรดดูรายละเอียดที่หัวข้อคลาสแหล่งจ่ายไฟของ Linux