گوشیهای هوشمند شامل تعدادی پردازنده هستند که هر کدام برای انجام وظایف مختلف بهینه شدهاند. با این حال، اندروید فقط روی یک پردازنده اجرا میشود: پردازنده برنامهها (AP). AP برای ارائه عملکرد عالی برای موارد استفاده روی صفحه نمایش مانند بازی تنظیم شده است، اما برای پشتیبانی از ویژگیهایی که نیاز به پردازشهای مکرر و کوتاه مدت دارند، حتی زمانی که صفحه نمایش خاموش است، بسیار پرمصرف است. پردازندههای کوچکتر قادر به مدیریت کارآمدتر این حجم کار هستند و وظایف خود را بدون تأثیر قابل توجه بر عمر باتری انجام میدهند. با این حال، محیطهای نرمافزاری در این پردازندههای کممصرف محدودتر هستند و میتوانند بسیار متفاوت باشند و توسعه بین پلتفرمی را دشوار میکنند.
محیط زمان اجرای هاب زمینه (CHRE) یک پلتفرم مشترک برای اجرای برنامهها روی پردازندههای کممصرف، با یک API ساده، استاندارد و سازگار با جاسازی، فراهم میکند. CHRE به تولیدکنندگان اصلی دستگاهها و شرکای مورد اعتماد آنها این امکان را میدهد که پردازش را از AP خارج کنند، در مصرف باتری صرفهجویی کنند و زمینههای مختلف تجربه کاربری را بهبود بخشند و مجموعهای از ویژگیهای همیشه روشن و آگاه از متن، به ویژه مواردی که شامل کاربرد یادگیری ماشینی در سنجش محیط میشوند را فعال کنند.
مفاهیم کلیدی
CHRE محیط نرمافزاری است که در آن برنامههای بومی کوچک، به نام نانواپها ، روی یک پردازنده کممصرف اجرا میشوند و از طریق رابط برنامهنویسی کاربردی مشترک CHRE با سیستم عامل تعامل دارند. برای تسریع پیادهسازی صحیح رابطهای برنامهنویسی کاربردی CHRE، یک پیادهسازی مرجع چند پلتفرمی از CHRE در AOSP گنجانده شده است. پیادهسازی مرجع شامل کد و انتزاعهای مشترک برای سختافزار و نرمافزار اصلی از طریق مجموعهای از لایههای انتزاع پلتفرم (PAL) است. نانواپها تقریباً همیشه به یک یا چند برنامه کلاینت که در اندروید اجرا میشوند، وابسته هستند که از طریق رابطهای برنامهنویسی کاربردی سیستم ContextHubManager با دسترسی محدود با CHRE و نانواپها تعامل دارند.
در سطح بالا، میتوان شباهتهایی بین معماری CHRE و اندروید به طور کلی پیدا کرد. با این حال، چند تفاوت مهم وجود دارد:
- CHRE فقط از اجرای نانواپلیکیشنهای توسعهیافته با کد بومی (C یا C++) پشتیبانی میکند؛ جاوا پشتیبانی نمیشود.
- به دلیل محدودیتهای منابع و امنیتی، CHRE برای استفاده توسط برنامههای اندرویدی شخص ثالث دلخواه باز نیست. فقط برنامههای مورد اعتماد سیستم میتوانند به آن دسترسی داشته باشند.
همچنین باید تمایز مهمی بین مفهوم CHRE و هاب حسگر قائل شد. اگرچه استفاده از سختافزار یکسان برای پیادهسازی هاب حسگر و CHRE رایج است، اما خود CHRE قابلیتهای حسگر مورد نیاز Android Sensors HAL را ارائه نمیدهد. CHRE به Context Hub HAL گره خورده است و به عنوان کلاینت یک چارچوب حسگر مخصوص دستگاه عمل میکند تا دادههای حسگر را بدون درگیر کردن AP دریافت کند.

شکل 1. معماری چارچوب CHRE
مرکز زمینه HAL
لایه انتزاعی سختافزار Context Hub (HAL) رابط بین چارچوب اندروید و پیادهسازی CHRE دستگاه است که در hardware/interfaces/contexthub تعریف شده است. Context Hub HAL رابطهای برنامهنویسی کاربردی (API) را تعریف میکند که از طریق آنها چارچوب اندروید، context hubهای موجود و نانواپلیکیشنهای آنها را کشف میکند، از طریق ارسال پیام با آن نانواپلیکیشنها تعامل دارد و امکان بارگیری و تخلیه نانواپلیکیشنها را فراهم میکند. یک پیادهسازی مرجع از Context Hub HAL که با پیادهسازی مرجع CHRE کار میکند، در system/chre/host موجود است.
در صورت وجود اختلاف بین این مستندات و تعریف HAL، تعریف HAL اولویت دارد.
مقداردهی اولیه
وقتی اندروید بوت میشود، ContextHubService تابع getHubs() HAL را فراخوانی میکند تا مشخص کند که آیا context hubهایی روی دستگاه موجود است یا خیر. این یک فراخوانی مسدودکننده و یکباره است، بنابراین باید به سرعت تکمیل شود تا از تأخیر در بوت جلوگیری شود و باید نتیجه دقیقی را برگرداند، زیرا context hubهای جدید نمیتوانند پس از آن معرفی شوند.
بارگیری و تخلیه نانواپها
یک مرکز زمینه میتواند شامل مجموعهای از نانواپلیکیشنها باشد که در تصویر دستگاه گنجانده شدهاند و هنگام شروع CHRE بارگیری میشوند. اینها به عنوان نانواپلیکیشنهای از پیش بارگذاری شده شناخته میشوند و باید در اولین پاسخ ممکن به queryApps() گنجانده شوند.
مرکز زمینه HAL همچنین از بارگیری و تخلیه نانواپلیکیشنها به صورت پویا در زمان اجرا، از طریق توابع loadNanoApp() و unloadNanoApp() پشتیبانی میکند. نانواپلیکیشنها در قالبی دودویی مختص پیادهسازی سختافزاری و نرمافزاری CHRE دستگاه، در اختیار HAL قرار میگیرند.
اگر پیادهسازی بارگذاری یک نانواپلیکیشن شامل نوشتن آن در حافظه غیرفرار، مانند حافظه فلش متصل به پردازندهای که CHRE را اجرا میکند، باشد، پیادهسازی CHRE باید همیشه با این نانواپلیکیشنهای پویا در حالت غیرفعال بوت شود. این بدان معناست که هیچ یک از کدهای نانواپلیکیشن تا زمانی که درخواست enableNanoapp() از طریق HAL دریافت نشود، اجرا نمیشوند. نانواپلیکیشنهای از پیش بارگذاری شده میتوانند در حالت فعال مقداردهی اولیه شوند.
هاب زمینه مجدداً راهاندازی میشود
اگرچه انتظار نمیرود CHRE در طول عملیات عادی مجدداً راهاندازی شود، اما میتواند برای بازیابی از شرایط غیرمنتظره مانند تلاش برای دسترسی به یک آدرس حافظه نگاشت نشده ضروری باشد. در این شرایط، CHRE مستقل از اندروید مجدداً راهاندازی میشود. HAL این موضوع را از طریق رویداد RESTARTED به اندروید اطلاع میدهد، که باید فقط پس از مقداردهی مجدد CHRE به حدی که بتواند درخواستهای جدید مانند queryApps() بپذیرد، ارسال کند.
نمای کلی سیستم CHRE
CHRE حول یک معماری رویدادمحور طراحی شده است، که در آن واحد اصلی محاسبه، رویدادی است که به نقطه ورود مدیریت رویداد یک نانواپلیکیشن ارسال میشود. در حالی که چارچوب CHRE میتواند چندرشتهای باشد، یک نانواپلیکیشن مشخص هرگز از چندین رشته به صورت موازی اجرا نمیشود. چارچوب CHRE با یک نانواپلیکیشن مشخص از طریق یکی از سه نقطه ورود نانواپلیکیشن ( nanoappStart() ، nanoappHandleEvent() و nanoappEnd() ) یا از طریق یک فراخوانی برگشتی ارائه شده در یک فراخوانی قبلی CHRE API تعامل دارد و نانواپلیکیشنها از طریق CHRE API با چارچوب CHRE و سیستم زیربنایی تعامل دارند. CHRE API مجموعهای از قابلیتهای اساسی و همچنین امکاناتی را برای دسترسی به سیگنالهای زمینهای، از جمله حسگرها، GNSS، Wi-Fi، WWAN و صدا فراهم میکند و میتواند با قابلیتهای اضافی مختص فروشنده برای استفاده توسط نانواپلیکیشنهای مختص فروشنده گسترش یابد.
سیستم ساخت
در حالی که Context Hub HAL و سایر اجزای ضروری AP-side در کنار اندروید ساخته میشوند، کدی که در CHRE اجرا میشود میتواند الزاماتی داشته باشد که آن را با سیستم ساخت اندروید ناسازگار میکند، مانند نیاز به یک زنجیره ابزار تخصصی. بنابراین، پروژه CHRE در AOSP یک سیستم ساخت ساده مبتنی بر GNU Make برای کامپایل نانواپها و به صورت اختیاری، چارچوب CHRE را در کتابخانههایی که میتوانند با سیستم ادغام شوند، فراهم میکند. تولیدکنندگان دستگاههایی که پشتیبانی از CHRE را اضافه میکنند، باید پشتیبانی سیستم ساخت را برای دستگاههای هدف خود در AOSP ادغام کنند.
رابط برنامهنویسی کاربردی CHRE با استاندارد زبان C99 نوشته شده است و پیادهسازی مرجع از زیرمجموعهای محدود از C++11 مناسب برای برنامههای با منابع محدود استفاده میکند.
API CHRE
رابط برنامهنویسی CHRE مجموعهای از فایلهای هدر C است که رابط نرمافزاری بین یک نانواپلیکیشن و سیستم را تعریف میکند. این رابط به گونهای طراحی شده است که کد نانواپلیکیشنها را در تمام دستگاههایی که از CHRE پشتیبانی میکنند، سازگار کند، به این معنی که کد منبع یک نانواپلیکیشن نیازی به اصلاح برای پشتیبانی از نوع دستگاه جدید ندارد، اگرچه ممکن است نیاز به کامپایل مجدد به طور خاص برای مجموعه دستورالعملهای پردازنده یا رابط دودویی برنامه (ABI) دستگاه هدف داشته باشد. معماری CHRE و طراحی API همچنین تضمین میکند که نانواپلیکیشنها با نسخههای مختلف CHRE API سازگار باشند، به این معنی که یک نانواپلیکیشن برای اجرا روی سیستمی که نسخه متفاوتی از CHRE API را در مقایسه با API هدفی که نانواپلیکیشن روی آن کامپایل شده است، پیادهسازی میکند، نیازی به کامپایل مجدد ندارد. به عبارت دیگر، اگر یک فایل باینری نانواپلیکیشن روی دستگاهی که از CHRE API نسخه ۱.۳ پشتیبانی میکند اجرا شود و آن دستگاه برای پشتیبانی از CHRE API نسخه ۱.۴ ارتقا یابد، همان فایل باینری نانواپلیکیشن به کار خود ادامه میدهد. به طور مشابه، نانواپ میتواند روی CHRE API نسخه ۱.۲ اجرا شود و در زمان اجرا مشخص کند که آیا برای دستیابی به کاربرد خود به قابلیتهای API نسخه ۱.۳ نیاز دارد یا اینکه میتواند با وجود افت عملکرد مطلوب، به کار خود ادامه دهد.
نسخههای جدید CHRE API همزمان با اندروید منتشر میشوند، با این حال از آنجایی که پیادهسازی CHRE بخشی از پیادهسازی فروشنده است، نسخه CHRE API پشتیبانیشده در یک دستگاه لزوماً به نسخه اندروید آن مرتبط نیست.
خلاصه نسخه
مانند طرح نسخهبندی HIDL اندروید ، API مربوط به CHRE از نسخهبندی معنایی پیروی میکند. نسخه اصلی نشاندهنده سازگاری باینری است، در حالی که نسخه فرعی با معرفی ویژگیهای سازگار با نسخههای قبلی افزایش مییابد. API مربوط به CHRE شامل حاشیهنویسیهای کد منبع است تا مشخص کند کدام نسخه یک تابع یا پارامتر را معرفی کرده است، برای مثال @since v1.1 .
پیادهسازی CHRE همچنین از طریق chreGetVersion() یک نسخه پچ مخصوص پلتفرم را نمایش میدهد که نشان میدهد چه زمانی رفع اشکال یا بهروزرسانیهای جزئی در پیادهسازی انجام شده است.
برای خلاصه هر نسخه، به version.h مراجعه کنید.
ویژگیهای اجباری سیستم
در حالی که منابع سیگنالهای زمینهای، مانند حسگرها، به حوزههای ویژگی اختیاری طبقهبندی میشوند، چند عملکرد اصلی در تمام پیادهسازیهای CHRE مورد نیاز است. این شامل APIهای اصلی سیستم، مانند APIهای مربوط به تنظیم تایمرها، ارسال و دریافت پیام به کلاینتها در پردازنده برنامهها، ثبت وقایع و موارد دیگر میشود. برای جزئیات کامل، به هدرهای API مراجعه کنید.
علاوه بر ویژگیهای اصلی سیستم که در CHRE API کدگذاری شدهاند، ویژگیهای اجباری سطح سیستم CHRE نیز وجود دارند که در سطح Context Hub HAL مشخص شدهاند. مهمترین آنها قابلیت بارگذاری و حذف پویای نانواپها است.
کتابخانه استاندارد C/C++
برای به حداقل رساندن استفاده از حافظه و پیچیدگی سیستم، پیادهسازیهای CHRE ملزم به پشتیبانی از تنها زیرمجموعهای از کتابخانههای استاندارد C و C++ و ویژگیهای زبانی مورد نیاز برای پشتیبانی در زمان اجرا هستند. با پیروی از این اصول، برخی از ویژگیها به دلیل وابستگیهای گسترده به حافظه و سطح سیستم عامل، و برخی دیگر به دلیل جایگزینی با APIهای مناسبتر مختص CHRE، صراحتاً حذف شدهاند. اگرچه قرار نیست این فهرست کامل باشد، اما قابلیتهای زیر برای نانواپلیکیشنها در نظر گرفته نشدهاند:
- استثنائات C++ و اطلاعات نوع زمان اجرا (RTTI)
- پشتیبانی از چندرشتهایسازی کتابخانه استاندارد، شامل هدرهای C++11
<thread>،<mutex>،<atomic>،<future> - کتابخانههای ورودی/خروجی استاندارد C و C++
- کتابخانه الگوی استاندارد ++C (STL)
- کتابخانه عبارات منظم استاندارد C++
- تخصیص پویای حافظه از طریق توابع استاندارد (برای مثال،
malloc،calloc،realloc،free،operator new) و سایر توابع کتابخانهای استاندارد که ذاتاً از تخصیص پویا استفاده میکنند، مانندstd::unique_ptr - محلیسازی و پشتیبانی از کاراکترهای یونیکد
- کتابخانههای تاریخ و زمان
- توابعی که جریان عادی برنامه را تغییر میدهند، از جمله
<setjmp.h>،<signal.h>،abort،std::terminate - دسترسی به محیط میزبان، شامل
systemوgetenv - POSIX و سایر کتابخانههایی که در استانداردهای زبان C99 یا C++11 گنجانده نشدهاند
در بسیاری از موارد، قابلیتهای معادل از توابع CHRE API و کتابخانههای کاربردی در دسترس هستند. به عنوان مثال، chreLog میتواند برای ثبت وقایع اشکالزدایی که هدف آن سیستم logcat اندروید است، مورد استفاده قرار گیرد، در حالی که یک برنامه سنتیتر ممکن است از printf یا std::cout استفاده کند.
در مقابل، برخی از قابلیتهای کتابخانه استاندارد مورد نیاز هستند. این به پیادهسازی پلتفرم بستگی دارد که این قابلیتها را از طریق کتابخانههای ایستا برای گنجاندن در یک فایل باینری نانواپ یا از طریق پیوند پویا بین نانواپ و سیستم در معرض نمایش قرار دهد. این موارد شامل موارد زیر میشود، اما محدود به آنها نیست:
- ابزارهای کاربردی رشته و آرایه:
memcmp،memcpy،memmove،memset،strlen کتابخانه ریاضی: توابع ممیز شناور با دقت تکی که معمولاً استفاده میشوند:
- عملیات پایه:
ceilf،fabsf،floorf،fmaxf،fminf،fmodf،roundf،lroundf،remainderf - توابع نمایی و توانی:
expf،log2f،powf،sqrtf - توابع مثلثاتی و هذلولی:
sinf،cosf،tanf،asinf،acosf،atan2f،tanhf
- عملیات پایه:
اگرچه برخی از پلتفرمهای اصلی از قابلیتهای اضافی پشتیبانی میکنند، اما یک نانواپ (nanoapp) در پیادهسازیهای CHRE قابل حمل در نظر گرفته نمیشود، مگر اینکه وابستگیهای خارجی خود را به توابع API CHRE و توابع کتابخانهای استاندارد تأیید شده محدود کند.
ویژگیهای اختیاری
برای ارتقای سختافزار و نرمافزار، رابط برنامهنویسی کاربردی CHRE به بخشهایی با ویژگیهای مختلف تقسیم شده است که از دیدگاه API اختیاری تلقی میشوند. اگرچه ممکن است این ویژگیها برای پشتیبانی از یک پیادهسازی سازگار با CHRE لازم نباشند، اما ممکن است برای پشتیبانی از یک نانواپلیکیشن خاص لازم باشند. حتی اگر یک پلتفرم از مجموعهای از APIهای مشخص پشتیبانی نکند، نانواپلیکیشنهایی که به آن توابع ارجاع میدهند باید بتوانند ساخته و بارگذاری شوند.
حسگرها
رابط برنامهنویسی کاربردی CHRE امکان درخواست داده از حسگرها از جمله شتابسنج، ژیروسکوپ، مغناطیسسنج، حسگر نور محیط و حسگر مجاورت را فراهم میکند. این رابطهای برنامهنویسی کاربردی (API) برای ارائه مجموعهای از ویژگیها مشابه با رابطهای برنامهنویسی کاربردی حسگرهای اندروید، از جمله پشتیبانی از دستهبندی نمونههای حسگر برای کاهش مصرف برق، طراحی شدهاند. پردازش دادههای حسگر در CHRE، در مقایسه با اجرا بر روی AP، امکان پردازش سیگنالهای حرکتی با مصرف انرژی بسیار کمتر و تأخیر کمتر را فراهم میکند.
سامانه موقعیتیاب جهانی (GNSS)
CHRE رابطهای برنامهنویسی کاربردی (API) را برای درخواست دادههای مکانی از یک سیستم ماهوارهای ناوبری جهانی (GNSS)، شامل GPS و سایر منظومههای ماهوارهای، ارائه میدهد. این شامل درخواستهایی برای تثبیت موقعیت دورهای و همچنین دادههای اندازهگیری خام میشود، هرچند هر دو قابلیتهای مستقلی هستند. از آنجایی که CHRE ارتباط مستقیمی با زیرسیستم GNSS دارد، در مقایسه با درخواستهای GNSS مبتنی بر AP، مصرف برق کاهش مییابد، زیرا AP میتواند در کل چرخه عمر یک جلسه مکانیابی در حالت خواب باقی بماند.
وایفای
CHRE امکان تعامل با تراشه Wi-Fi را فراهم میکند، که عمدتاً برای اهداف مکانی است. در حالی که GNSS برای مکانهای بیرونی به خوبی کار میکند، نتایج اسکنهای Wi-Fi میتواند اطلاعات مکانی دقیقی را در داخل خانه و مناطق توسعهیافته ارائه دهد. CHRE علاوه بر جلوگیری از هزینه روشن کردن AP برای اسکن، میتواند به نتایج اسکنهای Wi-Fi انجام شده توسط سیستم عامل Wi-Fi برای اهداف اتصال گوش دهد، که معمولاً به دلایل مصرف برق به AP تحویل داده نمیشوند. استفاده از اسکنهای اتصال برای اهداف زمینهای به کاهش تعداد کل اسکنهای Wi-Fi انجام شده و در نتیجه صرفهجویی در مصرف برق کمک میکند.
پشتیبانی از وایفای در CHRE API نسخه ۱.۱ اضافه شد، از جمله قابلیت نظارت بر نتایج اسکن و شروع اسکن بر اساس تقاضا. این قابلیتها در نسخه ۱.۲ با قابلیت انجام اندازهگیریهای زمان رفت و برگشت (RTT) در برابر نقاط دسترسی که از این ویژگی پشتیبانی میکنند، گسترش یافتند که امکان تعیین موقعیت نسبی دقیق را فراهم میکند.
وان
رابط برنامهنویسی کاربردی CHRE امکان بازیابی اطلاعات شناسایی سلول را برای سلول سرویسدهنده و همسایگانش فراهم میکند، که معمولاً برای اهداف مکانیابی دانهدرشت استفاده میشود.
صوتی
CHRE میتواند دستههایی از دادههای صوتی را از یک میکروفون کممصرف پردازش کند، که معمولاً از سختافزاری که برای پیادهسازی SoundTrigger HAL استفاده میشود، بهره میبرد. پردازش دادههای صوتی در CHRE میتواند آن را قادر سازد تا با دادههای دیگر، مانند حسگرهای حرکتی، ترکیب شود.
بلوتوث
CHRE رابطهای برنامهنویسی کاربردی (API) را ارائه میدهد که از زیرمجموعهای از قابلیتهای بلوتوث که از تخلیه بار کم مصرف بهره میبرند، پشتیبانی میکنند. CHRE به نانواپلیکیشنها اجازه میدهد اسکنهای BLE را انجام دهند، RSSI را رصد کنند و دادههای تبلیغاتی BLE را بدون بیدار کردن AP پردازش کنند. علاوه بر این، مالکیت یک اتصال سوکت بلوتوث برقرار شده را میتوان به دامنه تخلیه بار منتقل کرد، که به انرژی کمتری برای نگهداری نیاز دارد و به نانواپلیکیشنها اجازه میدهد تا از طریق اتصال سوکت BLE تخلیه شده ارتباط برقرار کنند.
پیادهسازی مرجع
کد مرجع برای چارچوب CHRE در پروژه AOSP system/chre که با زبان C++11 پیادهسازی شده است، گنجانده شده است. اگرچه اکیداً الزامی نیست، اما توصیه میشود که تمام پیادهسازیهای CHRE بر اساس این کدبیس باشند تا به تضمین سازگاری و تسریع پذیرش قابلیتهای جدید کمک شود. این کد را میتوان به عنوان یک نمونه مشابه با چارچوب اصلی اندروید در نظر گرفت، زیرا یک پیادهسازی متنباز از APIهایی است که برنامهها از آنها استفاده میکنند و به عنوان یک پایه و استاندارد برای سازگاری عمل میکند. اگرچه میتوان آن را با قابلیتهای خاص فروشنده سفارشیسازی و گسترش داد، اما توصیه میشود که کد مشترک تا حد امکان نزدیک به مرجع حفظ شود. مشابه HALهای اندروید، پیادهسازی مرجع CHRE از انتزاعهای مختلف پلتفرم استفاده میکند تا بتواند با هر دستگاهی که حداقل الزامات را برآورده میکند، سازگار شود.
برای جزئیات فنی و راهنمای انتقال، به README موجود در پروژه system/chre مراجعه کنید.