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

120

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

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

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

Итак, каковы ваши уникальные приемы оптимизации?

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

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

Wroclai
источник
2
Поскольку эффективность в конечном итоге сводится к тому, чтобы не делать ничего, что вам не нужно (или чаще, чем нужно), я думаю, многое будет зависеть от того, какие типы вещей должно выполнять ваше приложение ... Без указания этого, все вы можно получить коллекцию «обычных подозреваемых»
Крис Стрэттон
1
@Chris Stratton: Ну, ты прав. Но также, «обычные подозреваемые» или небольшой ответ о конкретном трюке помогут другим принять решение, является ли это «предположение» тем, что они ищут (и полезно ли оно в их конкретной ситуации).
Wroclai
Нелепо сколько действительно интересных вопросов закрывается на этом сайте.
Патрик
Прочитайте эту BlogPost medium.com/@hammad_tariq/...
Developine

Ответы:

68

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

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

unholysampler
источник
Спасибо! Мне очень нравятся ответы с ресурсами. :-)
Wroclai
1
Прочтите этот пост в блоге. medium.com/@hammad_tariq/…
Developine
37

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

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

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

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

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

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

olivierg
источник
1
Отличный ответ! Конкретные уловки приветствуются.
Wroclai
22

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

Aleadam
источник
Разумное использование темных цветов означает выигрыш для аккумулятора.
Роберт Массайоли
7
С другой стороны, черный цвет потребляет больше энергии, чем белый на ЖК-экранах, потому что свет (исходящий от задней подсветки) начинается с белого цвета и должен активно блокироваться для получения черного. [ Scientificamerican.com/article.cfm?id=fact-or-fiction-black-is ] Итог: не стоит слишком рассчитывать на эту оптимизацию цвета.
Sparky
16

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

Я считаю, что лучший инструмент для демонстрации всего этого во время работы приложения:

adb shell dumpsys meminfo 'your apps package name'
NickT
источник
1
О, это было ново. Спасибо, что поделился!
Wroclai
15

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

Хайко Рупп
источник
13

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

  • использовать convertViewдля адаптеров списков - было бы очень дорого, если бы вы создали новое представление внутри, так Adapter.getView()как эта процедура вызывается для каждой позиции в списке. Использование convertViewпозволяет повторно использовать уже созданное представление. Хороший пример (вместе с использованием ViewHolder) можно найти в ApiDemos .

  • Может случиться так, что ваши макеты не полностью оптимизированы и могут быть улучшены (например, путем слияния или удаления родителей). Инструмент Layoutopt для Android найдет для вас такую ​​ситуацию. Его можно использовать с HierarchyViewer для проверки отдельных представлений. Больше информации здесь .

  • удалить фоновый рисунок - у платформы Android раньше была (есть ли она?) проблема с определением того, какие представления следует рисовать. Существует вероятность, что ваш (по умолчанию) фоновый рисунок будет нарисован только для того, чтобы впоследствии быть скрытым вашим непрозрачным пользовательским интерфейсом. Чтобы избавиться от этого расточительного рисунка, просто удалите фоновый рисунок.

Это можно сделать в индивидуальном стиле

<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и т. д.

Дополнительные сведения о трюках с батареей см. В разделе « Кодирование для жизни - срок службы батареи» .

Youri
источник
"переработать сложные Java-объекты, такие ..." Как? в то время как у Java есть GC
Yousha Aleayoub
9

Над чем подумать: НЕ злоупотребляйте String, например, в огромном цикле. Это создаст множество объектов String, которые нужно собрать в сборку мусора. Пример «Плохое кодирование» будет создавать 2 строковых объекта в каждом цикле. В следующем примере будет создана только одна последняя строка и один конструктор строк. Это имеет огромное значение при оптимизации огромных циклов по скорости. Я много использовал конструктор строк при создании своего приложения Wordlist Pro для Android, и он стал действительно быстрым, когда перебирал 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);
    }

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

ernell
источник
6

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

Стан
источник
1
Я помню, как где-то это читал, не могли бы вы дать ссылку?
Уэсли Уайзер,
1
Не уверен, что это верно для конечных переменных, но может быть и для статических конечных переменных - см. Stackoverflow.com/questions/3117770/…
Алистер Коллинз
Не могу предоставить ссылку, но я встретил уведомление об этом в "Руководстве для начинающих по Android" Рето Мейера (19 мая 2010 г.) / Google IO. Короче говоря, его можно загрузить бесплатно, и в нем есть полезные советы о том, как создать хорошее приложение.
Stan
2
Конечные переменные могут сделать код более эффективным, потому что это будет означать, что все объекты будут GC за один прогон. Не в разное время в зависимости от того, когда вы установили для них значение null.
Роберт Массайоли
1
Вопрос: Компилятор не делает это за вас явно? Я думаю, это следует сделать на этапе анализа кода.
Pawan
6

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

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

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

Петерис Цауне
источник
Спасибо за понимание! Никогда об этом не слышал!
Wroclai
5

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

Naresh
источник
Причина? можешь объяснить почему?
Юша Алеайуб
5

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

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

Naresh
источник
4

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

FrVaBe
источник
4

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

luvieere
источник
3

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

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

..будет обновлено..

Ewoks
источник