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

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

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

  • BatteryService ใน 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 และการใช้งานเริ่มต้น 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 ก่อนสร้างบริการ Health HAL 2.1

การทดสอบ

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

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

Health 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 ด้วย 1000 และรายงานค่าเป็นมิลลิวินาที (mV) โปรดดู @1.0::HealthInfo

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