https://ok.ru/androidboot/topic/65802407747737 Как и обещал в данной статье я расскажу о вэйклоках и пробуждениях в устройствах ANDROID
В последнее время много пишут об отзыве разрешений, предоставленных приложениям на удержание вэйклоков и об избавлении от них, поэтому, похоже, наступило время разобраться.
Во-первых, Вы должны понять, что если Вам кажется, что этих подробностей слишком много, Вы не понимаете, о чём идёт речь или не заинтересованы в том, чтобы подняться на этот уровень детализации, то Вы не должны использовать какие-либо средства для изменения прав доступа или любого воздействия на вэйклоки или сигналы: отсутствие понятия о том, что Вы делаете или непонимание последствий нанесёт ущерб Вашему телефону, потенциально может сделать его нестабильным и, вероятно, увеличить расход батареи вместо какой-либо экономии.
Начнём с основ,затем перейдём на описание того, как эти механизмы взаимодействуют, и, наконец, что может случиться при изменении какой-либо из этих форм поведения.
Основные термины
Сигналы
Сигналы - это механизмы приложения для асинхронного вызова в определённый момент времени. Существуют различные типы сигналов, которые либо срабатывают, когда телефон уже пробуждён, либо являются причиной пробуждения. Кроме того, имеются разные степени точности, в зависимости от того, нужна ли Вам высокая точность или Вы позволяете системе Андроид принять решение о времени, чтобы она могла потенциально собрать несколько триггеров сигналов в одно пробуждение.
Пробуждения
Пробуждение вызывается сигналом типа RTC_WAKEUP. Признаком плохо разработанного приложения будет использование неправильного типа сигнала (пробуждения) для выполнения операций, выполняемых только при включённом экране (например, обновление виджета).
Вэйклок
Имеется два типа вэйклоков: вэйклоки ядра (Kernel wakelocks) и частичные вэйклоки. Частичные вэйклоки (Partial Wakelocks) – специфика Андроид, в то время как вэйклоки ядра не являются специфичными для данной системы и представляют собой часть любого ядра linux. Частичные вэйклоки внутренне задействуются при удержании вэйклока ядра.
В Андроиде частичные вэйклоки необходимы, когда имеется отрезок кода (блок, цепочка), которая не должна прерываться при переходе телефона в сон. Примером последовательности, которая не должна прерываться, являются как блоки, применяемые таким образом, чтобы гарантировать непрерывность при прохождении, так и блоки, использующие избыточные ресурсы, такие как данные, и которые Вы хотите завершить.
Как они взаимодействуют
Примеры частичных вэйклоков
Начнём с примера BBS (да, BBS удерживает вэйклоки). При определённых событиях (загрузка, отсоединение ЗУ, экран выкл/вкл) BBS сохраняет так называемые метки: метка является полным описанием соответственного полного состояния Вашего телефона в момент времени. Затем метки могут сравниваться для получения полной картины того, что происходило между двумя метками.
Для того, чтобы метка сохраняла целостность, важно, чтобы процесс сохранения не прерывался. При использовании телефона это не имеет значения (поскольку экран включен и при его использовании всё равно удерживается вэйклок), но подумайте, что происходит, когда экран выключен, и Вы отсоединяете ЗУ: телефон может перейти в сон до завершения критической последовательности, нарушая целостность: вот когда нужен вэйклок.
Другим примером будет ситуация, когда вы загружаете что-то (например, из google play) и Ваш экран отключается. Если загрузка началась, когда Вы использовали телефон, Вы хотите закончить её до того, как телефон перейдёт в сон. Отсутствие вэйклока при загрузке может стать причиной прерывания скачивания, файл может остаться недогруженным и получится, что батарею Вы использовали впустую и начинать надо заново.
Примеры пробуждений
Когда приложению необходимо что-то сделать в определённое время (например, запрос) оно будет использовать RTC_WAKEUP для запуска последовательности, которая, может , к примеру, открыть соединение и получить данные. Поскольку пробуждения могут запускаться, когда телефон спит и экран остаётся выключенным, телефону не понадобится много времени, чтобы снова перейти в сон, возможно, до того, как соединение и запрос будут закончены. Во избежание этого необходимо удержание вэйклока до тех пор, пока соединение и последующие действия не будут выполнены.
Что может произойти
Отзыв разрешений на удержание вэйклоков или препятствие выполнению данной операции приложением – наихудшее, что Вы можете сделать: в результате Вы получите ещё больший расход из-за устанавливаемых соединений и запуска передачи данных до того, как телефон вернётся в режим сна и отменит результат.
Ещё хуже: представьте следующую последовательность, которая будет происходить при пробуждении:
1. Телефон пробуждается (RTC_WAKEUP)
2. Удержание вэйклока
3. Соединение
4. Передача данных
5. Следующий сигнал программы
6. Освобождение вэйклока
Подумайте, что произойдёт, если Вы воспрепятствуете удержанию приложением вэйклока и в результате последовательность прервётся в процессе передачи?
Мы в тупике?
Нет. Выявление вэйклоков (особенно, длительных и часто происходящих), а также частых пробуждений – это показатель, что что-то идёт неправильно. Знание этого предполагает разные действия, которые мы можем выполнить:
• Примите решение об удалении приложения, поскольку цена его использования слишком высока по сравнению с пользой
• Попробуйте изменить симптомы, настраивая параметры приложения
• Используйте инструменты для предотвращения определённых пробуждений, если нет нужды в получении обновлений, когда телефон выключен (Facebook-один из примеров)
• Свяжитесь с разработчиком и помогите ему решить проблему с нежелательными эффектами
А что никогда не надо делать – это пытаться подавить симптомы вместо того, чтобы убрать причину (именно это вы делаете, когда препятствуете удержанию приложением вэйклоков, и это очень, очень плохая идея).
Подробнее о вэйлоках в следующей статье...
Приложения на ANDROID имеют обыкновение заниматься всякой ерундой тогда, когда смартфон должен спать. Поэтому половина аккумулятора уходит за ночь от простого лежания на тумбочке. Такие приложения надо вылавливать и принимать меры. Здесь я расскажу, как это делать.
Теория
Смартфон — это не просто мобильный телефон. Он имеет на борту мощные процессоры, гигабайты памяти. Все это потребляет огромное количество энергии — чуть ли не как компьютер. Если все это хозяйство держать включенным все время — батарейки хватит всего на несколько часов.Поэтому после нажатия кнопки выключения телефон отключает все это хозяйство. А чтобы телефон мог принимать звонки — оставляет включенным GSM-модуль. Энергопотребление в таком режиме падает в десятки раз. Проблема в том, что мы, э-э, не всегда хотим, чтобы телефон засыпал после того, как мы нажимаем на кнопку выключения. Например, если мы слушаем музыку. Чтобы музыка играла — смартфону нужно читать mp3’шки, раскодировать их, в общем — продолжать работать. Экран, конечно, погаснет, и это снизит энергопотребление в пару раз, но если еще и система спать уйдет — музыка замолкнет.Чтобы приложения могли блокировать засыпание — разработчики андроида изобрели wakelock’и. Wakelock (Вэйлок) — это такая блокировка на засыпание. Пока какое-то приложение удерживает эту блокировку — телефон заснуть не может.Все бы хорошо, но делается это совершенно незаметно для пользователя, и иногда хрен определишь, почему андроид не засыпает. Или почему просыпается среди ночи на два часа. Сейчас я объясню, как все это отлавливать.
Практика:
Собирать статистику энергопотребления мы будем при помощи BetterBatteryStats. Оно бесплатное.Как этой ерундой пользоваться — хрен разберешься. Для анализа расхода батареи необходим дамп BBS во время бездействия телефона!!!!!
(повторюсь, СУТЬ ПРОГРАММЫ: выяснить, что не даёт спать телефону, когда он должен спать, а не расход батареи во время работы.) Вот инструкция:
1.Включите в дополнительных настройках функции рута , а в настройках дампа отметьте все пункты. В последних версиях, если на устройстве есть рут, функции рута включены автоматически, и, начиная с 2.0.0.0В2, в программе отсутствует настройка файла дампа - все пункты включены по умолчанию.
2.Зарядите батарею, если заряда недостаточно (лучше, если заряд будет не 100%, а, скажем, 60-70, в этом случае дамп будет более реален).
3. Закройте все программы, включая BBS, отключите WiFi.
4. Очистите окошко недавних.
5. Подключите/отключите зарядное устройство.
6. Оставьте телефон бездействовать на 4 часа или более, лучше на всю ночь.
7. Откройте BBS, убедитесь, что в метках стоит: от - отключено (unplugged), до - текущее (current).
8. Сохраните дамп:
9. Откройте дамп, проверьте, что пункты "Kernel wakelocks (вэйклоки ядра)" и "alarms (сигналы)" (если у вас есть рут), отображены. Если нет, повторите всё заново.
Чтобы видеть только то, что происходило со спящим телефоном.
Статистика по-умолчанию — Other — это общая сводка. Если вы видите, что телефон пребывал долгое время в awake’а вместо того, чтобы спать — плохо дело. Чтобы выяснить, почему — нажмите на Other и выберите Partial Wakelocks. Там будут отображены приложения, которые блокировали уход телефона в спячку. Ну а дальше действуйте по ситуации.
Например, можно узнать, что стандартный андроидовский плеер, если его поставить на паузу, не дает телефону заснуть. Кнопки «стоп» в нем, разумеется, нету. Кнопки «закрыть» тоже. Или что фаерфокс со вкладками продолжает жрать батарею в свернутом состоянии. Закрыть его, понятное дело, невозможно — андроид умнее меня и сам решает, когда приложению закрываться, а когда — сворачиваться. Всякое такое вы будете с интересом обнаруживать по пути. Удачи... Более подробно о вэйлоках и как с ними бороться я расскажу в следующей статье... https://ok.ru/androidboot/topic/65817243590809
Присоединяйтесь — мы покажем вам много интересного
Присоединяйтесь к ОК, чтобы подписаться на группу и комментировать публикации.
Нет комментариев