Как анализировать количество батареи, используемой моим Android-приложением [duplicate]

Раньше я думал, что создание объектов во время выполнения будет лучшим подходом. Теперь я менее уверен, так как вы теряете некоторые полезные функции, хотя это может стоить того, что было бы просто для предотвращения путаницы новичков. Недостатками этого являются:

1. Производительность

def foo(arg=something_expensive_to_compute())):
    ...

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

2. Принудительные связанные параметры

Полезный трюк заключается в привязке параметров лямбда к привязке current переменной при создании лямбда. Например:

funcs = [ lambda i=i: i for i in range(10)]

Возвращает список функций, возвращающих 0,1,2,3 ... соответственно. Если поведение изменено, они вместо этого привяжут i к значению времени вызова для i, поэтому вы получите список функций, которые все вернули 9.

Единственным способом реализации этого в противном случае было бы создать дальнейшее закрытие с привязкой i, то есть:

def make_func(i): return lambda: i
funcs = [make_func(i) for i in range(10)]

3. Introspection

Рассмотрим код:

def foo(a='test', b=100, c=[]):
   print a,b,c

Мы можем получить информацию о аргументах и ​​значениях по умолчанию с помощью модуля inspect, который

>>> inspect.getargspec(foo)
(['a', 'b', 'c'], None, None, ('test', 100, []))

информация очень полезна для таких вещей, как создание документов, метапрограммирование, декораторы и т. д.

Теперь предположим, что поведение по умолчанию может быть изменено так, что это эквивалентно:

_undefined = object()  # sentinel value

def foo(a=_undefined, b=_undefined, c=_undefined)
    if a is _undefined: a='test'
    if b is _undefined: b=100
    if c is _undefined: c=[]

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

64
задан Paresh Mayani 27 September 2011 в 10:37
поделиться

6 ответов

На практике я считаю, что большинство приложений, которые имеют проблемы с питанием, также имеют проблемы с процессором. То есть профиль использования вашего приложения в качестве процессора, вероятно, является хорошим приближением к потреблению вашего аккумулятора. Есть предостережения и исключения, если, например, ваше приложение делает что-то дорогое с графическим процессором, беспроводной сетью, хранилищем и т. Д., А дорогостоящая операция не требует большого времени процессора.

Вот интересный блог о приложении «Power Tutor», который обеспечивает более точное измерение в работающей системе, чем встроенное приложение для батареи: http://gigaom.com/mobile/android-power-consumption-app/ . Я еще не пробовал.

Для другого уровня детализации, вот документ, который разбивает, какие компоненты телефона сосут наибольшее количество сока (обратите внимание, что бумага с 2010 года): http: //www.usenix.org/event/usenix10/tech/full_papers/Carroll.pdf (просто перейдите к разделу 5, чтобы прочитать их результаты). Они говорят, что яркость экрана является самым большим виновником.

Если яркость экрана является самым большим виновником, обязательно установите ее на фиксированный уровень, если вы измеряете использование своего собственного приложения.

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

22
ответ дан P.T. 21 August 2018 в 22:43
поделиться

Вопрос, который вы задали, является предметом исследования прямо сейчас. Существует несколько исследований, посвященных трассировке мелкозернистого энергопотребления, т. Е. Использованию мощности трассировки по потоку или подпрограмме. \

eprof - это один из инструментов, разработанных некоторыми университетскими градациями.

вы можете найти некоторые статьи по этой теме: http://web.ics.purdue.edu/~pathaka/pubs.html

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

4
ответ дан Harshit Syal 21 August 2018 в 22:43
поделиться
  • 1
    Запрещается посещать эту ссылку. Не могли бы вы предоставить рабочий? – saltandpepper 5 March 2013 в 12:55
  • 2
  • 3
    Обе ссылки в ответе и комментарии больше не существуют – Federico Cristina 24 January 2018 в 17:20

Начиная с Android 2.3.3 система имеет собственный монитор батареи.

Настройки -> О телефоне -> Использование аккумулятора

1
ответ дан hunterp 21 August 2018 в 22:43
поделиться
  • 1
    Спасибо за ответ, охотник. Но мне нужен более подробный анализ использования батареи, поэтому я могу выяснить, где и как улучшить использование аккумулятора моего приложения. – Arnab Chakraborty 28 September 2011 в 19:40

Появился новый инструмент, который поставляется с Android 5.0.

Вы можете запустить

adb shell dumpsys batterystats > dump.txt

. Чтобы получить полный сброс батареи вашего устройства. Вы также можете добавить некоторые параметры, такие как --unplugged (только выходные данные с момента последнего отсоединения) или --charged (только выходные данные с момента последнего заряда). Вы также можете добавить имя пакета, чтобы получать информацию только для этого пакета / приложения:

adb shell dumpsys batterystats --unplugged your.package.name > dump.txt

Часть > dump.txt помещает все в файл (возможно, просто работает в Windows, но не уверен. Но вы можете просто оставьте это, дамп будет напечатан прямо на консоли, где вы можете скопировать его и поместить в файл).

Это работает, только если у вас есть устройство с Android 5.x. Если у вас есть устройство с более низким уровнем, вы можете попытаться использовать

adb shell bugreport > bugreport.txt

Но этот файл будет очень большим. (~ 8mb +)

После создания этого файла вы можете использовать Historian Tool для Google

. Чтобы использовать его, вы должны установить Python 2.7.9 и запустить следующая команда

python /path/to/historian.py dump.txt > battery.html

Это создаст файл battery.html, в котором вы сможете увидеть данные в более удобном форматировании.

Последняя вещь: Если вы хотите сбросить статистику дамп батареи просто вызывает

adb shell dumpsys batterystats --reset

(работает только с Android 5.x)

27
ответ дан Informatic0re 21 August 2018 в 22:43
поделиться

Мы провели аналогичное тестирование, чтобы узнать, как мое приложение отвечает за потребление батареи телефона Nexus5.

Но, к сожалению, мы не смогли получить помощь от какого-либо инструмента, но в основном это было основано на ручном тестировании.

Мы идентифицировали некоторые модули в приложении, которые были заподозрены в увеличении потребления батареи.

  1. Модуль информирования о местоположении, в котором используется GPS.
  2. Модуль загрузки, который использует сетевое подключение, запускает фоновая работа в течение длительного времени.
  3. Модуль создания видео, который также делает CPU занятым из-за фоновой работы. и т. д. ...

Наконец, после 3-4 раунда тестирования у нас была определенная тенденция в данных, и мы смогли идентифицировать модуль, который был большим виновником потребления батареи.

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

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

Hope мой опыт был бы полезен для заявления о требованиях в исходном вопросе.

0
ответ дан JNYRanger 21 August 2018 в 22:43
поделиться
  • 1
    Не могли бы вы объяснить шаги, которые были выполнены, чтобы найти модули, потребляющие аккумулятор? – Rahulrr2602 13 March 2018 в 14:27

Я бы сказал, что нет реального инструмента для его проверки, поскольку он не может быть точно определен. Если вы возьмете iPhone, вы увидите, что количество батареек будет идти от 40% до 30%, а затем оставайтесь там на некоторое время, опускайтесь до 20%, снижайтесь до 15%, доходите до 25%, возвращайтесь к 20% ECT , Что вы можете сделать, это зарядить телефон в течение длительного периода времени, чтобы убедиться, что он полностью заряжен, а затем используйте ваше приложение, пока телефон не закроется, и не запомните количество времени, которое потребовалось. Теперь сделайте это с другой версией и посмотрите результат. В основном вам придется играть в игру MasterMind, если вы хотите сделать меньше тестов, насколько это возможно. Кроме того, если изменение не так просто, это, вероятно, не очень важно.

0
ответ дан user 21 August 2018 в 22:43
поделиться
  • 1
    Ваш предложенный метод также не является точным. Что делать, если во время второго запуска само устройство (ОС) или другие установленные приложения решат обновить некоторые данные (резервные контакты, отправлять журналы использования, проверять наличие обновлений и т. Д.), И вы будете отнимать батарею при подключении wifi / 3g и данных перевод? – MikeL 28 October 2014 в 10:50
Другие вопросы по тегам:

Похожие вопросы: