Термическое смягчение

С помощью фреймворка Android производители устройств и разработчики приложений могут использовать тепловые данные для обеспечения согласованного пользовательского опыта (UX), если устройство начинает перегреваться. Например, когда система подвергается термическому стрессу, задания jobscheduler замедляются и, при необходимости, инициируется тепловое отключение фреймворка. Приложения, которые получают уведомления о термическом стрессе через зарегистрированный обратный вызов в классе PowerManager , могут изящно корректировать свой UX.

Термический HAL

Android 9 и ниже используют интерфейс опроса, определенный в Thermal HAL 1.0, для получения показаний температуры. Этот HAL позволял фреймворку 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-термисторов, таких как тепловой сервис фреймворка. Например, RegisterIThermalChangedCallback и UnregisterIThermalChangedCallback для регистрации или отмены регистрации событий изменения степени серьезности. Если степень серьезности заданного датчика изменилась, notifyThrottling отправляет обратный вызов события теплового регулирования прослушивателям термических событий.

В дополнение к информации о термических датчиках, список смягченных охлаждающих устройств представлен в getCurrentCoolingDevices . Порядок этого списка сохраняется, даже если охлаждающее устройство отключилось. Производители устройств могут использовать этот список для сбора метрик statsd .

Более подробную информацию см. в разделе «Справочная реализация» .

Хотя вы можете добавлять собственные расширения, отключать функцию снижения теплового воздействия не следует.

Тепловое обслуживание

В Android 10 и выше тепловой сервис в фреймворке обеспечивает постоянный мониторинг с использованием различных сигналов смягчения от Thermal HAL 2.0 и предоставляет своим клиентам обратную связь по степени серьезности регулирования. Эти клиенты включают внутренние компоненты и приложения Android. Сервис использует два интерфейса обратного вызова связующего устройства, IThermalEventListener и IThermalStatusListener , представленные как обратные вызовы. Первый предназначен для внутреннего использования платформой и производителем устройств, а второй — для приложений Android.

Через интерфейсы обратного вызова текущий тепловой статус устройства можно получить как целочисленное значение в диапазоне от 0x00000000 (без регулирования) до 0x00000006 (устройство выключено). Только доверенная системная служба, такая как API Android или API производителя устройства, может получить доступ к подробной информации о тепловом датчике и тепловом событии. На следующем рисунке представлена ​​модель потока процесса теплового смягчения в Android 10 и выше:

Поток процесса снижения теплового воздействия в 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() удаляет ранее добавленный прослушиватель.

Используйте коды теплового состояния

Коды теплового состояния преобразуются в определенные уровни регулирования, которые можно использовать для сбора данных и проектирования оптимального 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 в значительной степени затронут. На этом этапе тепловое смягчение устройства должно ограничить производительность системы. Это состояние может вызвать побочные эффекты, такие как рывки дисплея и дрожание звука.
THERMAL_STATUS_CRITICAL ( 0x00000004 ) Platform сделала все, чтобы снизить мощность. Программное обеспечение для снижения температуры устройства перевело все компоненты в режим работы на минимальной мощности.
THERMAL_STATUS_EMERGENCY ( 0x00000005 ) Ключевые компоненты платформы отключаются из-за температурных условий, а функциональность устройства ограничена. Этот код состояния представляет собой последнее предупреждение перед отключением устройства. В этом состоянии некоторые функции, такие как модем и сотовые данные, полностью отключаются.
THERMAL_STATUS_SHUTDOWN ( 0x00000006 ) Выключить немедленно. Из-за серьезности этой стадии приложения могут не получить это уведомление.

Производители устройств должны пройти тест VTS для теплового HAL и могут использовать emul_temp из интерфейса ядра sysfs для имитации изменений температуры.