HAL статистики энергопотребления

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

IPower.hal 1.0 предоставляет интерфейс для передачи подсказок о питании и создания отчетов о совокупных данных показателей спящего режима подсистемы. В Android 10 и более поздних версий функция сбора статистики находится в API IPowerStats.hal и позволяет получать данные об энергопотреблении на устройстве. Это заменяет часть интерфейса IPower.hal, которая отвечает за сбор совокупной статистики, и позволяет более четко разделить функции.

Показатели сервиса IPowerStats не являются периодическими. Они появляются в ключевые моменты, например когда заряд батареи снижается на 1 %. Показатели снимаются реже, когда батарея разряжается медленно, и чаще, когда быстро. Данные могут отправляться на серверы и использоваться в отчетах об ошибках для анализа и сортировки. Это позволяет снизить энергопотребление и увеличить время работы от батареи.

IPower.hal и IPowerStats.hal

В Android 10 доступны оба интерфейса (IPower.hal и IPowerStats.hal), но функция сбора статистики IPower.hal доступна только в интерфейсе IPowerStats.hal. Функциональность IPowerStats.hal включает API для получения и использования данных, собранных с помощью встроенных средств измерения энергопотребления на поддерживаемых устройствах:

  • Выполняет измерения энергопотребления на уровне шины для клиентов с низкой (getRailInfo) и высокой (streamEnergyData) частотой и сообщает о накопленной энергии с момента загрузки.
  • Информация, связанная с каждым поддерживаемым PowerEntity, для которого доступны данные. PowerEntity – это подсистема платформы, периферийное устройство или домен питания, влияющий на общее энергопотребление устройства.
  • Возвращает набор состояний энергопотребления (getPowerEntityStateInfo), для которых указанные объекты предоставляют данные о времени нахождения, а затем возвращает накопленные данные для каждого указанного PowerEntity.

API IPowerStats.hal используются следующими клиентами:

  • Statsd, чтобы собирать показатели энергопотребления для каждой шины.
  • Perfetto, чтобы сопоставить энергопотребление с активностью ЦП.
  • Batterystats, чтобы улучшить атрибуцию батареи, используя измеренные данные, а не оценивая расход батареи по заданным константам в power_profile.xml..

На устройствах с Android 10 и более поздними версиями производитель может выбрать между функциями IPower.hal и IPowerStats.hal, но все клиенты должны использовать IPower.hal, если IPowerStats.hal не реализована .

Варианты реализации IPowerStats.hal

На устройствах с Android 7–9 доступны только функции IPower.hal. На устройствах, обновленных до Android 10, должна быть подсистема мониторинга энергопотребления или другие средства для отслеживания и записи статистики энергопотребления. Некоторые SoC собирают статистику энергопотребления, а информацию о состоянии энергопотребляющих объектов можно получить с помощью программного обеспечения. Оборудование для мониторинга энергопотребления необходимо только для поддержки getRailInfo(), getEnergyData() и streamEnergyData().

Если вы реализуете IPowerStats.hal без аппаратного обеспечения для мониторинга энергопотребления, getRailInfo(), getEnergyData() и streamEnergyData() возвращают NOT_SUPPORTED. Аналогично, getPowerEntityInfo(), getPowerEntityStateInfo() и getPowerEntityStateResidencyData() могут возвращать значение NOT_SUPPORTED, если их не предполагается использовать.

Примеры данных, возвращаемых API для мониторинга железнодорожного транспорта:

  • Шина питания дисплея потребляла X мкВт.
  • Шина питания модема потребляла Y мкВт.

Примеры данных, возвращаемых API спящего режима подсистемы:

  • Модем был в спящем режиме X мс.
  • Система на кристалле находилась в состоянии power-collapse в течение Y мс.
  • Графический процессор находился в режиме ожидания Z мс.

Используйте аппаратную подсистему мониторинга энергопотребления

Если в вашем устройстве есть аппаратная подсистема мониторинга питания, реализуйте IPowerStats.hal, создав один узел sysfs, из которого PowerStats.hal сможет анализировать данные, или набор системных вызовов типа ioctl.

Реализуйте драйвер ядра таким образом, чтобы предотвратить переполнение аккумулятора. Используемый алгоритм зависит от уникальной конструкции подсистемы мониторинга энергопотребления, которая должна предоставлять как мгновенные, так и средние значения напряжения и тока шины. Драйвер ядра должен собирать эти данные таким образом, чтобы не очищать аккумуляторы энергии, и должен поддерживать накопленные данные об энергии для каждой подшины с момента загрузки в виде 64-битной переменной, которая увеличивается вместе с показаниями энергии из каждого запроса аккумулятора.

Статистика для определенного компонента (или нескольких компонентов) должна быть указана в одном узле. Хотя это нетрадиционный способ использования sysfs (обычно каждый узел ограничен одним значением), он обеспечивает согласованность всех данных.

Рекомендации по дизайну

  • Поддерживайте низкую задержку (максимум 1 мс) при чтении из узла sysfs или выполнении системных вызовов.
  • Убедитесь, что функция сбора статистики не приводит к значительному увеличению энергопотребления:
    • Не увеличивайте количество пробуждений процессора приложений и/или подсистемы, чтобы отслеживать параметры, например время, проведенное в спящем режиме.
    • Передавать статистику между процессором приложений и встроенным ПО по возможности вместе с другим трафиком.
  • При необходимости подсистема может использовать следующие функции драйвера:
    • Внутреннее кеширование данных для предотвращения задержек и пробуждений за счет незначительного устаревания данных.
    • Выполнение экстраполяции, когда подсистема находится в спящем режиме, чтобы предоставить обновленное время сна без ее пробуждения.

Выбор компонентов, подсистем и статистики

Выбирая компоненты или подсистемы, для которых нужно собирать данные, IPowerStats.hal выбирайте все, что потребляет значительный ток (5 мА или более) или поддерживает несколько режимов энергопотребления, например:

  • отдельные подсистемы SoC;
  • Подсистемы, частично или полностью находящиеся за пределами SoC, например Wi-Fi, процессор изображений или процессор безопасности.
  • Периферийные устройства, например мощные светодиоды и камеры.
  • Домены питания, которые используют разные режимы (например, домен питания для однокристальной системы в целом).

Настройка канала

Эту функцию можно настроить. Разрабатывайте варианты использования и настраивайте их:

  • Определите, какие рельсы нужно отслеживать и как часто.
  • Решите, когда считывать данные и как их интерпретировать.
  • Принимайте решения на основе данных.

Проверка

Тесты VTS позволяют убедиться, что требования Android соблюдены. Комментарии в IPowerStats.hal используются для проверки соответствия устройства требованиям.

Например, если вы вызываете getRailInfo() и ничего не возвращается, тест VTS завершается ошибкой, поскольку вы не получили информацию об отслеживаемых шинах или возвращенный статус SUCCESS. Если вы получили информацию о железнодорожном транспорте, но она сопровождалась ответом NON_SUPPORTED или FILE_SYSTEM_ERROR, это также считается ошибкой. VTS проверяет, соответствует ли файл HAL спецификации производителя устройства, используя требования в комментариях IPower.hal и IPowerStats.hal. Пример комментариев, используемых при тестировании VTS, показан ниже:

/**
* Rail information:
* Reports information related to the rails being monitored.
*
* @return rails Information about monitored rails.
* @return status SUCCESS on success or NOT_SUPPORTED if
* feature is not enabled or FILESYSTEM_ERROR on filesystem nodes
* access error.
*/
getRailInfo()
generates(vec<e;RailInfo>e; rails, Status status);