Как бороться с (осиротевшими) WakeLocks?

40

Я думаю, что большинство из вас по крайней мере слышали о WakeLocks . Многие из вас уже испытали их - сознательно или нет. Некоторые могут знать, как с ними справляться в целом, но лишь немногие знают, как бороться с «более сложными кандидатами».

Для тех, кто не знает, хотя приведенная выше ссылка приводит к объяснению, краткое резюме: приложения могут запросить, WAKE_LOCKчтобы компонент устройства не "спал", чтобы они могли выполнять задачу, даже когда дисплей выключен. Это очень полезно в большинстве случаев (например, держать экран включенным во время навигации, держать WiFi активным для потоковой передачи музыки) - но при неправильном использовании это приводит к разрядке аккумулятора в течение короткого времени (до 25% в час) ,

В большинстве случаев легко определить источник (как правило, приложение с плохим поведением) - я покажу это в ответе ниже, так как это может оказаться полезным для многих пользователей. Но что делать, если приложение, которое запросило WakeLock, завершило работу, не отпустив его? Система Android не позаботится об этом . Конечно, перезагрузка решит проблему, но это не всегда (желательный) вариант.

Итак, с точки зрения пользователей (я не спрашиваю о решениях для разработки, а о том, как пользователь может что-то делать):

Что может сделать * пользователь *, чтобы решить проблему и избежать дальнейшего разряда батареи?

Я предпочитаю ответы, не связанные с root (так что все пользователи могут извлечь из этого пользу). Тем не менее, «укоренившиеся решения» полностью действительны и приветствуются.

Иззи
источник
2
У меня сложилось впечатление, что это было бы правдой только в том случае, если вы создали «неправильный» способ wakelock, используя /sys/power/wake_lock, но если вы сделали это «правильным» способом, используя PowerManager и PowerManager.WakeLock, сервис будет одновременно удерживать настоящий wakelock. и отпустите его, даже если ваш процесс был убит ...
Изката
1
Согласно информации, которую я привел, это явно не тот случай. Кто-то сообщает, что проверил исходники ядра, и не нашел намека на это. Подсказка для разработчиков: кажется, что «частичные wakelocks» могут быть запрошены по времени , поэтому срок их действия истекает автоматически, когда таймер истекает, а wakelock aquire не обновляется. Это должен быть «безопасный путь», на который вы ссылаетесь.
Иззи

Ответы:

37

Как я могу сказать, что я пострадал?

Это, наверное, первый вопрос к тем, кто не знаком с этой темой. С Gingerbread (Android 2.3) и выше у вас есть сервис, помогающий вам разобраться: статистика батареи. Хотя производители, как правило, размещают его в разных точках, его можно найти в меню «Настройки» → «О телефоне» и т. Д. И т. Д., И в нем показан список приложений, которые использовали большую часть заряда батареи. Поверх этого небольшой график. Нажмите на него, и вы попадете на экран, похожий на этот:

статистика батареи
Скриншот статистики батареи на Android 2.3

Я выбрал скриншот с одного из моих устройств, который иллюстрирует проблему. Если посмотреть на две нижние синие полосы («Aktiv» = устройство не активировано (активно), «Bildschirm an» = «Экран включен»), самая правая синяя полоса на «Aktiv» указывает на WakeLock: устройство было занято, несмотря на тот факт, что экран был выключен. Таким образом, мы можем быть уверены, что у нас есть WakeLock, но мы не можем сказать, кто это вызвал.

Если ваше устройство не предлагает этот экран (или полосы внизу: я только что обнаружил, например, LG Optimus 4X под управлением Android 4.0.3 обрезал эти полосы), вы можете найти их, например, с помощью GSam Battery Monitor :

GSam Battery Monitor
Аналогичная информация от GSam Battery Monitor - здесь упомянутые «синие полосы» желтого / оранжевого цвета

Что вызвало WakeLock?

К сожалению, на этот вопрос нельзя ответить с помощью предустановленных приложений (за исключением, возможно, некоторых пользовательских ПЗУ). Но есть инструменты, которые могут. Наиболее известным кандидатом для этого является BetterBatteryStats , и он показывает причину в разделе частичных wakelocks :

BetterBatteryStats BetterBatteryStats2
Скриншоты от BetterBatteryStats

В первом примере 2 (взято со страницы магазина приложений) событие, вызывающее большинство WakeLocks, было желаемым: мы не хотим, чтобы воспроизведение останавливалось во время прослушивания музыки. Итак, второй пример 3 (взятый из реального случая на одном из моих устройств) может оказаться лучше: самые верхние 3 события вызваны тем же приложением, которому необходим WakeLock для поддержания активной службы push-уведомлений IMAP.

В качестве альтернативы BetterBatteryStats , обратите внимание на приложение Wakelock Detector , упомянутое в ответе UzumApps - с которым проще работать, особенно для не техников:

Wakelock Detector: Информация о приложении Wakelock Detector: выбор процессов
Wakelock Detector - Нажмите на изображение, чтобы увеличить. (Источник: Google Play )

Что может быть сделано?

Если случай такой же ясный, как и во втором примере из предыдущего раздела, действие вполне очевидно - по крайней мере, в моем случае: мне не нужно сразу получать уведомление, когда приходит письмо; задержка в 30 минут абсолютно приемлема. Поэтому я зашел в почтовое приложение, отключил IMAP Push (см. Также: Push Email ) и вместо этого переключился на 30-минутный интервал опроса. WakeLocks не совсем исчезли, но заметно упали - время работы от батареи заметно улучшилось.

Тогда есть случай, упомянутый в самом вопросе: приложение с плохим поведением не выпускает свой WakeLock. Сразитесь с разработчиком своими выводами и попросите исправить. Если он доставляет: проблема решена. Если нет: почти всегда есть альтернативное приложение.

Что делать, если это сама система Android?

Да, иногда это выглядит так: 98% и более потребляются каким-то сервисом Android. О, если это 98%, в большинстве случаев кандидат называется LocationManagerService . Плохой парень шпионит за нами? Не обязательно. В этом особом случае перечисленный «плохой парень» даже не виноват - по крайней мере, не напрямую. Вот еще одно приложение, слишком часто запрашивающее текущее местоположение. На Setera.org есть отличная статья об этом: Определение местоположения Android LocationManagerService для аккумулятора . Чтобы дать реферат: он использует Androiddumpsysфункция (требуется root!) для выгрузки состояния системы и позволяет исследовать прослушиватели, установленные для LocationManagerService. Более внимательный взгляд на их конфигурацию показывает, что они постоянно «забивают» информацию о местоположении (некоторые делают это постоянно, то есть без перерыва). Поскольку идентификатор приложения указан вместе с другим именем приложения в другом месте дампа, вы все равно можете его идентифицировать и предпринять соответствующие действия.

А как насчет НЛО?

К сожалению, есть такие: приложения, которые зарегистрировали WakeLock - и затем вышли, не выпуская его. Осталось: * Неиспользованные F *** ing Obsoletes * - WakeLocks удерживаются без использования. Поэтому нет способа просто вывести приложение на передний план и перенастроить его, или заставить его выпустить свои WakeLocks.

Здесь единственное известное мне решение - это перезагрузка, и я хотел бы найти лучшее решение. Конечно, если вы знаете виновное приложение, шаги, относящиеся к нему, такие же, как и выше: сообщите об этом разработчику, получите исправление - или замените приложение. Но о том, чтобы избавиться от текущего WakeLock? Может быть, кто-то еще может предложить лучшую альтернативу перезагрузке?

Есть ли рекомендуемые дальнейшие чтения?

Конечно. Один сейчас, я могу добавить больше позже:

Иззи
источник
2
Лучше просвещение разработчиков, чтобы они говорили: «Освободите вейк-лок, когда закончите с ними, и уберите за собой»?
t0mm13b
3
Отвяжись от меня за твой как всегда ошеломляющий ответ !!! Тебе это никогда не надоедает? : D
t0mm13b
2
Конечно, но посмотрите на мой вопрос: я явно НЕ спрашиваю о стороне разработчика, но с точки зрения пользователей . Может быть, мне нужно сделать это более очевидным;)
Иззи
1
Скучно? Может кто-нибудь объяснить, на что это похоже? XD Нет, у меня всегда есть что-то на уме. Если я чувствую, что это достаточно хорошо, я даже спрашиваю об этом здесь (см. Мой профиль: я не часто спрашиваю), хотя у меня может быть (частичный) ответ. Отзывы здесь всегда освежают, если вопрос того стоит :)
Иззи
1
Пожалуйста, сделай! И сообщить о своих выводах! Я только что описал проблему с "осиротевшими" WakeLocks. Оглядываясь на час, я не пошел дальше, увидев, что это LocationManagerService . За обновлениями все 0сек (так!) Были Настройки Android (=: - 0). Я вышел из него, остановил его, убил его в командной строке ... нет способа избавиться от замков. WTF сделал там настройки ? Конечно, перезагрузка решила это - но нужно ли это WindowsPhone два раза в день?
Иззи
6

Короче говоря, это очень хороший вопрос, но, боюсь, он требует большего, чем просто информирование конечного пользователя!

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

К сожалению, оно было принято как де-факто решение для «управления питанием», хотя оно и не совсем эффективно! Была широкая дискуссия о wakelocks (с Грегом Кроа Хартманом - гуру Linux по разработке драйверов - я ищу точную ссылку), другие сайты, такие как LWN.net, и другая статья, объясненная на том же сайте здесь . Это была статья Грега Кроа Хартмана, на которую ссылается этот блог , в которой он, похоже, согласен с альтернативным решением, предложенным Рафаэлем Дж. Высоцким, много документировало потенциальную альтернативу. Я не уверен, что это на самом деле в более современном ядре v3.xx

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

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

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

Вот краткое резюме на XDA о том, что такое wakelocks для непосвященных. Используя BetterBatteryStats , можно было бы увидеть , какой именно процесс разрядки аккумулятора, вики размещен на GitHub, и доступен на рынке здесь .

t0mm13b
источник
1
Забавно, что вы указываете на ту же ветку XDA, о которой я упоминал. Я согласен с вами, что система должна заботиться лучше (например, выпуская WakeLocks, запрошенные приложениями, которые больше не работают). И разработчики должны быть более внимательны при кодировании (явно выпуская их в соответствующих состояниях LifeCycle). Но это не помогает нам знать пользователям . Я надеюсь, что мой ответ даст некоторое представление о том, что может сделать пользователь, и что один из вас, «технарей», может заполнить оставшийся пробел!
Иззи
3

Ознакомьтесь с Wakelock Detector: XDA-Developers / Google Play :

Детектор Wakelock группирует wakelocks приложения в одно расширяемое представление для лучшего вида. И это показывает, какие приложения работают. И есть расширенные кнопки удаления информации в расширенном представлении приложения.

Wakelock Detector: Информация о приложении Wakelock Detector: выбор процессов
Нажмите на изображение, чтобы увеличить. (Источник: Google Play )

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

UzumApps
источник
Спасибо! Это действительно ценная информация. Не могли бы вы добавить еще несколько деталей в ваш ответ, например, что делает его таким особенным? Я бы добавил несколько скриншотов. Пока это не сделано: вот ссылка Playstore на приложение ...
Иззи
Спасибо за подробности! Я объединил их в ваш ответ, надеюсь, вы не возражаете :) Вопрос понимания: скажем, приложение запрашивает местоположение с интервалом «0 секунд». Это может привести к тому, что LocationService активирует устройство. Будет ли Wake Lock Detector показывать ответственное приложение в качестве реальной причины - или LocationService , поскольку оно не является частью этого пакета приложений?
Иззи
Ответ на ваш вопрос «нет», потому что детектор wakelock группирует wakelocks, которые принадлежат одному и тому же имени пакета приложения. Так как Location Location принадлежит Android OS, решение будет проверять права доступа пользователя приложения
UzumApps
Большое спасибо! Я надеялся на простое решение "Что, если это сама система Android?" часть. Кажется, что такого нет, но если это возможно, возможно, будет хорошей идеей интегрироваться с WLD :)
Иззи
2
Спасибо за ваше мнение, я его рассмотрю и поработаю над этим. WLD выглядит хорошо !!! :)
UzumApps
1

Несколько способов помочь пользователям без рута

  1. Видя, что @Uzumapps, один из разработчиков приложения, опубликовал решение с использованием Wakelock Detector ( WLD ), я удивлен, что он не обновил информацию об использовании приложения, которое также можно использовать без рута, под названием Wakelock Detector Light ! Я обнаружил это в поисках решения для моего нового устройства (без рута).

Это недавняя разработка и, следовательно, публикация этого сообщения для пользователей рутированных устройств. Протестировано как работающее на Moto X Play (Android 6.0.1)

  • Скачать WLD от Play store по ссылке выше

  • Руководство по использованию WLD здесь

  • Инструкции для некорневых устройств тут . В нем есть все детали, но подведем итог:

    оболочка adb grep -i part_wake_lock

Примечание: я не мог заставить работать второй метод, хотел бы, чтобы решение для редактирования работало для таких неопытных парней, как я

beeshyams
источник