Оптимизация приложения для Android до выпуска

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

Перед вопросом:

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

Итак, какой ваш уникальный оптимизирующий трюк?

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

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

Ответ 1

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

Исследование использования ОЗУ с использованием MAT и Использование Traceview: статья о том, как использовать инструменты для профилирования вашего приложения.

Ответ 2

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

Лучший инструмент, который я знаю для этого, - это Tracker Allocation Tracker, включенный в DDMS.

Не только GC может повлиять на работу пользователя, но избыточные распределения и GC действительно потребляют некоторые вычислительные ресурсы.

Вот пример и небольшой трюк. В моем приложении у меня есть часы, которые показывают текущее (аудио) время, включая десятую часть секунд. Это часто обновляется. И TextView выполняет выделения внутри, всякий раз, когда вы вызываете setText() с CharSequence. Но он не выделяет ничего с помощью параметра setText (char [] text, int start, int len). Это не задокументировано, и никто не ответил, когда я спросил об этом.

Есть много таких. И это одна из причин, почему мое приложение содержит 50% -ный собственный код (но есть и другие причины).

Кроме того, я могу порекомендовать вам экспериментировать с ProGuard. Он выполняет несколько проверок оптимизации и регистрирует такую ​​информацию, как неиспользуемые методы в проекте, которые могут помочь вам удалить остатки в вашем коде.

Ответ 3

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

Ответ 4

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

Я нахожу лучший инструмент, показывающий вам все это при запуске приложения:

adb shell dumpsys meminfo 'your apps package name'

Ответ 5

При использовании SQLlite обратите особое внимание на индексы. Не принимайте ничего. Я получил огромные ускорения в Zwitscher, когда я помещал индексы в столбцы, обычно используемые для поиска.

Ответ 6

Несколько советов, которые помогут вам оптимизировать ваше приложение с точки зрения UI:

Это можно сделать с помощью пользовательского стиля

<resources>
    <style name="Theme.NoBackground" parent="android:Theme">
        <item name="android:windowBackground">@null</item>
    </style>
</resources>

Несколько советов, которые помогут вам оптимизировать ваше приложение с точки зрения использования аккумулятора:

  • проверьте тип сети и дождитесь, пока пользователь не получит в зоне Wi-Fi или 3G (и не будет роуминг), и только затем разрешите ему использовать соединение

  • использовать gzip для текстовых данных, когда это возможно, для ускорения загрузки и разбора

  • утилизировать сложные java-объекты, такие как XmlPullParserFactory/BitmapFactory/StringBuilder/Matcher и т.д.

Подробнее об аккумуляторах см. Кодирование на жизнь - срок службы батареи, то есть.

Ответ 7

Что-то, о чем нужно подумать: НЕ используйте Overring, например, в огромном цикле. Это создаст много объектов String, которые должны быть GC'ed. Пример "Плохое кодирование" будет генерировать 2 строковых объекта в каждом цикле. Следующий пример будет содержать только одну финальную строку и один строковый конструктор. Это имеет огромное значение при оптимизации огромных циклов для скорости. Я очень часто использовал струйный редактор при создании своего приложения для Android-приложения Wordlist Pro, и он быстро прошел через 270000 слов в мгновение ока.

    //Bad coding:
    String s = "";
    for(int i=0;i<999999;i++){
        s = "Number=";
        s = s + i;
        System.out.println(s);
    }

    //Better coding
    final String txt = "Number=";
    StringBuilder sb = new StringBuilder();
    for(int i=0;i < 999999;i++){
        sb.setLength(0);
        sb.append(txt);
        sb.append(i);
        System.out.println(sb);
    }

Я написал более расширенный блог-блог об этом. читайте здесь

Ответ 8

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

Ответ 9

Оптимизируйте свои PNG-изображения с помощью таких инструментов, как OptiPNG и PNGCrush, чтобы сэкономить несколько килобайт байтов от размера APK. Здесь также применяются советы по оптимизации изображений для веб-сайтов: используйте соответствующие форматы изображений, играйте с компрессией JPG, рассмотрите возможность использования бинарных прозрачных пленок вместо 8-разрядных прозрачных пленок и т.д.

Если вы отправляете большие PNG с альфа-каналом, вы можете обменять некоторые размеры APK для скорости запуска и использовать отдельные JPG для каналов RGB и A.

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

Ответ 10

Если у вас есть сетевые операции, попробуйте повторно использовать тот же экземпляр httpclient. Избегайте использования регулярных выражений.

Ответ 11

Попробуйте использовать DDMS для отслеживания всех потоков, запущенных в системе. Например, я заметил, что я использовал webview для отображения содержимого html, я заметил, что он создает несколько потоков для управления сеансами управления файлами cookie и т.д., Что увеличило мою печать в памяти. Поэтому, если у вас нет серьезной потребности в отображении сложного html, попробуйте использовать обычный класс утилиты "Html" в android для отображения содержимого html. Это может быть полезно для людей, которые отображают Eula, поскольку eula typicall содержит html-текст.

Если вам нужно выполнять сетевые операции, попробуйте использовать AndroidHttpClient, если вы новичок, у него есть хорошие возможности для кеширования сеансов SSL, и все это действительно помогает в улучшении вашей производительности. Всегда устанавливайте тайм-ауты соединения сокета примерно на 60 секунд или на некоторые конечные значения, поскольку бесконечные таймауты могут вызывать взаимоблокировки, особенно если вы отмените соединение во время рукопожатия ssl.

Ответ 12

Используйте Android Resource Tracker, чтобы найти неиспользуемые ресурсы в вашем проекте, которые можно удалить.

Ответ 13

Избегайте использования XPath, если вы можете анализировать входные данные XML, используя строковые процедуры манипуляции, чтобы получить текст между тегами. Я тестировал и могу подтвердить 10-кратное улучшение в этом случае в наборе данных 50000 элементов на HTC Desire.

Ответ 14

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

  • Не блокируйте поток пользовательского интерфейса с помощью дорогостоящих заданий, пользователь уйдет, если от приложения не будет ответа (используйте AsyncThreads).
  • Используйте LINT, новый инструмент, который сканирует источники проекта Android для возможных ошибок.

.. будет обновляться.