مجسات Multi-HAL

Sensors Multi-HAL هو إطار عمل يسمح لأجهزة الاستشعار HALs بالعمل جنبًا إلى جنب مع HALs الأخرى الخاصة بالمستشعرات. تقوم Sensors Multi-HAL بتحميل مستشعرات HAL الفرعية بشكل ديناميكي كمكتبات ديناميكية على قسم البائع وتمنحهم كائن رد اتصال يمكنه التعامل مع أحداث الترحيل والحصول على قفل التنبيه وتحريره. تعد HAL أجهزة الاستشعار الفرعية عبارة عن مستشعرات HAL مضمنة في كائن مشترك على قسم البائع ويتم استخدامها بواسطة إطار عمل HAL متعدد. لا تعتمد HALs الفرعية هذه على بعضها البعض أو على كود HAL المتعدد الذي يحتوي على الوظيفة الرئيسية للعملية.

المستشعرات Multi-HAL 2.1 ، المتوفرة على الأجهزة التي تعمل بنظام Android 11 أو أعلى ، هي تكرار لأجهزة الاستشعار Multi-HAL 2.0 التي تدعم تحميل HALs الفرعية التي يمكنها كشف نوع مستشعر زاوية المفصلة . لدعم هذا النوع من أجهزة الاستشعار ، يجب أن تستخدم HALs الفرعية واجهات برمجة تطبيقات HAL الفرعية المحددة في رأس 2.1 SubHal .

الفرق بين المستشعرات Multi-HAL 2 والمستشعرات HAL 2

تقدم المستشعرات Multi-HAL 2 ، المتوفرة على الأجهزة التي تعمل بنظام Android 10 أو أعلى ، العديد من التجريدات فوق أجهزة الاستشعار HAL 2 لتسهيل التفاعل مع واجهات برمجة تطبيقات HAL. تقدم المستشعرات Multi-HAL 2 فئة HalProxy للتعامل مع تنفيذ واجهة Sensors HAL 2 وواجهة V2_1/SubHal (أو V2_0/SubHal ) للسماح لـ HalProxy بالتفاعل مع HALs الفرعية.

تختلف واجهة ISensorsSubHal الواجهة 2.1/ISensors.hal (أو 2.0/ISensors.hal ) بالطرق التالية:

  • يمرر أسلوب التهيئة فئة IHalProxyCallback بدلاً من جهازي FMQ و ISensorsCallback .
  • يجب أن تقوم HALs الفرعية بتنفيذ وظيفة تصحيح الأخطاء لتوفير معلومات تصحيح الأخطاء في تقارير الأخطاء.
  • يجب أن تقوم Sub-HALs بتنفيذ دالة اسم حتى يمكن تمييز HAL الفرعي المحمل عن HALs الفرعية الأخرى.

يكمن الاختلاف الرئيسي بين Sensors Multi-HAL 2 و Sensors HAL 2 في وظائف التهيئة. بدلاً من توفير FMQs ، توفر واجهة IHalProxyCallback طريقتين ، طريقة واحدة لنشر أحداث المستشعر في إطار عمل المستشعرات وطريقة واحدة لإنشاء أقفال التنبيه. تحت الغطاء ، يدير Sensors Multi-HAL جميع التفاعلات مع FMQs لضمان التسليم في الوقت المناسب لأحداث المستشعر لجميع HALs الفرعية. يوصى بشدة أن تستخدم HALs الفرعية طريقة createScopedWakelock لتفويض عبء توقيت أقفال التنبيه إلى Sensors Multi-HAL ولتركيز استخدام قفل التنشيط على قفل تنشيط مشترك واحد لأجهزة Sensors Multi-HAL بأكملها ، مما يقلل من القفل وفتح القفل المكالمات.

تحتوي المستشعرات Multi-HAL 2 أيضًا على بعض ميزات الأمان المضمنة. إنه يتعامل مع المواقف التي يكون فيها جهاز الاستشعار FMQ ممتلئًا أو حيث يتم إعادة تشغيل إطار عمل مستشعر Android وتحتاج إلى إعادة تعيين حالة المستشعر. بالإضافة إلى ذلك ، عند نشر الأحداث في فئة HalProxy ولكن إطار عمل المستشعر غير قادر على قبول الأحداث على الفور ، يمكن لـ Sensors Multi-HAL نقل الأحداث إلى سلسلة رسائل في الخلفية للسماح بمواصلة العمل عبر جميع HALs الفرعية أثناء انتظار الأحداث ليتم نشرها.

شفرة المصدر وتنفيذ المرجع

يتوفر كود Multi-HAL لجميع أجهزة الاستشعار في hardware/interfaces/sensors/common/default/2.X/multihal/ . فيما يلي بعض المؤشرات.

  • HalProxy.h : يتم إنشاء كائن HalProxy بواسطة Sensors multi-HAL ويتولى نقل البيانات من HALs الفرعية إلى إطار عمل المستشعر.
  • HalProxy.cpp : يحتوي تطبيق HalProxy على كل المنطق اللازم لاتصالات تعدد الإرسال بين HALs وإطار عمل المستشعر.
  • SubHal.h : تحدد واجهة ISensorsSubHal الواجهة التي يجب أن تتبعها HALs الفرعية لتكون متوافقة مع HalProxy . يطبق HAL الفرعي طريقة التهيئة بحيث يمكن استخدام كائن HalProxyCallback لـ postEvents و createScopedWakelock .

    بالنسبة لعمليات تنفيذ Multi-HAL 2.0 ، استخدم الإصدار 2.0 من SubHal.h .

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/ : تتحقق اختبارات الوحدة هذه من تنفيذ HalProxy .

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/ : يستخدم هذا المثال لتنفيذ HAL الفرعي مستشعرات مزيفة لإنشاء بيانات مزيفة. مفيد لاختبار كيفية تفاعل HALs الفرعية المتعددة على الجهاز.

تطبيق

يصف هذا القسم كيفية تنفيذ Sensors Multi-HAL في المواقف التالية:

تنفيذ مجسات Multi-HAL 2.1

لتنفيذ Sensors Multi-HAL 2.1 على جهاز جديد ، اتبع الخطوات التالية:

  1. قم بتنفيذ واجهة ISensorsSubHal كما هو موضح في SubHal.h .
  2. قم بتطبيق طريقة sensorsHalGetSubHal_2_1 في SubHal.h .
  3. قم بإضافة هدف cc_library_shared لإنشاء طبقة تجريد الأجهزة الفرعية المنفذة حديثًا. عند إضافة الهدف:

    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 ، الذي يحتوي على قائمة HALs المدعومة على الجهاز.

  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 الفرعي.

هذه هي الاختلافات بين واجهات 2.0 و 2.1 SubHal :

  • يستخدم IHalProxyCallback الأنواع التي تم إنشاؤها في الإصدار 2.1 من ISensors.hal .
  • تقوم وظيفة initialize() بتمرير IHalProxyCallback جديد بدلاً من تلك الموجودة في واجهة 2.0 SubHal
  • يجب أن تقوم HALs الفرعية بتنفيذ getSensorsList_2_1 و injectSensorData_2_1 بدلاً من getSensorsList و injectSensorData لأن هذه الطرق تستخدم الأنواع الجديدة المضافة في الإصدار 2.1 من مواصفات ISensors.hal .
  • يجب أن تعرض HALs الفرعية sensorsHalGetSubHal_2_1 بدلاً من sensorsHalGetSubHal لـ Multi-HAL للتعامل معها كإصدار 2.1 sub-HAL.

المنفذ من مستشعرات HAL 2.0

عند الترقية إلى Sensors Multi-HAL 2.0 من Sensors HAL 2.0 ، تأكد من أن تطبيق HAL يلبي المتطلبات التالية.

تهيئة HAL

تحتوي أجهزة الاستشعار HAL 2.0 على وظيفة تهيئة تسمح لخدمة المستشعر بتمرير FMQs واستدعاء المستشعر الديناميكي. في Sensors Multi-HAL 2.0 ، تقوم وظيفة initialize() بتمرير رد اتصال واحد يجب استخدامه لنشر أحداث المستشعر ، والحصول على أقفال التنبيه ، والإخطار بتوصيل المستشعر الديناميكي وقطع الاتصال.

نشر أحداث المستشعر في تنفيذ Multi-HAL

بدلاً من نشر أحداث المستشعر من خلال FMQ ، يجب أن يكتب HAL الفرعي أحداث المستشعر إلى IHalProxyCallback عند توفر أحداث المستشعر.

أحداث WAKE_UP

في Sensors HAL 2.0 ، يمكن لـ HAL إدارة قفل التنبيه لتنفيذه. في Sensors Multi-HAL 2.0 ، تسمح HALs الفرعية بتنفيذ Multi-HAL لإدارة أقفال التنبيه ويمكن أن تطلب الحصول على قفل التنبيه عن طريق استدعاء createScopedWakelock . يجب الحصول على قفل تنشيط ذي نطاق مغلق وتمريره إلى postEvents عند نشر أحداث التنبيه إلى تنفيذ Multi-HAL.

مجسات ديناميكية

تتطلب المستشعرات Multi-HAL 2.0 أن يتم onDynamicSensorsConnected and onDynamicSensorsDisconnected في IHalProxyCallback كلما تغيرت اتصالات المستشعر الديناميكي. تتوفر عمليات الاسترجاعات هذه كجزء من مؤشر IHalProxyCallback الذي يتم توفيره من خلال وظيفة initialize() .

المنفذ من مستشعرات HAL 1.0

عند الترقية إلى Sensors Multi-HAL 2.0 من Sensors HAL 1.0 ، تأكد من أن تطبيق HAL يلبي المتطلبات التالية.

تهيئة HAL

يجب دعم وظيفة initialize() لإنشاء رد اتصال بين تطبيق HAL الفرعي وتطبيق Multi-HAL.

كشف أجهزة الاستشعار المتوفرة

في Sensors Multi-HAL 2.0 ، يجب أن تقوم وظيفة getSensorsList() بإرجاع نفس القيمة أثناء تمهيد جهاز واحد ، حتى عبر إعادة تشغيل HAL للمستشعرات. يسمح هذا لإطار العمل بمحاولة إعادة إنشاء اتصالات أجهزة الاستشعار في حالة إعادة تشغيل خادم النظام. يمكن أن تتغير القيمة التي تم إرجاعها بواسطة getSensorsList() بعد قيام الجهاز بإعادة التشغيل.

نشر أحداث المستشعر في تنفيذ Multi-HAL

في Sensors HAL 2.0 ، بدلاً من انتظار poll() ليتم استدعاؤه ، يجب أن يكتب HAL الفرعي أحداث المستشعر بشكل استباقي إلى IHalProxyCallback عندما تكون أحداث المستشعر متاحة.

أحداث WAKE_UP

في Sensors HAL 1.0 ، يمكن لـ HAL إدارة قفل التنبيه لتنفيذه. في Sensors Multi-HAL 2.0 ، تسمح HALs الفرعية بتنفيذ Multi-HAL لإدارة أقفال التنبيه ويمكن أن تطلب الحصول على قفل التنبيه عن طريق استدعاء createScopedWakelock . يجب الحصول على قفل تنشيط ذي نطاق مغلق وتمريره إلى postEvents عند نشر أحداث التنبيه إلى تنفيذ Multi-HAL.

مجسات ديناميكية

في Sensors HAL 1.0 ، يتم إرجاع المستشعرات الديناميكية من خلال وظيفة poll() . تتطلب المستشعرات Multi-HAL 2.0 أن يتم onDynamicSensorsConnected and 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. منفذ HALs الفرعي كما هو موضح في Porting from Sensors Hal 1.0 .
  4. اضبط المستشعرات Multi-HAL 2.0 على أنها HAL المعينة باتباع الخطوتين 3 و 4 في قسم تنفيذ المستشعرات Mutli-HAL 2.0 .

تصديق

تشغيل VTS

عندما تقوم بدمج واحد أو أكثر من HALs الفرعية مع 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

تشغيل اختبارات الوحدة

تختبر الوحدة في HalProxy_test.cpp اختبار HalProxy باستخدام HALs الفرعية المزيفة التي تم إنشاء مثيل لها في اختبار الوحدة ولا يتم تحميلها ديناميكيًا. عند إنشاء HAL فرعي جديد ، يجب أن تعمل هذه الاختبارات كدليل حول كيفية إضافة اختبارات الوحدة التي تتحقق من تطبيق HAL الفرعي الجديد بشكل صحيح.

لإجراء الاختبارات ، قم بتنفيذ الأوامر التالية:

cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest

الاختبار باستخدام HALs الفرعية المزيفة

تعد HALs الفرعية المزيفة تطبيقات وهمية لواجهة ISensorsSubHal . تعرض HALs الفرعية قوائم مختلفة من أجهزة الاستشعار. عندما يتم تنشيط المستشعرات ، فإنها تنشر بشكل دوري أحداث المستشعر التي تم إنشاؤها تلقائيًا إلى HalProxy بناءً على الفترات الزمنية المحددة في طلب مستشعر معين.

يمكن استخدام HALs الفرعية المزيفة لاختبار كيفية عمل كود Multi-HAL الكامل مع HALs الفرعية الأخرى التي تم تحميلها في النظام وللتأكيد على الجوانب المختلفة لرمز Sensors Multi-HAL.

يتوفر نوعان من HAL الفرعيين الوهميين على hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/ .

لإنشاء ودفع HALs الفرعية المزيفة إلى جهاز ، قم بتنفيذ الخطوات التالية:

  1. قم بتشغيل الأوامر التالية لإنشاء ودفع ثلاثة أقسام فرعية مزيفة مختلفة إلى الجهاز:

    $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 باستخدام مسارات HALs الفرعية المزيفة.

    /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 وقم بتحميل HALs الفرعية الجديدة المدرجة في ملف التكوين.

    adb shell stop
    adb shell start
    

تصحيح

يمكن للمطورين تصحيح أخطاء إطار العمل باستخدام الأمر lshal . لطلب إخراج التصحيح لـ Sensors HAL ، قم بتشغيل الأمر التالي:

adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default

يتم بعد ذلك إخراج معلومات حول الحالة الحالية لـ HalProxy و HALs الفرعية إلى الجهاز. الموضح أدناه هو مثال لإخراج الأمر لكائن HalProxy و HALs الفرعية المزيفة.

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 عددًا كبيرًا (1000 أو أكثر) ، فهذا يشير إلى وجود العديد من الأحداث المعلقة ليتم كتابتها في إطار عمل المستشعرات. يشير هذا إلى أن خدمة المستشعر في طريق مسدود أو تعطلت ولا تعالج أحداث المستشعر ، أو أنه تم نشر مجموعة كبيرة من أحداث المستشعر مؤخرًا من HAL فرعي.

إذا كان عدد مرجع قفل التنبيه أكبر من 0 ، فهذا يعني أن HalProxy قد اكتسبت قفل التنبيه. يجب أن يكون هذا أكبر من 0 فقط إذا تم ScopedWakelock عن قصد أو إذا تم إرسال أحداث التنبيه إلى HalProxy ولم تتم معالجتها بواسطة إطار عمل المستشعر.

يتم تمرير واصف الملف الذي تم تمريره إلى أسلوب التصحيح الخاص بـ HalProxy إلى كل طبقة HAL فرعية لذلك يجب على المطورين تنفيذ أسلوب التصحيح كجزء من واجهة ISensorsSubHal .