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 2.1
- انتقال از Sensors Multi-HAL 2.0 به Multi-HAL 2.1
- انتقال از حسگر HAL 2.0
- انتقال از حسگر HAL 1.0
- انتقال از Sensors Multi-HAL 1.0
از سنسورهای 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 در دستگاه جدید، این مراحل را دنبال کنید:
- رابط
ISensorsSubHal
را همانطور که درSubHal.h
توضیح داده شده است پیاده سازی کنید. - روش
sensorsHalGetSubHal_2_1
را درSubHal.h
پیاده سازی کنید. یک هدف
cc_library_shared
برای ساختن HAL فرعی تازه پیادهسازی شده اضافه کنید. هنگام اضافه کردن هدف:- اطمینان حاصل کنید که هدف به جایی در پارتیشن فروشنده دستگاه فشار داده شده است.
- در فایل پیکربندی که در
/vendor/etc/sensors/hals.conf
قرار دارد، مسیر را در یک خط جدید به کتابخانه اضافه کنید. در صورت لزوم، فایلhals.conf
را ایجاد کنید.
برای مثال ورودی
Android.bp
برای ساختن یک کتابخانه sub-HAL، بهhardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
مراجعه کنید.تمام ورودیهای
android.hardware.sensors
را از فایلmanifest.xml
، که حاوی لیست HALهای پشتیبانیشده در دستگاه است، حذف کنید.همه فایلهای
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.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 ساب 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 ، این مراحل را دنبال کنید.
- مطمئن شوید که پیکربندی HAL حسگرها در
/vendor/etc/sensors/hals.conf
قرار دارد. این ممکن است شامل انتقال فایل واقع در/system/etc/sensors/hals.conf
باشد. - هرگونه ارجاع به
hardware/hardware.h
وhardware/sensors.h
را حذف کنید زیرا این موارد برای HAL 2.0 پشتیبانی نمی شوند. - HALهای فرعی پورت همانطور که در Porting from Sensors Hal 1.0 توضیح داده شده است.
- با دنبال کردن مراحل 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 های فرعی جعلی به یک دستگاه، مراحل زیر را انجام دهید:
دستورات زیر را برای ساختن و فشار دادن سه زیر 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
پیکربندی 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
اشکال زدایی کنند. برای درخواست خروجی 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
پیاده سازی کنند.