การนำสุขภาพไปใช้ 2.1

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

เพื่อให้แน่ใจว่าสามารถใช้งานร่วมกันได้แบบย้อนหลัง:

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

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

การใช้บริการ Health 2.1

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

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

health@2.x มีลูกค้าดังต่อไปนี้:

  • ที่ชาร์จ การใช้ 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 โดยตรง

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

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

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

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

health@2.1 HAL รวมถึงการเปลี่ยนแปลง 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 (เพิ่มในความสมบูรณ์ 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 (เพิ่มในสุขภาพ 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 (เพิ่มในความสมบูรณ์ 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 ก่อนที่จะสร้างบริการ HAL 2.1 ด้านสุขภาพ

การทดสอบ

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

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

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

  • หน่วยของกระแสไฟภายในแบตเตอรี่และกระแสไฟเฉลี่ยของแบตเตอรี่ต้องเป็นไมโครแอมป์ (μA)
  • สัญลักษณ์แสดงกระแสไฟแบตเตอรี่ทันทีและโดยเฉลี่ยจะต้องถูกต้อง โดยเฉพาะ:
    • ปัจจุบัน == 0 เมื่อสถานะแบตเตอรี่ UNKNOWN
    • ปัจจุบัน > 0 เมื่อสถานะแบตเตอรี่กำลัง CHARGING
    • ปัจจุบัน <= 0 เมื่อสถานะของแบตเตอรี่เป็น NOT_CHARGING
    • ปัจจุบัน < 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