Я думаю, что большинство из вас по крайней мере слышали о WakeLocks . Многие из вас уже испытали их - сознательно или нет. Некоторые могут знать, как с ними справляться в целом, но лишь немногие знают, как бороться с «более сложными кандидатами».
Для тех, кто не знает, хотя приведенная выше ссылка приводит к объяснению, краткое резюме: приложения могут запросить, WAKE_LOCK
чтобы компонент устройства не "спал", чтобы они могли выполнять задачу, даже когда дисплей выключен. Это очень полезно в большинстве случаев (например, держать экран включенным во время навигации, держать WiFi активным для потоковой передачи музыки) - но при неправильном использовании это приводит к разрядке аккумулятора в течение короткого времени (до 25% в час) ,
В большинстве случаев легко определить источник (как правило, приложение с плохим поведением) - я покажу это в ответе ниже, так как это может оказаться полезным для многих пользователей. Но что делать, если приложение, которое запросило WakeLock, завершило работу, не отпустив его? Система Android не позаботится об этом . Конечно, перезагрузка решит проблему, но это не всегда (желательный) вариант.
Итак, с точки зрения пользователей (я не спрашиваю о решениях для разработки, а о том, как пользователь может что-то делать):
Что может сделать * пользователь *, чтобы решить проблему и избежать дальнейшего разряда батареи?
Я предпочитаю ответы, не связанные с root (так что все пользователи могут извлечь из этого пользу). Тем не менее, «укоренившиеся решения» полностью действительны и приветствуются.
источник
/sys/power/wake_lock
, но если вы сделали это «правильным» способом, используя PowerManager и PowerManager.WakeLock, сервис будет одновременно удерживать настоящий wakelock. и отпустите его, даже если ваш процесс был убит ...Ответы:
Как я могу сказать, что я пострадал?
Это, наверное, первый вопрос к тем, кто не знаком с этой темой. С 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 - здесь упомянутые «синие полосы» желтого / оранжевого цвета
Что вызвало WakeLock?
К сожалению, на этот вопрос нельзя ответить с помощью предустановленных приложений (за исключением, возможно, некоторых пользовательских ПЗУ). Но есть инструменты, которые могут. Наиболее известным кандидатом для этого является BetterBatteryStats , и он показывает причину в разделе частичных wakelocks :
Скриншоты от BetterBatteryStats
В первом примере 2 (взято со страницы магазина приложений) событие, вызывающее большинство WakeLocks, было желаемым: мы не хотим, чтобы воспроизведение останавливалось во время прослушивания музыки. Итак, второй пример 3 (взятый из реального случая на одном из моих устройств) может оказаться лучше: самые верхние 3 события вызваны тем же приложением, которому необходим WakeLock для поддержания активной службы push-уведомлений IMAP.
В качестве альтернативы BetterBatteryStats , обратите внимание на приложение Wakelock Detector , упомянутое в ответе UzumApps - с которым проще работать, особенно для не техников:
Wakelock Detector - Нажмите на изображение, чтобы увеличить. (Источник: Google Play )
Что может быть сделано?
Если случай такой же ясный, как и во втором примере из предыдущего раздела, действие вполне очевидно - по крайней мере, в моем случае: мне не нужно сразу получать уведомление, когда приходит письмо; задержка в 30 минут абсолютно приемлема. Поэтому я зашел в почтовое приложение, отключил IMAP Push (см. Также: Push Email ) и вместо этого переключился на 30-минутный интервал опроса. WakeLocks не совсем исчезли, но заметно упали - время работы от батареи заметно улучшилось.
Тогда есть случай, упомянутый в самом вопросе: приложение с плохим поведением не выпускает свой WakeLock. Сразитесь с разработчиком своими выводами и попросите исправить. Если он доставляет: проблема решена. Если нет: почти всегда есть альтернативное приложение.
Что делать, если это сама система Android?
Да, иногда это выглядит так: 98% и более потребляются каким-то сервисом Android. О, если это 98%, в большинстве случаев кандидат называется LocationManagerService . Плохой парень шпионит за нами? Не обязательно. В этом особом случае перечисленный «плохой парень» даже не виноват - по крайней мере, не напрямую. Вот еще одно приложение, слишком часто запрашивающее текущее местоположение. На Setera.org есть отличная статья об этом: Определение местоположения Android LocationManagerService для аккумулятора . Чтобы дать реферат: он использует Android
dumpsys
функция (требуется root!) для выгрузки состояния системы и позволяет исследовать прослушиватели, установленные для LocationManagerService. Более внимательный взгляд на их конфигурацию показывает, что они постоянно «забивают» информацию о местоположении (некоторые делают это постоянно, то есть без перерыва). Поскольку идентификатор приложения указан вместе с другим именем приложения в другом месте дампа, вы все равно можете его идентифицировать и предпринять соответствующие действия.А как насчет НЛО?
К сожалению, есть такие: приложения, которые зарегистрировали WakeLock - и затем вышли, не выпуская его. Осталось: * Неиспользованные F *** ing Obsoletes * - WakeLocks удерживаются без использования. Поэтому нет способа просто вывести приложение на передний план и перенастроить его, или заставить его выпустить свои WakeLocks.
Здесь единственное известное мне решение - это перезагрузка, и я хотел бы найти лучшее решение. Конечно, если вы знаете виновное приложение, шаги, относящиеся к нему, такие же, как и выше: сообщите об этом разработчику, получите исправление - или замените приложение. Но о том, чтобы избавиться от текущего WakeLock? Может быть, кто-то еще может предложить лучшую альтернативу перезагрузке?
Есть ли рекомендуемые дальнейшие чтения?
Конечно. Один сейчас, я могу добавить больше позже:
источник
Короче говоря, это очень хороший вопрос, но, боюсь, он требует большего, чем просто информирование конечного пользователя!
Перепроектируйте ядро, чтобы устранить пробуждения от блокировки и использовать более эффективный способ более эффективного управления принципом, продлевая тем самым срок службы батареи.
К сожалению, оно было принято как де-факто решение для «управления питанием», хотя оно и не совсем эффективно! Была широкая дискуссия о wakelocks (с Грегом Кроа Хартманом - гуру Linux по разработке драйверов - я ищу точную ссылку), другие сайты, такие как LWN.net, и другая статья, объясненная на том же сайте здесь . Это была статья Грега Кроа Хартмана, на которую ссылается этот блог , в которой он, похоже, согласен с альтернативным решением, предложенным Рафаэлем Дж. Высоцким, много документировало потенциальную альтернативу. Я не уверен, что это на самом деле в более современном ядре v3.xx
Плохо разработанные приложения могут и часто запрашивают пробуждения, такие как сохранение экрана, но на самом деле, в этом сценарии для сохранения экрана есть более эффективный способ сделать это:
В то время как стремление сохранить это от жаргона и т. Д. Для конечного пользователя, на самом деле суть проблемы сводится к коду ядра в том, как управляются wakelocks.
Вот краткое резюме на XDA о том, что такое wakelocks для непосвященных. Используя BetterBatteryStats , можно было бы увидеть , какой именно процесс разрядки аккумулятора, вики размещен на GitHub, и доступен на рынке здесь .
источник
Ознакомьтесь с Wakelock Detector: XDA-Developers / Google Play :
Детектор Wakelock группирует wakelocks приложения в одно расширяемое представление для лучшего вида. И это показывает, какие приложения работают. И есть расширенные кнопки удаления информации в расширенном представлении приложения.
Нажмите на изображение, чтобы увеличить. (Источник: Google Play )
Раскрытие информации: я один из ответственных разработчиков для этого приложения. Еще четверо друзей работают над этим проектом в качестве хобби.
источник
Несколько способов помочь пользователям без рута
Это недавняя разработка и, следовательно, публикация этого сообщения для пользователей рутированных устройств. Протестировано как работающее на Moto X Play (Android 6.0.1)
Скачать WLD от Play store по ссылке выше
Руководство по использованию WLD здесь
Инструкции для некорневых устройств тут . В нем есть все детали, но подведем итог:
Включить отладку по USB на устройстве и
adb
Загрузите Wakelock Unlocker для Chrome на свой ноутбук (также работает на Chromium)
Включите его, и все готово!
Wakelock Detector Light версия не отображает статистику, так как Unplugged
Примечание: я не мог заставить работать второй метод, хотел бы, чтобы решение для редактирования работало для таких неопытных парней, как я
источник