เซ็นเซอร์ Multi-HAL เป็นเฟรมเวิร์กที่ช่วยให้เซ็นเซอร์ HAL ทำงานควบคู่ไปกับเซ็นเซอร์ HAL อื่นๆ Sensors Multi-HAL จะโหลด HAL ย่อยของเซ็นเซอร์ที่จัดเก็บเป็นไลบรารีไดนามิกบนพาร์ติชันของผู้จำหน่ายแบบไดนามิก และให้ออบเจ็กต์การโทรกลับที่สามารถจัดการการโพสต์เหตุการณ์ ตลอดจนการรับและปลดล็อคการปลุกระบบได้ เซ็นเซอร์ sub-HAL คือเซ็นเซอร์ HAL ที่สร้างขึ้นในออบเจ็กต์ที่ใช้ร่วมกันบนพาร์ติชันของผู้จำหน่าย และใช้งานโดยเฟรมเวิร์ก multi-HAL HAL ย่อยเหล่านี้ไม่ได้ขึ้นอยู่กับอีกอันหนึ่งหรือขึ้นอยู่กับโค้ด multi-HAL ที่มีฟังก์ชันหลักสำหรับกระบวนการ
เซ็นเซอร์ Multi-HAL 2.1 ซึ่งพร้อมใช้งานบนอุปกรณ์ที่ใช้ Android 11 ขึ้นไป เป็นการทำซ้ำของเซ็นเซอร์ Multi-HAL 2.0 ที่รองรับการโหลด HAL ย่อยที่สามารถเปิดเผยประเภทเซ็นเซอร์ มุมบานพับ ได้ เพื่อรองรับเซ็นเซอร์ประเภทนี้ sub-HAL ต้องใช้ sub-HAL API ที่กำหนดไว้ใน ส่วนหัว 2.1 SubHal
สำหรับอุปกรณ์ที่ใช้ Android 13 ขึ้นไปที่ใช้ เซ็นเซอร์ AIDL HAL คุณสามารถใช้เลเยอร์ชิม HAL หลายชั้นเพื่ออนุญาตความสามารถหลาย HAL ได้ สำหรับรายละเอียดการใช้งาน โปรดดูที่ การใช้เซ็นเซอร์ Multi-HAL กับเซ็นเซอร์ AIDL HAL
ความแตกต่างระหว่างเซ็นเซอร์ Multi-HAL 2 และเซ็นเซอร์ HAL 2
Sensors Multi-HAL 2 พร้อมใช้งานบนอุปกรณ์ที่ใช้ Android 10 หรือสูงกว่า นำเสนอสิ่งที่เป็นนามธรรมหลายอย่างนอกเหนือจาก เซ็นเซอร์ HAL 2 เพื่อให้โต้ตอบกับ HAL API ได้ง่ายขึ้น เซ็นเซอร์ Multi-HAL 2 แนะนำคลาส HalProxy เพื่อจัดการการใช้งานอินเทอร์เฟซเซ็นเซอร์ HAL 2 และอินเทอร์เฟ V2_1/SubHal
(หรือ V2_0/SubHal
) เพื่อให้ HalProxy
สามารถโต้ตอบกับ HAL ย่อยได้
อินเทอร์เฟซ ISensorsSubHal
แตกต่างจากอิน 2.1/ISensors.hal
(หรือ 2.0/ISensors.hal
) ในลักษณะต่อไปนี้:
- วิธีการเริ่มต้นผ่านคลาส
IHalProxyCallback
แทนที่จะเป็น FMQ และISensorsCallback
สองตัว - Sub-HAL ต้องใช้ฟังก์ชันดีบักเพื่อให้ข้อมูลการดีบักในรายงานข้อบกพร่อง
- Sub-HAL ต้องใช้ฟังก์ชันชื่อเพื่อให้ sub-HAL ที่โหลดสามารถแยกแยะได้จาก sub-HAL อื่น ๆ
ความแตกต่างที่สำคัญระหว่างเซ็นเซอร์ Multi-HAL 2 และเซ็นเซอร์ HAL 2 อยู่ที่ฟังก์ชันการเริ่มต้น แทนที่จะจัดเตรียม FMQ อินเทอร์เฟซ IHalProxyCallback
มีสองวิธี วิธีหนึ่งในการโพสต์เหตุการณ์เซ็นเซอร์ไปยังเฟรมเวิร์กเซ็นเซอร์ และวิธีการหนึ่งในการสร้างล็อคปลุก ภายใต้ฝากระโปรงหน้า เซ็นเซอร์ Multi-HAL จะจัดการการโต้ตอบทั้งหมดกับ FMQ เพื่อให้มั่นใจว่ามีการส่งเหตุการณ์เซ็นเซอร์อย่างทันท่วงทีสำหรับ HAL ย่อยทั้งหมด ขอแนะนำอย่างยิ่งให้ HAL ย่อยใช้วิธี createScopedWakelock
เพื่อมอบหมายภาระในการหมดเวลาล็อคการทำงานให้กับเซ็นเซอร์ Multi-HAL และเพื่อรวมการใช้งานล็อคปลุกการทำงานไว้ที่หนึ่งล็อคปลุกทั่วไปสำหรับเซ็นเซอร์ Multi-HAL ทั้งหมด ซึ่งจะลดการล็อคและการปลดล็อคให้เหลือน้อยที่สุด โทร
เซ็นเซอร์ Multi-HAL 2 ยังมีคุณสมบัติด้านความปลอดภัยในตัวอีกด้วย โดยจะจัดการกับสถานการณ์ที่เซ็นเซอร์ FMQ เต็มหรือที่เฟรมเวิร์กเซ็นเซอร์ Android รีสตาร์ทและจำเป็นต้องรีเซ็ตสถานะเซ็นเซอร์ นอกจากนี้ เมื่อมีการโพสต์เหตุการณ์ไปยังคลาส HalProxy
แต่เฟรมเวิร์กเซ็นเซอร์ไม่สามารถยอมรับเหตุการณ์ได้ทันที Multi-HAL ของเซ็นเซอร์สามารถย้ายเหตุการณ์ไปยังเธรดพื้นหลังเพื่อให้งานดำเนินต่อไปใน HAL ย่อยทั้งหมดในขณะที่รอเหตุการณ์ ที่จะโพสต์
ซอร์สโค้ดและการใช้งานอ้างอิง
รหัส Multi-HAL ของเซ็นเซอร์ทั้งหมดมีอยู่ใน hardware/interfaces/sensors/common/default/2.X/multihal/
ต่อไปนี้คือคำแนะนำไปยังแหล่งข้อมูลบางส่วน
-
HalProxy.h
: ออบเจ็กต์HalProxy
ได้รับการสร้างอินสแตนซ์โดย Sensors multi-HAL และจัดการการส่งผ่านข้อมูลจาก HAL ย่อยไปยังเฟรมเวิร์กของเซ็นเซอร์ -
HalProxy.cpp
: การใช้งานHalProxy
ประกอบด้วยตรรกะทั้งหมดที่จำเป็นสำหรับการสื่อสารแบบมัลติเพล็กซ์ระหว่าง sub-HAL และเฟรมเวิร์กเซ็นเซอร์ SubHal.h
: อินเทอร์เฟซISensorsSubHal
กำหนดอินเทอร์เฟซที่ sub-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/
: การใช้งาน sub-HAL ตัวอย่างนี้ใช้เซ็นเซอร์ปลอมเพื่อสร้างข้อมูลปลอม มีประโยชน์สำหรับการทดสอบว่า HAL ย่อยหลายตัวโต้ตอบบนอุปกรณ์อย่างไร
การนำไปปฏิบัติ
ส่วนนี้อธิบายวิธีการใช้เซ็นเซอร์ Multi-HAL ในสถานการณ์ต่อไปนี้:
- การใช้เซ็นเซอร์ Multi-HAL กับเซ็นเซอร์ AIDL HAL
- การใช้เซ็นเซอร์ Multi-HAL 2.1
- การย้ายจากเซ็นเซอร์ Multi-HAL 2.0 ไปยัง Multi-HAL 2.1
- การย้ายจากเซ็นเซอร์ HAL 2.0
- การย้ายจากเซ็นเซอร์ HAL 1.0
- การย้ายจากเซ็นเซอร์ Multi-HAL 1.0
ใช้เซ็นเซอร์ Multi-HAL กับเซ็นเซอร์ AIDL HAL
หากต้องการอนุญาตความสามารถ multi-HAL ด้วยเซ็นเซอร์ AIDL HAL ให้นำเข้าโมดูลเลเยอร์ AIDL Multi-HAL ซึ่งพบได้ใน ฮาร์ดแวร์/อินเทอร์เฟซ/เซ็นเซอร์/aidl/default/multihal/ โมดูลจะจัดการการแปลงระหว่างเซ็นเซอร์ AIDL และ HIDL ประเภทคำจำกัดความ HAL และกำหนด wrapper รอบอินเทอร์เฟซ multi-HAL ที่อธิบายไว้ใน การใช้เซ็นเซอร์ Multi-HAL 2.1 แผ่นชิม AIDL multi-HAL เข้ากันได้กับอุปกรณ์ที่ใช้เซ็นเซอร์ Multi-HAL 2.1
ชั้นชิม AIDL หลาย HAL ช่วยให้คุณสามารถแสดงตัวติดตามส่วนหัวและประเภทเซ็นเซอร์ 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
เพื่อสร้าง sub-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 และservice.rc
ทั้งหมดออกจากไฟล์device.mk
และเพิ่มandroid.hardware.sensors@2.1-service.multihal
และandroid.hardware.sensors@2.1-service.multihal.rc
ในPRODUCT_PACKAGES
เมื่อบู๊ตเครื่อง HalProxy
จะเริ่มทำงาน ค้นหา sub-HAL ที่เพิ่งนำมาใช้ใหม่ และเริ่มต้นได้โดยการเรียก sensorsHalGetSubHal_2_1
พอร์ตจากเซ็นเซอร์ Multi-HAL 2.0 ถึง Multi-HAL 2.1
หากต้องการย้ายจาก Multi-HAL 2.0 ไปเป็น Multi-HAL 2.1 ให้ใช้อินเทอร์เฟ SubHal
และคอมไพล์ sub-HAL ของคุณใหม่
นี่คือความแตกต่างระหว่างอินเทอร์เฟ SubHal
2.0 และ 2.1:
-
IHalProxyCallback
ใช้ประเภทที่สร้างขึ้นในเวอร์ชัน 2.1 ของข้อกำหนดISensors.hal
- ฟังก์ชัน
initialize()
ส่งผ่านIHalProxyCallback
ใหม่แทนที่จะเป็นอันจากอินเทอร์เฟซ 2.0SubHal
- Sub-HAL ต้องใช้
getSensorsList_2_1
และinjectSensorData_2_1
แทนgetSensorsList
และinjectSensorData
เนื่องจากวิธีการเหล่านี้ใช้ประเภทใหม่ที่เพิ่มในเวอร์ชัน 2.1 ของข้อกำหนดISensors.hal
- Sub-HAL ต้องเปิดเผย
sensorsHalGetSubHal_2_1
แทนที่จะเป็นsensorsHalGetSubHal
เพื่อให้ Multi-HAL ถือเป็นเวอร์ชัน 2.1 sub-HAL
พอร์ตจากเซนเซอร์ HAL 2.0
เมื่ออัปเกรดเป็นเซ็นเซอร์ Multi-HAL 2.0 จาก เซ็นเซอร์ HAL 2.0 ตรวจสอบให้แน่ใจว่าการใช้งาน HAL ตรงตามข้อกำหนดต่อไปนี้
เริ่มต้น HAL
เซ็นเซอร์ HAL 2.0 มีฟังก์ชันเริ่มต้นที่ช่วยให้บริการเซ็นเซอร์ส่งผ่าน FMQ และการเรียกกลับเซ็นเซอร์แบบไดนามิก ใน Sensors Multi-HAL 2.0 ฟังก์ชัน initialize()
จะส่งผ่านการโทรกลับครั้งเดียวซึ่งต้องใช้เพื่อโพสต์เหตุการณ์เซ็นเซอร์ รับ Wake Lock และแจ้งเตือนการเชื่อมต่อและการตัดการเชื่อมต่อเซ็นเซอร์แบบไดนามิก
โพสต์เหตุการณ์เซ็นเซอร์ไปยังการใช้งาน Multi-HAL
แทนที่จะโพสต์เหตุการณ์เซ็นเซอร์ผ่าน FMQ Sub-HAL จะต้องเขียนเหตุการณ์เซ็นเซอร์ไปยัง IHalProxyCallback
เมื่อมีเหตุการณ์เซ็นเซอร์
กิจกรรม WAKE_UP
ในเซ็นเซอร์ HAL 2.0 นั้น HAL สามารถจัดการล็อคปลุกสำหรับการใช้งานได้ ใน Sensors Multi-HAL 2.0 นั้น sub-HAL อนุญาตให้ใช้งาน Multi-HAL เพื่อจัดการ Wake Lock และสามารถขอ Wake Lock ได้โดยการเรียกใช้ createScopedWakelock
ต้องรับการล็อคการทำงานที่มีขอบเขตที่ถูกล็อคและส่งผ่านไปยัง postEvents
เมื่อโพสต์เหตุการณ์การปลุกไปยังการใช้งาน Multi-HAL
เซ็นเซอร์แบบไดนามิก
เซ็นเซอร์ Multi-HAL 2.0 กำหนดให้ onDynamicSensorsConnected
และ onDynamicSensorsDisconnected
ใน IHalProxyCallback
จะถูกเรียกเมื่อใดก็ตามที่การเชื่อมต่อเซ็นเซอร์แบบไดนามิกเปลี่ยนแปลง การเรียกกลับเหล่านี้พร้อมใช้งานเป็นส่วนหนึ่งของตัวชี้ IHalProxyCallback
ที่ให้ไว้ผ่านฟังก์ชัน initialize()
พอร์ตจากเซนเซอร์ HAL 1.0
เมื่ออัปเกรดเป็นเซ็นเซอร์ Multi-HAL 2.0 จาก เซ็นเซอร์ HAL 1.0 ตรวจสอบให้แน่ใจว่าการใช้งาน HAL ตรงตามข้อกำหนดต่อไปนี้
เริ่มต้น HAL
ต้องรองรับฟังก์ชัน initialize()
เพื่อสร้างการเรียกกลับระหว่าง sub-HAL และการใช้งาน Multi-HAL
เปิดเผยเซ็นเซอร์ที่มีอยู่
ใน Sensors Multi-HAL 2.0 ฟังก์ชัน getSensorsList()
จะต้องส่งคืนค่าเดียวกันระหว่างการบู๊ตอุปกรณ์เครื่องเดียว แม้ว่า HAL จะรีสตาร์ทข้ามเซ็นเซอร์ก็ตาม ซึ่งช่วยให้เฟรมเวิร์กพยายามสร้างการเชื่อมต่อเซ็นเซอร์อีกครั้งหากเซิร์ฟเวอร์ระบบรีสตาร์ท ค่าที่ส่งคืนโดย getSensorsList()
สามารถเปลี่ยนแปลงได้หลังจากที่อุปกรณ์ทำการรีบูต
โพสต์เหตุการณ์เซ็นเซอร์ไปยังการใช้งาน Multi-HAL
ในเซ็นเซอร์ HAL 2.0 แทนที่จะรอให้มีการเรียก poll()
sub-HAL จะต้องเขียนเหตุการณ์เซ็นเซอร์ในเชิงรุกไปยัง IHalProxyCallback
ทุกครั้งที่มีเหตุการณ์เซ็นเซอร์
กิจกรรม WAKE_UP
ในเซ็นเซอร์ HAL 1.0 นั้น HAL สามารถจัดการล็อคปลุกสำหรับการใช้งานได้ ใน Sensors Multi-HAL 2.0 นั้น sub-HAL ช่วยให้การใช้งาน Multi-HAL สามารถจัดการ Wake Lock และสามารถขอ Wake Lock ได้โดยการเรียกใช้ createScopedWakelock
ต้องรับการล็อคการทำงานที่มีขอบเขตที่ถูกล็อคและส่งผ่านไปยัง postEvents
เมื่อโพสต์เหตุการณ์การปลุกไปยังการใช้งาน Multi-HAL
เซ็นเซอร์แบบไดนามิก
ในเซ็นเซอร์ HAL 1.0 เซ็นเซอร์แบบไดนามิกจะถูกส่งกลับผ่านฟังก์ชัน poll()
เซ็นเซอร์ Multi-HAL 2.0 กำหนดให้ onDynamicSensorsConnected
และ onDynamicSensorsDisconnected
ใน IHalProxyCallback
จะถูกเรียกเมื่อใดก็ตามที่การเชื่อมต่อเซ็นเซอร์แบบไดนามิกเปลี่ยนแปลง การเรียกกลับเหล่านี้พร้อมใช้งานเป็นส่วนหนึ่งของตัวชี้ 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 ตามที่อธิบายไว้ใน การย้ายจากเซ็นเซอร์ Hal 1.0
- ตั้งค่าเซ็นเซอร์ Multi-HAL 2.0 เป็น HAL ที่กำหนดโดยทำตามขั้นตอนที่ 3 และ 4 ในส่วน การนำเซ็นเซอร์ไปใช้ Mutli-HAL 2.0
การตรวจสอบ
เรียกใช้ VTS
เมื่อคุณรวม HAL ย่อยอย่างน้อย 1 รายการเข้ากับ Sensors Multi-Hal 2.1 ให้ใช้ Vendor Test Suite (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
หากคุณกำลังเรียกใช้เลเยอร์ชิม AIDL Multi-HAL ให้เรียกใช้ VtsAidlHalSensorsTargetTest
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsAidlHalSensorsTargetTest
เรียกใช้การทดสอบหน่วย
การทดสอบหน่วยใน HalProxy_test.cpp
ทดสอบ HalProxy
โดยใช้ HAL ย่อยปลอมที่สร้างอินสแตนซ์ในการทดสอบหน่วยและไม่ได้โหลดแบบไดนามิก เมื่อสร้าง sub-HAL ใหม่ การทดสอบเหล่านี้ควรทำหน้าที่เป็นแนวทางในการเพิ่มการทดสอบหน่วยที่ตรวจสอบว่ามีการใช้ 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 ย่อยปลอมสองตัวมีอยู่ที่ 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
หากต้องการร้องขอเอาต์พุตการตรวจแก้จุดบกพร่องของเซ็นเซอร์ 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 ย่อยเมื่อเร็วๆ นี้
หากจำนวนการอ้างอิงการล็อคปลุกมากกว่า 0
แสดงว่า HalProxy
ได้รับการล็อคปลุกแล้ว ค่านี้ควรมีค่ามากกว่า 0
หาก ScopedWakelock
ถูกจงใจจัดขึ้น หรือหากเหตุการณ์การปลุกถูกส่งไปยัง HalProxy
และไม่ได้รับการประมวลผลโดยเฟรมเวิร์กเซ็นเซอร์
ตัวอธิบายไฟล์ที่ส่งผ่านไปยังวิธีการดีบักของ HalProxy
จะถูกส่งผ่านไปยัง HAL ย่อยแต่ละอัน ดังนั้นนักพัฒนาจะต้องนำวิธีการดีบักไปใช้เป็นส่วนหนึ่งของอินเทอร์เฟซ ISensorsSubHal