Sensors Multi-HAL چارچوبی است که به HALهای حسگر اجازه میدهد در کنار دیگر HALهای حسگر اجرا شوند. Sensors Multi-HAL بهطور پویا زیر HALهای حسگرها را که بهعنوان کتابخانههای پویا در پارتیشن فروشنده ذخیره شدهاند بار میکند و به آنها یک شیء فراخوانی میدهد که میتواند ارسال رویدادها و دریافت و رها کردن قفل بیدارباش را مدیریت کند. HAL فرعی حسگرها یک HAL حسگرها است که در یک شیء مشترک در پارتیشن فروشنده ساخته شده است و توسط چارچوب چند HAL استفاده میشود. این HALهای فرعی به یکدیگر یا به کد چند HAL که حاوی تابع اصلی برای فرایند است وابسته نیستند.
Sensors Multi-HAL 2.1 که در دستگاههای دارای Android نسخه ۱۱ یا بالاتر دردسترس است، تکراری از Sensors Multi-HAL 2.0 است که از بار کردن زیر HALهایی که میتوانند نوع حسگر زاویه لولا را نشان دهند پشتیبانی میکند. برای پشتیبانی از این نوع حسگر، HALهای فرعی باید از میاناهای برنامهسازی کاربردی HAL فرعی تعریفشده در سرصفحه SubHal نسخه ۲.۱ استفاده کنند.
برای دستگاههای دارای Android 13 یا بالاتر که از Sensors AIDL HAL استفاده میکنند، میتوانید از لایه میانجی چندگانه HAL برای فعال کردن قابلیت چندگانه HAL استفاده کنید. برای جزئیات پیادهسازی، استفاده از Sensors Multi-HAL با Sensors AIDL HAL را ببینید.
تفاوت بین «حسگرهای چندگانه HAL 2» و «حسگرهای HAL 2»
«میانای سختافزاری انتزاعی چندگانه حسگرها ۲» که در دستگاههای دارای Android 10 یا بالاتر دردسترس است، چندین انتزاع را در بالای میانای سختافزاری انتزاعی حسگرها ۲ معرفی میکند تا تعامل با «میاناهای برنامهسازی کاربردی» میانای سختافزاری انتزاعی را آسانتر کند. Sensors Multi-HAL 2 introduces the
HalProxy
class to handle implementing the Sensors HAL 2 interface and the
V2_1/SubHal
(or
V2_0/SubHal)
interface to allow HalProxy to interact with sub-HALs.
میانای ISensorsSubHal از
2.1/ISensors.hal
(یا
2.0/ISensors.hal)
میانای به روشهای زیر متفاوت است:
- روش مقداردهی اولیه بهجای دو FMQ و
ISensorsCallback، کلاسIHalProxyCallbackرا ارسال میکند. - «لایه انتزاع سختافزار فرعی» باید تابع اشکالزدایی را برای ارائه اطلاعات اشکالزدایی در گزارشهای اشکال پیادهسازی کند.
- زیر HALها باید تابع نام را پیادهسازی کنند تا زیر HAL بارشده بتواند از دیگر زیر HALها متمایز شود.
تفاوت اصلی بین Sensors Multi-HAL 2 و Sensors HAL 2 در
توابع اولیه است. بهجای ارائه FMQ، میانای IHalProxyCallback دو روش ارائه میدهد: یک روش برای پست کردن رویدادهای حسگر به چارچوب حسگرها و یک روش برای ایجاد قفلهای بیدارباش. در پشت صحنه، Sensors
Multi-HAL همه تعاملات با FMQ را مدیریت میکند تا از ارائه بهموقع
رویدادهای حسگر برای همه زیر-HALها اطمینان حاصل کند. بهشدت توصیه میشود که زیر-HALها از روش createScopedWakelock برای واگذار کردن بار زمانبندی قفلهای بیداری به «چند-HAL حسگرها» استفاده کنند و استفاده از قفل بیداری را در یک قفل بیداری مشترک برای کل «چند-HAL حسگرها» متمرکز کنند، که این کار باعث بهحداقل رساندن تماسهای قفل کردن و باز کردن قفل میشود.
Sensors Multi-HAL 2 همچنین دارای برخی ویژگیهای ایمنی داخلی است. این تابع موقعیتهایی را که در آن FMQ حسگر پر است یا چارچوب حسگر Android بازراهاندازی میشود و وضعیت حسگر باید بازنشانی شود مدیریت میکند. علاوهبراین، وقتی رویدادها در کلاس HalProxy پست میشوند اما چارچوب حسگر نمیتواند رویدادها را فوراً بپذیرد، «چندگانه سختافزار انتزاعی حسگرها» میتواند رویدادها را به یک رشته پسزمینه منتقل کند تا درحالیکه منتظر پست شدن رویدادها است، کار در همه سختافزارهای انتزاعی فرعی ادامه یابد.
کد منبع و پیادهسازی مرجع
همه کدهای Multi-HAL حسگرها در
hardware/interfaces/sensors/common/default/2.X/multihal/ دردسترس است.
در اینجا به چند منبع اشاره شده است.
HalProxy.h: شیءHalProxyتوسط Sensors multi-HAL نمونهسازی میشود و انتقال دادهها از sub-HAL به چارچوب حسگر را مدیریت میکند.HalProxy.cpp: پیادهسازیHalProxyحاوی همه منطقهای لازم برای ارتباط چندگانه بین sub-HAL و چارچوب حسگر است.SubHal.h: میانایISensorsSubHalمیانایی را تعریف میکند که HALهای فرعی باید از آن پیروی کنند تا باHalProxyسازگار باشند. sub-HAL روش initialize را پیادهسازی میکند تا بتوان از شیءHalProxyCallbackبرایpostEventsوcreateScopedWakelockاستفاده کرد.برای پیادهسازیهای Multi-HAL 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 از حسگرهای جعلی برای تولید دادههای جعلی استفاده میکند. برای آزمایش نحوه تعامل چند HAL فرعی در دستگاه مفید است.
پیادهسازی
این بخش نحوه پیادهسازی Sensors Multi-HAL را در موقعیتهای زیر شرح میدهد:
- استفاده از «چندگانه HAL حسگرها» با «حسگرها AIDL HAL»
- پیادهسازی Sensors Multi-HAL 2.1
- انتقال از Sensors Multi-HAL 2.0 به Multi-HAL 2.1
- انتقال از Sensors HAL 2.0
- انتقال از Sensors HAL 1.0
- انتقال از Sensors Multi-HAL 1.0
استفاده از Sensors Multi-HAL با Sensors AIDL HAL
برای فعال کردن قابلیت چندگانه HAL با Sensors AIDL HAL، واحد لایه میانافزار چندگانه HAL را که در hardware/interfaces/sensors/aidl/default/multihal/ قرار دارد وارد کنید. این ماژول تبدیل بین انواع تعریف HAL حسگرهای AIDL و HIDL را مدیریت میکند و یک پوشاننده در اطراف میانای چند HAL تعریف میکند که در پیادهسازی حسگرهای چند HAL نسخه ۲.۱ شرح داده شده است. لایه واسط چند HAL در AIDL با دستگاههایی که Sensors Multi-HAL 2.1 را پیادهسازی میکنند سازگار است.
لایه میانافزار چندگانه AIDL به شما امکان میدهد ردیاب سر و انواع حسگر IMU با محور محدود را در Sensors AIDL HAL نمایان کنید. برای استفاده از این انواع حسگر تعریفشده توسط میانای AIDL HAL، فیلد type را در ساختار SensorInfo در پیادهسازی getSensorsList_2_1() تنظیم کنید. این کار ایمن است
زیرا فیلدهای نوع حسگر با پشتیبانی عدد صحیح در HAL حسگرهای AIDL و HIDL
همپوشانی ندارند.
پیادهسازی Sensors Multi-HAL 2.1
برای پیادهسازی Sensors Multi-HAL 2.1 در دستگاه جدید، این مراحل را دنبال کنید:
- واسط
ISensorsSubHalرا همانگونه که درSubHal.hتوضیح داده شده است پیادهسازی کنید. - روش
sensorsHalGetSubHal_2_1را درSubHal.hپیادهسازی کنید. برای ساختن sub-HAL که بهتازگی پیادهسازی شده است،
cc_library_sharedهدف اضافه کنید. هنگام افزودن هدف:- مطمئن شوید که هدف به جایی در بخش فروشنده دستگاه ارسال شده باشد.
- در فایل پیکربندی واقع در
/vendor/etc/sensors/hals.conf، مسیر کتابخانه را در خط جدیدی اضافه کنید. درصورت لزوم، فایلhals.confرا ایجاد کنید.
برای نمونه
Android.bpورودی برای ساختن کتابخانه زیر 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 شروع به کار میکند، بهدنبال sub-HAL جدیداً پیادهسازیشده میگردد، و آن را با فراخوانی
sensorsHalGetSubHal_2_1 مقداردهی اولیه میکند.
انتقال از Sensors Multi-HAL 2.0 به Multi-HAL 2.1
برای انتقال از Multi-HAL 2.0 به Multi-HAL 2.1،
SubHal
واسط را پیادهسازی کنید و sub-HAL را دوباره کامپایل کنید.
تفاوتهای بین میاناهای 2.0 و 2.1 SubHal عبارتند از:
-
IHalProxyCallbackاز انواع ایجادشده در نسخه ۲.۱ مشخصاتISensors.halاستفاده میکند. - تابع
initialize()بهجای تابع مربوط به میانای 2.0SubHal،IHalProxyCallbackجدیدی را ارسال میکند - «لایه انتزاع سختافزار فرعی» باید
getSensorsList_2_1وinjectSensorData_2_1را بهجایgetSensorsListوinjectSensorDataپیادهسازی کند زیرا این روشها از انواع جدید اضافهشده در نسخه ۲.۱ مشخصاتISensors.halاستفاده میکنند. - زیر HALها باید بهجای
sensorsHalGetSubHal،sensorsHalGetSubHal_2_1را نمایش دهند تا Multi-HAL آنها را بهعنوان زیر HALهای نسخه ۲.۱ درنظر بگیرد.
انتقال از Sensors HAL 2.0
هنگام ارتقا دادن از Sensors HAL 2.0 به Sensors Multi-HAL 2.0، مطمئن شوید که پیادهسازی HAL الزامات زیر را برآورده میکند.
مقداردهی اولیه HAL
Sensors HAL 2.0 تابع اولیه دارد که به سرویس حسگر اجازه میدهد
FMQ و برگشتپذیر حسگر پویا را منتقل کند. در Sensors Multi-HAL 2.0،
تابع initialize() یک فراخوان برگشتی واحد را ارسال میکند که باید برای پست کردن
رویدادهای حسگر، دریافت قفلهای بیدارباش، و اطلاعرسانی درباره اتصال و
قطع اتصال حسگر پویا استفاده شود.
رویدادهای حسگر را در پیادهسازی Multi-HAL پست کنید
بهجای پست کردن رویدادهای حسگر ازطریق FMQ، زیر-HAL باید رویدادهای حسگر را
در
IHalProxyCallback
وقتی رویدادهای حسگر دردسترس هستند بنویسد.
رویدادهای WAKE_UP
در Sensors HAL 2.0، HAL میتواند قفل بیدارباش را برای پیادهسازی خود مدیریت کند. In
Sensors Multi-HAL 2.0, the sub-HALs allow the Multi-HAL implementation to
manage wake locks and can request a wake lock to be acquired by invoking
createScopedWakelock.
هنگام پست کردن رویدادهای بیدار شدن به پیادهسازی Multi-HAL، باید قفل بیداری با محدوده قفلشده دریافت شود و به postEvents ارسال شود.
حسگرهای پویا
Sensors Multi-HAL 2.0 مستلزم این است که
onDynamicSensorsConnected و
onDynamicSensorsDisconnected در
IHalProxyCallback
هرگاه اتصالهای حسگر پویا تغییر میکند فراخوانی شوند. این فراخوانیهای برگشتی بهعنوان بخشی از اشارهگر IHalProxyCallback که ازطریق تابع initialize() ارائه میشود دردسترس هستند.
درگاه از Sensors HAL 1.0
هنگام ارتقا به Sensors Multi-HAL 2.0 از Sensors HAL 1.0، مطمئن شوید که پیادهسازی HAL الزامات زیر را برآورده میکند.
مقداردهی اولیه HAL
برای ایجاد تماس برگشتی بین
پیادهسازی sub-HAL و Multi-HAL، باید از تابع initialize() پشتیبانی شود.
نمایش حسگرهای دردسترس
در 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 میتواند قفل بیدارباش را برای پیادهسازی خود مدیریت کند. در
Sensors Multi-HAL 2.0، زیر HALها به پیادهسازی Multi-HAL اجازه میدهند تا
قفلهای بیداری را مدیریت کند و میتواند با فراخوانی
createScopedWakelock درخواست کند که قفل بیداری دریافت شود.
وقتی رویدادهای بیدار شدن در پیادهسازی Multi-HAL پست میشود، باید قفل بیداری محدودشده قفلشدهای دریافت و به postEvents ارسال شود.
حسگرهای پویا
در Sensors HAL 1.0، حسگرهای پویا ازطریق تابع poll() برگردانده میشوند.
«لایه انتزاع سختافزاری چندگانه حسگرها نسخه ۲.۰» ملزم میکند که 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ها را همانطور که در انتقال از Sensors Hal 1.0 شرح داده شده است منتقل کنید.
- با دنبال کردن مراحل ۳ و ۴ در بخش پیادهسازی «حسگرهای چندگانه HAL 2.0»، «حسگرهای چندگانه 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 را اجرا میکنید، VtsAidlHalSensorsTargetTest را اجرا کنید.
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsAidlHalSensorsTargetTest
اجرای آزمونهای واحد
آزمونهای واحد در HalProxy_test.cpp، HalProxy را بااستفاده از زیر HALهای جعلی آزمایش میکنند که
در آزمون واحد نمونهسازی شدهاند و بهصورت پویا بارگیری نمیشوند. هنگام ایجاد
زیرHAL جدید، این آزمایشها باید بهعنوان راهنمایی برای نحوه افزودن آزمایشهای واحدی که
تأیید میکنند زیرHAL جدید بهدرستی پیادهسازی شده است عمل کنند.
برای اجرای آزمایشها، فرمانهای زیر را اجرا کنید:
cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/testsatest
آزمایش با زیرواحد سختافزاری انتزاعی جعلی
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/mmaadb 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.soadb 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.soadb 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 stopadb shell start
اشکالزدایی
توسعهدهندگان میتوانند چارچوب را بااستفاده از فرمان lshal اشکالزدایی کنند. برای درخواست
برونداد اشکالزدایی «لایه انتزاع سختافزار حسگرها»، فرمان زیر را اجرا کنید:
adb rootadb 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 عدد بزرگی (۱۰۰۰ یا بیشتر) باشد،
این نشان میدهد که رویدادهای زیادی درانتظار نوشته شدن در چارچوب حسگرها هستند. این نشان میدهد که سرویس حسگر در بنبست قرار گرفته یا ازکار افتاده است و
رویدادهای حسگر را پردازش نمیکند، یا اینکه اخیراً دسته بزرگی از رویدادهای حسگر
از HAL فرعی پست شده است.
اگر تعداد ارجاع قفل بیداری بیشتر از 0 باشد، یعنی HalProxy قفل بیداری را بهدست آورده است. این مقدار فقط درصورتی باید بیشتر از 0 باشد که ScopedWakelock
عمداً نگه داشته شده باشد یا رویدادهای بیدار شدن به HalProxy ارسال شده باشد و
توسط چارچوب حسگر پردازش نشده باشد.
توصیفگر فایل ارسالشده به روش اشکالزدایی HalProxy به هریک از
زیر HALها ارسال میشود، بنابراین توسعهدهندگان باید روش اشکالزدایی را بهعنوان بخشی از
میانای ISensorsSubHal پیادهسازی کنند.