ใน 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 ย้อนกลับ
ความเข้ากันได้กับรูปภาพเดิมของผู้ให้บริการมีการบังคับใช้โดย
กำหนดเวลาการเลิกใช้งาน
หากต้องการตรวจสอบความเข้ากันได้แบบย้อนหลัง ให้ทำดังนี้
healthd
จะลงทะเบียนIHealth
กับhwservicemanager
แม้ว่าจะเป็นระบบ Daemon เพิ่มIHealth
ลงในไฟล์ Manifest ของระบบด้วยชื่ออินสแตนซ์ "backup"- เฟรมเวิร์กและ
storaged
สื่อสารกับhealthd
จนถึงhwbinder
แทนที่จะเป็นbinder
- มีการเปลี่ยนโค้ดสำหรับเฟรมเวิร์กและ
storaged
เพื่อดึงข้อมูลอินสแตนซ์ "ค่าเริ่มต้น" หากมี ให้เลือก "สำรอง"- รหัสไคลเอ็นต์ 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 ผู้ให้บริการสามารถลบล้าง
ค่าช่วงเวลาทำงานบ้านเป็นระยะ 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
- ปัจจุบัน == 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
ด้วย 1000 และรายงานค่าเป็นมิลลิวินาที (mV) โปรดดู @1.0::HealthInfo
โปรดดูรายละเอียดที่หัวข้อ คลาสแหล่งจ่ายไฟของ Linux