تلفنهای هوشمند دارای تعدادی پردازنده هستند که هرکدام برای انجام وظایف مختلف بهینهسازی شدهاند. بااینحال، Android فقط روی یک پردازنده اجرا میشود: پردازنده برنامهها (AP). پردازنده برنامه برای ارائه عملکرد عالی در موارد استفاده با صفحهنمایش روشن، مثل بازی کردن، تنظیم شده است، اما برای پشتیبانی از ویژگیهایی که همیشه به پردازشهای مکرر و کوتاه نیاز دارند، حتی وقتی صفحهنمایش خاموش است، مصرف انرژی بسیار بالایی دارد. پردازندههای کوچکتر میتوانند این حجمهای کاری را بهطور کارآمدتری مدیریت کنند و کارهایشان را بدون تأثیر قابلتوجه بر عمر باتری تکمیل کنند. بااینحال، محیطهای نرمافزاری در این پردازندههای کممصرف محدودتر هستند و میتوانند بسیار متفاوت باشند، که توسعه چندسکویی را دشوار میکند.
«محیط زمان اجرای مرکز زمینهای» (CHRE) پلاتفرم مشترکی برای اجرای برنامهها در پردازنده کممصرف با میانای برنامهسازی کاربردی ساده، استاندارد، و سازگار با جاسازی ارائه میدهد. CHRE به سازندگان اصلی دستگاه و شرکای مورداعتماد آنها کمک میکند تا پردازش را بهراحتی از پردازنده برنامه بردارند، در مصرف باتری صرفهجویی کنند، و بخشهای مختلف تجربه کاربری را بهبود بخشند، و دستهای از ویژگیهای همیشه روشن و متناسب با بافتار را فعال کنند، بهویژه ویژگیهایی که شامل اعمال یادگیری ماشین بر حسگر محیطی میشود.
مفاهیم اصلی
CHRE محیط نرمافزاری است که در آن برنامههای بومی کوچک، بهنام
نانوبرنامهها، در پردازنده کممصرف اجرا میشوند و ازطریق میانای برنامهسازی کاربردی CHRE مشترک با سیستم
زیربنایی تعامل برقرار میکنند. برای تسریع پیادهسازی صحیح
میاناهای برنامهسازی کاربردی CHRE، یک پیادهسازی مرجع چندپلاتفرمی از CHRE در
AOSP گنجانده شده است. پیادهسازی مرجع شامل کد مشترک و انتزاعهایی برای سختافزار و نرمافزار زیرین ازطریق مجموعهای از لایههای انتزاع پلاتفرم (PALs) است. برنامههای Nano تقریباً همیشه به یک یا چند برنامه کارخواه درحال اجرا در
Android گره خوردهاند که ازطریق میاناهای برنامهسازی کاربردی سیستم با دسترسی محدود
ContextHubManager
با CHRE و برنامههای Nano تعامل دارند.
در سطح بالا، میتوان بین معماری CHRE و Android بهطور کلی شباهتهایی پیدا کرد. بااینحال، چند تفاوت مهم وجود دارد:
- CHRE فقط از اجرای برنامههای نانویی که با کد بومی (C یا C++) توسعه یافتهاند پشتیبانی میکند؛ از Java پشتیبانی نمیشود.
- بهدلیل محدودیتهای منابع و محدودیتهای امنیتی، CHRE برای استفاده توسط برنامههای Android طرف سوم دلخواه باز نیست. فقط برنامههای مورداعتماد سیستم میتوانند به آن دسترسی داشته باشند.
همچنین باید بین مفهوم CHRE و مرکز حسگر تمایز مهمی قائل شد. اگرچه استفاده از سختافزار یکسان برای پیادهسازی مرکز حسگر و CHRE رایج است، خود CHRE قابلیتهای حسگر موردنیاز لایه انتزاع سختافزاری حسگرهای Android را ارائه نمیدهد. CHRE به Context Hub HAL متصل است و بهعنوان کارخواه چارچوب حسگر مختص دستگاه عمل میکند تا دادههای حسگر را بدون دخالت AP دریافت کند.
شکل ۱. معماری چارچوب CHRE
لایه انتزاع سختافزار Context Hub
لایه انتزاعی سختافزار (HAL) «مرکز زمینه» میانای بین چارچوب Android و پیادهسازی CHRE دستگاه است که در hardware/interfaces/contexthub تعریف شده است.
Context Hub HAL میاناهای برنامهسازی کاربردی را تعریف میکند که ازطریق آنها چارچوب Android مراکز بافت دردسترس و برنامههای نانویی آنها را شناسایی میکند، ازطریق انتقال پیام با آن برنامههای نانویی تعامل برقرار میکند، و امکان بارگیری و لغو بارگیری برنامههای نانویی را فراهم میکند. پیادهسازی مرجع HAL «مرکز زمینهای» که با پیادهسازی مرجع CHRE کار میکند در
system/chre/host دردسترس است.
درصورت وجود تعارض بین این مستندات و تعریف HAL، تعریف HAL اولویت دارد.
راهاندازی
وقتی Android راهاندازی میشود،
ContextHubService
تابع getHubs() HAL را فرا میخواند تا مشخص کند آیا مرکز زمینهای در دستگاه دردسترس است یا نه. این یک فراخوانی مسدودکننده و یکباره است، بنابراین باید بهسرعت تکمیل شود تا از تأخیر در راهاندازی جلوگیری شود، و باید نتیجه دقیقی برگرداند، زیرا پساز آن نمیتوان کانونهای زمینه جدیدی معرفی کرد.
بار کردن و تخلیه کردن برنامههای کوچک
مرکز زمینهای میتواند شامل مجموعهای از برنامههای نانو باشد که در تصویر دستگاه گنجانده شدهاند و هنگام شروع CHRE بارگیری میشوند. اینها بهعنوان نانوبرنامههای پیشبارشده شناخته میشوند،
و باید در اولین پاسخ ممکن به queryApps() گنجانده شوند.
«لایه انتزاع سختافزار» «مرکز زمینهای» همچنین از بار کردن و بار کردن پویا نانوبرنامهها در زمان اجرا ازطریق توابع loadNanoApp() و unloadNanoApp() پشتیبانی میکند. برنامههای کوچک
در قالب باینری خاص سختافزار CHRE و
پیادهسازی نرمافزار دستگاه به HAL ارائه میشوند.
اگر پیادهسازی برای بار کردن یک برنامه نانو شامل نوشتن آن در حافظه غیرفرار باشد،
مثل فضای ذخیرهسازی فلش متصل به پردازندهای که CHRE را اجرا میکند، در اینصورت
پیادهسازی CHRE باید همیشه با این برنامههای نانو پویا در حالت غیرفعال راهاندازی شود. این یعنی تا زمانی که درخواست enableNanoapp() ازطریق HAL دریافت نشود، هیچکدام از کدهای برنامه کوچک اجرا نمیشود. برنامههای نانویی پیشبارگیریشده میتوانند
در حالت فعالشده مقداردهی اولیه شوند.
Context Hub بازراهاندازی میشود
درحالیکه انتظار نمیرود CHRE درطول عملکرد عادی بازراهاندازی شود، ممکن است برای بازیابی از شرایط غیرمنتظره، مثل تلاش برای دسترسی به نشانی حافظه نگاشتنشده، لازم باشد. در این شرایط، CHRE مستقل از Android بازراهاندازی میشود. «لایه انتزاع سختافزار» ازطریق رویداد RESTARTED به Android اطلاع میدهد که CHRE مجدداً مقداردهی اولیه شده است. این رویداد باید فقط پساز آنکه CHRE به نقطهای رسیده است که میتواند درخواستهای جدیدی مثل queryApps() را بپذیرد ارسال شود.
نمای کلی سیستم CHRE
CHRE براساس معماری رویدادمحور طراحی شده است که در آن واحد اصلی محاسبات رویدادی است که به نقطه ورودی مدیریت رویداد نانوبرنامه ارسال میشود. اگرچه چارچوب CHRE میتواند چندرشتهای باشد، یک برنامه نانو هرگز از چندین رشته بهصورت موازی اجرا نمیشود. چارچوب CHRE ازطریق یکی از سه نقطه ورودی برنامه نانو (nanoappStart()،
nanoappHandleEvent()، و nanoappEnd()) یا ازطریق یک تابع برگشتی که در یک
فراخوانی قبلی CHRE API ارائه شده است با برنامه نانو تعامل میکند، و برنامههای نانو ازطریق CHRE API با چارچوب CHRE و سیستم زیرین تعامل میکنند. «میانای برنامهسازی کاربردی CHRE» مجموعهای از قابلیتهای
پایه و همچنین امکاناتی برای دسترسی به نشانهای زمینهای، ازجمله
حسگرها، GNSS، Wi-Fi، WWAN، و صدا ارائه میدهد و میتوان آن را با قابلیتهای
ویژه فروشنده برای استفاده توسط برنامههای نانویی ویژه فروشنده گسترش داد.
سیستم ساخت
While the Context Hub HAL and other necessary AP-side components are built alongside Android, code that runs within CHRE can have requirements that make it incompatible with the Android build system, such as the need for a specialized toolchain. بنابراین، پروژه CHRE در AOSP یک سیستم ساخت سادهشده براساس GNU Make برای کامپایل کردن نانوبرنامهها و، بهصورت اختیاری، چارچوب CHRE در کتابخانههایی که میتوانند با سیستم ادغام شوند ارائه میدهد. سازندگان دستگاه که پشتیبانی از CHRE را اضافه میکنند باید پشتیبانی سیستم ساخت را برای دستگاههای هدف خود در AOSP ادغام کنند.
«میانای برنامهسازی کاربردی CHRE» براساس استاندارد زبان C99 نوشته شده است و پیادهسازی مرجع از زیرمجموعه محدود C++11 استفاده میکند که برای برنامههای با منابع محدود مناسب است.
CHRE API
«میانای برنامهسازی کاربردی CHRE» مجموعهای از فایلهای سرصفحه C است که واسط نرمافزاری بین یک برنامه کوچک و سیستم را تعریف میکند. این چارچوب بهگونهای طراحی شده است که کد نانوبرنامهها را در همه دستگاههایی که از CHRE پشتیبانی میکنند سازگار کند، یعنی کد منبع نانوبرنامه برای پشتیبانی از نوع دستگاه جدید نیازی به اصلاح ندارد، اگرچه ممکن است لازم باشد بهطور خاص برای مجموعه دستورالعمل پردازنده دستگاه هدف یا میانای دودویی کاربردی (ABI) بازهمگردانی شود. معماری CHRE و طراحی میانای برنامهسازی کاربردی همچنین تضمین میکند که برنامههای نانو در نسخههای مختلف «میانای برنامهسازی کاربردی CHRE» سازگاری باینری دارند، به این معنی که یک برنامه نانو نیازی ندارد برای اجرا در سیستمی که نسخه متفاوتی از «میانای برنامهسازی کاربردی CHRE» را در مقایسه با میانای برنامهسازی کاربردی هدف که برنامه نانو دربرابر آن کامپایل شده است پیادهسازی میکند، دوباره کامپایل شود. بهعبارت دیگر، اگر یک باینری نانوبرنامه روی دستگاهی اجرا شود که از CHRE API v1.3 پشتیبانی میکند، و آن دستگاه برای پشتیبانی از CHRE API v1.4 ارتقا یابد، همان باینری نانوبرنامه به عملکرد خود ادامه میدهد. بههمین ترتیب، برنامه کوچک میتواند در CHRE API v1.2 اجرا شود، و میتواند در زمان اجرا تعیین کند که آیا برای دستیابی به استفادهاش به قابلیتهای API v1.3 نیاز دارد یا اینکه میتواند، احتمالاً با افت کیفیت ویژگی، کار کند.
نسخههای جدید CHRE API همزمان با Android منتشر میشوند، اما ازآنجاییکه پیادهسازی CHRE بخشی از پیادهسازی فروشنده است، نسخه CHRE API پشتیبانیشده در یک دستگاه لزوماً با نسخه Android مرتبط نیست.
خلاصه نسخه
مانند
طرح نسخهبندی Android HIDL،
«میانای برنامهسازی کاربردی CHRE» از نسخهبندی معنایی پیروی میکند.
نسخه اصلی نشاندهنده سازگاری باینری است، درحالیکه نسخه فرعی زمانی افزایش مییابد که ویژگیهای سازگار با نسخههای قبلی معرفی شوند. «میانای برنامهسازی کاربر CHRE»
شامل حاشیهنویسیهای کد منبع برای شناسایی نسخهای است که یک تابع
یا پارامتر را معرفی کرده است، برای مثال @since v1.1.
پیادهسازی CHRE همچنین نسخه وصله خاص پلاتفرمی را ازطریق
chreGetVersion() آشکار میکند که نشان میدهد چه زمانی رفع اشکال یا بهروزرسانیهای جزئی در
پیادهسازی انجام شده است.
برای خلاصه هر نسخه، version.h را ببینید.
ویژگیهای اجباری سیستم
درحالیکه منابع سیگنالهای زمینهای، مانند حسگرها، در دستههای ویژگیهای اختیاری قرار میگیرند، چند عملکرد اصلی در تمامی پیادهسازیهای CHRE الزامی است. این شامل میاناهای برنامهسازی کاربردی سیستم اصلی، مثل میاناهای مربوط به تنظیم زمانسنجها، ارسال و دریافت پیام به مشتریان در پردازنده برنامهها، گزارشگیری، و غیره میشود. برای جزئیات کامل، سرصفحههای میانای برنامهسازی کاربردی را ببینید.
علاوهبر ویژگیهای سیستم اصلی که در «میانای برنامهسازی کاربردی CHRE» تدوین شدهاند، ویژگیهای سطح سیستم CHRE اجباری نیز وجود دارد که در سطح Context Hub HAL مشخص شدهاند. مهمترین آنها قابلیت بار کردن و بار کردن پویای برنامههای کوچک است.
کتابخانه استاندارد C/C++
برای بهحداقل رساندن استفاده از حافظه و پیچیدگی سیستم، پیادهسازیهای CHRE باید فقط از زیرمجموعهای از کتابخانههای استاندارد C و C++ و ویژگیهای زبان نیازمند پشتیبانی زمان اجرا پشتیبانی کنند. با پیروی از این اصول، برخیاز ویژگیها بهدلیل وابستگیهای گسترده در سطح سیستمعامل و حافظه بهطور صریح کنار گذاشته میشوند و برخیدیگر بهدلیل اینکه با «میاناهای برنامهسازی کاربردی» مناسبتر 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 میتوان برای گزارش اشکالزدایی
هدفیابیشده برای سیستم Android 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
- عملیات پایه:
درحالیکه برخیاز پلاتفرمهای زیربنایی از قابلیتهای اضافی پشتیبانی میکنند، یک برنامه کوچک در پیادهسازیهای CHRE قابلحمل درنظر گرفته نمیشود، مگر اینکه وابستگیهای خارجی خود را به توابع CHRE API و توابع کتابخانه استاندارد تأییدشده محدود کند.
ویژگیهای اختیاری
برای ارتقای سختافزار و نرمافزار، CHRE API به حوزههای ویژگی تقسیم میشود، که از دیدگاه API اختیاری درنظر گرفته میشوند. اگرچه ممکن است این ویژگیها برای پشتیبانی از پیادهسازی CHRE سازگار لازم نباشد، اما ممکن است برای پشتیبانی از یک نانوبرنامه خاص لازم باشد. حتی اگر پلاتفرمی از مجموعه خاصی از میاناهای برنامهسازی کاربردی پشتیبانی نکند، نانوبرنامههایی که به آن عملکردها ارجاع میدهند باید بتوانند ساخته و بار شوند.
حسگرها
«میانای برنامهسازی کاربردی CHRE» امکان درخواست داده از حسگرها را فراهم میکند، ازجمله شتابسنج، ژیروسکوپ، مغناطیسسنج، حسگر نور محیطی، و حسگر مجاورت. این «میاناهای برنامهسازی کاربردی» برای ارائه مجموعهای از ویژگیهای مشابه با «میاناهای برنامهسازی کاربردی حسگرهای Android» طراحی شدهاند، ازجمله پشتیبانی از دستهبندی نمونههای حسگر برای کاهش مصرف انرژی. پردازش دادههای حسگر در CHRE باعث میشود پردازش سیگنالهای حرکتی در مقایسه با اجرا در AP با مصرف انرژی بسیار کمتر و تأخیر کمتر انجام شود.
GNSS
CHRE میاناهای برنامهسازی کاربردی برای درخواست دادههای مکان از سیستم ماهوارهای ناوبری جهانی (GNSS)، ازجمله GPS و دیگر منظومههای ماهوارهای، ارائه میدهد. این شامل درخواستهای اصلاح موقعیت دورهای و همچنین دادههای اندازهگیری خام میشود، اگرچه هر دو قابلیتهای مستقلی هستند. ازآنجاییکه CHRE پیوند مستقیمی با زیرسیستم GNSS دارد، در مقایسه با درخواستهای GNSS مبتنی بر AP، مصرف انرژی کاهش مییابد، زیرا AP میتواند درطول چرخه عمر جلسه مکان در حالت خواب بماند.
Wi-Fi
CHRE امکان تعامل با تراشه Wi-Fi را فراهم میکند، که عمدتاً برای اهداف مکانی است. درحالیکه «سامانه ماهوارهای ناوبری جهانی» برای مکانهای فضای باز بهخوبی کار میکند، نتایج اسکنهای Wi-Fi میتواند اطلاعات مکان دقیقی را در فضاهای بسته و مناطق توسعهیافته ارائه دهد. علاوهبر اجتناب از هزینه بیدار کردن AP برای اسکن، CHRE میتواند به نتایج اسکنهای Wi-Fi که توسط میانافزار Wi-Fi برای اهداف اتصالپذیری انجام میشود گوش دهد، که معمولاً بهدلایل مربوط به مصرف برق به AP ارائه نمیشوند. استفاده از اسکنهای اتصالپذیری برای اهداف زمینهای به کاهش تعداد کل اسکنهای Wi-Fi انجامشده و صرفهجویی در مصرف برق کمک میکند.
پشتیبانی از Wi-Fi در CHRE API v1.1 اضافه شد، ازجمله امکان نظارت بر نتایج اسکن و راهاندازی اسکن درصورت نیاز. این قابلیتها در نسخه ۱.۲ با امکان انجام اندازهگیریهای زمان رفتوبرگشت (RTT) دربرابر نقاط دسترسی که از این ویژگی پشتیبانی میکنند گسترش یافت، که امکان تعیین دقیق موقعیت نسبی را فراهم میکند.
WWAN
CHRE API امکان بازیابی اطلاعات شناسایی سلول را برای سلول ارائهدهنده و همسایگان آن فراهم میکند، که معمولاً برای اهداف مکانیابی با دقت پایین استفاده میشود.
صوتی
CHRE میتواند دستههای دادههای صوتی را از میکروفون کممصرف پردازش کند، که معمولاً از سختافزار استفادهشده برای پیادهسازی SoundTrigger HAL بهره میبرد. پردازش دادههای صوتی در CHRE میتواند امکان ترکیب آن با دادههای دیگر، مثل حسگرهای حرکتی، را فراهم کند.
بلوتوث
«محیط اجرای زمینه اتصال» میاناهای برنامهسازی کاربردیای ارائه میدهد که از زیرمجموعهای از عملکرد «بلوتوث» که از بارگیری کممصرف بهره میبرد پشتیبانی میکند. «محیط زمینهای حسگر محاسباتی» به برنامههای نانو اجازه میدهد بدون بیدار کردن AP، اسکنهای BLE انجام دهند، «شاخص قدرت سیگنال دریافتی» را پایش کنند، و دادههای تبلیغات BLE را پردازش کنند. علاوهبراین، مالکیت اتصال سوکت بلوتوث برقرارشده میتواند به دامنه واگذاری منتقل شود که برای نگهداری انرژی کمتری نیاز دارد و به برنامههای کوچک اجازه میدهد ازطریق اتصال سوکت BLE واگذارشده ارتباط برقرار کنند.
پیادهسازی مرجع
کد مرجع چارچوب CHRE در AOSP در پروژه system/chre
قرار دارد که در C++11 پیادهسازی شده است. اگرچه این الزام بهطور دقیق وجود ندارد، اما توصیه میشود که همه پیادهسازیهای CHRE براساس این پایگاه کد باشد تا به تضمین یکپارچگی و تسریع پذیرش قابلیتهای جدید کمک کند. این کد را میتوان بهعنوان مشابهی برای چارچوب اصلی Android درنظر گرفت، زیرا پیادهسازی متنباز میاناهای برنامهسازی کاربردی است که برنامهها از آن استفاده میکنند و بهعنوان مبنا و استانداردی برای سازگاری عمل میکند. درحالیکه میتوان آن را با قابلیتهای خاص فروشنده سفارشیسازی و گسترش داد، توصیه میشود که کد مشترک تا حد امکان نزدیک به مرجع حفظ شود. پیادهسازی مرجع CHRE، مشابه HALهای Android، از انتزاعهای پلاتفرم مختلفی استفاده میکند تا بتواند با هر دستگاهی که حداقل الزامات را برآورده میکند سازگار شود.
برای جزئیات فنی و راهنمای انتقال،
README
موجود در پروژه system/chre را ببینید.