با استفاده از چارچوب اندروید، تولیدکنندگان دستگاه و توسعهدهندگان برنامهها میتوانند از دادههای حرارتی برای اطمینان از یک تجربه کاربری (UX) پایدار در صورت شروع گرمای بیش از حد دستگاه استفاده کنند. به عنوان مثال، هنگامی که یک سیستم تحت فشار حرارتی قرار میگیرد، وظایف jobscheduler محدود میشوند و در صورت لزوم، خاموش شدن حرارتی چارچوب آغاز میشود. برنامههایی که اعلانهای فشار حرارتی را از طریق یک فراخوانی ثبت شده در کلاس PowerManager دریافت میکنند، میتوانند UX خود را به طرز زیبایی تنظیم کنند.
HAL حرارتی
اندروید ۹ و پایینتر از یک رابط نظرسنجی تعریفشده در Thermal HAL 1.0 برای دریافت اطلاعات دما استفاده میکنند. این HAL به چارچوب اندروید و سایر کلاینتهای مورد اعتماد، مانند HAL سازنده دستگاه، اجازه میدهد تا دمای فعلی و آستانههای تنظیم و خاموش کردن خاص سیاست محصول را برای هر حسگر از طریق همان API بخوانند.
اندروید ۱۰ یک سیستم حرارتی در چارچوب اندروید و نسخه جدیدی از HAL، Thermal HAL 2.0، را معرفی کرد که رابط کاربری را به دستگاههای سختافزاری زیرسیستم حرارتی خلاصه میکند. رابط سختافزاری شامل حسگرهای دما و ترمیستورها برای پوست، باتری، پردازنده گرافیکی (GPU)، پردازنده مرکزی (CPU) و پورت USB است. دمای پوست دستگاه مهمترین سیستمی است که باید ردیابی شود تا دمای سطح دستگاه در محدوده حرارتی مشخص شده نگه داشته شود.
علاوه بر این، Thermal HAL 2.0 برای چندین کلاینت، خوانش حسگر حرارتی و سطوح شدت مرتبط را برای نشان دادن تنش حرارتی فراهم میکند. شکل زیر دو پیام هشدار از رابط کاربری سیستم اندروید را نشان میدهد. این پیامها زمانی نمایش داده میشوند که رابط فراخوانی IThermalEventListener برای حسگرهای USB_PORT و SKIN ، به ترتیب، به سطح شدت THERMAL_STATUS_EMERGENCY برسند.

شکل ۱. هشدارهای گرمای بیش از حد.
دمای فعلی برای انواع مختلف حسگرهای حرارتی از طریق IThermal HAL بازیابی میشود. هر فراخوانی تابع، مقدار وضعیت SUCCESS یا FAILURE را برمیگرداند. اگر SUCCESS برگردانده شود، فرآیند ادامه مییابد. اگر FAILURE برگردانده شود، یک پیام خطا، که باید برای انسان قابل خواندن باشد، به status.debugMessage ارسال میشود.
علاوه بر اینکه یک رابط نظرسنجی است که دمای فعلی را برمیگرداند، میتوانید از فراخوانی IThermalChangedCallback (HIDL، اندروید ۱۰ تا ۱۳) یا IThermalChangedCallback (AIDL، اندروید ۱۴ و بالاتر) با رابط فراخوانی از کلاینتهای HAL حرارتی، مانند سرویس حرارتی چارچوب، استفاده کنید. به عنوان مثال، RegisterIThermalChangedCallback و UnregisterIThermalChangedCallback برای ثبت یا لغو ثبت رویدادهای تغییر یافته از نظر شدت دما. اگر شدت دمای یک سنسور مشخص تغییر کرده باشد، notifyThrottling یک فراخوانی رویداد محدودکننده دما را به شنوندگان رویداد حرارتی ارسال میکند.
علاوه بر اطلاعات حسگر حرارتی، فهرستی از دستگاههای خنککنندهی کاهشیافته در getCurrentCoolingDevices نمایش داده میشود. ترتیب این فهرست ثابت است، حتی اگر یک دستگاه خنککننده از دسترس خارج شده باشد. تولیدکنندگان دستگاه میتوانند از این فهرست برای جمعآوری معیارهای statsd استفاده کنند.
برای اطلاعات بیشتر، به پیادهسازی مرجع مراجعه کنید.
اگرچه میتوانید افزونههای خودتان را اضافه کنید، اما نباید عملکرد کاهش دما را غیرفعال کنید.
خدمات حرارتی
در اندروید ۱۰ و بالاتر، سرویس حرارتی در چارچوب، با استفاده از سیگنالهای مختلف کاهش از Thermal HAL 2.0، نظارت مداوم را ارائه میدهد و بازخورد شدت گلوگاه را به کلاینتهای خود ارائه میدهد. این کلاینتها شامل اجزای داخلی و برنامههای اندروید هستند. این سرویس از دو رابط فراخوانی binder، IThermalEventListener و IThermalStatusListener ، که به عنوان فراخوانیهای بازنمایی میشوند، استفاده میکند. اولی برای استفاده داخلی پلتفرم و سازنده دستگاه و دومی برای برنامههای اندروید است.
از طریق رابطهای فراخوانی، وضعیت حرارتی فعلی دستگاه به صورت یک مقدار صحیح از 0x00000000 (بدون گلوگاه) تا 0x00000006 (خاموش شدن دستگاه) قابل بازیابی است. فقط یک سرویس سیستمی قابل اعتماد، مانند API اندروید یا API سازنده دستگاه، میتواند به اطلاعات دقیق حسگر حرارتی و رویداد حرارتی دسترسی داشته باشد. شکل زیر مدلی از جریان فرآیند کاهش اثرات حرارتی در اندروید 10 و بالاتر را ارائه میدهد:

شکل ۲. جریان فرآیند کاهش دما در اندروید ۱۰ و بالاتر.
دستورالعملهای سازنده دستگاه
برای گزارش سنسور دمای دستگاه و وضعیت گلوگاه برای اندروید ۱۰ تا ۱۳، تولیدکنندگان دستگاه باید جنبه HIDL از Thermal HAL 2.0 ( IThermal.hal ) را پیادهسازی کنند.
برای گزارش حسگر دمای دستگاه و وضعیت گلوگاه برای اندروید ۱۴، تولیدکنندگان دستگاه باید جنبه AIDL از Thermal HAL 2.0 ( IThermal.aidl ) را پیادهسازی کنند.
هر چیزی که عملکرد دستگاه را کاهش میدهد، از جمله محدودیتهای توان باتری، باید از طریق HAL حرارتی گزارش شود. برای اطمینان از این اتفاق، تمام حسگرهایی را که ممکن است نیاز به کاهش (بر اساس تغییرات وضعیت) را نشان دهند، در HAL حرارتی قرار دهید و شدت هرگونه اقدام کاهشی انجام شده را گزارش دهید. مقدار دمایی که از خوانش حسگر برگردانده میشود، لازم نیست دمای واقعی باشد، مادامی که آستانه شدت مربوطه را به طور دقیق منعکس کند. به عنوان مثال، میتوانید مقادیر عددی مختلفی را به جای مقادیر آستانه دمای واقعی خود ارسال کنید، یا میتوانید برای ایجاد هیسترزیس، گاردبندینگ را در مشخصات آستانه ایجاد کنید. با این حال، شدت مربوط به آن مقدار باید با آنچه در آن آستانه مورد نیاز است مطابقت داشته باشد. به عنوان مثال، ممکن است تصمیم بگیرید ۷۲ درجه سانتیگراد را به عنوان آستانه دمای بحرانی خود برگردانید، در حالی که دمای واقعی ۶۵ درجه سانتیگراد است و با شدت بحرانی که شما مشخص کردهاید مطابقت دارد. سطح شدت باید برای بهترین عملکرد چارچوب حرارتی دقیق باشد.
برای مطالعه بیشتر در مورد سطوح آستانه در چارچوب و نحوه مطابقت آنها با اقدامات کاهش، به بخش «استفاده از کدهای وضعیت حرارتی» مراجعه کنید.
استفاده از APIهای حرارتی
برنامهها میتوانند شنوندهها را اضافه و حذف کنند و از طریق کلاس PowerManager به اطلاعات وضعیت حرارتی دسترسی داشته باشند. رابط IThermal تمام عملکردهای مورد نیاز، از جمله بازگرداندن مقادیر وضعیت حرارتی را فراهم میکند. رابط اتصال IThermal به عنوان رابط OnThermalStatusChangedListener قرار گرفته است که برنامهها میتوانند هنگام ثبت یا حذف شنوندههای وضعیت حرارتی از آن استفاده کنند.
رابطهای برنامهنویسی کاربردی (API) مربوط به دما در اندروید، هم متدهای فراخوانی (callback) و هم متدهای نظرسنجی (polling) دارند تا برنامهها از طریق کدهای وضعیت (status codes) که در کلاس PowerManager تعریف شدهاند، از سطح شدت دما مطلع شوند. این متدها عبارتند از:
-
getCurrentThermalStatus()وضعیت حرارتی فعلی دستگاه را به صورت یک عدد صحیح برمیگرداند، مگر اینکه دستگاه در حال تنظیم دما باشد. -
addThermalStatusListener()یک شنونده (listener) اضافه میکند. -
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 از رابط sysfs هسته برای شبیهسازی تغییرات دما استفاده کنند.