Я думаю, что большинство из вас, по крайней мере, слышали о WakeLocks . Многие из вас уже испытали их — сознательно или нет. Некоторые могут знать, как обращаться с ними в целом, но лишь немногие знают, как обращаться с «более сложными кандидатами».
Для тех, кто не знает, хотя приведенная выше ссылка ведет к объяснению, краткое резюме: приложения могут запрашивать, WAKE_LOCK
чтобы компонент устройства не «спал», чтобы они могли выполнять задачу, даже когда дисплей выключен. Это очень полезно в большинстве случаев (например, держать экран включенным во время навигации, поддерживать Wi-Fi активным для потоковой передачи музыки), но при неправильном использовании это приводит к разрядке аккумулятора в течение короткого времени (до 25% в час). .
В большинстве случаев легко определить источник (обычно приложение с плохим поведением) — я покажу это в ответе ниже, так как это может оказаться полезным для многих пользователей. Но что делать, если приложение, запросившее WakeLock, закрывается, не разблокировав его? Система Android не позаботится об этом . Конечно, перезагрузка решила бы проблему, но это не всегда (желательный) вариант.
Итак, с точки зрения пользователей (я не спрашиваю о решениях для разработки, а о том, как пользователь может с этим справиться):
Что может сделать *пользователь* , чтобы решить проблему и избежать дальнейшего разряда батареи?
Я предпочитаю ответы , не связанные с root (чтобы все пользователи могли извлечь из этого пользу). Тем не менее, «укоренившиеся решения» также полностью действительны и приветствуются.
Это, наверное, первый вопрос к тем, кто не знаком с этой темой. С Gingerbread (Android 2.3) и более поздними версиями у вас есть встроенная служба, которая поможет вам разобраться: статистика батареи. Хотя производители, как правило, размещают его в разных местах, в основном его можно найти в разделе «Настройки» → «О телефоне» → «Аккумулятор » или аналогичном, и он показывает список приложений, которые использовали большую часть вашей батареи. Сверху небольшой график. Коснитесь этого, и вы попадете на экран, похожий на этот:
Скриншот статистики батареи на Android 2.3
Я выбрал снимок экрана с одного из моих устройств, который иллюстрирует проблему. Глядя на две нижние синие полоски («Актив» = устройство не спит (активно), «Билдширм» = «Экран включен»), самая правая синяя полоса на «Активе» указывает на WakeLock: устройство оставалось занятым, несмотря на тот факт, что экран был выключен. Таким образом, мы можем быть уверены, что у нас есть WakeLock, но мы не можем сказать, кто его вызвал.
Если на вашем устройстве нет этого экрана (или полос внизу: я только что обнаружил, например, что LG Optimus 4X под управлением Android 4.0.3 обрезает эти полосы), вы можете найти их, например, с помощью GSam Battery Monitor :
Аналогичная информация от GSam Battery Monitor — здесь упомянутые «синие полосы» желтые/оранжевые.
К сожалению, на этот вопрос нельзя ответить с помощью предустановленных приложений (за исключением, может быть, некоторых пользовательских ПЗУ). Но есть инструменты, которые могут. Самый известный кандидат на это — BetterBatteryStats , который показывает нам причину в разделе частичных пробуждения :
Скриншоты из BetterBatteryStats
В первом примере 2 (взятом со страницы PlayStore приложения) событие, вызывающее большую часть WakeLocks, было желаемым: мы не хотим, чтобы воспроизведение останавливалось во время прослушивания музыки. Таким образом, второй пример 3 (взятый из реального случая на одном из моих устройств) может оказаться лучше: самые верхние 3 события вызваны одним и тем же приложением, которому требовался WakeLock для поддержания активной службы push-уведомлений IMAP.
В качестве альтернативы BetterBatteryStats ознакомьтесь с приложением Wakelock Detector , упомянутым в ответе UzumApps, с которым легче справиться, особенно для нетехнических специалистов:
Wakelock Detector -- Щелкните изображение, чтобы увеличить его. (Источник: Google Play )
Если дело так же ясно, как во втором примере в предыдущем разделе, то и действие совершенно очевидно — по крайней мере, в моем случае: мне не нужно получать немедленную информацию о прибытии почты; задержка в 30 минут абсолютно приемлема. Поэтому я зашел в почтовое приложение, отключил IMAP Push (см. также: Push Email ) и вместо этого переключился на 30-минутный интервал опроса. WakeLocks не исчезли полностью, но заметно уменьшились — заметно увеличилось время автономной работы.
Тогда есть случай, упомянутый в самом вопросе: приложение с плохим поведением не выпускает свой WakeLock. Сообщите разработчику о своих выводах и попросите исправить. Если он доставляет: проблема решена. Если нет: почти всегда есть альтернативное приложение.
Да, иногда это выглядит именно так: 98% и более потребляется какой-то службой Android. О, если это 98%, в большинстве случаев кандидат называется LocationManagerService . Плохой парень шпионит за нами? Не обязательно. В этом особом случае указанный «плохой парень» даже не виновен — по крайней мере, не напрямую. Вот еще одно приложение, слишком часто запрашивающее текущее местоположение. На сайте Setera.org есть отличная статья по этому поводу: Определение расхода батареи Android LocationManagerService . Чтобы дать аннотацию: он использует Androiddumpsys
функция (требуется root!) для создания дампа состояния системы и позволяет исследовать прослушиватели, установленные для службы LocationManagerService. При внимательном рассмотрении их конфигурации видно, что они постоянно "забивают" его информацией о местоположении (некоторые делают это постоянно, т.е. без перерыва). Поскольку идентификатор приложения указан рядом и в другом месте дампа даже вместе с техническим именем приложения, вы все равно можете идентифицировать его и предпринять соответствующие действия.
К сожалению, есть такие: Приложения, которые зарегистрировали WakeLock, а затем вышли, не разблокировав его. Что осталось, так это *неиспользуемые гребаные устаревшие устройства* -- бесполезные WakeLocks. Таким образом, невозможно просто вывести приложение на передний план и перенастроить или заставить его выпустить свои WakeLocks.
Здесь единственное известное мне решение - это перезагрузка, и я хотел бы иметь лучшее решение. Конечно, если вы знаете виновное приложение, действия по его устранению такие же, как описано выше: сообщить разработчику, получить исправление или заменить приложение. А насчет избавления от текущего WakeLock? Может быть, кто-то еще может предложить лучшую альтернативу перезагрузке?
Конечно. Пока один, позже могу добавить еще:
Короче говоря, это очень хороший вопрос, но, боюсь, он требует большего, чем просто информирование конечного пользователя!
Перепроектируйте ядро, чтобы устранить блокировку пробуждения и использовать более тщательный и эффективный способ управления этим принципом, тем самым продлевая срок службы батареи.
К сожалению, де-факто это было принято как решение для включения «управления питанием», несмотря на то, что оно также не совсем эффективно! Была обширная дискуссия о wakelocks (с Грегом Кроа Хартманом — гуру Linux по разработке драйверов — я ищу точную ссылку), другие сайты, такие как LWN.net , и еще одна статья, объясненная на том же сайте здесь . Это была статья, на которую Грег Кроа Хартман сослался в этом блоге , в которой он, кажется, согласен с альтернативным решением, предложенным Рафаэлем Дж. Высоцки , и многое задокументировал о потенциальной альтернативе. Не уверен, что это действительно так в более современном ядре v3.xx.
Плохо спроектированные приложения могут и часто запрашивают пробуждения, такие как сохранение экрана включенным, но на самом деле в этом сценарии для удержания экрана есть более эффективный способ сделать это:
getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
В то время как стремление не допускать жаргона и т. д. для конечного пользователя, на самом деле суть проблемы сводится к коду ядра в том, как управляются wakelocks.
Вот краткое изложение на XDA о том, что такое wakelocks для непосвященных. Используя BetterBatteryStats , можно было точно увидеть, какой процесс разряжает батарею, вики размещена на github и доступна на рынке здесь .
Проверьте Wakelock Detector: XDA-Developers / Google Play :
Детектор вейклоков группирует вейклоки приложения в один расширяемый вид для лучшего просмотра. И он показывает, какие приложения запущены. И в расширенном представлении приложения есть кнопки информации об удалении удаления.
Нажмите на изображение, чтобы увеличить. (Источник: Google Play )
Раскрытие информации: я являюсь одним из ответственных разработчиков этого приложения. Еще четыре друга работают со мной над этим проектом в качестве хобби.
Пара способов, которые помогут пользователям нерутированных устройств
Это недавняя разработка, и поэтому она публикуется для пользователей устройств без рута. Протестировано как работающее на Moto X Play (Android 6.0.1)
Загрузите WLD из магазина Play по ссылке выше.
Руководство по использованию WLD здесь
Инструкция для нерутированных устройств здесь . В нем есть все детали, но резюмирую:
Включите отладку по USB на устройстве иadb
Загрузите Wakelock Unlocker для Chrome на свой ноутбук (также работает на Chromium)
Включите его, и все готово!
Версия Wakelock Detector Light не отображает статистику с момента отключения от сети
мощность dumpsys оболочки adb | grep -i partial_wake_lock
Примечание. Я не смог заставить работать второй метод, я бы приветствовал решение по редактированию, чтобы заставить его работать для неподкованных парней, таких как я .
Изката
/sys/power/wake_lock
, но если вы сделали это «правильным» способом, используя PowerManager и PowerManager.WakeLock, обе службы будут удерживать настоящую wakelock и отпустите его, даже если ваш процесс был убит...Иззи