سنسورهای Multi-HAL

Sensors Multi-HAL چارچوبی است که به HAL های حسگر اجازه می دهد در کنار سایر HAL های حسگر اجرا شوند. Sensors Multi-HAL به صورت پویا، HAL های فرعی حسگرهایی را که به عنوان کتابخانه های پویا در پارتیشن فروشنده ذخیره شده اند بارگیری می کند و به آنها یک شئ پاسخگوی تماس می دهد که می تواند رویدادهای ارسالی و دریافت و آزاد کردن wake lock را مدیریت کند. Sensors sub-HAL یک حسگر HAL است که در یک شی مشترک در پارتیشن فروشنده ساخته شده است و توسط چارچوب چند HAL استفاده می شود. این HAL های فرعی به یکدیگر یا به کد چند HAL که حاوی تابع اصلی فرآیند است، وابسته نیستند.

Sensors Multi-HAL 2.1، موجود در دستگاه‌های دارای Android 11 یا بالاتر، تکراری از Sensors Multi-HAL 2.0 است که از بارگیری HAL‌های فرعی پشتیبانی می‌کند که می‌توانند نوع سنسور زاویه لولا را نشان دهند. برای پشتیبانی از این نوع حسگر، sub-HAL ها باید از API های sub-HAL تعریف شده در هدر 2.1 SubHal استفاده کنند.

برای دستگاه‌های دارای Android نسخه 13 یا بالاتر که از Sensors AIDL HAL استفاده می‌کنند، می‌توانید از لایه multi-HAL shim استفاده کنید تا قابلیت چند HAL را مجاز کنید. برای جزئیات پیاده سازی، به استفاده از سنسورهای چند HAL با سنسورهای AIDL HAL مراجعه کنید.

تفاوت بین سنسورهای Multi-HAL 2 و Sensors HAL 2

Sensors Multi-HAL 2، موجود در دستگاه‌های دارای Android 10 یا بالاتر، چندین انتزاع را در بالای Sensors HAL 2 معرفی می‌کند تا تعامل با APIهای HAL را آسان‌تر کند. 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 و ISensorsCallback ارسال می کند.
  • HAL های فرعی باید یک تابع اشکال زدایی را برای ارائه اطلاعات اشکال زدایی در گزارش های اشکال پیاده سازی کنند.
  • Sub-HAL ها باید یک تابع نام را پیاده سازی کنند تا بتوان Sub-HAL بارگذاری شده را از سایر HAL های فرعی متمایز کرد.

تفاوت اصلی بین Sensors Multi-HAL 2 و Sensors HAL 2 در توابع مقداردهی اولیه است. رابط IHalProxyCallback به جای ارائه FMQ دو روش را ارائه می دهد، یک روش برای ارسال رویدادهای حسگر به چارچوب حسگرها و یک روش برای ایجاد قفل های بیدار. در زیر هود، Sensors Multi-HAL تمام تعاملات با FMQs را مدیریت می کند تا از تحویل به موقع رویدادهای حسگر برای همه HAL های فرعی اطمینان حاصل کند. اکیداً توصیه می‌شود که HAL‌های فرعی از روش createScopedWakelock برای واگذاری بار زمان‌بندی wake lock به Sensors Multi-HAL و متمرکز کردن استفاده از wake lock به یک wake lock مشترک برای کل سنسور Multi-HAL استفاده کنند، که قفل و باز کردن قفل را به حداقل می‌رساند. تماس می گیرد.

سنسورهای Multi-HAL 2 همچنین دارای برخی ویژگی‌های ایمنی داخلی است. موقعیت‌هایی را کنترل می‌کند که FMQ حسگر پر است یا چارچوب حسگر Android راه‌اندازی مجدد می‌شود و وضعیت حسگر باید بازنشانی شود. علاوه بر این، زمانی که رویدادها در کلاس HalProxy پست می‌شوند اما چارچوب حسگر قادر به پذیرش فوری رویدادها نیست، Sensors Multi-HAL می‌تواند رویدادها را به یک رشته پس‌زمینه منتقل کند تا در زمان انتظار برای رویدادها، کار در همه HAL‌های فرعی ادامه یابد. پست شود.

کد منبع و پیاده سازی مرجع

کد Multi-HAL همه سنسورها در hardware/interfaces/sensors/common/default/2.X/multihal/ موجود است. در اینجا به برخی از منابع اشاره می شود.

  • HalProxy.h : شی HalProxy توسط Sensors multi-HAL نمونه سازی می شود و انتقال داده ها از HAL های فرعی به چارچوب حسگر را مدیریت می کند.
  • HalProxy.cpp : اجرای HalProxy شامل تمام منطق مورد نیاز برای ارتباط چندگانه بین HAL های فرعی و چارچوب حسگر است.
  • SubHal.h : رابط ISensorsSubHal رابطی را تعریف می کند که sub-HAL ها باید برای سازگاری با HalProxy دنبال کنند. sub-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/ : این نمونه اجرای sub-HAL از حسگرهای جعلی برای تولید داده های جعلی استفاده می کند. برای آزمایش نحوه تعامل چندین HAL فرعی بر روی یک دستگاه مفید است.

پیاده سازی

این بخش نحوه پیاده سازی Sensors Multi-HAL را در شرایط زیر شرح می دهد:

از سنسورهای Multi-HAL با سنسورهای AIDL HAL استفاده کنید

برای اجازه دادن قابلیت Multi-HAL با Sensors AIDL HAL، ماژول لایه شیم AIDL Multi-HAL را وارد کنید، که در سخت افزار/رابط/حسگر/aidl/default/multihal/ یافت می شود. این ماژول تبدیل بین انواع تعریف HAL ​​حسگرهای AIDL و HIDL را انجام می دهد و یک پوشش در اطراف رابط چند HAL که در Implementing Sensors Multi-HAL 2.1 توضیح داده شده است، تعریف می کند. لایه AIDL multi-HAL شیم با دستگاه هایی که Sensors Multi-HAL 2.1 را پیاده سازی می کنند سازگار است.

لایه شیم AIDL multi-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 برای ساختن HAL فرعی تازه پیاده‌سازی شده اضافه کنید. هنگام اضافه کردن هدف:

    1. اطمینان حاصل کنید که هدف به جایی در پارتیشن فروشنده دستگاه فشار داده شده است.
    2. در فایل پیکربندی که در /vendor/etc/sensors/hals.conf قرار دارد، مسیر را در یک خط جدید به کتابخانه اضافه کنید. در صورت لزوم، فایل hals.conf را ایجاد کنید.

    برای مثال ورودی Android.bp برای ساختن یک کتابخانه sub-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 آن را مقداردهی اولیه می‌کند.

پورت از Sensors Multi-HAL 2.0 به Multi-HAL 2.1

برای انتقال از Multi-HAL 2.0 به Multi-HAL 2.1، رابط SubHal را پیاده سازی کنید و ساب هال خود را مجدداً کامپایل کنید.

اینها تفاوت های بین رابط های 2.0 و 2.1 SubHal هستند:

  • 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 ساب HAL در نظر بگیرد.

پورت از سنسور HAL 2.0

هنگام ارتقا به Sensors Multi-HAL 2.0 از Sensors HAL 2.0 ، مطمئن شوید که اجرای HAL الزامات زیر را برآورده می کند.

HAL را راه اندازی کنید

سنسور HAL 2.0 دارای یک تابع مقداردهی اولیه است که به سرویس حسگر اجازه می دهد FMQ و یک تماس سنسور پویا را ارسال کند. در Sensors Multi-HAL 2.0، تابع initialize() یک فراخوان منفرد ارسال می کند که باید برای ارسال رویدادهای حسگر، به دست آوردن wake lock و اطلاع از اتصال و قطع شدن سنسور پویا استفاده شود.

رویدادهای حسگر را به اجرای Multi-HAL ارسال کنید

به جای ارسال رویدادهای حسگر از طریق FMQ، HAL فرعی باید رویدادهای حسگر را در زمانی که رویدادهای حسگر در دسترس هستند در IHalProxyCallback بنویسد.

رویدادهای WAKE_UP

در Sensors HAL 2.0، HAL می تواند wake lock را برای اجرای آن مدیریت کند. در Sensors Multi-HAL 2.0، HAL های فرعی به پیاده سازی Multi-HAL اجازه می دهند تا wake lock ها را مدیریت کند و می توانند با فراخوانی createScopedWakelock درخواست دریافت wake lock کنند. هنگام ارسال رویدادهای بیدار شدن در اجرای Multi-HAL، یک wake lock با محدوده قفل شده باید بدست آید و به postEvents منتقل شود.

سنسورهای دینامیک

Sensors Multi-HAL 2.0 مستلزم آن است که onDynamicSensorsConnected و onDynamicSensorsDisconnected در IHalProxyCallback هر زمان که اتصالات حسگر پویا تغییر می کنند فراخوانی شوند. این تماس ها به عنوان بخشی از نشانگر IHalProxyCallback که از طریق تابع initialize() ارائه می شود، در دسترس هستند.

پورت از سنسور HAL 1.0

هنگام ارتقا به Sensors Multi-HAL 2.0 از Sensors HAL 1.0 ، مطمئن شوید که اجرای HAL الزامات زیر را برآورده می کند.

HAL را راه اندازی کنید

تابع initialize() باید برای برقراری تماس بین sub-HAL و پیاده سازی Multi-HAL پشتیبانی شود.

سنسورهای موجود را در معرض دید قرار دهید

در Sensors Multi-HAL 2.0، تابع getSensorsList() باید همان مقدار را در طول راه‌اندازی یک دستگاه، حتی در بین سنسورها که HAL راه‌اندازی مجدد می‌کنند، برگرداند. این به چارچوب اجازه می دهد تا در صورت راه اندازی مجدد سرور سیستم، اتصالات حسگر را دوباره برقرار کند. مقدار بازگشتی توسط getSensorsList() می تواند پس از راه اندازی مجدد دستگاه تغییر کند.

رویدادهای حسگر را به اجرای Multi-HAL ارسال کنید

در Sensors HAL 2.0، به جای منتظر ماندن برای فراخوانی poll() ، sub-HAL باید هر زمان که رویدادهای حسگر در دسترس هستند، رویدادهای حسگر را فعالانه در IHalProxyCallback بنویسد.

رویدادهای WAKE_UP

در Sensors HAL 1.0، HAL می تواند wake lock را برای اجرای آن مدیریت کند. در Sensors Multi-HAL 2.0، sub-HAL ها به پیاده سازی Multi-HAL اجازه می دهد تا wake lock ها را مدیریت کند و می تواند با فراخوانی createScopedWakelock درخواست دریافت wake lock کند. هنگام ارسال رویدادهای بیدار شدن در اجرای Multi-HAL، یک wake lock با محدوده قفل شده باید بدست آید و به postEvents منتقل شود.

سنسورهای دینامیک

در Sensors HAL 1.0، حسگرهای پویا از طریق تابع poll() برگردانده می شوند. Sensors Multi-HAL 2.0 مستلزم آن است که onDynamicSensorsConnected و onDynamicSensorsDisconnected در IHalProxyCallback هر زمان که اتصالات حسگر پویا تغییر می کنند فراخوانی شوند. این تماس ها به عنوان بخشی از نشانگر IHalProxyCallback که از طریق تابع initialize() ارائه می شود، در دسترس هستند.

پورت از Sensors 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های فرعی پورت همانطور که در Porting from Sensors Hal 1.0 توضیح داده شده است.
  4. با دنبال کردن مراحل 3 و 4 در بخش Implementing Sensors Mutli-HAL 2.0 Sensors Multi-HAL 2.0 را به عنوان HAL تعیین شده تنظیم کنید.

اعتبار سنجی

VTS را اجرا کنید

هنگامی که یک یا چند ساب HAL را با 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

اگر لایه AIDL Multi-HAL shim را اجرا می کنید، 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 جدید، این تست ها باید به عنوان راهنمای نحوه افزودن تست های واحدی باشد که تأیید می کند که sub-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 جعلی مختلف به دستگاه اجرا کنید:

    $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 زدایی کنند. برای درخواست خروجی Debug 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 تعداد زیادی باشد (1000 یا بیشتر)، این نشان می‌دهد که رویدادهای زیادی در انتظار نوشته شدن در چارچوب حسگرها هستند. این نشان می دهد که سرویس حسگر به بن بست رسیده است یا از کار افتاده است و رویدادهای حسگر را پردازش نمی کند، یا اینکه دسته بزرگی از رویدادهای حسگر اخیراً از یک HAL فرعی پست شده است.

اگر تعداد ref wake lock بزرگتر از 0 باشد، این بدان معناست که HalProxy یک wake lock به دست آورده است. اگر ScopedWakelock عمداً در حال برگزاری باشد یا رویدادهای بیداری به HalProxy ارسال شده باشند و توسط چارچوب حسگر پردازش نشده باشند، این مقدار باید بیشتر از 0 باشد.

توصیفگر فایل ارسال شده به روش اشکال زدایی HalProxy به هر زیر HAL ارسال می شود، بنابراین توسعه دهندگان باید روش اشکال زدایی را به عنوان بخشی از رابط ISensorsSubHal پیاده سازی کنند.