P.S. Проблемы с Samsung
При написании статьи я наткнулся на полезный сайт https://dontkillmyapp.com, на котором можно узнать, какие ограничения накладывают различные производители на энергопотребление устройств. Самой частой проблемой, с которой я сталкивался, была жалоба пользователей Samsung на высокое энергопотребление различными приложениями. И на этом ресурсе я нашел ответ на свой вопрос.
Вместе с релизом Samsung S8 была представлена утилита для увеличения времени работы батареи под названием App Power Monitor. И чтобы приложения работали корректно, их нужно вносить в whitelist. Также Samsung — рекордсмен по убийству приложений благодаря его «Адаптивной батарее».
На сайте есть рекомендации для разработчиков по обходу ограничений, но в случае с данным производителем:
Чтобы до конца понять, как работает и от каких факторов зависит энергопотребление Android-приложения, одной статьи, конечно, недостаточно. Но надеюсь, что я выполнил свою главную цель — заинтересовать вас этой темой, и вы сможете оптимизировать работу с энергопотреблением. На этом у меня все.
Энергосберегающий режим
Режим энергосбережения под тем или иным названием сегодня имеется в большинстве прошивок современных устройств под ОС Android. Он позволяет ограничить энергопотребление за счет снижения производительности устройства, яркости экрана и ограничений некоторых приложений. Имеется два способа, как включить режим энергосбережения на Android. Если используется панель уведомлений, нужно:
- Провести пальцем по экрану сверху вниз, открыть панель уведомлений и нажать на знак «Шестеренка».
- Найти и кликнуть значок батареи.
- В окне настроек аккумулятора открыть раздел настроек.
- Выбрать режим экономии.
Если активация режима энергосбережения проходит через настройки, необходимо:
- Открыть раздел «Настройки».
- Нажать на пункт «Батарея», а затем выбрать «Режим энергосбережения».
- Включить соответствующий переключатель.
- Можно настроить автоматическое включение. Для этого следует найти пункт «Включать автоматически» и выбрать один из вариантов:
- никогда;
- при остатке заряда 5% или 15%.
Когда устройство заряжается, режим энергосбережения выключается автоматически.
А как отключить режим энергосбережения на Android? Очень просто. Это можно сделать с помощью вышеуказанных действий, только не включая, а выключая функцию.
Как предотвратить переход приложений в режим ожидания
Приложение Standby считается оптимизацией батареи, как и Doze. Вы вообще не должны управлять или настраивать это вообще. Приложения перейдут в режим ожидания, если вы их никогда не используете, и все. Запустите приложение, и Android выведет его из режима ожидания.
Однако вы можете запретить Android переводить приложение в режим ожидания. Возможно, вы захотите сделать это, если вы знаете, что приложение должно работать в фоновом режиме, а App Standby переводит его в режим ожидания, вызывая проблемы.
Для этого откройте экран «Настройки», коснитесь «Аккумулятор», коснитесь кнопки меню и коснитесь «Оптимизация заряда батареи». Вы также можете открыть быстрые уведомления из ящика приложения и коснуться значка батареи, чтобы открыть экран батареи. Коснитесь заголовка «Не оптимизировано» и коснитесь «Все приложения», чтобы просмотреть список всех приложений на вашем устройстве..
Чтобы приложение не переходило в режим ожидания, коснитесь его и установите для него значение «Не оптимизировать». Это тот же параметр, который предотвращает ограничение приложения с помощью Doze. Эти параметры освобождают приложения от Doze, App Standby и любых будущих оптимизаций батареи, которые Google добавляет в Android.
Фоновые оптимизации.
Ограничения, начиная с Android 7:
- Не отправляются широковещательные сообщения `CONNECTIVITY_ACTION`, если receiver объявлен в манифесте. Если receiver зарегистрирован динамически, то сообщение будет получено.
- Приложения не могут получать или отправлять `ACTION_NEW_PICTURE` или `ACTION_NEW_VIDEO`.
Ограничения, начиная с Android 9:
Если система замечает, что приложение потребляет чрезмерное количество ресурсов, она уведомляет пользователя и дает ему возможность ограничить действия приложения. Это поведение включает в себя:
- Чрезмерные wake locks.
- Избыточное количество фоновых сервисов.
Точные ограничения определяются производителем устройства.
Google I/O
Jetpack
На конференции Google I/O много говорили о Jetpack — своего рода прокачанном наборе инструментов, который сама Google рекомендует использовать для создания быстрых, производительных, эффективных и самых-самых в мире приложений.
В целом инструменты достаточно стандартны, это все те же набившие оскомину AppCompat, новомодный Android KTX (кстати, да, Google намекает, что Java пора на покой), компоненты так называемой архитектуры Android: LiveData, ViewModel, Room и так далее. В списке есть и стандартные API Android, такие, например, как менеджер загрузок, а еще Emoji, куда же без них.
Запутав за десять лет экосистему Android до такой степени, что среднестатистический разработчик уже не может понять, куда ему ткнуться, Google решила все-таки внести ясность.
Компоненты Jetpack
Другие статьи в выпуске:
- Содержание выпуска
- Подписка на «Хакер»-60%
WorkManager
Среди компонентов Jetpack оказался один новый и довольно занятный. Название ему — WorkManager, а история очень и очень интересная. Издревле в Android было два основных метода выполнить фоновую работу: фоновый поток (AsyncTask, например) и сервисы. Последние пользовались особой популярностью, потому как работали независимо от самого приложения, да еще и с возможностью попросить систему о своем перезапуске.
Когда набежала толпа гоблинов, вирусов и говнокодеров, стало ясно, что так дело не пойдет и нужен более контролируемый системой фоновый механизм. Google придумала JobScheduler, подсистему Android 5, которая позволяла отдать системе задачу на выполнение в такое-то и такое-то время, почти как в iOS. Сервисы тем временем неистово подавлялись (а в Android 8 вообще ушли в нелегал).
Со временем JobScheduler обрастал функциональностью, появился его аналог для более старых ОС (Firebase JobDispatcher), а народ все не унимался: ну неудобно нам, убогим, первые версии JobScheduler не работали, другие постоянно менялись, предлагаемая Google альтернатива зависела от самой инфраструктуры Google; плюс у нас тут RxJava и вообще реактивщина, а вы нам какой-то JobScheduler с его идеями из прошлого века.
Вот Google и решила выкатить свой WorkManager с промайзами и обсерверами. Если говорить в двух словах, то WorkManager — это работающая на костях существующего Android библиотека, которая позволяет тебе делать любые фоновые штуки с реактивщиной в нужное тебе время, нужной последовательности и нужных условиях и вообще не заботиться о том, на какой версии все это будет работать (библиотека выберет нужный механизм сама, в зависимости от версии Android).
Android App Bundle
Еще один важнейший анонс, сделанный компанией на Google I/O, — это App Bundle (видео), мечта всех домохозяек, взявших Android Studio в руки. Представь, что у тебя есть приложение, в которое понапихано множество самой разной графики в разных разрешениях, поддержка 150 языков, а еще есть сборки нативных библиотек для четырех архитектур.
Чтобы поддерживать все это дело, тебе приходится писать большой build.gradle, который собирал бы для тебя с десяток различных вариантов APK для разных платформ, разрешений экрана, возможно даже языков. Все это пришлось бы отдельно заливать в Play Store (ну ладно, может быть, ты юзаешь devops). В любом случае возни море, а все ради того, чтобы размер APK для каждого устройства и региона был адекватным.
А теперь представь, что ты просто нажимаешь «Собрать приложение» и вместо множества пакетов Android Studio выдает тебе один большой файл формата AAB. И в нем все: все картинки, шрифты, изображения, сборки библиотек — все, что только можно. Ты заливаешь этот файл в Google Play, и на этом твои проблемы заканчиваются: Google Play сам разберет его на множество мелких APK под разные архитектуры, размеры экрана и регионы.
Более того, в данный момент Google тестирует функцию Dynamic feature modules — с ее помощью можно разбивать базовый APK на части, которые будут докачиваться при необходимости. Ну правда, зачем тебе все приложение, если большей частью его функций ты даже не будешь пользоваться?
Внутренний формат AAB
AndroidX
Ну и в конце, конечно же, об AndroidX. Команда разработчиков support-библиотек, нужных для реализации новых функций ОС на старых устройствах, уже, кажется, сама запуталась и решила привести в порядок все эти com.android.support:appcompat-v7, support-v4 и прочий ворох невнятных, никак не связанных между собой имен.
Теперь у нас есть единое пространство имен для всех библиотек поддержки: . Все, что относится к API самого Android, теперь в пакете , внешние гугловские библиотеки поддержки — в . Было:
Стало:
Doze Mode
Когда устройство находится в режиме Doze, доступ приложений к определенным ресурсам откладывается до появления окна обслуживания (maintenance window). Список конкретных ограничений.
Если пользователь оставляет на какое-то время устройство отключенным от зарядки и с выключенным экраном, то оно переходит в режим Doze. В этом режиме система пытается сохранить заряд батареи, ограничивая доступ приложений к сетевым и ресурсоемким службам, откладывает Jobs, синхронизацию и Alarms.
Периодически система выходит из режима Doze, чтобы приложения могли выполнить отложенные действия. Во время этого окна обслуживания (maintenance window) система запускает все отложенные синхронизации, Jobs, Alarms и позволяет приложениям получить доступ к сети.
Со временем система все реже и реже планирует maintenance windows, что помогает снизить расход энергии, когда устройство не на зарядке.
В режиме Doze к приложениям применяются следующие ограничения:
- Доступ в сеть приостановлен.
- Стандартные AlarmManager откладываются до следующего окна обслуживания.
- Система не сканирует Wi-Fi.
- Система не позволяет запускаться sync adapters.
- Система не позволяет запускаться JobScheduler.
Чеклист для приложения в режиме Doze:
- Использовать FCM для обмена сообщениями.
- Если пользователь должен сразу увидеть уведомление, то нужно использовать .
- Предоставлять достаточное количество информации в сообщении, чтобы избежать последующих запросов в сеть.
- Установить критически оповещения с and .
- Протестировать приложение в режиме Doze.
Главное отличие — Android Marshmallow 6.0 против 6.0.1
главное отличие между Android Marshmallow 6.0 и 6.0.1 заключается в том, что Android Marshmallow 6.0.1 поставляется с обновлениями, такими как 200 новых эмодзи, новый способ запуска камеры, удобный способ использования планшета с измененным пользовательским интерфейсом, восстановление режима «не беспокоить» и другие функции безопасности. Хотя эти обновления могут показаться не слишком важными, они улучшают пользовательский интерфейс и Android Marshmallow для более эффективной конкуренции с конкурентами. Давайте внимательнее посмотрим как на операционную систему, так и на обновление и посмотрим, что они предлагают.
Лучшее решение: навсегда отключить приложение
App Standby помогает, но не мешает приложениям работать полностью. Чтобы приложение не запускалось полностью, его следует удалить. Если вы не можете удалить приложение со своего устройства, как это происходит со многими предустановленными приложениями, вы можете «отключить» их из Android. Несколько лет назад для этого требовался root-доступ, но теперь он встроен в Android.
Чтобы отключить приложение, откройте экран «Настройки» и нажмите «Приложения». Нажмите на название приложения и нажмите кнопку «Отключить», чтобы отключить его. Приложение исчезнет из вашего ящика приложения и вообще не сможет работать в фоновом режиме — это как если бы вы удалили приложение, за исключением того, что оно все еще занимает место в системной области вашего устройства. Чтобы восстановить доступ к этому приложению, снова откройте экран приложений, коснитесь отключенного приложения и включите его..
Хотя вы можете сделать Doze более агрессивным, чтобы приложения не разряжали батарею, не было никакого смысла делать App Standby более агрессивным. Приложение Standby разработано, чтобы помочь людям, которые не любят возиться, но имеют на своем устройстве набор приложений, установленных производителем или приложений, которые они установили несколько месяцев назад. Если вы из тех, кто разбирается в этом, вам лучше удалить или отключить эти приложения вручную.
Вибрация
Вибрация тратит приличное количество энергии. При этом на «Андроиде» она используется не только для звонков и сообщений, но и в приложениях или при нажатии на экран.
Избегайте, когда это возможно, «режим встречи»
На передней панели вашего мобильного устройства нажмите функциональную клавишу, которая обычно представлена двумя перекрывающимися прямоугольниками или ее эквивалентом, в зависимости от производителя и модели вашего мобильного телефона.
- В раскрывающемся списке выберите параметр, связанный с управлением приложениями.
- Откроется экран «Активные приложения».
- Наконец, нажмите кнопку «Готово все», чтобы закрыть все запущенные приложения.
Это может показаться второстепенной проблемой, но вибрация вашего мобильного телефона потребляет батарею.
Во избежание пропущенных звонков вибровызов можно не отключать, но во всех остальных случаях отключение вибрации — это экономия заряда батареи на «Андроид»-смартфонах и планшетах.
Как почистить память телефона
Начнем с банального! Память телефона — первое, что мешает смартфону считаться новым. Помню, как в свое время я покупал смартфоны, память которых у меня заканчивалась примерно через 2-3 года, когда приходило время их менять. Тогда я шутил, что покупаю новый потому, что в старом закончилась память.
А ведь забитая память телефона часто может приводить не только к появлению сообщений о невозможности сделать очередное фото, но и к тому, что смартфон начнет тормозить, а иногда даже работать некорректно. Проявления могут быть разными — от почти незаметных до реальных зависаний — но они есть практически всегда.
Интерфейс
С помощью API TextClassifier Google расширила возможности определения текста. Теперь он определяет даты, номера рейсов и адреса. Smart Linkify позволяет использовать TextClassifier через API Linkify с расширенными опциями для быстрого ответа.
В Android 9 переработали меню многозадачности. Благодаря новому дизайну оно стало удобнее. Пользователь может листать список приложений и посмотреть полное превью.
Приложения теперь будут адаптироваться под смартфоны с «монобровью». Система сама управляет высотой строки состояния с временем, зарядом батареи и сетью, чтобы отделить чёлку от основного контента. Кроме того, разработчикам можно будет активировать имитацию «моноброви», чтобы проверить, как приложение с ней работает.
Разработчики мессенджеров могут использовать API MessagingStyle. Теперь в уведомлении будет видно картинки и стикеры. Кроме того, в уведомлениях будет поддержка умных ответов.
В Android 9 появился виджет лупы для текста, чтобы пользователям было удобнее его выделять. Он позволяет точно позиционировать курсор и выделить именно тот кусок, который нужен. Её можно прикрутить к любому блоку в окне, чтобы можно было внимательно рассмотреть не только текст, но и другие элементы.
В Android добавили API BiometricPrompt, чтобы пользователь заходил в свои аккаунты через сканер отпечатка пальца или другие поддерживаемые биометрические датчики. Особенность здесь заключается в том, что разработчикам не нужно будет писать всё это отдельно, а просто обращаться к инструкциям напрямую.
Раньше это было и у других производителей смартфонов, а Google сейчас хочет перевести всех на единую систему.
Что делать
Во-первых, нужно убедиться, что устройство заряжается полностью. Поднять емкость свыше заявленной не удастся, но откалибровать стоит. Во-вторых, потребуется оптимизация батареи Android. Оптимизировать нужно само устройство. Понятие оптимизации в самом простом смысле включает:
- очистку памяти;
- отключение обновлений и ненужных процессов;
- использование режима энергосбережения.
Если войти в настройки Android и выбрать раздел «Батарея», можно увидеть, как распределяется потребление между ресурсами гаджета, и только потом принимать решение на отключение или изменение настроек.
Включите «Адаптивное энергопотребление» и «Адаптивную яркость»
Две эти функции используют машинное обучение, чтобы подстроить систему под вашу манеру пользоваться телефоном. Включённое «Адаптивное энергопотребление» (Adaptive Battery) гарантирует, что ваши приложения будут потреблять заряд только тогда, когда они вам необходимы. По умолчанию эта функция обычно уже активирована, но никогда не помешает сходить в настройки и проверить, так ли это.
Откройте «Настройки» → «Батарея» → Adaptive Battery. Активируйте «Адаптивное энергопотребление», нажав на переключатель.
Теперь Android будет запоминать, какими приложениями вы пользуетесь чаще всего, и тратить заряд батареи в первую очередь именно на них.
«Адаптивная яркость» же автоматически меняет интенсивность свечения экрана в зависимости от освещения окружающей среды. Откройте «Настройки» → «Экран», отыщите там пункт «Адаптивная яркость» и включите его. После этого вам не придётся вручную водить пальцем по ползунку яркости всякий раз, когда вы заходите с улицы в дом.
Для каких приложений вы должны отключить оптимизацию?
Какие типы приложений сталкиваются с проблемами с Doze? Ниже приведены некоторые из них, которые вы могли бы рассмотреть для настройки:
- Приложения для обмена сообщениями, такие как WhatsApp, Telegram и ваше приложение SMS. Оптимизация батареи может привести к опозданию уведомлений.
- VPN-приложения . Оптимизация заряда батареи может привести к потере соединения VPN, когда экран телефона выключен.
- Приложения для резервного копирования фотографий . Возможно, вы захотите отключить оптимизацию батареи для приложений, таких как Google Photos, которые автоматически создают резервные копии ваших фотографий в облаке. Часто вы открываете его и видите, что приложение не создавало резервные копии фотографий в течение нескольких дней. Это может привести к потере фотографий, если что-то случится с вашим устройством.
- Любые приложения, которые в противном случае чувствительны ко времени . Приложения, такие как SMS-планировщики, могут не отправлять запланированные сообщения вовремя, когда они оптимизированы для использования батареи.
Помните, что вы должны экономно отключать оптимизацию батареи. Это делает слишком много приложений негативно влияет на срок службы батареи.
Используйте «Экономию заряда батареи»
«Экономия заряда батареи» появилась ещё в Android 6.0. Её цель — следить, чтобы ваши приложения не расходовали энергию, пока смартфон находится в режиме ожидания. Система отключает им доступ к Сети, запрещает синхронизацию, и их деятельность — например, обновление ленты новостей или загрузка новых сообщений — приостанавливается.
Эту функцию стоит включать для тех приложений, которые не нужны вам постоянно. Например, какой-нибудь RSS-ридер, которым вы пользуетесь пару раз в день, можно и ограничить. А вот Telegram трогать не стоит, иначе можете перестать получать сообщения при выключенном экране.
Включается «Экономия заряда батареи» так:
Теперь ваши приложения будут скромнее в плане электропотребления в режиме ожидания.
App Permissions
Приложения в Android 6.0 запрашивают доступ к тем или иным данным и функциям только тогда, когда он нужен. Буквально это означает, что, например, диктофон не имеет постоянный доступ к микрофону, а запрашивает разрешение каждый раз у системы. Пользователь, конечно, не может контролировать этот процесс динамично, но может дать (и отобрать) разрешение использовать программам разные данные или датчики.
Приятно, что система работает аналогично тому, как она реализована в iOS – если вы не хотите давать доступ календарю к камере, то можете отказать, а приложение продолжит работать (за исключением функций, которые непосредственно завязаны на фотографировании).
Возможности подключения и местоположение
Android 9 позволит создавать встроенные функции позиционирования в приложениях через поддержку платформы для Wi-Fi Round-Trip-Time. Это позволит приложению определить местоположение смартфона с точностью до 1-2 метров.
Возможности службы JobScheduler расширили. Раньше она только управляла запланированными задачами и фоновыми приложениями. Теперь она может адаптировать сетевые задачи: например, оператор может сообщить о перегрузке сети, а JobScheduler будет управлять приложениями на основе полученных данных.
Теперь API для платежей через NFC будет открытым. На поддерживаемых устройствах можно использовать API OMAPI для того, чтобы приложения получили доступ к защищённым элементам.
Что можно сделать, если сервисы Google Play много потребляют батареи?
- Дайте всем накопившимся в очередь обновлениям установиться;
- включите WiFi и проверьте, везде ли скачались и установились апдейты;
- отключите все ненужные уведомления в приложениях через настройки Android;
- удалите любые лишние программы (например, магазинов, каршерингов, пиццерий, которыми не пользуетесь).
- не пытайтесь ограничить работу сервисов «Гугл» принудительным переводом в глубокий сон или отключением;
- если ограничивали, то включите все штатные функции, связанные с сервисами Google Play;
- сбросьте настройки на заводские, если забыли, что отключали и настраивали.
Найдите проблемное приложение при помощи лучших Android-инструментов по обнаружению «жрунов». Попытайтесь его настроить, чтобы оно меньше обращалось к Google Play Services или вовсе удалите.
Бывали и случаи, когда, например, в Xiaomi Mi 9T в 2019-м году, проблема с повышенным жором заряда гугловскими сервисами решалась только обновлением операционной системы (MIUI). Был программный конфликт на уровне драйверов контроллера питания и WiFi (Qcom RX).
Пользователи узнали тогда о глобальной ошибке, просто поискав в интернете похожие проблемы. И нашли отклики у других владельцев такого же смартфона.
Возможность добавления в Белый список
Даже несмотря на то, что Force Doze имеет функцию, при которой устройство активируется, чтобы выполнять работы по техническому обслуживанию и получать уведомления, вы можете добавить несколько приоритетных приложений в раздел белых списков для удержания частичных блокировок пробуждения и доступа к сети для получения уведомлений. Благодаря этой функции Force Doze обеспечивает защиту и в то же время экономит заряд аккумулятора.
Примечание: Force Doze — это бесплатное приложение с открытым исходным кодом, поэтому вы можете получить приложение и исходный код по этой ссылке. Вы также можете присоединиться к обсуждению на форуме XDA.
Лучшее решение: отключить приложение на постоянной основе
App Standby помогает, но это не мешает приложениям работать полностью. Чтобы приложение полностью не запускалось, его следует удалить. Если вы не можете удалить приложение с вашего устройства, как в случае со многими предустановленными приложениями, вы можете «отключить» их из Android. Много лет назад для этого требовался корневой доступ, но теперь он встроен в Android.
Чтобы отключить приложение, откройте экран «Настройки» и нажмите «Приложения». Нажмите имя приложения и нажмите кнопку «Отключить», чтобы отключить его. Приложение исчезнет из вашего приложения и не будет разрешено работать в фоновом режиме вообще — это как если бы вы удалили приложение, за исключением того, что оно все еще занимает место в системной области вашего устройства. Чтобы восстановить доступ к этому приложению, перейдите на экран «Приложения», коснитесь отключенного приложения и включите его.
Image
В то время как вы можете сделать Doz более агрессивным, чтобы приложения не разряжали ваш аккумулятор, не было бы реального смысла сделать App Standby более агрессивным. App Standby призван помочь людям, которые не любят возиться, но имеют множество установленных производителем приложений или приложений, которые они установили несколько месяцев назад на своем устройстве. Если вы такой выродка, который знает об этом, вам лучше удалить или отключить эти приложения вручную.