Передача данных по беспроводной сети – один из основных источников расхода заряда батареи. Чтобы минимизировать разряд батареи, связанный с сетевой активностью, важно понимать, как модель подключения влияет на базовое радиооборудование.
В этом разделе описывается конечный автомат беспроводной связи и объясняется, как с ним взаимодействует модель подключения вашего приложения. Затем в ней предлагается несколько методов, которые помогут минимизировать влияние потребления данных вашим приложением на батарею.
Конечный автомат радиомодуля
В радиомодуле устройства пользователя есть встроенные функции энергосбережения, которые помогают минимизировать потребление энергии. В активном режиме беспроводной модуль потребляет значительное количество энергии, а в неактивном или в режиме ожидания – очень мало.
Важно помнить, что радиомодуль не может мгновенно перейти из режима ожидания в полностью активный режим. При включении радиомодуля возникает задержка. Поэтому батарея медленно переходит из состояния с более высоким энергопотреблением в состояние с более низким энергопотреблением, чтобы экономить энергию, когда она не используется, и при этом минимизировать задержку, связанную с включением радио.
Конечный автомат для типичного радиомодуля сети 3G состоит из трех энергетических состояний:
- Полная мощность. Используется при активном подключении, позволяя устройству передавать данные с максимально возможной скоростью.
- Низкое энергопотребление. Промежуточное состояние, при котором расход заряда батареи снижается примерно на 50%.
- Режим ожидания. Состояние минимального энергопотребления, при котором сетевое подключение неактивно.
Хотя в режимах низкого энергопотребления и ожидания батарея разряжается значительно меньше, они также вносят значительную задержку в сетевые запросы. Для перехода из режима низкого энергопотребления в режим полной мощности требуется около 1,5 секунды, а из режима ожидания – более 2 секунд.
Чтобы минимизировать задержку, конечный автомат использует задержку для отсрочки перехода в состояния с более низким энергопотреблением. На рисунке 1 показаны временные интервалы для типичной радиосети 3G оператора AT&T.
Рисунок 1. Типичный конечный автомат беспроводной радиосвязи 3G.
Конечный автомат радиомодуля на каждом устройстве, в частности связанная с ним задержка перехода ("время затухания") и задержка запуска, зависит от используемой технологии беспроводной связи (3G, LTE, 5G и т. д.) и определяется и настраивается сетью оператора, в которой работает устройство.
На этой странице описан конечный автомат, представляющий типичный радиомодуль 3G, на основе данных, предоставленных AT&T. Однако общие принципы и рекомендации применимы ко всем беспроводным радиомодулям.
Этот подход особенно эффективен для мобильных сайтов, поскольку он предотвращает нежелательные задержки при просмотре веб-страниц. Относительно низкое время задержки также гарантирует, что после завершения сеанса просмотра радио может перейти в состояние с более низким энергопотреблением.
К сожалению, такой подход может привести к неэффективной работе приложений в современных операционных системах для смартфонов, таких как Android, где приложения работают как на переднем плане (где важна задержка), так и в фоновом режиме (где приоритет должен отдаваться времени автономной работы).
Как приложения влияют на конечный автомат радиомодуля
Каждый раз, когда вы создаете новое сетевое подключение, радиомодуль переходит в режим полной мощности. В случае типичного конечного автомата радиомодуля 3G, описанного ранее, он будет оставаться на полной мощности в течение всего времени передачи плюс дополнительные 5 секунд хвостового времени, а затем 12 секунд в состоянии низкого энергопотребления. Таким образом, для типичного устройства 3G каждый сеанс передачи данных приведет к тому, что радио будет потреблять энергию в течение как минимум 18 секунд.
На практике это означает, что приложение, которое передает данные в течение одной секунды три раза в минуту, будет постоянно поддерживать активность беспроводной связи, переводя ее в режим высокой мощности, как только она переходит в режим ожидания.
Рисунок 2. Относительное энергопотребление беспроводного радиомодуля при передаче данных в течение одной секунды три раза в минуту. В этой цифре не учитывается задержка между запусками.
Если же приложение будет передавать данные пакетами, например по три секунды каждую минуту, то радиомодуль будет работать в режиме высокой мощности всего 20 секунд в минуту. Это позволит радиомодулю находиться в режиме ожидания 40 секунд из каждой минуты, что приведет к значительному снижению энергопотребления.
Рисунок 3. Относительное энергопотребление беспроводного радиомодуля при передаче данных в течение трех секунд раз в минуту.
Методы оптимизации
Теперь, когда вы понимаете, как доступ к сети влияет на время работы от батареи, давайте поговорим о том, что вы можете сделать, чтобы снизить расход заряда батареи, а также обеспечить быструю и плавную работу пользователей.
Передача данных о наборах
Как говорилось в предыдущем разделе, объединение передач данных в пакеты, чтобы передавать больше данных реже, – один из лучших способов повысить эффективность батареи.
Конечно, это не всегда возможно, если приложению нужно немедленно отправить или получить данные в ответ на действие пользователя. Чтобы избежать этого, можно использовать предварительную выборку данных. Другие сценарии, такие как отправка журналов или аналитики на сервер и другие несрочные передачи данных, инициированные приложением, очень хорошо подходят для пакетной обработки и объединения. Советы по планированию фоновой передачи данных по сети можно найти в статье Оптимизация задач, инициированных приложением.
Предварительная загрузка данных
Предварительная выборка данных – ещё один эффективный способ сократить количество независимых сеансов передачи данных, которые выполняет приложение. При упреждающей выборке, когда пользователь выполняет действие в приложении, оно прогнозирует, какие данные, скорее всего, потребуются для следующей серии действий пользователя, и извлекает эти данные за один раз, через одно соединение, на полной мощности.
Загружая данные заранее, вы сокращаете количество активаций радиомодуля, необходимых для скачивания данных. В результате вы не только экономите заряд батареи, но и улучшаете задержку, снижаете требуемую пропускную способность и сокращаете время скачивания.
Кроме того, предварительная выборка повышает удобство работы с приложением, поскольку минимизирует задержки, связанные с ожиданием завершения загрузки перед выполнением действия или просмотром данных.
Вот практический пример.
Новостной агрегатор
Многие новостные приложения пытаются уменьшить пропускную способность, загружая заголовки только после выбора категории, полные статьи только тогда, когда пользователь хочет их прочитать, и миниатюры только по мере их появления в поле зрения.
При таком подходе радиомодуль вынужден оставаться активным на протяжении большей части сеанса чтения новостей, пока пользователи прокручивают заголовки, меняют категории и читают статьи. Кроме того, постоянное переключение между состояниями энергопотребления приводит к значительной задержке при переключении категорий или чтении статей.
Лучше предварительно загрузить разумный объем данных при запуске, начиная с первого набора заголовков новостей и уменьшенных изображений, чтобы обеспечить малое время задержки при запуске, а затем продолжить с остальными заголовками и уменьшенными изображениями, а также текстом каждой статьи, доступной по крайней мере из основного списка заголовков.
Другой вариант – предварительно загружать все заголовки, значки, тексты статей и, возможно, даже все изображения в статьях. Обычно это делается в фоновом режиме по заранее заданному расписанию. При таком подходе есть риск потратить значительную часть пропускной способности и заряда батареи на скачивание контента, который никогда не будет использован, поэтому его следует реализовывать с осторожностью.
Дополнительные сведения
Хотя упреждающая выборка данных имеет много преимуществ, при слишком агрессивном использовании она также создает риск увеличения расхода заряда батареи и пропускной способности, а также квоты на скачивание за счет скачивания неиспользуемых данных. Также важно убедиться, что предварительная выборка не задерживает запуск приложения, пока приложение ожидает завершения предварительной выборки. На практике это может означать постепенную обработку данных или инициирование последовательных передач с приоритетом, чтобы данные, необходимые для запуска приложения, загружались и обрабатывались в первую очередь.
Интенсивность упреждающей выборки зависит от размера скачиваемых данных и вероятности их использования. Если опираться на описанную выше модель, то для данных, которые с вероятностью 50% будут использованы в текущем сеансе, можно выполнить предварительную выборку примерно на 6 секунд (около 1–2 МБ). В этом случае потенциальная стоимость скачивания неиспользуемых данных будет примерно равна потенциальной экономии от отказа от их скачивания.
Как правило, рекомендуется предварительно загружать данные так, чтобы вам нужно было инициировать еще одну загрузку каждые 2–5 минут и в порядке от 1 до 5 мегабайт.
Следуя этому принципу, большие загрузки, такие как видеофайлы, должны загружаться частями через регулярные интервалы (каждые 2–5 минут), эффективно предварительно выбирая только те видеоданные, которые, вероятно, будут просмотрены в следующие несколько минут.
Решением может быть планирование полной загрузки только при подключении к Wi-Fi и, возможно, только во время зарядки устройства. WorkManager API поддерживает именно такой сценарий использования, позволяя ограничить фоновую работу, пока устройство не будет соответствовать заданным разработчиком критериям, например не будет подключено к зарядному устройству и сети Wi-Fi.
Проверяйте подключение перед отправкой запросов
Поиск сигнала сотовой сети – одна из самых энергоемких операций на мобильном устройстве. При обработке запросов, инициированных пользователем, рекомендуется сначала проверить наличие подключения с помощью ConnectivityManager, как описано в разделе Отслеживание статуса подключения и тарификации трафика.
Если сеть недоступна, приложение может экономить заряд батареи, не заставляя мобильный радиомодуль выполнять поиск. Запрос будет запланирован и выполнен вместе с другими запросами, когда подключение будет установлено.
Подключения к пулу
Дополнительная стратегия, которая может помочь в дополнение к пакетной обработке и предварительной выборке, заключается в объединении сетевых подключений вашего приложения.
Как правило, повторное использование существующих сетевых подключений более эффективно, чем создание новых. Повторное использование подключений также позволяет сети более эффективно реагировать на перегрузку и связанные с ней проблемы с передачей данных.
HttpURLConnection и большинство HTTP-клиентов, например OkHttp, по умолчанию поддерживают пулы подключений и повторное использование одного и того же подключения для нескольких запросов.
Итоги и планы на будущее
В этом разделе вы узнали много нового о беспроводной радиосвязи и некоторых стратегиях, которые можно широко применять для обеспечения быстрого и оперативного взаимодействия с пользователем при одновременном снижении расхода заряда батареи.
В следующем разделе мы подробно рассмотрим три типа сетевых взаимодействий, которые встречаются в большинстве приложений. Вы узнаете, что влияет на каждый из этих типов, а также познакомитесь с современными методами и API для эффективного управления этими взаимодействиями.