ติดตั้งใช้งาน 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/default พร้อมให้บริการในวงกว้างและเลิกใช้งานภาพผู้ให้บริการ Android 8.1 แล้ว คุณจะเลิกใช้งาน IHealth/backup และ healthd ได้ ดูรายละเอียดเพิ่มเติมได้ที่การเลิกใช้งาน health@1.0

ตัวแปรการสร้างสำหรับบอร์ดโดยเฉพาะสำหรับ healthd

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

ใน health@2.1 ผู้ให้บริการสามารถลบล้างค่าช่วงเวลาของงานบ้านแบบเป็นรอบ 2 รายการนี้ในโครงสร้าง 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
  • recovery การลิงก์กับ libbatterymonitor อยู่ภายใน health@2.0-impl การเรียก BatteryMonitor ทั้งหมดจะแทนที่ด้วยการเรียกใช้คลาสการใช้งาน Health
  • BatteryManager 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 และการใช้งานเริ่มต้น 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 โดยเฉพาะ หากอุปกรณ์ประกาศ 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 ด้วย 1,000 และรายงานค่าเป็นมิลลิโวลต์ (mV) โปรดดู @1.0::HealthInfo

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