ใน Android 11 เราได้ปรับโครงสร้างโค้ด healthd
ทั้งหมดเป็น libhealthloop
และ libhealth2impl
จากนั้นแก้ไขเพื่อใช้ HAL health@2.1
health@2.0-impl-2.1
การติดตั้งใช้งานการส่งผ่านของ Health 2.1 จะลิงก์ไลบรารีทั้ง 2 นี้แบบคงที่ ไลบรารีที่ลิงก์แบบคงที่จะช่วยให้ 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
แม้ว่าจะเป็น daemon ของระบบก็ตาม ระบบจะเพิ่มIHealth
ลงในไฟล์ Manifest ของระบบ โดยมีชื่ออินสแตนซ์เป็น "backup"- เฟรมเวิร์กและ
storaged
สื่อสารกับhealthd
ผ่านhwbinder
แทนbinder
- โค้ดสำหรับเฟรมเวิร์กและ
storaged
มีการเปลี่ยนแปลงเพื่อดึงข้อมูลอินสแตนซ์ "default" หากมี แล้วจึงดึงข้อมูล "backup"- โค้ดไคลเอ็นต์ C++ ใช้ตรรกะที่กำหนดไว้ใน
libhealthhalutils
- โค้ดไคลเอ็นต์ Java ใช้ตรรกะที่กำหนดไว้ใน
HealthServiceWrapper
- โค้ดไคลเอ็นต์ C++ ใช้ตรรกะที่กำหนดไว้ใน
- หลังจากที่ iHealth/default พร้อมใช้งานอย่างแพร่หลายและเลิกใช้งานอิมเมจของผู้ให้บริการ Android 8.1 แล้ว เราจะเลิกใช้งาน iHealth/backup และ
healthd
ได้
ตัวแปรบิลด์เฉพาะบอร์ดสำหรับ healthd
BOARD_PERIODIC_CHORES_INTERVAL_*
คือตัวแปรเฉพาะบอร์ดที่ใช้สร้าง
healthd
เนื่องจากมีการแยกการสร้างระบบ/ผู้ให้บริการ จึงไม่สามารถกำหนดค่าเฉพาะบอร์ดสำหรับโมดูลระบบได้ ค่าเหล่านี้เคยถูกลบล้าง
ในฟังก์ชัน healthd_board_init
ที่เลิกใช้งานแล้ว
ใน health@2.1 ผู้ให้บริการสามารถลบล้างค่าช่วงเวลาของงานตามกำหนดการ 2 รายการนี้ใน healthd_config
struct ก่อน
ส่งไปยังตัวสร้างคลาสการใช้งาน Health คลาสการติดตั้งใช้งานด้านสุขภาพ
ควรรับค่าจาก
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
BatteryManager.queryProperty(int id)
เป็นไคลเอ็นต์เดียวของIBatteryPropertiesRegistrar.getProperty
IBatteryPropertiesRegistrar.getProperty
ได้รับจากhealthd
และอ่านโดยตรงจาก/sys/class/power_supply
ด้วยเหตุผลด้านความปลอดภัย เราจึงไม่อนุญาตให้แอปเรียกใช้ HAL ของ Health โดยตรง ใน Android 9 ขึ้นไป
IBatteryPropertiesRegistrar
บริการ Binder จะให้บริการโดยBatteryService
แทนhealthd
BatteryService
จะส่งต่อการเรียกไปยัง HAL ของ Health เพื่อดึงข้อมูลที่ขอ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
หรือจาก
บริการเริ่มต้น (เช่น ไฟล์เป็น Symlink ไปยังโฟลเดอร์เฉพาะของผู้ให้บริการ
ที่ปฏิเสธการเข้าถึงเนื่องจากนโยบาย 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
- 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
ด้วย 1000 และรายงานค่าเป็นมิลลิโวลต์ (mV) ดู @1.0::HealthInfo
โปรดดูรายละเอียดที่หัวข้อ คลาสแหล่งจ่ายไฟของ Linux