เซนเซอร์ Multi-HAL

เซ็นเซอร์ 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.0

  • hardware/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 ด้วยเซ็นเซอร์ 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 บนอุปกรณ์ใหม่ ให้ทำตามขั้นตอนเหล่านี้:

  1. ใช้อินเทอร์เฟ ISensorsSubHal ตามที่อธิบายไว้ใน SubHal.h
  2. ใช้วิธี sensorsHalGetSubHal_2_1 ใน SubHal.h
  3. เพิ่มเป้าหมาย cc_library_shared เพื่อสร้าง sub-HAL ที่นำมาใช้ใหม่ เมื่อเพิ่มเป้าหมาย:

    1. ตรวจสอบให้แน่ใจว่าเป้าหมายถูกผลักไปที่ใดที่หนึ่งบนพาร์ติชันผู้จำหน่ายของอุปกรณ์
    2. ในไฟล์กำหนดค่าที่ /vendor/etc/sensors/hals.conf ให้เพิ่มพาธไปยังไลบรารีในบรรทัดใหม่ หากจำเป็น ให้สร้างไฟล์ hals.conf

    สำหรับตัวอย่างรายการ Android.bp สำหรับการสร้างไลบรารี่ย่อย HAL โปรดดูที่ hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp

  4. ลบรายการ android.hardware.sensors ทั้งหมดออกจากไฟล์ manifest.xml ซึ่งมีรายการ HAL ที่รองรับบนอุปกรณ์

  5. ลบไฟล์ 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.0 SubHal
  • 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 ให้ทำตามขั้นตอนเหล่านี้

  1. ตรวจสอบให้แน่ใจว่าการกำหนดค่าเซ็นเซอร์ HAL อยู่ที่ /vendor/etc/sensors/hals.conf. ซึ่งอาจเกี่ยวข้องกับการย้ายไฟล์ที่อยู่ที่ /system/etc/sensors/hals.conf
  2. ลบการอ้างอิงถึง hardware/hardware.h และ hardware/sensors.h เนื่องจากไม่รองรับ HAL 2.0
  3. พอร์ตย่อย HAL ตามที่อธิบายไว้ใน การย้ายจากเซ็นเซอร์ Hal 1.0
  4. ตั้งค่าเซ็นเซอร์ 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 ย่อยปลอมไปยังอุปกรณ์ ให้ทำตามขั้นตอนต่อไปนี้:

  1. รันคำสั่งต่อไปนี้เพื่อสร้างและพุช 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
    
  2. อัปเดตการกำหนดค่าเซ็นเซอร์ 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
    
  3. รีสตาร์ท 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