Статьи

Оптимизация расхода батареи и данных в Android

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

Оптимизация времени автономной работы

Аппаратные компоненты, которые потребляют большую часть батареи, — это процессор, датчики и экран. Датчики включают GPS, NFC, Bluetooth и т. Д.

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

В следующих разделах я рассмотрю несколько факторов, влияющих на разрядку аккумулятора. Также я приведу несколько советов о том, как избежать или уменьшить разрядку аккумулятора.

Осторожно используйте анимацию

Очевидно, что анимации требуют большой вычислительной мощности ЦП и поэтому потребляют значительное количество энергии. Согласно документации , большинство анимаций выглядят плавно при 30 кадрах в секунду. Таким образом, переход на более 30 кадров может быть бесполезной тратой вычислительной мощности и, кроме того, больше батареи.

Другой совет, который приходит из документации, — дать процессору поспать между анимациями. Это связано с тем, что непрерывная анимация приводит к постоянным изменениям на экране устройства. Как я уже упоминал ранее, экран является одним из основных факторов разрядки аккумулятора.

Имиджевые ресурсы

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

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

Осторожно используйте WakeLocks

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

Для выполнения задач, когда телефон спит, приложение должно пробуждать экран, а для этого необходимо использовать WakeLocks .

WakeLocks используются, чтобы держать экран и процессор включенным. Обычный пример WakeLocks — в мобильных играх и приложениях для воспроизведения видео, когда экран остается включенным, даже когда пользователь не взаимодействует.
Проблема с WakeLocks заключается в том, что при неправильном использовании может оставить устройство без сна на долгое время, что потребляет батарею и ресурсы.
Для правильного использования WakeLocks следуйте указаниям документации для разработчиков Android.

Стратегии оптимизации батареи

Для некоторых некритических задач приложения, выполнение которого может быть отложено в другое время, хорошей стратегией является выполнение этого при зарядке устройства. Обычно это касается фоновых задач.
Задержка такого рода задач во время зарядки устройства не влияет на срок службы батареи. Примером, в этом случае, может быть синхронизация данных с некоторым веб-сервисом.

Хорошее решение для такого рода задач исходит от Google с API JobScheduler . Этот API был создан специально для фоновых задач, чтобы эффективно планировать их запуск вместе с другими заданиями приложений. Так что действительно примите это во внимание, если ваше приложение должно выполнять тяжелые задачи.

Эффективная сеть и время автономной работы

До сих пор я указывал на некоторые из факторов, влияющих на срок службы батареи, но ни один из упомянутых факторов не потребляет больше батареи, чем сетевые операции.

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

Чтобы четко понять влияние сетевых операций на потребление батареи, мы должны сначала понять, как сетевые операции выполняются с точки зрения использования ресурсов. Сетевые операции выполняются с помощью так называемых радиомодулей, WiFi или 3G / 4G.

В целях экономии энергии система Android не всегда поддерживает эту радиостанцию ​​на полной мощности, иначе время работы от батареи быстро уменьшится. Чтобы продемонстрировать это, взгляните на различные состояния беспроводного радио 3G.

Radio States

  • Полная мощность — сетевое радио активно, выполняются некоторые сетевые операции.
  • Низкое энергопотребление — промежуточное состояние, при котором используется 50% заряда батареи.
  • Режим ожидания — нет сетевых операций, низкое потребление батареи.

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

При выполнении одной сетевой операции устройство теряет заряд батареи в течение 18 секунд, если учесть, что сетевая операция выполняется в течение 1 секунды, что в большинстве случаев верно. Если вы подумаете об этом, в одной операции сети тратится много энергии.

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

Пакетные соединения

Как отмечалось ранее, одна сетевая задача неэффективно расходует около 18 секунд батареи.
Что если все сетевые соединения сгруппированы и выполняются одно за другим? Очевидно, что в этом случае радио не будет проходить через весь процесс пробуждения и сна в каждом сетевом вызове. Он будет оставаться активным до тех пор, пока не будет завершена вся работа в сети, а затем перейдет в состояние ожидания.

Если мы делаем простую математику, 18-секундный процесс в каждой операции накапливается в одной большой сетевой операции. В целом радио остается активным в течение более короткого времени, чем отдельные задачи.

Проблема здесь заключается в том, что задачи должны быть сгруппированы и выполнены в одном и том же окне полной мощности. Дело в том, что не все запросы могут ждать формирования группы. Это решение более эффективно для фоновых задач, и API JobScheduler может помочь с этими заданиями. API-интерфейс JobScheduler группирует задачи из многих приложений для более эффективного использования ресурсов.

Данные предварительной выборки

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

Реклама является фактором, расходующим заряд батареи

Мобильные объявления являются одним из основных источников дохода для многих приложений, но они являются важным фактором в разрядке батареи. Объявления используют вычислительную мощность для отображения красочных изображений и даже видео, но также используют сеть. Реклама использует большую полосу пропускания, загружая большой контент, что приводит к увеличению расхода заряда батареи.

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

Анализ батареи с помощью инструментов мониторинга

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

Основываясь на упомянутых ранее сетевых стратегиях, вы можете определить, какое влияние сеть оказывает на батарею. На следующих рисунках показано, как выглядит хорошая и плохая сетевая стратегия с точки зрения сетевых задач.

Хороший пример — сетевые задачи сгруппированы
Good example

Плохой пример
Bad example

Всплески сети на втором изображении являются ярким примером плохой сетевой стратегии.

Аккумуляторный историк

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

battery-historian/

Battery Historian с открытым исходным кодом и доступна на GitHub .

Завершение

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

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