Мнение автора BetterBatteryStats об отзыве разрешений и препятствию удержанию приложениями вэйклоков

Перевод ©Dmitry Gaich 2020

Некоторые мысли о вэйклоках и пробуждениях

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

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

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

Основные термины

Сигналы
Сигналы — это механизмы приложения для асинхронного вызова в определённый момент времени. Существуют различные типы сигналов, которые либо срабатывают, когда телефон уже пробуждён, либо являются причиной пробуждения. Кроме того, имеются разные степени точности, в зависимости от того, нужна ли Вам высокая точность или Вы позволяете системе Андроид принять решение о времени, чтобы она могла потенциально собрать несколько триггеров сигналов в одно пробуждение.

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

Вэйклок
Имеется два типа вэйклоков: вэйклоки ядра и частичные вэйклоки. Частичные вэйклоки – специфика Андроид, в то время как вэйклоки ядра не являются специфичными для данной системы и представляют собой часть любого ядра linux. Частичные вэйклоки внутренне задействуются при удержании вэйклока ядра.
В Андроиде частичные вэйклоки необходимы, когда имеется отрезок кода (блок, цепочка), которая не должна прерываться при переходе телефона в сон. Примером последовательности, которая не должна прерываться, являются как блоки, применяемые таким образом, чтобы гарантировать непрерывность при прохождении, так и блоки, использующие избыточные ресурсы, такие как данные, и которые Вы хотите завершить.

Как они взаимодействуют

Примеры частичных вэйклоков
Начнём с примера BBS (да, BBS удерживает вэйклоки). При определённых событиях (загрузка, отсоединение ЗУ, экран выкл/вкл) BBS сохраняет так называемые метки: метка является полным описанием соответственного полного состояния Вашего телефона в момент времени. Затем метки могут сравниваться для получения полной картины того, что происходило между двумя метками.
Для того, чтобы метка сохраняла целостность, важно, чтобы процесс сохранения не прерывался. При использовании телефона это не имеет значения (поскольку экран включен и при его использовании всё равно удерживается вэйклок), но подумайте, что происходит, когда экран выключен, и Вы отсоединяете ЗУ: телефон может перейти в сон до завершения критической последовательности, нарушая целостность: вот когда нужен вэйклок.

Другим примером будет ситуация, когда вы загружаете что-то (например, из google play) и Ваш экран отключается. Если загрузка началась, когда Вы использовали телефон, Вы хотите закончить её до того, как телефон перейдёт в сон. Отсутствие вэйклока при загрузке может стать причиной прерывания скачивания, файл может остаться недогруженным и получится, что батарею Вы использовали впустую и начинать надо заново.

Примеры пробуждений
Когда приложению необходимо что-то сделать в определённое время (например, запрос) оно будет использовать RTC_WAKEUP для запуска последовательности, которая, может , к примеру, открыть соединение и получить данные. Поскольку пробуждения могут запускаться, когда телефон спит и экран остаётся выключенным, телефону не понадобится много времени, чтобы снова перейти в сон, возможно, до того, как соединение и запрос будут закончены. Во избежание этого необходимо удержание вэйклока до тех пор, пока соединение и последующие действия не будут выполнены.

Что может произойти
Отзыв разрешений на удержание вэйклоков или препятствие выполнению данной операции приложением – наихудшее, что Вы можете сделать: в результате Вы получите ещё больший расход из-за устанавливаемых соединений и запуска передачи данных до того, как телефон вернётся в режим сна и отменит результат.
Ещё хуже: представьте следующую последовательность, которая будет происходить при пробуждении:
1. Телефон пробуждается (RTC_WAKEUP)
2. Удержание вэйклока
3. Соединение
4. Передача данных
5. Следующий сигнал программы
6. Освобождение вэйклока

Подумайте, что произойдёт, если Вы воспрепятствуете удержанию приложением вэйклока и в результате последовательность прервётся в процессе передачи?

Мы в тупике?
Нет. Выявление вэйклоков (особенно, длительных и часто происходящих), а также частых пробуждений – это показатель, что что-то идёт неправильно. Знание этого предполагает разные действия, которые мы можем выполнить:
• Примите решение об удалении приложения, поскольку цена его использования слишком высока по сравнению с пользой
• Попробуйте изменить симптомы, настраивая параметры приложения
• Используйте инструменты для предотвращения определённых пробуждений, если нет нужды в получении обновлений, когда телефон выключен (Facebook-один из примеров)
• Свяжитесь с разработчиком и помогите ему решить проблему с нежелательными эффектами
А что никогда не надо делать – это пытаться подавить симптомы вместо того, чтобы убрать причину (именно это вы делаете, когда препятствуете удержанию приложением вэйклоков, и это очень, очень плохая идея).

Оригинал

Поделиться ссылкой:

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *