Мощность подсистемы устройства часто измеряется и записывается в лабораторных условиях для различных устойчивых условий, например, когда экран включен или устройство находится в режиме ожидания. Это работает для подсистем с постоянным энергопотреблением или в условиях, которые легко измерить в лабораторных условиях, но не для определенных случаев использования, например, когда на экране отображается видео.
IPower.hal 1.0
предоставляет интерфейс для передачи подсказок по питанию и отчета о совокупных данных о показателях состояния сна подсистемы. В Android 10 и более поздних версиях функция сбора совокупной статистики находится в API-интерфейсах сбора статистики мощности IPowerStats.hal
и обеспечивает способ получения данных об энергопотреблении на устройстве. Это заменяет часть интерфейса IPower.hal
, предназначенную для сбора совокупной статистики, для более четкого разделения функций.
Показания службы IPowerStats
не являются периодическими. Они происходят в ключевые моменты, например, когда батарея разряжается на 1%. Показания снимаются реже, когда разряд батареи низкий, и чаще, когда он высокий. Данные могут быть отправлены обратно на серверы и могут использоваться в отчетах об ошибках для анализа и сортировки. Это поддерживает текущие усилия по снижению энергопотребления и увеличению срока службы батареи.
IPower.hal и IPowerStats.hal
Интерфейсы IPower.hal
и IPowerStats.hal
доступны в Android 10, но функция сбора статистики 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 по Android 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 мс.
- SoC находился в состоянии сбоя питания в течение Y мс.
- Графический процессор находился в состоянии ожидания в течение Z мс.
Используйте аппаратную подсистему мониторинга питания.
Если в конструкции вашего устройства предусмотрена аппаратная подсистема мониторинга энергопотребления, реализуйте IPowerStats.hal
, создав один узел sysfs , из которого PowerStats.hal
сможет анализировать данные, или создав набор системных вызовов типа ioctl .
Вы должны реализовать драйвер ядра таким образом, чтобы предотвратить переполнение аккумулятора. Используемый алгоритм зависит от конструкции вашей уникальной аппаратной подсистемы контроля мощности, которая должна обеспечивать измерения как мгновенного, так и среднего напряжения и тока шины. Драйвер ядра должен собирать эти данные таким образом, чтобы не очищать аккумуляторы энергии, и он должен сохранять накопленные данные об энергии для каждого субрельса с момента загрузки в форме 64-битной переменной, которая увеличивается в зависимости от показаний энергии из каждый запрос аккумулятора.
Статистика для данного компонента (или, при необходимости, нескольких компонентов) должна находиться в одном узле. Хотя это не обычное использование sysfs (обычно ограничивающее каждый узел одним значением), оно обеспечивает согласованность всех данных.
Руководство по проектированию
- Поддерживайте низкую задержку (максимум 1 мс) при чтении с узла sysfs или выполнении системных вызовов.
- Убедитесь, что поддержка функций статистики не приводит к значительному увеличению энергопотребления:
- Не увеличивайте время пробуждения точки доступа (AP) и/или подсистемы для отслеживания таких параметров, как время, проведенное в спящем режиме.
- По возможности передавайте статистику между процессором приложений и прошивкой вместе с другим трафиком.
- При необходимости подсистема может использовать следующие функции драйвера:
- Внутреннее кэширование данных, чтобы избежать задержек и пробуждений за счет слегка устаревших данных.
- Выполнение экстраполяции, когда подсистема находится в режиме сна, чтобы предоставить обновленное время сна без пробуждения подсистемы.
Выбирайте компоненты, подсистемы и статистику
При выборе компонентов или подсистем для сбора данных IPowerStats.hal
выберите на устройстве все, что потребляет значительный ток (5 мА или более) или поддерживает несколько режимов энергопотребления, например следующие:
- Отдельные подсистемы SoC.
- Подсистемы, частично или полностью находящиеся вне SoC, например Wi-Fi, процессор изображений или процессор безопасности.
- Периферийные устройства, такие как мощные светодиоды и камеры.
- Домены питания, использующие разные режимы (например, домен питания для SoC в целом).
Кастомизация
Эту дополнительную функцию можно настроить. Разработайте варианты использования и настройте свое использование:
- Решите, какие рельсы и как часто измерять.
- Решите, когда читать данные и как их интерпретировать.
- Решите, какое действие предпринять и когда его предпринять, основываясь на ваших данных.
Валидация
Тесты 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);