Heartbeat alarm не дает заснуть телефону
Привет всем. =) Как и обещал, выкладываю вторую часть материала статьи об энергосбережении на Android. На этот раз речь пойдет о возможностях c root-доступом.
О том, что такое Root, как его получить, возможные риски, полезный софт - в этой замечательной статье на 4PDA
Итак, если вы рутировали свой гаджет, то у вас открываются дополнительные возможности по экономии электроэнергии:
1. Удаление или отключение ("заморозка") любых приложений;
2. Управление частотой процессора;
3. Исключение программ из автозагрузки;
4. Поиск программ, не дающих "засыпать" устройству и/или чрезмерно нагружающих процессор;
5. Модули для Xposed для экономии электроэнергии.
Можно было бы добавить пункт "Правка файлов в разделе system вручную", но это еще более опасно, чем взаимодействие с system через специализированный софт, поэтому о нем упоминать не рискну.
С первого пункта и начнем. Как я уже писал в первой части, дополнительной экономии электроэнергии можно достичь с удалением/отключением программ. С наличием Root-доступа вы можете удалить/отключить любую программу. НО БУДЬТЕ ОЧЕНЬ ОСТОРОЖНЫ: удаление и/или отключение того-что-трогать-нельзя, может привести к негативным последствиям, вплоть до "окирпичивания". Приложения, от которых можно безболезненно избавиться, вы можете уточнить на тематических форумах. Либо, как вариант, воспользоваться программами Power Clean или менеджер приложений (ROOT) (ссылки на упомянутые приложения будут в конце поста). В первой программе выбираем Менеджер приложений, прокручиваем список до "Предуст. прил-я", где приложения делятся на те, что можно безопасно отключить и на те, которые трогать нельзя. Справедливости, ради, отключение Play Маркета, Hangouts, стандартного почтовика, которые приложение занесло в список "неприкасаемых", не нанесло моему телефону никакого вреда. Во втором при запуске формируется список системных приложений, который делится на три типа: "Можно удалить", "Лучше оставить" и "Удалять небезопасно".
Если написанное выше не испугало, начнем с менее радикального способа. Пожалуй, самой известной программой для отключения ("заморозки") является Titanium Backup. Точнее, это лишь одна из его множества полезных функций. Для заморозки приложения запускаем Тitanium, жмем вкладку Резервные копии, где находим нужное приложение, тапаем по нему и выбираем "Заморозка!". Но я, например, отключаю приложения через Lacky Patcher, еще одну утилиту, но с "уклоном" в сторону патчинга и взлома приложений. Нужно лишь в настройках в разделе "Фильтр" поставить галочки рядом со всеми пунктами, и тогда в списке будут отображаться все приложения. Ну а дальше все просто: тап по приложению > Инструменты > Отключить приложение (заморозить). У этого же автора есть Lucky App Manager - Lucky Patcher без "незаконных" функций.
Перечислю еще несколько программ с функцией отключения приложений: Link2SD, SD Maid, My Android Tools, System Cleanup.
Перейдем к удалению системных приложений. Тут скажу очень кратко: Все, что умеет замораживать приложения, почти наверняка умеет и удалять системные. А также многочисленные файлменеджеры с менеджерами приложений, отдельные менеджеры приложений, всевозможные "комбаины". Главное - чтобы они имели доступ к root-привилегиям.
Управление частотой процессора
ВНИМАНИЕ! Ручное изменение частоты CPU может привести к зависанию, нестабильной работе и теоретически даже к повреждению устройства!
Есть три основных параметра, влияющих на энергопотребление процессора, которые можно изменить: частота, режим управления частотой, напряжение.
Все современные устройства могут динамически управлять частотой своего процессора в зависимости от его загрузки, тем самым регулируя его производительность и энергопотребление. Но это не всегда может происходить правильно и наиболее оптимально, и у аппарата будет не экономичный расход энергии. При этом, при отсутствии активных приложений, выключенном экране, частота процессора снижается до минимального значения, прописанного в ядре прошивки, как правило это 15-30% от максимальной частоты. В правильно оптимизированном устройстве, со средней повседневной нагрузкой, большую часть времени процессор будет работать именно на минимальной частоте. Оценить оптимизацию энергопотребления процессора устройства можно посмотрев статистику работы процессора на той или иной частоте. Для этого открываем приложение Android System Info, выбираем вкладку Информация о системе и пункт Процессор. Если там вы видите, что большую часть времени процессор работает на максимальной частоте, значит, с оптимизацией есть проблема. При этом, в первую очередь нужно посмотреть графики загрузки процессора в программах мониторинга, например, SystemPanel. Если процессор не грузит какое-либо приложение, за счёт чего его частота поднимается, значит, неправильно работает штатный режим управления частотой.
Для исправления ситуации устанавливаем SetCPU , с помощью которого можно не только задать рабочую частоту процессора (или уточнить диапазон рабочих частот), но и создать профили частот, активируемые по какому-либо событию (запуску приложения, уменьшению заряда, отключению экрана, времени), то есть оптимизировать процесс управления частотой под себя. Также в программе можно вручную выбирать режимы работы процессора. Подробное описание этих параметров превратит длиннопост в очень длиннопост =), поэтому разумнее будет ограничиться ссылками на программы, где все довольно подробно расписано:
SetCPU и CPU Control. Вторая дополнительно умеет понижать напряжение процессора.
Исключение программ из автозагрузки
Многие сталкивались с ситуацией, когда только что купленный смартфон радует своего владельца необыкновенной скоростью и отзывчивостью, но стоит установить в него весь комплект необходимых программ, как от былой резвости не остаётся и следа. Это происходит из-за того, что очень многие программы и сервисы добавляют себя в автозагрузку, стартуют вместе с операционной системой, а затем так и работают в фоновом режиме, отбирая системные ресурсы и съедая заряд вашего аккумулятора. Чтобы убрать программы из автозагрузки, существует несколько утилит, самая известная и популярная из которых - Autostarts. Посему расскажу подробнее именно о ней. При запуске программы на дисплее появляются вкладки, при нажатии на которые видно, какие приложения и службы запускаются при том или ином действии. Чтобы удалить какое-либо приложение, жмем на него и в открывшемся окне выбираем Запретить. Помните: даже после удаления Autostarts, все изменения внесённые в приложения сохранятся на постоянной основе. Если вы хотите исследовать правила запуска для каждой конкретной программы, то необходимо переключиться в настройках в режим
Как видите, в целом довольно просто. Подробнее тут и FAQ из самой программы.
Существуют и аналоги Autostarts:
Startup Manager, Autorun Manager, AutoRun Manager (да, разработчики иногда не заморачиваются с названиями) и другие программы, которые вы, при желании, можете найти в сети и Play Маркете.
Поиск "незасыпающих" и грузящих процессор программ
Некоторые программы работающие в фоне, могут своими запросами "будить" телефон находящийся в режиме "сна" (так называемые Wakelock) и не давать ему перейти в режим энергосбережения, при этом появляется та самая "невидимая" активность.
Далее описаны несколько способов вычисления виновника незасыпания:
Перед применением какого-либо способа, попробуйте сначала просто перезагрузить телефон (особенно при сильной "невидимой" активность или показателе Running
100%), этого порой бывает достаточно.
Устанавливаем программу Wakelock Detector и запускаем её перед сном. Утром смотрим как "спал" телефон, какие приложения его "будили". Если попадается в лидерах незнакомый процесс, гуглим за что он отвечает и делаем выводы.
Устанавливаем BetterBatteryStats, так же запускаем перед сном, утром смотрим результаты. Подробное описание здесь.
Устанавливаем SystemPanel, переходим "Меню->Настройки", ставим галку "Включить Мониторинг", остальные галки по желанию. Оставляем аппарат на некоторое время в покое, желательно на всю ночь. По прошествии времени переходим Меню->Мониторинг. Нажимаем кнопку "История" и видим графики. Можно задать интервал вывода информации (если мониторинг работал всю ночь, удобнее выставить "8 часов"). Находясь в Истории, нажимаем на кнопку в верхнем левом углу "график", выбираем там Топ-приложения и получаем список приложений и процессов. Нажимаем на наиболее активные процессы и видим информацию о процессе, внизу видим историю потребления. Нажимаем кнопку "Сравнить", и снизу добавляются общие графики. Поочередно просматривая графики всех процессов, в итоге находим виновников незасыпания.
Модули Xposed для экономии энергии
Если очень кратко, то Xposed - это программа для изменения настроек приложений и прошивок без необходимости их декомпиляции, компиляции и подписи. Нужный результат достигается с помощью т.н. модулей. И, как вы уже догадались, некоторые модули помогут сэкономить заряд аккумулятора. Рассмотрим подробнее несколько: Power Nap, Amplify Battery Extender - Root, Greenify, Boot Manager,
Power Nap - это аналог технологии Stamina от Sony, но теперь доступный для Android-устройств версии 4.1 и выше. Модуль останавливает фоновые процессы, когда отключен экран, но вы можете добавить в список исключений те приложения, от которых нужны уведомления: соцсети, мессенджеры, звонки и SMS и т.п.
Программа Amplify прибивает основные системные процессы, пожирающие заряд батареи: NlpWakelock, NlpCollectorWakeLock, ALARM_WAKEUP_LOCATOR и ALARM_WAKE_ACTIVITY_DETECTION. Одно это позволяет ощутимо увеличить время жизни гаджета между зарядами, а за пожертвование доступны дополнительные функции.
Xposed Media Scanner Optimizer позволит вам взять под контроль процесс индексирования медиафайлов и настроить его по своему вкусу. Вы будете получать уведомления о начале работы сканера и его завершении, сможете запускать и приостанавливать этот процесс вручную, установить каталоги и типы файлов, которые будут индексироваться и многое другое.
Boot Manager делает то же, что и Autostarts: убирает программы и службы из автозагрузки.
Greenify - модуль для гибернации (усыпления) программ.
Вот, в основном все. Конечно, существует еще множество способов и программ, экономящих заряд аккумулятора, но я не ставил целью рассказать о всех. Охватить все особенности устройств, прошивок, софта в нескольких постах просто нереально. Если где ошибся, забыл - больно не бейте. =)
Список программ в комментариях (даю ссылки на 4PDA, т.к некоторые программы там русифицированы и есть полные версии. Но для скачивания нужна регистрация. Там же ссылки на Play Маркет, если данная программа там есть).
Хотим сразу предупредить, что данное руководство вряд ли подойдёт начинающим пользователям, так как требует некоторых знаний, а также решимости и желания ковыряться в недрах Android. Некоторые из ссылок в этой статье приведут вас на англоязычные сайты, поэтому для получения дополнительной информации вам понадобятся базовые знания иностранного языка. Кроме этого, все действия вы производите на свой страх и риск, а мы не несём ответственности за результат и возможные сбои в работе вашего устройства.
Ну, теперь, когда все формальности соблюдены, поехали!
Что вам понадобится
Прежде всего вот вам список всех необходимых инструментов и программ, которые будут использованы в этой инструкции. Возле некоторых из них я привёл ссылки на статьи, в которых вы можете получить дополнительные сведения. Каждой из этих утилит в статье будет посвящён отдельный раздел, включающий ссылки для скачивания и описание основных настроек.
- Root — «Руководство по получению root-прав на Android».
- Xposed Framework — «Xposed Framework — новые возможности для вашего Android».
- Greenify — «Спаси батарею Android-смартфона с Greenify».
- Amplify.
- MyAndroidTools.
- AppOpsXposed.
- AdAway — «Как убрать рекламу в браузере и приложениях Android».
- PowerNap.
Изменение базовых настроек
Начнём инструкцию с того, что лежит на поверхности. Описанные в этом разделе базовые настройки все знают, но далеко не все утруждают себя сделать необходимые изменения, обеспечивающие снижение энергопотребления смартфона или планшета.
1. Настройки экрана
Яркость экрана является одним из главных факторов, влияющих на время жизни батареи. Чем яркость выше, тем быстрее батарея разряжается. При этом лучше изменять яркость вручную, а не доверять автоматической регулировке. Далеко не всегда автоматика правильно срабатывает, да и датчик освещённости требует дополнительного питания. Не забудьте также установить время выключения экрана на 30 секунд или менее.
2. Передача данных
Это очень простой совет, но он реально продлевает жизнь устройства. Переключайте тип сети с 3G на 2G на то время, когда вам не требуется мобильный интернет и вы используете смартфон только для звонков.
3. Wi-Fi
Даже в те моменты, когда Wi-Fi отключён, ваш смартфон ищет доступную сеть. Отключить эту опцию можно, перейдя в «Настройки» → Wi-Fi → «Дополнительные функции» → «Всегда искать сети».
4. Определение местоположения
Ещё один поглотитель энергии — это сервис определения местоположения. Выключите его в том случае, если он вам в данное время не нужен: «Настройки» → «Местоположение».
Настройки программ
Теперь, когда вы оптимизировали все базовые настройки, можно начать погружаться глубже. Следующие действия будут касаться системных служб и процессов, которые скрыты от взгляда обычного пользователя.
1. Xposed Framework
Это приложение представляет собой рабочую среду, служащую для запуска нужных нам программ. Так что первым делом необходимо позаботиться об установке Xposed на своё устройство.
- Для Android версий 4.0.3–4.4 установочный файл можно скачать здесь.
- Для Android версий 5.0+ (частичная поддержка) все необходимые файлы и инструкции можно найти в этом топике. Подробное описание процедуры установки можно прочитать здесь.
- Для Samsung TouchWiz ROM скачать Xposed Framework можно здесь.
2. Greenify
Вы можете использовать Greenify для «заморозки» приложений и сервисов, которые вам не нужны. Обратите внимание, что вам понадобится именно версия Greenify (Donation Package), которая содержит некоторые дополнительные и экспериментальные функции. После установки Greenify вы должны будете активировать соответствующий модуль в Xposed. Затем активируйте режим ускорения и экспериментальные функции в настройках программы.
«Заморозьте» программы, которые потребляют энергию аккумулятора в фоновом режиме. В моём случае получился следующий список:
- Browser;
- Hike;
- Instagram;
- Google+;
- Messenger;
- Music;
- Walkman;
- UC Browser;
- XDA;
- Hangouts;
- Album;
- Calendar;
- Calendar Storage (Use alternate calendar);
- Camera;
- File Commander;
- MX Player;
- SHAREit;
- Maps.
и активность MyActivity появляется в указанное время. Только когда устройство подключено. Он также работает, когда он находится в кармане, или когда задержка составляет несколько минут. Но когда я устанавливаю alarmManager перед ночью, он не будет работать утром. Тем не менее, он будет работать, как только я возьму телефон или разблокировать экран.
Итак, я полагаю, это из-за сна режим устройства, но как это решить ?
1) я добавил журнал во всех методах myActivity, и я уверен, что никто не вызывается, прежде чем я вручную разбужу устройство. 2) я попробовал блокировку пробуждения PowerManagement (с разрешением WAKE_LOCK в манифесте), но ничего не изменилось :
пожалуйста, помогите ! Я уверена, что я так близко.
редактировать Dec 04'16 : Благодаря Нику Фрискелу и Викраму РАО, я изменил свой первоначальный код, чтобы вызвать broadcastReceiver и получить свой wakeLock в в onReceive. К сожалению, это не работает. Он отлично работает, когда телефон подключен или когда будильник планируется через 35 минут, но в течение полной ночи onReceive даже не вызывается. Я попытался в ту ночь, с сигнализацией, запланированной на 9:00, но onReceive был выполнен только в 9:46, что означает момент, когда я разблокировал устройство. Вот мой новый код :
что сказал, мой журнал пишет "начало onReceive" не в начале слушатель почему-то. Мне просто удалось поставить его в реальное начало, поэтому я посмотрю, вызван ли слушатель или нет.
редактировать Dec 05'16 : Итак, я изменил запись журнала в верхней части onReceive, и произошла та же проблема : запуск onReceive вызывается, как только я вручную разбужу устройство. Я могу реализовать wakefulBroadcastReceiver, но я боюсь, что это ничего не решит. Если я правильно понял, wakefulBroadcastReceiver полезен для предотвращения спящий режим между onReceive и запуском действия или службы. Но что, если onReceive даже не позвонил ? Я в отчаянии. Может быть, мне стоит напрямую спросить Sony. Кроме того, мой телефон имеет режим выносливости, но он не активирован.
EDIT Dec 11'16: Итак, с новыми тестами я теперь уверен, что ничего не понимаю. Я установил broadcastReceiver, который активируется каждые 5 минут (onReceive сбрасывает alarmManager через 5 минут), и я вижу, что это отлично рабочий. иногда. Он может длиться несколько часов и спать в течение двух часов, затем ОК в течение 30 минут, а затем снова спать. (все это, когда мой телефон включен, отключен и простаивает). Я собираюсь удалить весь код, но то, что нас интересует. Это будет легче понять, и я смогу написать здесь все активные код.
Давай представим, что у нас есть приложение, а у него, в свою очередь, есть служба (service), которая должна постоянно висеть в фоне, обрабатывать команды, полученные от сетевого сервера, и отправлять ответы. Связь с сервером, как это и положено мобильным устройствам, поддерживается с помощью long poll запросов, то есть приложение подключается к удаленному серверу и ждет, пока тот отправит что-либо в ответ, а потом переподключается и ждет снова. Это эффективный и очень экономный в плане заряда батареи способ, который в том числе используется в механизме push-уведомлений самого Android.
В теории все выглядит отлично, архитектура приложения абсолютно правильная, вот только, если начать его тестировать, вскроется несколько очень неприятных моментов.
Режимы энергосбережения Android
В Android 4.4–5.1 (версии ниже мы рассматривать не будем — они стремительно устаревают) служба будет работать и моментально откликаться на запросы сервера, но только до тех пор, пока экран включен. Через несколько секунд после отключения экрана смартфон перейдет в режим сна (suspend), и промежуток между отправкой запроса и ответом нашего приложения будет составлять примерно минуту. Это срок между maintenance-пробуждениями устройства, и повлиять на него мы не можем.
В Android 6.0–7.1 ситуация будет примерно такой же, однако спустя примерно час смартфон перейдет в так называемый режим Doze. После этого ответ от приложения можно либо не получить вовсе, либо получить спустя час или два. А все потому, что в режиме Doze смартфон фактически не дает работать сторонним приложениям и их службам и полностью отрезает им доступ в Сеть. Управление они могут получить только на короткий промежуток времени спустя час после перехода в режим Doze, затем два часа, четыре часа, со все большим увеличением промежутков между пробуждениями.
Итого, в Android есть сразу три механизма, с которыми придется бороться:
- Suspend — обычный режим энергосбережения, может замедлить получение ответа от устройства примерно на одну минуту;
- App Standby — агрессивный режим энергосбережения, способный замедлить получение ответа на сутки;
- Doze — агрессивный общесистемный режим энергосбережения, который применяется ко всем приложениям.
Все эти режимы энергосбережения можно обойти, но чем дальше в лес, тем больше костылей и неудобств пользователю, поэтому мы рассмотрим несколько вариантов обхода механизмов энергосбережения, от самых лайтовых до хардкорных.
Сценарий 1. Небольшая задержка в ответе некритична, переход в Doze некритичен
В этом сценарии у тебя есть приложение, для которого задержка в ответе до одной минуты некритична, а переход смартфона в режим агрессивного энергосбережения совсем не страшен. Все, что тебе нужно, — это чтобы система не отправляла приложение в состояние Standby.
Два самых простых способа добиться этого — либо вывести службу на передний план (foreground service), либо дать приложению права администратора устройства. Начнем с первого варианта.
Foreground service
Foreground service в терминологии Android — это служба, которая имеет уведомление в шторке. Система относится к таким службам гораздо бережнее. Например, при нехватке памяти она будет убита в последнюю очередь, она не будет убита при смахивании приложения в меню управления запущенными приложениями, и да, к ней не будет применен режим Standby.
Создать foreground service очень просто. Достаточно вставить в код службы примерно такие строки:
Этот пример создает уведомление, при тапе на которое будет запущена ExampleActivity, в конце с помощью startForeground() служба переводится в статус foreground.
Права администратора
Другой вариант — это дать приложению права администратора. Такие права обеспечивают возможность управлять политикой формирования паролей экрана блокировки, делать удаленную блокировку и вайп устройства.
В свое время Google ввела понятие «администратор устройства» для компаний, которые хотели бы управлять смартфонами своих сотрудников. То есть компания создает приложение, которое получает права администратора и может заблокировать или сбросить телефон после команды от сервера. Именно поэтому приложение с правами администратора не переходит в режим Standby, ведь команда на блокировку может прийти в любой момент.
Получить, а точнее запросить права администратора опять же просто. Для начала нам понадобится пара колбэков, которые будут вызваны после того, как права получены или отозваны:
А затем достаточно вызвать интент DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN, который приведет к появлению на экране окна для активации прав администратора:
Запрос на активацию прав администратора и окно управления администраторами | Запрос на активацию прав администратора и окно управления администраторами |
Запрос на активацию прав администратора и окно управления администраторами |
Сценарий 2. Небольшая задержка в ответе некритична, в режиме Doze сервис должен работать
Проблема с предыдущим сценарием в том, что, хотя приложение и не будет переходить в состояние Standby, режим Doze продолжит на него действовать. К счастью, Android позволяет частично отключить Doze для выбранных приложений и даже предоставляет средства для вывода диалога с запросом на добавление приложения в список исключений. Все, что нужно сделать, — это вызвать следующий интент:
Плюс добавить такую строку в Manifest.xml:
Если юзер согласится добавить приложение в исключение, нажав «Да», наша служба сможет работать с Сетью и устанавливать вейклоки (partial wakelock), даже когда смартфон находится в режиме Doze.
Проблема этого подхода только в том, что Google не пропустит такое приложение в Play Store. Точнее, она должна его пропустить, если подобная функциональность действительно необходима приложению (об этом ясно сказано в документации). Но по факту робот Гугла сразу отшибает любые приложения с пермишеном REQUEST_IGNORE_BATTERY_OPTIMIZATIONS.
Обойти эту проблему можно, если вместо того, чтобы напрямую просить юзера добавить приложение в список исключений, просто кинуть его на экран управления исключениями Doze (Настройка → Батарея → Меню → Экономия заряда батареи), предварительно предупредив, что юзер должен сам найти приложение в списке и выключить для него режим энергосбережения. Сделать это можно с помощью такого метода:
Окно исключений режима Doze | Окно исключений режима Doze |
Окно исключений режима Doze |
Сценарий 3. Задержка в ответе недопустима, в режиме Doze сервис должен работать
К сожалению, даже если ты добавишь приложение в исключения Doze, ты все равно не избежишь задержки в ответе. Одна минута может быть некритична для большинства приложений, но, если речь идет о чем-то вроде мессенджера, никакая задержка не допустима.
Реализация push-уведомлений выходит далеко за рамки этой статьи, поэтому я не буду рассказывать о ней, но поделюсь некоторыми советами.
- Push-уведомления должны быть реализованы средствами Firebase Cloud Messaging (FCM, ранее Google Cloud Messaging) или с помощью библиотек и сервисов на основе этой технологии.
- Уведомления должны быть высокоприоритетными, иначе они не смогут вытащить твое приложение из Doze.
- Твое приложение должно находиться в списке исключений Doze, иначе, проснувшись после получения push, оно не сможет выйти в Сеть.
- Самый простой способ реализации push-уведомления — это сервис OneSignal. Он построен на базе FCM, очень легко интегрируется в приложение и предоставляет безлимитное количество пушей даже в бесплатной версии.
Вместо выводов
С каждой новой версией Android Google все больше ограничивает разработчиков приложений в возможностях. Однако обходные пути всегда можно отыскать. Да, порой эти пути больше напоминают извилистые лесные тропы, чем автомагистраль. Но они есть, и Google не закрывает все возможные пути реализации функциональности, намеренно оставляя лазейки.
Евгений Зобнин
Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.
Читайте также: