Sensors Multi-HAL เป็นเฟรมเวิร์กที่ช่วยให้ HAL ของเซ็นเซอร์ทำงานควบคู่ไปกับ HAL ของเซ็นเซอร์อื่นๆ เซ็นเซอร์หลาย HAL ของเซ็นเซอร์จะโหลด HAL ย่อยของเซ็นเซอร์แบบไดนามิกที่จัดเก็บเป็นไลบรารีแบบไดนามิกในพาร์ติชันของผู้ให้บริการ และให้ออบเจ็กต์ Callback ที่สามารถจัดการการโพสต์เหตุการณ์ รวมถึงการรับและปล่อย Wake Lock เซ็นเซอร์ย่อย HAL คือ HAL เซ็นเซอร์ที่สร้างขึ้นในวัตถุที่ใช้ร่วมกันในพาร์ติชันผู้ให้บริการ และเฟรมเวิร์ก Multi-HAL จะนำไปใช้ HAL ย่อยเหล่านี้ไม่ขึ้นต่อกันหรือไม่ได้ขึ้นอยู่กับโค้ดมัลติ HAL ที่มีฟังก์ชันหลักของกระบวนการ
เซ็นเซอร์ Multi-HAL 2.1 พร้อมใช้งานในอุปกรณ์ที่ใช้ Android 11 ขึ้นไป โดยเป็นโมเดลของเซ็นเซอร์ Multi-HAL 2.0 ที่รองรับการโหลด HAL ย่อยที่สามารถแสดงเซ็นเซอร์ประเภทมุมบานพับ เพื่อให้รองรับเซ็นเซอร์ประเภทนี้ HAL ต้องใช้ API ย่อย HAL ที่กำหนดไว้ในส่วนหัว SubHal
สำหรับอุปกรณ์ที่ใช้ Android 13 ขึ้นไปซึ่งใช้ Sensors AIDL HAL คุณจะใช้เลเยอร์ shim แบบหลาย HAL เพื่ออนุญาตความสามารถในการจัดการแบบ Multi-HAL ได้ ดูรายละเอียดการใช้งานได้ที่ การใช้ Sensors Multi-HAL กับ Sensors AIDL HAL
ความแตกต่างระหว่างเซ็นเซอร์แบบหลาย HAL 2 กับเซ็นเซอร์ HAL 2
เซ็นเซอร์ Multi-HAL 2 ที่พร้อมใช้งานในอุปกรณ์ที่ใช้ Android 10 ขึ้นไป
จะมีแอบสแตรกต์ต่างๆ เพิ่มเข้ามานอกเหนือจาก Sensors HAL
2 เพื่อให้โต้ตอบกับ HAL API ได้ง่ายขึ้น Sensors Multi-HAL 2 เปิดตัวคลาส
HalProxy
สำหรับจัดการการใช้งานอินเทอร์เฟซ Sensors HAL 2 และอินเทอร์เฟซ
V2_1/SubHal
(หรือ
V2_0/SubHal
)
เพื่อให้ HalProxy
โต้ตอบกับ HAL ย่อยได้
อินเทอร์เฟซ ISensorsSubHal
แตกต่างจากอินเทอร์เฟซ 2.1/ISensors.hal
(หรือ 2.0/ISensors.hal
) ในลักษณะต่อไปนี้
- วิธีการเริ่มต้นผ่านคลาส
IHalProxyCallback
แทนที่จะเป็น FMQ 2 รายการและISensorsCallback
- Sub-HAL ต้องใช้ฟังก์ชันแก้ไขข้อบกพร่องเพื่อให้ข้อมูลการแก้ไขข้อบกพร่องในรายงานข้อบกพร่อง
- HAL ย่อยต้องใช้ฟังก์ชันชื่อเพื่อให้แยก HAL ย่อยที่โหลดออกจาก HAL ย่อยอื่นๆ
ความแตกต่างหลักระหว่าง Sensors Multi-HAL 2 กับ Sensors HAL 2 อยู่ที่
ฟังก์ชันเริ่มต้น แทนที่จะให้ FMQ อินเทอร์เฟซ IHalProxyCallback
ก็มี 2 วิธี ได้แก่ วิธีโพสต์เหตุการณ์ของเซ็นเซอร์ไปยังเฟรมเวิร์กของเซ็นเซอร์และอีกวิธีในการสร้าง Wake Lock ภายในระบบ เซ็นเซอร์
Multi-HAL จะจัดการการโต้ตอบทั้งหมดกับ FMQ เพื่อให้ส่งเหตุการณ์เซ็นเซอร์สำหรับ HAL ย่อยทั้งหมดได้อย่างทันท่วงที ขอแนะนำเป็นอย่างยิ่งให้ HAL ย่อยใช้เมธอด createScopedWakelock
เพื่อมอบสิทธิ์ในการจำกัดเวลาการทำงานขณะล็อกให้กับเซ็นเซอร์ Multi-HAL และเพื่อรวมการใช้งาน Wake Lock แบบรวมศูนย์อยู่ที่ Wake Lock ส่วนกลางรายการเดียวสำหรับเซ็นเซอร์ Multi-HAL ทั้งหมดของ Sensors Multi-HAL ซึ่งจะช่วยลดการล็อกและปลดล็อกการเรียกใช้
เซ็นเซอร์ Multi-HAL 2 ยังมีฟีเจอร์ด้านความปลอดภัยบางอย่างในตัวด้วย โดยจะจัดการกับสถานการณ์ที่เซ็นเซอร์ FMQ เต็ม หรือตำแหน่งที่เฟรมเวิร์กเซ็นเซอร์ Android รีสตาร์ทและต้องรีเซ็ตสถานะเซ็นเซอร์ นอกจากนี้ เมื่อมีการโพสต์เหตุการณ์ไปยังคลาส HalProxy
แต่เฟรมเวิร์กเซ็นเซอร์ไม่ยอมรับเหตุการณ์ในทันที เซ็นเซอร์ Multi-HAL ของเซ็นเซอร์จะสามารถย้ายเหตุการณ์ไปยังชุดข้อความในเบื้องหลังเพื่อให้ทำงานต่อไปใน HAL ย่อยทั้งหมดขณะรอการโพสต์เหตุการณ์
การใช้ซอร์สโค้ดและการอ้างอิง
รหัส Multi-HAL ของ Sensors ทั้งหมดจะอยู่ใน hardware/interfaces/sensors/common/default/2.X/multihal/
โปรดดูแหล่งข้อมูลต่อไปนี้
HalProxy.h
: ออบเจ็กต์HalProxy
สร้างขึ้นโดยเซ็นเซอร์มัลติ HAL และจัดการการส่งข้อมูลจาก HAL ย่อยไปยังเฟรมเวิร์กเซ็นเซอร์HalProxy.cpp
: การใช้งานHalProxy
มีตรรกะทั้งหมดที่จำเป็นในการสื่อสารแบบมัลติเพล็กซ์ระหว่าง HAL ย่อยกับเฟรมเวิร์กเซ็นเซอร์SubHal.h
: อินเทอร์เฟซISensorsSubHal
จะกำหนดอินเทอร์เฟซที่ HAL ย่อยต้องปฏิบัติตามเพื่อให้ใช้ร่วมกับHalProxy
ได้ ส่วนหัวย่อย HAL จะใช้วิธีการเริ่มต้นเพื่อให้ออบเจ็กต์HalProxyCallback
ใช้สำหรับpostEvents
และcreateScopedWakelock
ได้สำหรับการใช้งาน Multi-HAL 2.0 ให้ใช้
SubHal.h
เวอร์ชัน 2.0hardware/interfaces/sensors/common/default/2.X/multihal/tests/
: การทดสอบหน่วยเหล่านี้จะช่วยยืนยันการติดตั้งใช้งานHalProxy
hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
: ตัวอย่างการใช้งาน HAL ย่อยนี้ใช้เซ็นเซอร์ปลอมเพื่อสร้างข้อมูลปลอม มีประโยชน์สำหรับการทดสอบว่า HAL ย่อยต่างๆ โต้ตอบกันอย่างไรบนอุปกรณ์
การใช้งาน
ส่วนนี้จะอธิบายวิธีใช้งานเซ็นเซอร์แบบหลาย HAL ในสถานการณ์ต่อไปนี้
- การใช้เซ็นเซอร์ Multi-HAL กับเซ็นเซอร์ AIDL HAL
- การใช้เซ็นเซอร์ Multi-HAL 2.1
- การโอนจากเซ็นเซอร์ Multi-HAL 2.0 ไปยัง Multi-HAL 2.1
- การโอนจาก Sensors HAL 2.0
- การโอนจาก Sensors HAL 1.0
- การพอร์ตจาก Sensors Multi-HAL 1.0
ใช้เซ็นเซอร์ Multi-HAL กับเซ็นเซอร์ AIDL HAL
หากต้องการให้ความสามารถในการทำงานแบบหลาย HAL กับ Sensors AIDL HAL ให้นำเข้าโมดูลเลเยอร์ shim ของ AIDL Multi-HAL ซึ่งอยู่ในฮาร์ดแวร์/อินเทอร์เฟซ/เซ็นเซอร์/aidl/default/multihal/ โมดูลจะจัดการการแปลงระหว่างประเภทคำจำกัดความ HAL ของเซ็นเซอร์ AIDL กับ HIDL และกำหนด Wrapper รอบๆ อินเทอร์เฟซแบบหลาย HAL ตามที่อธิบายไว้ในการใช้เซ็นเซอร์ Multi-HAL 2.1 เลเยอร์ Shim แบบ Multi-HAL ของ AIDL ใช้งานได้กับอุปกรณ์ที่ใช้ Sensors Multi-HAL 2.1
ชั้นชิมภาพแบบ Multi-HAL ของ AIDL ช่วยให้คุณแสดงอุปกรณ์ติดตามศีรษะและเซ็นเซอร์ IMU แบบแกนจำกัดในเซ็นเซอร์ AIDL HAL ได้ หากต้องการใช้ประเภทเซ็นเซอร์เหล่านี้ที่กำหนดโดยอินเทอร์เฟซ AIDL HAL ให้ตั้งค่าช่อง type
ในโครงสร้าง SensorInfo
ในการใช้งาน getSensorsList_2_1()
วิธีนี้ปลอดภัยเนื่องจากฟิลด์ประเภทเซ็นเซอร์ที่ได้รับการสนับสนุนจำนวนเต็มของเซ็นเซอร์ AIDL และ HIDL แบบ HAL ไม่ทับซ้อนกัน
ใช้เซ็นเซอร์ Multi-HAL 2.1
หากต้องการใช้ Sensors Multi-HAL 2.1 ในอุปกรณ์เครื่องใหม่ ให้ทำตามขั้นตอนต่อไปนี้
- ใช้อินเทอร์เฟซ
ISensorsSubHal
ตามที่อธิบายไว้ในSubHal.h
- ใช้เมธอด
sensorsHalGetSubHal_2_1
ในSubHal.h
เพิ่มเป้าหมาย
cc_library_shared
เพื่อสร้าง HAL ย่อยที่ใช้งานใหม่ เมื่อเพิ่มเป้าหมาย- ตรวจสอบว่าได้พุชเป้าหมายไปยังตำแหน่งอื่นในพาร์ติชันผู้ให้บริการของอุปกรณ์แล้ว
- ในไฟล์การกำหนดค่าที่อยู่ที่
/vendor/etc/sensors/hals.conf
ให้เพิ่มเส้นทางไปยังไลบรารีในบรรทัดใหม่ หากจำเป็น ให้สร้างไฟล์hals.conf
สำหรับตัวอย่างของรายการ
Android.bp
สำหรับการสร้างไลบรารีย่อย HAL โปรดดูhardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
นำรายการ
android.hardware.sensors
ทั้งหมดออกจากไฟล์manifest.xml
ซึ่งมีรายการ HAL ที่รองรับในอุปกรณ์นำบริการ
android.hardware.sensors
และservice.rc
ทั้งหมดออกจากไฟล์device.mk
รวมทั้งเพิ่มandroid.hardware.sensors@2.1-service.multihal
และandroid.hardware.sensors@2.1-service.multihal.rc
ลงในPRODUCT_PACKAGES
เมื่อบูต HalProxy
เริ่มทำงาน มองหา HAL ย่อยที่ใช้งานใหม่ และเริ่มต้นโดยการเรียกใช้ sensorsHalGetSubHal_2_1
พอร์ตจากเซ็นเซอร์ Multi-HAL 2.0 ไปยัง Multi-HAL 2.1
หากต้องการย้ายจาก Multi-HAL 2.0 ไปยัง Multi-HAL 2.1 ให้ใช้อินเทอร์เฟซ SubHal
และคอมไพล์ HAL ย่อยอีกครั้ง
ความแตกต่างระหว่างอินเทอร์เฟซ SubHal
2.0 และ 2.1 มีดังนี้
IHalProxyCallback
ใช้ประเภทที่สร้างในข้อกำหนดเฉพาะISensors.hal
ในเวอร์ชัน 2.1- ฟังก์ชัน
initialize()
จะส่งIHalProxyCallback
ใหม่แทนการส่งจากอินเทอร์เฟซ 2.0SubHal
- HAL ย่อยต้องใช้
getSensorsList_2_1
และinjectSensorData_2_1
แทนgetSensorsList
และinjectSensorData
เนื่องจากวิธีการเหล่านี้ใช้ประเภทใหม่ที่เพิ่มเข้ามาในเวอร์ชัน 2.1 ของข้อกำหนดISensors.hal
- HAL ย่อยจะต้องแสดง
sensorsHalGetSubHal_2_1
แทนที่จะเป็นsensorsHalGetSubHal
สำหรับ Multi-HAL เพื่อให้ถือว่าเป็น HAL ย่อยในเวอร์ชัน 2.1
พอร์ตจาก Sensors HAL 2.0
เมื่ออัปเกรดเป็น Sensors Multi-HAL 2.0 จาก Sensors HAL 2.0 โปรดตรวจสอบว่าการติดตั้งใช้งาน HAL เป็นไปตามข้อกำหนดต่อไปนี้
เริ่มต้น HAL
เซ็นเซอร์ HAL 2.0 มีฟังก์ชันเริ่มต้นที่ทำให้บริการเซ็นเซอร์ส่ง FMQ และ Callback ของเซ็นเซอร์แบบไดนามิกได้ ในเซ็นเซอร์ Multi-HAL 2.0 ฟังก์ชัน initialize()
จะส่ง Callback ครั้งเดียวที่ต้องใช้เพื่อโพสต์เหตุการณ์เซ็นเซอร์ รับ Wake Lock รวมถึงแจ้งเตือนเกี่ยวกับการเชื่อมต่อและการยกเลิกการเชื่อมต่อเซ็นเซอร์แบบไดนามิก
โพสต์เหตุการณ์เซ็นเซอร์ไปจนถึงการใช้งาน Multi-HAL
แทนที่จะโพสต์เหตุการณ์เซ็นเซอร์ผ่าน FMQ นั้น HAL ย่อยจะต้องเขียนเหตุการณ์เซ็นเซอร์ไปยัง IHalProxyCallback
เมื่อมีเหตุการณ์เซ็นเซอร์พร้อมใช้งาน
กิจกรรม WAKE_UP
ใน Sensors HAL 2.0 HAL จะจัดการ Wake Lock สำหรับการติดตั้งใช้งานได้ ในเซ็นเซอร์ Multi-HAL 2.0 นั้น HAL ย่อยจะช่วยให้การใช้งาน Multi-HAL จัดการ Wake Lock ได้ และอาจขอให้ได้ Wake Lock ด้วยการเรียกใช้ createScopedWakelock
ต้องรับ Wake Lock ที่กำหนดขอบเขตล็อกและส่งไปยัง postEvents
เมื่อโพสต์เหตุการณ์การปลุกระบบไปยังการใช้งาน Multi-HAL
เซ็นเซอร์แบบไดนามิก
เซ็นเซอร์ Multi-HAL 2.0 กำหนดให้ต้องเรียกใช้ onDynamicSensorsConnected
และ onDynamicSensorsDisconnected
ใน IHalProxyCallback
เมื่อการเชื่อมต่อเซ็นเซอร์แบบไดนามิกมีการเปลี่ยนแปลง Callback เหล่านี้พร้อมใช้งานโดยเป็นส่วนหนึ่งของตัวชี้ IHalProxyCallback
ที่ให้ไว้ผ่านฟังก์ชัน initialize()
พอร์ตจาก Sensors HAL 1.0
เมื่ออัปเกรดเป็น Sensors Multi-HAL 2.0 จาก Sensors HAL 1.0 โปรดตรวจสอบว่าการติดตั้งใช้งาน HAL เป็นไปตามข้อกำหนดต่อไปนี้
เริ่มต้น HAL
ต้องมีการรองรับฟังก์ชัน initialize()
เพื่อสร้าง Callback ระหว่างการใช้งาน Sub-HAL กับการใช้งาน Multi-HAL
แสดงเซ็นเซอร์ที่ใช้ได้
ในเซ็นเซอร์ Multi-HAL 2.0 ฟังก์ชัน getSensorsList()
ต้องแสดงค่าเดียวกันระหว่างการเปิดเครื่องอุปกรณ์เดียว แม้ว่าจะมีการรีสตาร์ท HAL ของเซ็นเซอร์ก็ตาม วิธีนี้ช่วยให้เฟรมเวิร์กสามารถพยายามเริ่มต้นการเชื่อมต่อเซ็นเซอร์อีกครั้งหากเซิร์ฟเวอร์ระบบรีสตาร์ท ค่าที่ getSensorsList()
แสดงผลอาจเปลี่ยนแปลงได้หลังจากอุปกรณ์รีบูต
โพสต์เหตุการณ์เซ็นเซอร์ไปจนถึงการใช้งาน Multi-HAL
ในเซ็นเซอร์ HAL 2.0 แทนที่จะรอให้มีการเรียก poll()
เฮลย่อยต้องเขียนเหตุการณ์เซ็นเซอร์ไปยัง IHalProxyCallback
ด้วยตนเองเมื่อใดก็ตามที่มีเหตุการณ์เซ็นเซอร์เกิดขึ้น
กิจกรรม WAKE_UP
ใน Sensors HAL 1.0 HAL จะจัดการ Wake Lock สำหรับการติดตั้งใช้งานได้ ในเซ็นเซอร์ Multi-HAL 2.0 นั้น HAL ย่อยช่วยให้การใช้งาน Multi-HAL จัดการ Wake Lock ได้ และอาจขอให้รับ Wake Lock ด้วยการเรียกใช้ createScopedWakelock
ต้องรับ Wake Lock ที่กำหนดขอบเขตล็อกและส่งไปยัง postEvents
เมื่อโพสต์เหตุการณ์การปลุกระบบไปยังการใช้งาน Multi-HAL
เซ็นเซอร์แบบไดนามิก
ในเซ็นเซอร์ HAL 1.0 เซ็นเซอร์แบบไดนามิกจะแสดงผลผ่านฟังก์ชัน poll()
เซ็นเซอร์ Multi-HAL 2.0 กำหนดให้ต้องเรียกใช้ onDynamicSensorsConnected
และ onDynamicSensorsDisconnected
ใน IHalProxyCallback
เมื่อการเชื่อมต่อเซ็นเซอร์แบบไดนามิกมีการเปลี่ยนแปลง Callback เหล่านี้พร้อมใช้งานโดยเป็นส่วนหนึ่งของตัวชี้ IHalProxyCallback
ที่ให้ไว้ผ่านฟังก์ชัน initialize()
พอร์ตจากเซ็นเซอร์ Multi-HAL 1.0
หากต้องการโอนการติดตั้งใช้งานที่มีอยู่จาก Sensors Multi-HAL 1.0 ให้ทำตามขั้นตอนต่อไปนี้
- ตรวจสอบว่าการกำหนดค่า HAL ของเซ็นเซอร์อยู่ที่
/vendor/etc/sensors/hals.conf
ซึ่งอาจต้องย้ายไฟล์ซึ่งอยู่ที่/system/etc/sensors/hals.conf
- นำการอ้างอิงถึง
hardware/hardware.h
และhardware/sensors.h
ออกเนื่องจาก HAL 2.0 ไม่รองรับ - พอร์ตย่อย HAL ของพอร์ตตามที่อธิบายไว้ในการพอร์ตจาก Sensors Hal 1.0
- ตั้งค่า Sensors Multi-HAL 2.0 เป็น HAL ที่กำหนดโดยทำตามขั้นตอนที่ 3 และ 4 ในส่วนการใช้งาน Sensors Mutli-HAL 2.0
การตรวจสอบความถูกต้อง
เรียกใช้ VTS
เมื่อผสานรวม HAL ย่อยอย่างน้อย 1 รายการกับ Sensors Multi-Hal 2.1 แล้ว ให้ใช้ชุดทดสอบผู้ให้บริการ (VTS) เพื่อให้การติดตั้งใช้งาน HAL ย่อยเป็นไปตามข้อกำหนดทั้งหมดที่กำหนดโดยอินเทอร์เฟซ Sensors HAL
หากต้องการเรียกใช้เฉพาะการทดสอบ VTS เซ็นเซอร์เมื่อตั้งค่า VTS ในเครื่องโฮสต์ ให้เรียกใช้คำสั่งต่อไปนี้
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsHalSensorsV2_0Target && \
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsHalSensorsV2_1Target
หากกำลังใช้เลเยอร์ shim ของ AIDL Multi-HAL ให้เรียกใช้ VtsAidlHalSensorsTargetTest
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsAidlHalSensorsTargetTest
เรียกใช้การทดสอบหน่วย
การทดสอบ 1 หน่วยในการทดสอบ HalProxy_test.cpp
HalProxy
โดยใช้ HAL ย่อยปลอมซึ่งสร้างขึ้นในการทดสอบ 1 หน่วยและไม่ได้โหลดแบบไดนามิก เมื่อสร้าง HAL ย่อยใหม่ การทดสอบเหล่านี้ควรเป็นแนวทางในการเพิ่มการทดสอบ 1 หน่วยที่ยืนยันว่ามีการใช้งาน HAL ย่อยใหม่อย่างถูกต้อง
หากต้องการทำการทดสอบ ให้เรียกใช้คำสั่งต่อไปนี้
cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest
ทดสอบด้วย HAL ปลอม
HAL ปลอมคือการใช้งานอินเทอร์เฟซ ISensorsSubHal
ปลอม
HAL ย่อยจะแสดงรายการเซ็นเซอร์ที่แตกต่างกัน เมื่อเปิดใช้งานเซ็นเซอร์แล้ว ระบบจะโพสต์เหตุการณ์ที่เซ็นเซอร์สร้างขึ้นโดยอัตโนมัติเป็นระยะๆ ไปยัง HalProxy
โดยอิงตามช่วงเวลาที่ระบุไว้ในคำขอเซ็นเซอร์ดังกล่าว
HAL ปลอมสามารถใช้เพื่อทดสอบว่าโค้ด Multi-HAL ที่สมบูรณ์ทำงานร่วมกับ HAL ย่อยอื่นๆ ที่โหลดเข้ามาในระบบและเพื่อเน้นแง่มุมต่างๆ ของโค้ด Multi-HAL ของเซ็นเซอร์
มี HAL ปลอม 2 รายการอยู่ที่ hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
หากต้องการสร้างและพุช HAL ย่อยไปยังอุปกรณ์ ให้ทำตามขั้นตอนต่อไปนี้
เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างและพุช HAL ย่อยที่แตกต่างกันทั้ง 3 รายการไปยังอุปกรณ์
$ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests/
mma
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
อัปเดตการกำหนดค่า HAL ของเซ็นเซอร์ที่
/vendor/etc/sensors/hals.conf
ด้วยเส้นทางสำหรับ HAL ย่อยที่ปลอมแปลง/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
รีสตาร์ท
HalProxy
และโหลด HAL ย่อยใหม่ที่แสดงในการกำหนดค่าadb shell stop
adb shell start
การแก้ไขข้อบกพร่อง
นักพัฒนาซอฟต์แวร์จะแก้ไขข้อบกพร่องของเฟรมเวิร์กได้โดยใช้คำสั่ง lshal
หากต้องการขอผลลัพธ์การแก้ไขข้อบกพร่องของ Sensors HAL ให้เรียกใช้คำสั่งต่อไปนี้
adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default
จากนั้นระบบจะส่งออกข้อมูลเกี่ยวกับสถานะปัจจุบันของ HalProxy
และ HAL ย่อยไปยังเทอร์มินัล ด้านล่างนี้เป็นตัวอย่างเอาต์พุตคำสั่งสำหรับออบเจ็กต์ HalProxy
และ HAL ย่อยปลอม
Internal values:
Threads are running: true
Wakelock timeout start time: 200 ms ago
Wakelock timeout reset time: 73208 ms ago
Wakelock ref count: 0
# of events on pending write queue: 0
# of non-dynamic sensors across all subhals: 8
# of dynamic sensors across all subhals: 0
SubHals (2):
Name: FakeSubHal-OnChange
Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
Name: FakeSubHal-OnChange
Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
หากตัวเลขที่ระบุสำหรับ # of events on pending write queue
เป็นเลขขนาดใหญ่ (1,000 หรือมากกว่า) แสดงว่ามีเหตุการณ์จำนวนมากรอดำเนินการเขียนลงในเฟรมเวิร์กของเซ็นเซอร์ ซึ่งแสดงว่าบริการเซ็นเซอร์ถูกล็อกหรือขัดข้องและไม่ได้ประมวลผลเหตุการณ์เซ็นเซอร์ หรือมีการโพสต์เหตุการณ์เซ็นเซอร์จำนวนมากจาก HAL ย่อยเมื่อเร็วๆ นี้
หากจำนวนการอ้างอิง Wake Lock มากกว่า 0
หมายความว่า HalProxy
ได้ Wake Lock แล้ว ซึ่งควรมากกว่า 0
เฉพาะในกรณีที่ระบบระงับ ScopedWakelock
ไว้โดยตั้งใจ หรือมีการส่งเหตุการณ์การปลุกระบบไปยัง HalProxy
และเฟรมเวิร์กเซ็นเซอร์ยังไม่ได้ประมวลผล
ระบบจะส่งข้อบ่งชี้ไฟล์ที่ส่งไปยังวิธีการแก้ไขข้อบกพร่องของ HalProxy
ไปยัง HAL ย่อยแต่ละรายการ ดังนั้นนักพัฒนาซอฟต์แวร์จึงต้องนำวิธีการแก้ไขข้อบกพร่องดังกล่าวไปใช้เป็นส่วนหนึ่งของอินเทอร์เฟซ ISensorsSubHal