Фреймворк Android позволяет производителям устройств и разработчикам приложений использовать данные о температуре, чтобы обеспечивать стабильное удобство использования, если устройство начинает перегреваться. Например, когда система подвергается тепловому стрессу,
задачи jobscheduler ограничиваются и, если необходимо, инициируется тепловое отключение фреймворка. Приложения, которые получают уведомления о перегреве через зарегистрированный обратный вызов в классе PowerManager, могут корректно адаптировать интерфейс.
Thermal HAL
В Android 9 и более ранних версиях для получения данных о температуре используется интерфейс опроса, определенный в Thermal HAL 1.0. Этот уровень абстракции позволяет фреймворку Android и другим доверенным клиентам, например HAL производителя устройства, считывать текущую температуру и пороговые значения для регулирования производительности и отключения, заданные в правилах для каждого датчика, через один и тот же API.
В Android 10 появилась система управления нагревом в структуре Android и новая версия 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, таких как сервис Thermal Service фреймворка. Например, RegisterIThermalChangedCallback и UnregisterIThermalChangedCallback для регистрации или отмены регистрации событий, связанных с изменением серьезности. Если уровень перегрева датчика изменился, notifyThrottling отправляет обратный вызов события троттлинга прослушивателям событий перегрева.
Помимо информации с датчика температуры, в getCurrentCoolingDevices также представлен список устройств, которые были отключены из-за перегрева. Порядок устройств в списке не меняется, даже если одно из них отключилось. Производители устройств могут использовать этот список для сбора показателей statsd.
Подробную информацию можно найти в справочном руководстве по реализации.
Вы можете добавлять собственные расширения, но не отключайте функцию терморегуляции.
Тепловизор
В Android 10 и более поздних версий сервис Thermal Framework постоянно отслеживает состояние устройства, используя различные сигналы от 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 binder
обернут в интерфейс OnThermalStatusChangedListener, который приложения могут использовать
при регистрации или удалении слушателей статуса перегрева.
В Android Thermal API есть методы обратного вызова и опроса, которые позволяют приложениям получать уведомления об уровнях перегрева с помощью кодов статуса, определенных в классе 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) |
Сильное ограничение; UX значительно ухудшается. На этом этапе система должна ограничивать свою производительность, чтобы избежать перегрева. Это может привести к побочным эффектам, таким как рывки при воспроизведении видео и аудио. |
THERMAL_STATUS_CRITICAL (0x00000004) |
Платформа сделала все возможное, чтобы снизить энергопотребление. Программное обеспечение для снижения температуры устройства перевело все компоненты в режим минимальной производительности. |
THERMAL_STATUS_EMERGENCY (0x00000005) |
Основные компоненты платформы отключаются из-за перегрева, и функциональность устройства ограничена. Этот код статуса представляет собой последнее предупреждение перед отключением устройства. В этом режиме некоторые функции, например модем и мобильный интернет, полностью отключены. |
THERMAL_STATUS_SHUTDOWN (0x00000006) |
Немедленно выключите устройство. Из-за серьезности этого этапа приложения могут не получать уведомления. |
Производители устройств должны пройти тест VTS для HAL терморегулирования и могут использовать emul_temp из интерфейса kernel sysfs для имитации изменений температуры.