با چارچوب Android، تولیدکنندگان دستگاه و توسعهدهندگان برنامه میتوانند از دادههای حرارتی استفاده کنند تا درصورت داغ شدن بیشازحد دستگاه، تجربه کاربری (UX) یکسانی را تضمین کنند. برای مثال، وقتی سیستم تحت فشار حرارتی قرار میگیرد،
jobscheduler کار محدود میشود و درصورت لزوم،
خاموش شدن حرارتی چارچوب شروع میشود. برنامههایی که ازطریق یک برگشت ثبتشده در کلاس PowerManager اعلانهای تنش حرارتی دریافت میکنند میتوانند «تجربه کاربری» خود را بهنحوی مناسب تنظیم کنند.
لایه انتزاع سختافزار حرارتی
Android 9 و نسخههای پایینتر از میانای نظرسنجی تعریفشده در Thermal HAL 1.0 برای دریافت خوانشهای دما استفاده میکنند. این HAL به چارچوب Android و دیگر مشتریان مطمئن، مثل HAL سازنده دستگاه، اجازه میداد ازطریق همان API، دمای فعلی و آستانههای محدودسازی و خاموش کردن مختص خطمشی محصول را برای هر حسگر بخواند.
Android 10 سیستم حرارتی را در چارچوب Android و نسخه جدیدی از HAL، یعنی Thermal HAL 2.0، معرفی کرد که میانای دستگاههای سختافزاری زیرسیستم حرارتی را انتزاعی میکند. میانای سختافزاری شامل حسگرهای دما و مقاومتهای حرارتی برای پوست، باتری، واحد پردازش گرافیکی، واحد پردازش مرکزی، و درگاه USB است. دمای پوست دستگاه مهمترین سیستم برای ردیابی است تا دمای سطح دستگاه را در محدوده حرارتی مشخصشده نگه دارد.
علاوهبراین، Thermal HAL 2.0 چندین کارخواه را با خوانشهای حسگر حرارتی و سطوح شدت مرتبط برای نشان دادن تنش حرارتی ارائه میدهد. شکل زیر دو پیام هشدار از رابط کاربری سیستم Android را نشان میدهد. این پیامها زمانی نمایش داده میشوند که واسط تماس برگشتی IThermalEventListener برای حسگرهای USB_PORT و SKIN بهترتیب به سطح شدت THERMAL_STATUS_EMERGENCY برسد.
شکل ۱. هشدارهای گرمای بیشازحد.
دمای فعلی برای انواع مختلف حسگرهای حرارتی ازطریق
IThermal HAL بازیابی میشود. هر فراخوانی تابع
مقدار وضعیت SUCCESS یا FAILURE را برمیگرداند. اگر SUCCESS برگردانده شود، فرایند ادامه مییابد. اگر FAILURE برگردانده شود، پیام خطایی که باید برای انسان قابلخواندن باشد به status.debugMessage ارسال میشود.
علاوهبر اینکه میانای نظرسنجی است که دماهای فعلی را برمیگرداند،
میتوانید از فراخوانی برگشتی
IThermalChangedCallback (HIDL، Android 10 تا 13) یا
IThermalChangedCallback (AIDL، Android 14 و بالاتر)
با میانای فراخوانی برگشتی از کلاینتهای HAL حرارتی، مانند سرویس حرارتی چارچوب،
استفاده کنید. برای مثال، RegisterIThermalChangedCallback و
UnregisterIThermalChangedCallback برای ثبت یا لغو ثبت رویدادهای
تغییر شدت. اگر شدت حرارتی حسگر خاصی تغییر کرده باشد،
notifyThrottling یک فراخوان رویداد محدودسازی حرارتی به شنوندگان رویداد حرارتی ارسال میکند.
علاوهبر اطلاعات حسگر حرارتی، فهرستی از دستگاههای خنککننده کاهشیافته
در getCurrentCoolingDevices نشان داده میشود. ترتیب این فهرست ثابت است، حتی
اگر دستگاه خنککننده آفلاین شده باشد. سازندگان دستگاه میتوانند از این فهرست برای
جمعآوری سنجههای statsd استفاده کنند.
برای اطلاعات بیشتر، به پیادهسازی مرجع مراجعه کنید.
اگرچه میتوانید افزونههای خودتان را اضافه کنید، اما نباید عملکرد کاهش حرارت را غیرفعال کنید.
سرویس حرارتی
در Android نسخه ۱۰ و بالاتر، سرویس حرارتی در چارچوب، نظارت مداوم را بااستفاده از سیگنالهای کاهش مختلف از Thermal HAL 2.0 ارائه میدهد و بازخورد شدت کاهش سرعت را به مشتریان خود میدهد. این کلاینتها شامل مؤلفههای داخلی
و برنامههای Android میشود. این سرویس از دو میانای تماس برگشتی پیونددهنده،
IThermalEventListener و IThermalStatusListener، که بهعنوان تماس برگشتی نمایان شدهاند استفاده میکند. اولی برای استفاده داخلی پلاتفرم و سازنده دستگاه است و دومی برای برنامههای Android است.
ازطریق میاناهای بازخوانی، وضعیت حرارتی فعلی دستگاه بهصورت یک مقدار عدد صحیح از 0x00000000 (بدون محدودسازی) تا 0x00000006 (خاموش شدن دستگاه) قابلبازیابی است. فقط سرویس سیستم مورد اعتماد، مثل
میانای برنامهسازی کاربردی Android یا میانای برنامهسازی کاربردی سازنده دستگاه، میتواند به اطلاعات دقیق حسگر حرارتی
و رویداد حرارتی دسترسی داشته باشد. شکل زیر مدلی از
جریان فرایند کاهش حرارت در Android 10 و بالاتر ارائه میدهد:
شکل ۲. جریان فرایند کاهش حرارت در Android 10 و بالاتر.
دستورالعملهای سازنده دستگاه
برای گزارش وضعیت حسگر دمای دستگاه و محدودسازی برای Android نسخه ۱۰ تا ۱۳، سازندگان دستگاه باید جنبه HIDL از Thermal HAL 2.0 (IThermal.hal) را پیادهسازی کنند.
برای گزارش وضعیت حسگر دمای دستگاه و محدودسازی سرعت برای Android 14، سازندگان دستگاه باید جنبه AIDL از Thermal HAL 2.0 (IThermal.aidl) را پیادهسازی کنند.
هر چیزی که عملکرد دستگاه را محدود میکند، ازجمله محدودیتهای توان باتری، باید ازطریق HAL حرارتی گزارش شود. برای اطمینان از وقوع این امر، همه حسگرهایی را که ممکن است نشاندهنده نیاز به کاهش باشند (براساس تغییرات وضعیت) در HAL حرارتی قرار دهید و شدت هرگونه اقدام کاهشی انجامشده را گزارش کنید. مقدار دمای برگشتی از خوانش حسگر لازم نیست دمای واقعی باشد، بهشرطی که بهطور دقیق آستانه شدت مربوطه را منعکس کند. برای مثال، میتوانید بهجای مقادیر آستانه دمای واقعیتان، مقادیر عددی متفاوتی را ارسال کنید، یا میتوانید برای ارائه پسماند، محافظت را در مشخصات آستانه بسازید. بااینحال، شدت مربوط به آن مقدار باید با آنچه در آن آستانه موردنیاز است مطابقت داشته باشد. برای مثال، ممکن است تصمیم بگیرید که ۷۲ درجه سانتیگراد را بهعنوان آستانه دمای بحرانی برگردانید، درحالیکه دمای واقعی ۶۵ درجه سانتیگراد است و با شدت بحرانی که مشخص کردهاید مطابقت دارد. سطح شدت باید دقیق باشد تا چارچوب حرارتی بهترین عملکرد را داشته باشد.
برای مطالعه بیشتر درباره سطوح آستانه در چارچوب و نحوه مطابقت آنها با کنشهای کاهش، به استفاده از کدهای وضعیت حرارتی مراجعه کنید.
استفاده از میاناهای برنامهسازی کاربردی حرارتی
برنامهها میتوانند شنونده اضافه یا حذف کنند و ازطریق کلاس PowerManager به اطلاعات وضعیت حرارتی دسترسی داشته باشند.
میانای IThermal همه عملکردهای موردنیاز را ارائه میدهد، ازجمله
برگرداندن مقادیر وضعیت حرارتی. میانای
IThermal binder
بهعنوان میانای OnThermalStatusChangedListener بستهبندی شده است که برنامهها میتوانند
هنگام ثبت یا برداشتن شنوندگان وضعیت حرارتی از آن استفاده کنند.
«میاناهای برنامهسازی کاربردی حرارتی Android» هم روشهای تماس برگشتی و هم روشهای نظرسنجی برای برنامهها دارند تا ازطریق کدهای وضعیت، که در کلاس PowerManager تعریف شدهاند، از سطوح شدت حرارتی مطلع شوند. روشها عبارتاند از:
getCurrentThermalStatus()وضعیت حرارتی فعلی دستگاه را بهصورت عدد صحیح برمیگرداند، مگر اینکه دستگاه درحال محدود شدن باشد.addThermalStatusListener()شنوندهای را اضافه میکند.removeThermalStatusListener()شنوندهای را که قبلاً اضافه شده است برمیدارد.
استفاده از کدهای وضعیت حرارتی
کدهای وضعیت حرارتی به سطوح محدودسازی خاصی ترجمه میشوند که میتوانید از آنها برای جمعآوری دادهها و طراحی تجربه کاربری بهینه استفاده کنید. برای مثال، برنامهها ممکن است وضعیت 0x00000000 (THERMAL_STATUS_NONE) دریافت کنند که ممکن است بعداً به 0x00000001 (THERMAL_STATUS_LIGHT) تغییر کند. علامتگذاری وضعیت 0x00000000 بهعنوان t0، سپس اندازهگیری زمان سپریشده از وضعیت THERMAL_STATUS_NONE تا وضعیت THERMAL_STATUS_LIGHT بهعنوان t1 به سازندگان دستگاه امکان میدهد تا راهبردهای کاهشی را برای موارد استفاده خاص طراحی و آزمایش کنند. جدول زیر روشهای پیشنهادی برای استفاده از کدهای وضعیت حرارتی را نشان میدهد:
| کد وضعیت حرارتی | شرح و استفاده پیشنهادی |
|---|---|
THERMAL_STATUS_NONE (0x00000000) |
بدون محدودسازی شبکه. از این وضعیت برای اجرای اقدامات محافظتی، مثل تشخیص شروع دوره زمانی (t0 تا t1) از THERMAL_STATUS_NONE (0) تا THERMAL_STATUS_LIGHT (1) استفاده کنید. |
THERMAL_STATUS_LIGHT (0x00000001) |
محدود کردن نور، تجربه کاربری تحت تأثیر قرار نمیگیرد. برای این مرحله از اقدامات ملایم برای کاهش اثر دستگاه استفاده کنید. برای مثال، تقویت یا استفاده از فرکانسهای ناکارآمد را رد کنید، اما فقط در هستههای بزرگ. |
THERMAL_STATUS_MODERATE (0x00000002) |
تحدید متوسط، تجربه کاربری بهشدت تحت تأثیر قرار نمیگیرد. کاهش حرارت بر فعالیتهای پیشزمینه تأثیر میگذارد، بنابراین برنامهها باید فوراً مصرف برق را کاهش دهند. |
THERMAL_STATUS_SEVERE (0x00000003) |
محدودسازی شدید؛ تجربه کاربری بهشدت تحت تأثیر قرار گرفته است. در این مرحله، کاهش حرارت دستگاه باید ظرفیت سیستم را محدود کند. این وضعیت ممکن است باعث عوارض جانبی مانند لرزش نمایشگر و لرزش صدا شود. |
THERMAL_STATUS_CRITICAL (0x00000004) |
پلاتفرم همه اقدامات لازم را برای کاهش مصرف برق انجام داده است. نرمافزار کاهش حرارت دستگاه همه اجزا را در کمترین ظرفیتشان قرار داده است. |
THERMAL_STATUS_EMERGENCY (0x00000005) |
اجزای اصلی در پلاتفرم بهدلیل شرایط حرارتی خاموش میشوند و عملکرد دستگاه محدود میشود. این کد وضعیت نشاندهنده آخرین هشدار قبلاز خاموش شدن دستگاه است. در این حالت، برخیاز کارکردها، مثل مودم و داده شبکه تلفن همراه، بهطور کامل خاموش میشوند. |
THERMAL_STATUS_SHUTDOWN (0x00000006) |
فوراً خاموش شود. بهدلیل شدت این مرحله، ممکن است برنامهها نتوانند این اعلان را دریافت کنند. |
تولیدکنندگان دستگاه باید آزمون VTS را برای HAL حرارتی بگذرانند و میتوانند از
emul_temp از
میانای
kernel sysfs برای شبیهسازی تغییرات دما استفاده کنند.