เซ็นเซอร์ Multi-HAL

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.0

  • hardware/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

หากต้องการให้ความสามารถในการทำงานแบบหลาย 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 ในอุปกรณ์เครื่องใหม่ ให้ทำตามขั้นตอนต่อไปนี้

  1. ใช้อินเทอร์เฟซ ISensorsSubHal ตามที่อธิบายไว้ใน SubHal.h
  2. ใช้เมธอด sensorsHalGetSubHal_2_1 ใน SubHal.h
  3. เพิ่มเป้าหมาย cc_library_shared เพื่อสร้าง 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.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.0 SubHal
  • 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 ให้ทำตามขั้นตอนต่อไปนี้

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

  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 หากต้องการขอผลลัพธ์การแก้ไขข้อบกพร่องของ 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