کاهش حرارتی

با چارچوب 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 و بالاتر را ارائه می دهد:

جریان فرآیند کاهش حرارت در اندروید 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 تعریف شده‌اند، از سطوح شدت حرارتی مطلع شوند. روش ها عبارتند از:

از کدهای وضعیت حرارتی استفاده کنید

کدهای وضعیت حرارتی به سطوح دریچه گاز خاصی ترجمه می شوند که می توانید از آنها برای جمع آوری داده ها و طراحی یک 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 برای شبیه سازی تغییرات دما استفاده کنند.