как получить информацию об использовании батареи установленных приложений?

Используя этот код, я могу найти уровень заряда батареи телефона:

int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float percent = (level / (float)scale) * 100;

Но как мне получить информацию об использовании батареи приложений, установленных на телефоне, в том числе об использовании экрана, как показано на рисунке ниже?

Скриншот экрана сведений об использовании батареи


person Edgar prabhu    schedule 17.02.2016    source источник
comment
Необходимо получить сведения об использовании батареи для отдельных приложений.   -  person Edgar prabhu    schedule 17.02.2016
comment
проверьте эту ссылку stackoverflow.com/questions/3770021/   -  person Vivek Mishra    schedule 17.02.2016
comment
@VivekMishra мне нужно получить программно, а не командой adb   -  person Edgar prabhu    schedule 17.02.2016
comment
см. ответ Криса по этой ссылке   -  person Vivek Mishra    schedule 17.02.2016
comment
@Edgarprabhu - я проверил ссылку, и в ней определенно есть то, что вы ищете.   -  person Kristy Welsh    schedule 24.02.2016
comment
@VivekMishra - вы должны сделать это ответом.   -  person Kristy Welsh    schedule 24.02.2016
comment
@KristyWelsh опубликовано как ответ   -  person Vivek Mishra    schedule 24.02.2016


Ответы (3)


Измерить энергопотребление для конкретного приложения или для определенной части аппаратного обеспечения телефона не так просто. Из общедоступного Google Developer API это невозможно сделать простым способом. Есть и другие способы, которые довольно сложны. Для каждого Android-смартфона Google требует, чтобы производитель добавил так называемый профиль питания XML. к устройству. Они выглядят так

  <item name="screen.on">0.1</item>  <!-- ~200mA -->
  <item name="screen.full">0.1</item>  <!-- ~300mA -->
  <item name="bluetooth.active">0.1</item> <!-- Bluetooth data transfer, ~10mA -->
  <item name="bluetooth.on">0.1</item>  <!-- Bluetooth on & connectable, but not connected, ~0.1mA -->
  <item name="wifi.on">0.1</item>  <!-- ~3mA -->
  <item name="wifi.active">0.1</item>  <!-- WIFI data transfer, ~200mA -->
  <item name="wifi.scan">0.1</item> 

Они сообщают вам, сколько тока потребляет каждое аппаратное состояние компонента (например, Wi-Fi имеет три состояния, процессор — 10 и т. д.). Теперь Android основан на Linux, и это позволяет вам проверять текущее состояние каждого аппаратного компонента. Например, файл

/sys/devices/virtual/leds/lcd-backlight/brightness

дает вам текущее состояние вашего ЖК-дисплея (обратите внимание, что для этого не требуется root-доступ). Для каждого аппаратного компонента существует такой путь. Если теперь вы хотите точно измерить, сколько энергии потребляет приложение, вам нужно написать службу, которая отслеживает, когда приложение активно или нет, и каковы текущие состояния оборудования. С помощью этой информации вы можете рассчитать потребление энергии.

Также существует приложение с открытым исходным кодом, оно называется PowerTutor (вот ссылка на Play-Store и здесь вы найдете исходный код. Он делает именно то, что я только что объяснил. Они также публикуют научный paper о том, насколько точен их подход (он хорошо работает).

Теперь возникает проблема. Несколько лет назад у меня возникла проблема с измерением энергопотребления некоторых приложений. Клиент хотел, чтобы мы оценили его точное энергопотребление. В итоге мы обнаружили, что профили мощности, на которых основан анализ, недостаточно точны. Создавалось впечатление, что производители просто помещают в XML какие-то значения, которые даже не относятся к устройству. У нас было более 100 различных устройств от 20 разных брендов, только некоторые из них, казалось, имели значения в XML, которые были связаны с устройством.

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

person Westranger    schedule 25.02.2016

Статистику батареи можно сбросить с устройства следующим образом для API >= 19:

adb shell dumpsys batterystats

Для API ‹ 19 используйте:

adb shell dumpsys batteryinfo
person Bogdan Ustyak    schedule 22.02.2016
comment
похоже, это изменилось на adb shell dumpsys batterystats - person CamHart; 17.12.2019

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

Если вы также хотите включить внутренние классы или методы, сделайте следующее:

  1. Перейдите в /платформы/.
  2. Скопируйте, вставьте и замените загруженный скрытый файл API в этот каталог, например. андроид-23/android.jar.
  3. Измените compileSdkVersion и targetSdkVersion на 23 (например).
  4. Наконец, перестройте свой проект.

https://github.com/anggrayudi/android-hidden-api

person Xudong Ran    schedule 26.08.2016