Режим энергосбережения Doze — одно из ключевых новшеств Android 6.0. Это не просто очередная оптимизация, это кардинальное решение, позволяющее, по словам Google, существенно продлить жизнь устройства от батареи. Но так ли эффективен этот механизм на самом деле? Попробуем выяснить, а заодно разберемся, как он работает и можно ли его настроить под себя и активировать на старых версиях Android.

 

В чем проблема?

Когда Google заявляет, что после обновления до Android 6.0 жизнь Nexus 7 продлевается на пять часов, верится с трудом. Уж слишком фантастическая цифра. Однако если разобраться в том, как работает Doze, то все встанет на свои места. Дело в том, что Doze — это не какая-то навороченная технология, а довольно простой механизм, который всего лишь ликвидирует одну из проблем Android, заложенную еще на этапе проектирования операционной системы.

В отличие от со всех сторон обрезанной iOS, Android всегда был операционкой, гораздо более близкой по духу к настольным операционным системам, и одной из его особенностей всегда была полноценная многозадачность. Другими словами, приложения никогда не ограничивались в том, что они делают, пока находятся, так сказать, в свернутом состоянии. Ты мог спокойно запустить обновление списка писем в почтовом приложении, свернуть его и продолжать читать твиттер. Почтовый клиент благополучно загрузит цепочки писем в фоновом режиме и выведет в статусную строку уведомление. Более того, можно не просто свернуть приложение, а вообще выключить экран, и оно все равно сделает свою работу.

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

Долгое время проблему пыталась побороть как сама Google, так и независимые разработчики. В первом случае результатом работы стали разные ухищрения, такие, например, как автоматическое отслеживание работы фоновых сервисов приложений и их убийство при слишком долгой активной работе или слишком высокой нагрузке на процессор (Android 4.4). Во втором случае появились приложения Wakelock Detector и Greenify. Одно показывало, какие приложения не дают процессору уснуть, другое позволяло «заморозить» эти приложения, чтобы они вообще не могли работать в фоне. Для многих любителей ставить на смартфоны сотни приложений эти два инструмента стали спасением.

Wakelock Detector: список жадных до процессора приложений
Wakelock Detector: список жадных до процессора приложений

Однако, кроме root на смартфоне, Wakelock Detector и Greenify требовали также понимать, что ты делаешь, тратить время на поиск жадных до процессора приложений, да и вообще все это грязные хаки. С помощью Doze Google как раз и попыталась избавиться от этих проблем, реализовав полностью автоматический механизм заморозки приложений.

Greenify: выбираем приложения для заморозки
Greenify: выбираем приложения для заморозки
 

Как это работает?

Doze — это системный сервис, который активируется после отключения экрана и следит за тем, не взял ли ты смартфон в руки (с помощью датчиков положения) или не подключил ли к зарядке. Тогда же начинается отсчет времени; если по окончании этого периода указанных действий со смартфоном не происходит, Doze переводит его в режим агрессивного энергосбережения (на самом деле все сложнее, но об этом позже), который предполагает:

  • запрет любых сетевых операций;
  • полное игнорирование вейклоков (wake locks), того самого механизма, который позволяет приложениям безнаказанно работать, даже если экран выключен;
  • отложенное выполнение алармов (alarms), которые позволяют приложениям получать управление в указанное время;
  • отключение сканирования Wi-Fi;
  • отключение синхронизаций, как с Google, так и с другими облачными сервисами, добавленными в раздел «Аккаунты» в настройках;
  • отключение JobScheduler, подсистемы, позволяющей приложениям получать управление при определенных условиях (при подключении к Wi-Fi, например).

Говоря простыми словами, Doze запрещает приложениям делать что-либо, если смартфон долгое время не используется. Но есть несколько исключений. Первое: через определенные периоды система на короткое время выходит из режима Doze, позволяя приложениям выполнить отложенные действия (те же алармы). Причем чем дольше смартфон остается нетронутым, тем реже будет происходить выход из Doze. Второе: система учитывает потребности таких приложений, как будильники, и выходит из режима Doze незадолго до того, как они должны сработать (такие приложения должны использовать метод setAalarmClock() класса AlarmManager). Третье: приложения, получающие push-уведомления с помощью Google Cloud Messaging (GCM), смогут выводить смартфон из режима Doze, но только в том случае, если это высокоприоритетное уведомление. Четвертое: звонки и СМС сразу выводят смартфон из режима Doze.

Временная шкала работы Doze
Временная шкала работы Doze

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

 

Можно ли отключить Doze?

Doze — это, безусловно, большой шаг вперед в энергосбережении. Однако далеко не каждый пользователь будет рад тому, что все его приложения будут так или иначе заморожены. Есть целый класс программ, которые должны работать в фоне и постоянно выполнять какие-то действия: скрытые GPS-трекеры, приложения для удаленного управления, разного рода серверы (SSH, SMB). Поэтому в Android есть встроенный интерфейс для отключения Doze для отдельно взятых приложений (белый список).

Находится он здесь: «Настройки -> Батарея -> меню -> Экономия заряда батареи -> Все приложения». Достаточно тапнуть по нужному приложению и выбрать пункт «Не экономить». После этого приложение сможет использовать интернет и занимать процессор (с помощью тех самых вейклоков) когда ему заблагорассудится, однако все остальные ограничения Doze и App Standby будут продолжать действовать.

Отключаем Doze для приложения
Отключаем Doze для приложения

Запрос на добавление в белый список может инициировать и само приложение. В Play Маркете такое приложение будет подвергнуто дополнительной модерации и будет допущено к публикации в магазине только при соблюдении определенных условий. В частности, Doze разрешается обходить только приложениям, которые технически с ним несовместимы или по каким-либо причинам не могут использовать GCM.

Чтобы отключить Doze полностью, нужно либо подключить смартфон по ADB к компу, либо иметь root. Во втором случае отключение Doze выполняется с помощью любого доступного в маркете эмулятора терминала:

su
dumpsys deviceidle disable

Включение:

su
dumpsys deviceidle enable
 

Более широкие настройки?

Имея root, Doze можно затюнинговать под себя. Для этого есть несколько приложений, но мы остановимся на Naptime от небезызвестного Франциско Франко (в журнале было интервью с ним). Naptime позволяет изменить почти любые настройки Doze, в том числе время его включения, разрыв между интервалами выхода из Doze, частоту опроса сенсоров положения и многое другое.

Приложение имеет множество настроек, разделенных на три секции: Sensors, Idle и Apps, плюс в самом верху переключатель для ленивых Agressive Doze. Последний, как и гласит название, запускает агрессивный режим работы Doze, который предполагает, что Doze будет активирован сразу после отключения экрана. Использовать его я рекомендую только в крайних случаях, например во время долгих поездок без доступа к заряднику.

У каждой настройки есть описание (на английском), однако понять его смысл, не зная, через какие стадии проходит смартфон перед переходом в режим Doze, практически невозможно. Поэтому нам придется углубиться в детали. Если не брать в расчет некоторые этапы вроде заблаговременного определения местоположения, которое может понадобиться находящимся в Doze приложениям, то цикл работы Doze выглядит так:

  1. Экран смартфона выключается.
  2. Запускается Inactive timeout (по умолчанию тридцать минут), во время которого смартфон просто следит за тем, не включится ли экран снова.
  3. По истечении тайм-аута запускается Sensing timeout (четыре минуты), во время которого смартфон ждет любые движения смартфона — если они есть, запускается Motion inactive timeout (десять минут), по окончании которого вновь запускается Sensing timeout.
  4. Если движений нет, запускается Idle after inactive timeout (тридцать минут), смартфон ждет резких движений и перемещений смартфона (Significant motion), если они происходят, запускается Motion inactive timeout, а далее все сначала с третьего пункта.
  5. Если и резких движений нет, смартфон переходит в режим Doze и запускается Idle timeout (один час), смартфон продолжает следить за движениями.
  6. По истечении Idle timeout смартфон на короткое время выходит из режима Doze, запуская Idle pending timeout (пять минут).
  7. Если движений не происходит, смартфон вновь возвращается в режим Doze, но в этот раз на время, равное Idle timeout * Idle factor (2.0), то есть на два часа.
  8. Шаги 6 и 7 повторяются.

Во время всех шагов этого цикла, начиная с третьего, смартфон следит за движениями смартфона и, если они есть, запускает Motion inactive timeout, после которого возвращается к третьему шагу. Другими словами, смартфон, который постоянно перемещается в пространстве (например, при ходьбе), будет всегда находиться в режиме либо Sensing, либо Motion inactive и никогда не перейдет в режим Doze. Если же смартфон находится в покое, переход в режим Doze случится не раньше, чем через час (Inactive timeout + Idle after inactive timeout).

Стандартные настройки близки к оптимальным для большинства людей. В течение дня, когда ты берешь смартфон в руки как минимум раз в час, он будет работать в обычном режиме, а по ночам благополучно переходить в режим Doze. Это абсолютно логичная и правильная схема работы. Любителям экспериментов я бы предложил обратить внимание на Inactive timeout, Motion inactive timeout и Idle pending timeout. Первые два можно уменьшить, например, в два раза, тогда находящийся в покое смартфон будет переходить в режим Doze уже через тридцать минут. Idle pending timeout определяет период, в который смартфон будет бодрствовать, временно выходя из Doze. Пять минут может быть слишком много для того, чтобы приложения всего лишь успели забрать почту и обновить виджет погоды, так что этот параметр можно снизить до одной-двух минут. Остальные настройки я бы не трогал.

Кстати, смартфон можно в любой момент принудительно перевести в режим Doze с помощью все той же команды dumpsys (правда, делать это следует при выключенном экране, например с помощью ADB):

su
dumpsys deviceidle force-idle

Также можно перевести в режим App Standby отдельно взятое приложение:

su
am set-inactive имя_пакета true
С помощью команды dumpsys deviceidle можно узнать текущие настройки Doze
С помощью команды dumpsys deviceidle можно узнать текущие настройки Doze
 

Doze для более старых версий Android?

Doze встроен в операционную систему и затрагивает многие ее компоненты, поэтому перенести его в более старую версию ОС, не подвергая ее серьезным изменениям, невозможно. Однако уже появились люди, играющие на желании пользователей получить Doze, не устанавливая Android 6.0. Приложение Doze уже успело засветиться на многих зарубежных и отечественных сайтах как сторонняя реализация оригинальной функции от Google, совместимая аж с Android 4.1.

На самом же деле приложение не имеет ничего общего с функцией Doze из Android 6.0. Все, что оно делает, — просто запрещает приложениям использовать интернет, когда экран выключен. Другими словами, как и раньше, приложения будут продолжать просыпаться и занимать процессор, но не получат доступ к сети. Какая-то экономия батареи от этого, конечно, будет, но это жуткий костыль, который сломает нормальное функционирование многих приложений (само собой, функции временного отключения режима энергосбережения тут нет).

Запомни эту сову — она не та, за кого себя выдает
Запомни эту сову — она не та, за кого себя выдает
 

Выводы

Doze — отличная технология, но это вовсе не волшебная пилюля, которая решит все твои проблемы с расходом батареи разом. Ее эффективность сильно зависит от того, как ты используешь устройство. На смартфоне разница в расходе батареи после перехода на Android 6.0, скорее всего, будет практически незаметна, Doze проявит себя только ночью, когда смартфон находится в покое.

Однако для планшета все может быть совсем иначе. Если ты используешь его нечасто, например только для чтения книг и иногда игр, Doze сможет проявить себя во всей красе. Большую часть времени планшет будет находиться в режиме энергосбережения, так что расход окажется минимальным (в идеале нулевым).

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии