ใน 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 กำหนดการเลิกใช้งานจะบังคับใช้ความเข้ากันได้แบบย้อนหลังกับรูปภาพเดิมของผู้ให้บริการ
หากต้องการตรวจสอบความเข้ากันได้แบบย้อนหลัง ให้ทำดังนี้
healthd
ลงทะเบียนIHealth
เป็นhwservicemanager
แม้ว่าจะเป็นระบบไดมอนก็ตาม ระบบจะเพิ่มIHealth
ลงในไฟล์ Manifest ของระบบ โดยมีชื่ออินสแตนซ์เป็น "backup"- เฟรมเวิร์กและ
storaged
จะสื่อสารกับhealthd
ผ่านhwbinder
แทนbinder
- โค้ดสําหรับเฟรมเวิร์กและ
storaged
มีการเปลี่ยนแปลงเพื่อดึงข้อมูลอินสแตนซ์ "default" หากมี มิเช่นนั้นจะเป็น "backup"- โค้ดไคลเอ็นต์ C++ ใช้ตรรกะที่กําหนดไว้ใน
libhealthhalutils
- โค้ดไคลเอ็นต์ Java ใช้ตรรกะที่กําหนดไว้ใน
HealthServiceWrapper
- โค้ดไคลเอ็นต์ C++ ใช้ตรรกะที่กําหนดไว้ใน
- หลังจาก IHealth/ค่าเริ่มต้นพร้อมให้บริการในวงกว้างและเลิกใช้งานภาพผู้ให้บริการ Android 8.1 แล้ว คุณจะเลิกใช้งาน IHealth/backup และ
healthd
ได้ ดูรายละเอียดเพิ่มเติมได้ที่การเลิกใช้งาน health@1.0
ตัวแปรบิลด์เฉพาะบอร์ดสำหรับประสิทธิภาพ
BOARD_PERIODIC_CHORES_INTERVAL_*
คือตัวแปรเฉพาะบอร์ดที่ใช้สร้าง
healthd
เนื่องจากการแยกบิลด์ของระบบ/ผู้ให้บริการจะระบุค่าเฉพาะกระดานสำหรับโมดูลระบบไม่ได้ ค่าเหล่านี้เคยมีการลบล้างในฟังก์ชัน healthd_board_init
ที่เลิกใช้งานแล้ว
ใน health@2.1 ผู้ให้บริการสามารถลบล้างค่าช่วงเวลาของงานประจําสองค่านี้ในโครงสร้าง 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
- การกู้คืน การลิงก์กับ
libbatterymonitor
อยู่ภายในhealth@2.0-impl
การเรียกBatteryMonitor
ทั้งหมดจะแทนที่ด้วยการเรียกใช้คลาสการใช้งานHealth
ประหยัดแบตเตอรี่
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
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 ใหม่ซึ่งเขียนขึ้นสำหรับ HAL ของ health@2.1 โดยเฉพาะ หากอุปกรณ์ประกาศ Health@2.1 HAL ในไฟล์ Manifest ของอุปกรณ์ อุปกรณ์จะต้องผ่านการทดสอบ VTS ที่เกี่ยวข้อง
การทดสอบจะเขียนขึ้นสำหรับทั้งอินสแตนซ์เริ่มต้น (เพื่อให้แน่ใจว่าอุปกรณ์ใช้ HAL อย่างถูกต้อง) และอินสแตนซ์สํารอง (เพื่อให้แน่ใจว่า healthd
จะยังคงทํางานอย่างถูกต้องก่อนที่จะถูกนําออก)
ข้อกำหนดด้านข้อมูลแบตเตอรี่
HAL ของ Health 2.0 ระบุชุดข้อกำหนดในอินเทอร์เฟซ HAL แต่การทดสอบ VTS ที่เกี่ยวข้องจะบังคับใช้ข้อกำหนดดังกล่าวค่อนข้างผ่อนปรน ใน Android 11 จะมีการเพิ่มการทดสอบ VTS ใหม่เพื่อบังคับใช้ข้อกำหนดต่อไปนี้ในอุปกรณ์ที่เปิดตัวด้วย Android 11 ขึ้นไป
- หน่วยของกระแสแบตเตอรี่ทันทีและโดยเฉลี่ยต้องเป็นไมโครแอมแปร์ (μA)
- เครื่องหมายของกระแสแบตเตอรี่ทันทีและโดยเฉลี่ยต้องถูกต้อง
กล่าวคือ
- current == 0 เมื่อสถานะแบตเตอรี่คือ
UNKNOWN
- current > 0 เมื่อสถานะแบตเตอรี่คือ
CHARGING
- ปัจจุบัน <= 0 เมื่อสถานะแบตเตอรี่คือ
NOT_CHARGING
- current < 0 เมื่อสถานะแบตเตอรี่คือ
DISCHARGING
- ไม่ได้บังคับใช้เมื่อสถานะแบตเตอรี่คือ
FULL
- current == 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