ใน 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 ความเข้ากันได้แบบย้อนหลังกับอิมเมจของผู้จำหน่ายเก่านั้นถูกบังคับใช้โดย กำหนดการเลิกใช้งาน
เพื่อให้แน่ใจว่าสามารถใช้งานร่วมกันได้แบบย้อนหลัง:
-
healthd
ลงทะเบียนIHealth
กับhwservicemanager
แม้ว่าจะเป็น daemon ระบบก็ตามIHealth
จะถูกเพิ่มเข้าไปในรายการระบบ โดยมีชื่ออินสแตนซ์ "สำรอง" - กรอบงานและ
storaged
สื่อสารกับhealthd
ผ่านhwbinder
แทนที่จะเป็นbinder
- รหัสสำหรับเฟรมเวิร์กและ
storaged
มีการเปลี่ยนแปลงเพื่อดึงอินสแตนซ์ "ค่าเริ่มต้น" หากมี จากนั้นจึงดึงข้อมูล "สำรอง"- รหัสไคลเอ็นต์ C++ ใช้ตรรกะที่กำหนดไว้ใน
libhealthhalutils
- รหัสไคลเอ็นต์ Java ใช้ตรรกะที่กำหนดไว้ใน
HealthServiceWrapper
- รหัสไคลเอ็นต์ C++ ใช้ตรรกะที่กำหนดไว้ใน
- หลังจากที่ 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
(เพิ่มใน 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 ใหม่ที่เขียนขึ้นโดยเฉพาะสำหรับ health@2.1 HAL หากอุปกรณ์ประกาศ health@2.1 HAL ในรายการอุปกรณ์ อุปกรณ์นั้นจะต้องผ่านการทดสอบ 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
- ปัจจุบัน == 0 เมื่อสถานะแบตเตอรี่
- สถานะของแบตเตอรี่จะต้องถูกต้องโดยพิจารณาว่ามีการเชื่อมต่อแหล่งพลังงานหรือไม่ โดยเฉพาะ:
- สถานะของแบตเตอรี่จะต้องเป็น
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