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

ใน Android 11 เราได้ปรับโครงสร้างโค้ด healthd ทั้งหมดเป็น libhealthloop และ libhealth2impl จากนั้นแก้ไขเพื่อใช้ HAL health@2.1 health@2.0-impl-2.1 การติดตั้งใช้งานการส่งผ่านของ Health 2.1 จะลิงก์ไลบรารีทั้ง 2 นี้แบบคงที่ ไลบรารีที่ลิงก์แบบคงที่จะช่วยให้ 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 แม้ว่าจะเป็น daemon ของระบบก็ตาม ระบบจะเพิ่ม IHealth ลงในไฟล์ Manifest ของระบบ โดยมีชื่ออินสแตนซ์เป็น "backup"
  2. เฟรมเวิร์กและ storaged สื่อสารกับ healthd ผ่าน hwbinder แทน binder
  3. โค้ดสำหรับเฟรมเวิร์กและ storaged มีการเปลี่ยนแปลงเพื่อดึงข้อมูลอินสแตนซ์ "default" หากมี แล้วจึงดึงข้อมูล "backup"
    • โค้ดไคลเอ็นต์ C++ ใช้ตรรกะที่กำหนดไว้ใน libhealthhalutils
    • โค้ดไคลเอ็นต์ Java ใช้ตรรกะที่กำหนดไว้ใน HealthServiceWrapper
  4. หลังจากที่ iHealth/default พร้อมใช้งานอย่างแพร่หลายและเลิกใช้งานอิมเมจของผู้ให้บริการ Android 8.1 แล้ว เราจะเลิกใช้งาน iHealth/backup และ healthd ได้

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

BOARD_PERIODIC_CHORES_INTERVAL_* คือตัวแปรเฉพาะบอร์ดที่ใช้สร้าง healthd เนื่องจากมีการแยกการสร้างระบบ/ผู้ให้บริการ จึงไม่สามารถกำหนดค่าเฉพาะบอร์ดสำหรับโมดูลระบบได้ ค่าเหล่านี้เคยถูกลบล้าง ในฟังก์ชัน healthd_board_init ที่เลิกใช้งานแล้ว

ใน health@2.1 ผู้ให้บริการสามารถลบล้างค่าช่วงเวลาของงานตามกำหนดการ 2 รายการนี้ใน healthd_config struct ก่อน ส่งไปยังตัวสร้างคลาสการใช้งาน Health คลาสการติดตั้งใช้งานด้านสุขภาพ ควรรับค่าจาก 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 BatteryManager.queryProperty(int id) เป็นไคลเอ็นต์เดียวของ IBatteryPropertiesRegistrar.getProperty IBatteryPropertiesRegistrar.getProperty ได้รับจาก healthd และอ่านโดยตรงจาก /sys/class/power_supply

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

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

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

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

  • หน่วยของกระแสแบตเตอรี่แบบทันทีและโดยเฉลี่ยต้องเป็นไมโครแอมป์ (μA)
  • เครื่องหมายของกระแสแบตเตอรี่ขณะนั้นและกระแสแบตเตอรี่เฉลี่ยต้องถูกต้อง โดยเฉพาะอย่างยิ่ง
    • current == 0 เมื่อสถานะแบตเตอรี่เป็น UNKNOWN
    • current > 0 เมื่อสถานะแบตเตอรี่เป็น CHARGING
    • current <= 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 ด้วย 1000 และรายงานค่าเป็นมิลลิโวลต์ (mV) ดู @1.0::HealthInfo

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