با چارچوب Android، سازندگان دستگاه و توسعهدهندگان برنامهها میتوانند از دادههای حرارتی برای اطمینان از تجربه کاربری ثابت (UX) در صورت شروع به گرم شدن بیش از حد دستگاه استفاده کنند. به عنوان مثال، هنگامی که یک سیستم تحت فشار حرارتی قرار میگیرد، کارهای jobscheduler
متوقف میشوند و در صورت لزوم، خاموشی حرارتی چارچوب آغاز میشود. برنامههایی که اعلانهای استرس حرارتی را از طریق تماسهای ثبتشده در کلاس PowerManager
دریافت میکنند، میتوانند UX خود را به خوبی تنظیم کنند.
HAL حرارتی
اندروید 9 و پایین تر از رابط نظرسنجی تعریف شده در Thermal HAL 1.0 برای دریافت خوانش دما استفاده می کند. این HAL به فریمورک اندروید و سایر مشتریان قابل اعتماد، مانند HAL سازنده دستگاه، اجازه میدهد تا دمای فعلی و آستانههای خاموشی و خاموشی خاص برای هر سنسور را از طریق همان API بخوانند.
اندروید 10 یک سیستم حرارتی در چارچوب اندروید و نسخه جدیدی از HAL، Thermal HAL 2.0 را معرفی کرد که رابط را به دستگاههای سختافزاری زیرسیستم حرارتی خلاصه میکند. رابط سخت افزاری شامل سنسورهای دما و ترمیستور برای پوست، باتری، GPU، CPU و پورت USB است. دمای پوست دستگاه مهمترین سیستم برای ردیابی برای حفظ دمای سطح دستگاه در محدوده های حرارتی مشخص است.
علاوه بر این، Thermal HAL 2.0 برای چندین مشتری خوانش حسگر حرارتی و سطوح شدت مرتبط را برای نشان دادن استرس حرارتی فراهم می کند. در شکل زیر دو پیام هشدار از رابط کاربری سیستم اندروید نشان داده شده است. این پیامها زمانی نمایش داده میشوند که رابط پاسخ تماس IThermalEventListener
برای حسگرهای USB_PORT
و SKIN
به ترتیب به سطح شدت THERMAL_STATUS_EMERGENCY
برسد.
شکل 1. هشدارهای گرمای بیش از حد.
دمای فعلی برای انواع مختلف حسگرهای حرارتی از طریق IThermal HAL بازیابی می شود. هر فراخوانی تابع یک مقدار وضعیت SUCCESS
یا FAILURE
را برمیگرداند. اگر SUCCESS
برگردانده شود، روند ادامه می یابد. اگر FAILURE
برگردانده شود، یک پیام خطا، که باید توسط انسان قابل خواندن باشد، به status.debugMessage
ارسال می شود.
علاوه بر اینکه یک رابط نظرسنجی است که دمای فعلی را برمیگرداند، میتوانید از callback IThermalChangedCallback
(HIDL، Android 10 تا 13) یا IThermalChangedCallback
(AIDL، Android 14 و بالاتر) با رابط تماس برگشتی از کلاینتهای HAL حرارتی، مانند فریمورک استفاده کنید. سرویس حرارتی برای مثال، RegisterIThermalChangedCallback
و UnregisterIThermalChangedCallback
برای ثبت یا لغو ثبت رویدادهای تغییر یافته با شدت تغییر دهید. اگر شدت حرارتی یک حسگر معین تغییر کرده باشد، notifyThrottling
یک رویداد throttling حرارتی را به شنوندگان رویداد حرارتی ارسال می کند.
علاوه بر اطلاعات حسگر حرارتی، فهرستی از دستگاههای خنککننده کاهشیافته در getCurrentCoolingDevices
نمایش داده میشود. ترتیب این فهرست پایدار است، حتی اگر دستگاه خنک کننده آفلاین باشد. سازندگان دستگاه می توانند از این لیست برای جمع آوری معیارهای statsd
استفاده کنند.
برای اطلاعات بیشتر، به پیاده سازی مرجع مراجعه کنید.
در حالی که می توانید برنامه های افزودنی خود را اضافه کنید، نباید عملکرد کاهش حرارتی را غیرفعال کنید.
سرویس حرارتی
در اندروید 10 و بالاتر، سرویس حرارتی در چارچوب با استفاده از سیگنالهای کاهشدهنده مختلف از Thermal HAL 2.0، نظارت دائمی را ارائه میکند و بازخورد شدید شدت را به مشتریان خود میدهد. این کلاینتها شامل اجزای داخلی و برنامههای اندروید میشوند. این سرویس از دو رابط تماس بایندر، IThermalEventListener
و IThermalStatusListener
استفاده میکند که بهعنوان پاسخ تماس در معرض نمایش قرار میگیرند. اولی برای پلتفرم داخلی و استفاده سازنده دستگاه و دومی برای برنامه های اندروید است.
از طریق واسط های تماس برگشتی، وضعیت حرارتی فعلی دستگاه به صورت یک مقدار صحیح از 0x00000000
(بدون دریچه گاز) تا 0x00000006
(خاموش شدن دستگاه) قابل بازیابی است. فقط یک سرویس سیستم قابل اعتماد، مانند API Android یا API سازنده دستگاه، میتواند به اطلاعات دقیق حسگر حرارتی و رویداد حرارتی دسترسی داشته باشد. شکل زیر مدلی از جریان فرآیند کاهش حرارت در اندروید 10 و بالاتر را ارائه می دهد:
شکل 2. جریان فرآیند کاهش حرارت در اندروید 10 و بالاتر.
دستورالعمل سازنده دستگاه
برای گزارش سنسور دمای دستگاه و وضعیت دریچه گاز برای Android 10 تا 13، سازندگان دستگاه باید جنبه HIDL Thermal HAL 2.0 ( IThermal.hal
) را اجرا کنند.
برای گزارش سنسور دمای دستگاه و وضعیت دریچه گاز برای Android 14، سازندگان دستگاه باید جنبه AIDL Thermal HAL 2.0 ( IThermal.aidl
) را اجرا کنند.
هر چیزی که عملکرد دستگاه را کاهش می دهد، از جمله محدودیت های قدرت باتری، باید از طریق HAL حرارتی گزارش شود. برای اطمینان از این اتفاق، تمام حسگرهایی که ممکن است نیاز به کاهش (بر اساس تغییرات وضعیت) را نشان دهند را در HAL حرارتی قرار دهید و شدت هر گونه اقدامات کاهشی انجام شده را گزارش دهید. مقدار دمایی که از قرائت سنسور بازگردانده میشود نباید دمای واقعی باشد، تا زمانی که آستانه شدت متناظر را دقیقاً منعکس کند. به عنوان مثال، میتوانید مقادیر عددی متفاوتی را به جای مقادیر آستانه دمای واقعی خود ارسال کنید، یا میتوانید برای ایجاد پسماند، نوار محافظ را در مشخصات آستانه ایجاد کنید. با این حال، شدت متناظر با آن مقدار باید با آنچه در آن آستانه مورد نیاز است مطابقت داشته باشد. برای مثال، ممکن است تصمیم بگیرید که 72 درجه سانتیگراد را به عنوان آستانه دمای بحرانی خود برگردانید، زمانی که دمای واقعی 65 درجه سانتیگراد است و با شدت بحرانی که مشخص کرده اید مطابقت دارد. سطح شدت باید برای بهترین عملکرد چارچوب حرارتی دقیق باشد.
برای مطالعه بیشتر در مورد سطوح آستانه در چارچوب و نحوه مطابقت آنها با اقدامات کاهش، به استفاده از کدهای وضعیت حرارتی مراجعه کنید.
از API های حرارتی استفاده کنید
برنامه ها می توانند شنونده ها را اضافه و حذف کنند و از طریق کلاس PowerManager
به اطلاعات وضعیت حرارتی دسترسی داشته باشند. رابط IThermal
تمام عملکردهای مورد نیاز، از جمله برگرداندن مقادیر وضعیت حرارتی را فراهم می کند. رابط IThermal binder به عنوان رابط OnThermalStatusChangedListener
پیچیده شده است که برنامه ها می توانند هنگام ثبت یا حذف شنوندگان وضعیت حرارتی از آن استفاده کنند.
APIهای حرارتی اندروید دارای روشهای تماس و نظرسنجی هستند تا برنامهها از طریق کدهای وضعیت، که در کلاس PowerManager
تعریف شدهاند، از سطوح شدت حرارتی مطلع شوند. روش ها عبارتند از:
-
getCurrentThermalStatus()
وضعیت حرارتی فعلی دستگاه را به صورت یک عدد صحیح برمیگرداند، مگر اینکه دستگاه در حال throttling باشد. -
addThermalStatusListener()
شنونده اضافه می کند. -
removeThermalStatusListener()
شنونده اضافه شده قبلی را حذف می کند.
از کدهای وضعیت حرارتی استفاده کنید
کدهای وضعیت حرارتی به سطوح دریچه گاز خاصی ترجمه می شوند که می توانید از آنها برای جمع آوری داده ها و طراحی یک UX بهینه استفاده کنید. برای مثال، برنامهها ممکن است وضعیت 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 ) | کاهش سرعت، UX تحت تأثیر قرار نمی گیرد. برای این مرحله از کاهش دهنده های دستگاه استفاده کنید. به عنوان مثال، از تقویت یا استفاده از فرکانس های ناکارآمد صرف نظر کنید، اما فقط در هسته های بزرگ. |
THERMAL_STATUS_MODERATE ( 0x00000002 ) | فشار متوسط، UX تاثیر زیادی ندارد. کاهش حرارتی بر فعالیتهای پیشزمینه تأثیر میگذارد، بنابراین برنامهها باید فوراً قدرت را کاهش دهند. |
THERMAL_STATUS_SEVERE ( 0x00000003 ) | گلوگاه شدید؛ UX تا حد زیادی تحت تاثیر قرار می گیرد. در این مرحله، کاهش حرارتی دستگاه باید ظرفیت سیستم را محدود کند. این حالت ممکن است عوارض جانبی، مانند jank صفحه نمایش و لرزش صدا ایجاد کند. |
THERMAL_STATUS_CRITICAL ( 0x00000004 ) | پلتفرم تمام تلاش خود را برای کاهش قدرت انجام داده است. نرم افزار کاهش حرارت دستگاه، تمامی قطعات را در کمترین ظرفیت خود قرار داده است. |
THERMAL_STATUS_EMERGENCY ( 0x00000005 ) | اجزای کلیدی پلت فرم به دلیل شرایط حرارتی خاموش می شوند و عملکرد دستگاه محدود است. این کد وضعیت نشان دهنده آخرین هشدار قبل از خاموش شدن دستگاه است. در این حالت برخی از عملکردها مانند مودم و داده های سلولی به طور کامل خاموش می شوند. |
THERMAL_STATUS_SHUTDOWN ( 0x00000006 ) | فورا خاموش شود. به دلیل شدت این مرحله، ممکن است برنامه ها نتوانند این اعلان را دریافت کنند. |
سازندگان دستگاه باید تست VTS را برای HAL حرارتی بگذرانند و می توانند emul_temp
از رابط هسته sysfs برای شبیه سازی تغییرات دما استفاده کنند.