Благодаря платформе Android производители устройств и разработчики приложений могут использовать данные о перегреве для обеспечения стабильного пользовательского опыта (UX) в случае перегрева устройства. Например, при перегреве системы задачи jobscheduler заданий замедляются, и при необходимости инициируется отключение платформы из-за перегрева. Приложения, получающие уведомления о перегреве через зарегистрированный обратный вызов в классе PowerManager могут корректно адаптировать свой UX.
Термальный HAL
В Android 9 и более ранних версиях для получения показаний температуры используется интерфейс опроса, определенный в Thermal HAL 1.0. Этот HAL позволял платформе Android и другим доверенным клиентам, таким как HAL производителя устройства, считывать текущую температуру и пороговые значения регулирования и отключения, специфичные для политики продукта, для каждого датчика через один и тот же API.
В Android 10 была представлена система терморегулирования в рамках Android Framework, а также новая версия HAL, Thermal HAL 2.0, которая абстрагирует интерфейс к аппаратным устройствам подсистемы терморегулирования. Аппаратный интерфейс включает датчики температуры и термисторы для оболочки, батареи, графического процессора, центрального процессора и USB-порта. Температура оболочки устройства является наиболее важной системой для отслеживания, чтобы поддерживать температуру поверхности устройства в пределах заданных температурных ограничений.
Кроме того, Thermal HAL 2.0 предоставляет нескольким клиентам показания датчиков температуры и соответствующие уровни серьезности для индикации теплового стресса. На следующем рисунке показаны два предупреждающих сообщения из системного интерфейса Android. Эти сообщения отображаются, когда интерфейс обратного вызова IThermalEventListener для датчиков USB_PORT и SKIN , соответственно, достигает уровня серьезности THERMAL_STATUS_EMERGENCY .

Рисунок 1. Предупреждения о перегреве.
Текущие значения температуры для различных типов термодатчиков получаются с помощью IThermal HAL . Каждый вызов функции возвращает значение статуса либо SUCCESS , либо FAILURE . Если возвращается SUCCESS , процесс продолжается. Если возвращается FAILURE , в status.debugMessage отправляется сообщение об ошибке, которое должно быть удобочитаемым.
Помимо того, что это интерфейс опроса, возвращающий текущие значения температуры, вы можете использовать функцию обратного вызова IThermalChangedCallback (HIDL, Android 10–13) или IThermalChangedCallback (AIDL, Android 14 и выше) с интерфейсом обратного вызова из клиентов HAL, отвечающих за температуру, например, из службы терморегулирования фреймворка. Например, RegisterIThermalChangedCallback и UnregisterIThermalChangedCallback позволяют регистрировать или отменять регистрацию событий изменения уровня теплового стресса. Если уровень теплового стресса для данного датчика изменился, notifyThrottling отправляет обработчик события регулирования температуры слушателям событий терморегулирования.
В дополнение к информации от термодатчиков, в функции getCurrentCoolingDevices отображается список устройств охлаждения, которые были отключены. Порядок элементов в этом списке сохраняется, даже если устройство охлаждения отключилось. Производители устройств могут использовать этот список для сбора метрик statsd .
Для получения более подробной информации см. эталонную реализацию .
Хотя вы можете добавлять собственные расширения, не следует отключать функцию снижения тепловыделения.
Тепловая служба
В Android 10 и выше служба терморегулирования в рамках фреймворка обеспечивает постоянный мониторинг с использованием различных сигналов снижения температуры от Thermal HAL 2.0 и предоставляет клиентам информацию о степени ограничения температуры. К таким клиентам относятся внутренние компоненты и приложения Android. Служба использует два интерфейса обратного вызова Binder, IThermalEventListener и IThermalStatusListener , предоставляемые в качестве обратных вызовов. Первый предназначен для использования внутри платформы и производителями устройств, а второй — для приложений Android.
Через интерфейсы обратного вызова можно получить текущее тепловое состояние устройства в виде целочисленного значения от 0x00000000 (отсутствие регулирования) до 0x00000006 (выключение устройства). Доступ к подробной информации о тепловом датчике и тепловых событиях может получить только доверенная системная служба, такая как API Android или API производителя устройства. На следующем рисунке представлена модель процесса снижения теплового стресса в Android 10 и выше:

Рисунок 2. Схема процесса снижения тепловыделения в Android 10 и выше.
рекомендации производителя устройства
Для отображения состояния датчика температуры устройства и регулирования частоты обновления для Android 10–13 производители устройств должны реализовать аспект HIDL в Thermal HAL 2.0 ( IThermal.hal ).
Для отображения состояния датчика температуры устройства и регулирования частоты обновления для Android 14 производители устройств должны реализовать аспект AIDL в Thermal HAL 2.0 ( IThermal.aidl ).
Любые факторы, снижающие производительность устройства, включая ограничения по заряду батареи, должны передаваться через тепловой HAL. Для этого необходимо добавить в тепловой HAL все датчики, которые могут указывать на необходимость принятия мер по снижению нагрузки (на основе изменений состояния), и сообщать о степени серьезности принятых мер. Возвращаемое значение температуры от датчика не обязательно должно совпадать с фактической температурой, если оно точно отражает соответствующий пороговый уровень серьезности. Например, вместо фактических пороговых значений температуры можно передавать другие числовые значения, или можно добавить в спецификации пороговых значений защитный диапазон для обеспечения гистерезиса. Однако уровень серьезности, соответствующий этому значению, должен соответствовать тому, что требуется при этом пороге. Например, можно установить критическое пороговое значение температуры равным 72°C, если фактическая температура составляет 65°C, и это соответствует указанному вами критическому уровню серьезности. Уровень серьезности должен быть точным для оптимальной работы тепловой структуры.
Чтобы узнать больше о пороговых уровнях в рамках данной системы и о том, как они соотносятся с мерами по снижению рисков, см. раздел «Использование кодов теплового состояния» .
Используйте термоаппликаторы API.
Приложения могут добавлять и удалять обработчики событий, а также получать доступ к информации о состоянии температуры через класс PowerManager . Интерфейс IThermal предоставляет всю необходимую функциональность, включая возврат значений состояния температуры. Интерфейс связывателя IThermal обернут в интерфейс OnThermalStatusChangedListener , который приложения могут использовать при регистрации или удалении обработчиков событий состояния температуры.
API 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 из интерфейса ядра sysfs для имитации изменений температуры.