ติดตั้งใช้งาน 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 แทน healthdBatteryService 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 2.0 ของ Health ระบุชุดข้อกำหนดในอินเทอร์เฟซ 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