Як боротися з (осиротілими) WakeLocks?


40

Я думаю, більшість із вас принаймні чули про WakeLocks . Багато хто з вас вже їх випробували - свідомо чи ні. Деякі можуть знати, як взагалі з ними боротися, але лише деякі знають, як боротися з "складнішими кандидатами".

Для тих, хто не знає, хоча вище посилання призводить до пояснення, короткий підсумок: програми можуть попросити a, WAKE_LOCKщоб утримати компонент пристрою від «сну», щоб вони могли виконувати завдання навіть при вимкненому дисплеї. Це дуже корисно в більшості випадків (наприклад, увімкнення екрана під час навігації, підтримка Wi-Fi активного для потокового перегляду музики), - але використовується неправильно, це призводить до того, що ваш акумулятор буде вичерпаний за короткий термін (до 25% на годину) .

У більшості випадків легко визначити джерело (як правило, це погано поводиться додаток) - я покажу це у відповіді нижче, оскільки це може виявитися корисним для багатьох користувачів. Але що робити, якщо додаток, який запитав WakeLock, закривається, не випускаючи його? Система Android не подбає про це . Звичайно, перезавантаження дозволить вирішити проблему - але це не завжди (бажаний) варіант.

Отже, з точки зору користувачів (я не питаю про розробки, а про те, як користувач може впоратися з речами):

Що може зробити * користувач *, щоб вирішити проблему та уникнути подальшого розряду акумулятора?

Я віддаю перевагу відповідям, що не включають root (тому всі користувачі можуть отримати від цього користь). Однак "вкорінені рішення" також цілком справедливі і вітаються.


2
У мене було враження, що це справедливо лише в тому випадку, якщо ви створили будинок «неправильним» способом, /sys/power/wake_lockале якщо ви зробили це «правильним» способом за допомогою PowerManager та PowerManager.WakeLock, сервіс одночасно міститиме справжній будильник і відпустіть його, навіть якщо ваш процес був убитий ...
Ізката

1
Згідно з інформацією, яку я зв'язав, це очевидно не так. Хтось там повідомляє, перевіривши джерела ядра, і не знайшов жодного натяку на це. Підказка для розробників: схоже, що "часткові годинники" можна запросити тимчасово , тому вони закінчуються автоматично, коли таймер не ввімкнувся та не було оновлено. Це має бути "безпечним способом", на який ви посилаєтесь.
Іззі

Відповіді:


37

Як я можу сказати, що я вплинув?

Це, мабуть, перше запитання до тих, хто не знайомий з цією темою. За допомогою пряників (Android 2.3) і вище, у вас є сервіс на борту, який допоможе вам з'ясувати: статистика батареї. Хоча виробники, як правило, розміщують його в різних точках, вони в основному знаходяться в Налаштуваннях → Про телефон → Акумулятор або подібне, і показує список програм, які використовують більшу частину акумулятора. Зверху на це невеликий графік. Торкніться цього, і він відкриє екран, подібний до цього:

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

Я вибрав знімок екрана з одного зі своїх пристроїв, який ілюструє проблему. Дивлячись на дві нижні сині смуги ("Актив" = Пристрій тримався неспаним (активним), "Bildschirm a" = "Екран увімкнено"), найправіша синя смуга на "Активі" вказує на WakeLock: Пристрій залишався зайнятим, незважаючи на факт вимкнення екрана. Таким чином, ми можемо бути впевнені, що у нас є WakeLock - але ми не можемо сказати, хто це спричинив.

Якщо ваш пристрій не пропонує цей екран (або смужки внизу: я нещодавно виявив, наприклад, LG Optimus 4X під управлінням Android 4.0.3 відрізав ці смуги), ви можете їх знайти, наприклад, використовуючи монітор батареї GSam :

Монітор акумулятора GSam
Подібна інформація від GSam Battery Monitor - тут згадані "сині смужки" жовто / оранжеві

Що спричинило WakeLock?

На жаль, на це питання не можна відповісти за допомогою попередньо встановлених додатків (крім, можливо, деяких користувальницьких ПЗУ). Але є інструменти, які можуть. Найвідоміший кандидат для цього - BetterBatteryStats , і він показує нам причину у своєму розділі про часткові неділі :

BetterBatteryStats BetterBatteryStats2
Знімки екрана від BetterBatteryStats

У першому прикладі 2 (взятий із сторінки відтворення магазину програми) подія, яка спричинила більшість WakeLocks, була бажаною: ми не хочемо, щоб відтворення припинялося під час прослуховування музики. Тож другий приклад 3 (взятий із реального випадку на одному з моїх пристроїв) може виявитись кращим: найвищі 3 події спричинені саме тим самим додатком, якому потрібен був WakeLock, щоб підтримувати IMP-сервіс активним.

Для альтернативи BetterBatteryStats ознайомтесь з додатком детектора Wakelock , згаданим у відповіді UzumApps, - який, як видається, простіше в роботі, особливо для нетехнологів:

Детектор будильника: подробиці програми Detector Wakelock: Виберіть процеси
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 застарілих * - WakeLocks не використовується. Тож жодний спосіб просто не виводити додаток на перший план і перенастроювати його, або змушувати його випускати свої WakeLocks.

Тут єдине відоме мені рішення - це перезавантаження - і я хотів би мати краще рішення. Звичайно, якщо ви знаєте, що винна програма, кроки щодо неї такі ж, як і вище: повідомте розробника, отримайте виправлення - або замініть додаток. Але про позбавлення від поточного WakeLock? Може хтось інший може запропонувати кращу альтернативу перезавантаженню?

Чи є деякі рекомендовані подальші читання?

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


2
Краща освіта розробникам сказати ... "Випустіть годинники, коли ви закінчите з ними і прибираєте за собою"?
t0mm13b

3
Запросити мене за вашу як завжди приголомшливу відповідь !!! Ти ніколи з цим не нудьгуєш? : D
t0mm13b

2
Звичайно - але дивіться моє запитання: я чітко не запитую про сторону розробника, а з точки зору користувачів . Можливо, мені потрібно зробити це більш очевидним;)
Іззі

1
Нудно? Може хтось, будь ласка, пояснить, що це таке? XD Ні, я завжди щось маю на увазі. Якщо я вважаю, що це досить добре, я навіть запитую про це тут (див. Мій профіль: я не прошу часто), хоча у мене може бути (часткова) відповідь. Відгуки тут завжди освіжаючі, якщо питання того варте :)
Izzy

1
Будь ласка! І повідомте про свої висновки! У мене щойно була така описана проблема із «осиротілими» WakeLocks. Проїжджаючи протягом години, я не зайшов далі, ніж побачив, що це LocationManagerService . Зареєстровано для оновлень усі 0сек (sic!) Android Settings (=: - 0). Я вийшов з нього, зупинив його, вбив у командному рядку ... ніякого способу позбутися від замків. WTF зробили там налаштування ? Перезавантаження це, звичайно, вирішило - але це WindowsPhone, який ми повинні перезавантажувати двічі на день?
Іззі

6

Коротше кажучи, це дуже гарне запитання, але боюся, це означає більше, ніж просто інформування кінцевого користувача!

Переробіть ядро, щоб усунути неполадки і використовувати більш ретельний ефективний спосіб управління принципом, тим самим продовжуючи термін служби акумулятора.

На жаль, це було прийнято як фактичне рішення для включення "управління енергією", незважаючи на те, що воно не є точно ефективним! Був велика дискусія про wakelocks (з Gregh Kroah Хартманн - гуру Linux для розробки драйверів - я вдаючись до допомоги для точного Linky), інші сайти , такі як LWN.net і інша стаття пояснений на тому ж сайті тут . Це стаття Грега Кроа Хартмана, про яку йдеться у цьому блозі , в якій він, мабуть, погоджується з альтернативним рішенням, запропонованим Рафаелем Дж. Вісоцьким, багато задокументував потенційну альтернативу. Я не впевнений, чи дійсно це місце в більш сучасному ядрі v3.xx

Неправильно розроблені програми можуть вимагати і часто вимагати синхронізації, наприклад, збереження екрана, але насправді в цьому сценарії утримання екрана насправді існує більш ефективний спосіб зробити це:

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

У той же час, прагнучи зберегти це без яргону тощо для кінцевого користувача, справді суть проблеми зводиться до коду ядра в тому, як керуються вейлок-файлами.

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


1
Смішно ви вказуєте на ту саму тему XDA, яку я згадав. Я погоджуюсь з вами, що система повинна дбати про краще (наприклад, випускаючи WakeLocks, запитувані додатками, які більше не працюють). І що розробники повинні більше дбати про кодування (чітко вивільняючи їх у відповідних станах LifeCycle). Але це не допомагає нам знати користувачів . Я сподіваюся, що моя відповідь дає деяке розуміння того, що може зробити користувач - і що хтось із вас "техніків" може заповнити пробіл, що залишився!
Іззі

3

Ознайомтеся з детектором будильників: розробники XDA / Google Play :

Детектор Wakelock групує годинники програми в один розширюваний вигляд для кращого вигляду. І це показує, які програми запущені. А в розширеному вікні програми є кнопки з інформацією про видалення.

Детектор будильника: подробиці програми Detector Wakelock: Виберіть процеси
Клацніть зображення, щоб збільшити. (Джерело: Google Play )

Розкриття: Я один з відповідальних розробників цього додатка. Ще четверо друзів зі мною працюють над цим проектом як хобі.


Дякую! Це справді цінна інформація. Ви б не хотіли додати ще трохи деталей у свою відповідь, наприклад, що робить її такою особливою? Я б тоді додав кілька скріншотів. Поки це не зроблено: Ось посилання Playstore на додаток ...
Izzy

Дякую за деталі! Я об'єднав їх у вашу відповідь, сподіваюся, ви не заперечуєте :) Питання про розуміння: Скажіть, додаток запитує місцеположення, використовуючи інтервал "0 секунд". Це призведе до того, що LocationService завершить роботу пристрою. Чи виявив бы детектор блокування Wake показ відповідальної програми як справжню причину - або LocationService , оскільки це не є частиною цього пакету програм?
Izzy

Відповідь на ваше запитання - «ні», оскільки детектор будильників групує годинники, що належать до того ж імені пакета програми. Оскільки служба локації належить до Android OS, рішенням буде перевірка дозволів користувача на додаток
UzumApps

Дуже дякую! Я сподівався на просте рішення "Що робити, якщо це сама система Android?" частина. Здається, немає такого поняття - але якщо це можливо, можливо, було б корисно інтегруватись із WLD :)
Izzy

2
Дякую за вашу думку, я буду розглядати це і працювати над цим. WLD добре виглядає !!! :)
UzumApps

1

Кілька способів , які допоможуть некореневих пристроїв користувачів

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

Це нещодавня розробка, а отже, і розміщення цього повідомлення для не вкорінених користувачів пристроїв. Перевірено як працює на Moto X Play (Android 6.0.1)

  • Завантажте WLD з посилання магазину Play вище

  • Посібник з використання WLD тут

  • Інструкції для не вкорінених пристроїв тут . У ньому є всі деталі, але підсумовуючи:

    adb оболонки dumpsys power | grep -i part_wake_lock

Примітка: я не міг отримати роботу другого методу, я б вітав рішення для редагування, щоб воно працювало для не кмітливих хлопців, як я

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.