Оптимізація програми Android перед випуском [закрито]


120

Я в « особливій » ситуації щодо ефективності своєї програми. Зараз я перебуваю на етапі, коли мені потрібно покращити продуктивність програми та зменшити витрату акумулятора .

Перед питанням:

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

Отже, який ваш унікальний оптимізуючий трюк (и)?

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

Будь ласка, проголосуйте чудові відповіді, оскільки це заохотить великих розробників поділитися своїми знаннями.


2
Оскільки ефективність зрештою зводиться до того, щоб не робити нічого, чого не потрібно (або частіше, ніж потрібно), я думаю, що багато чого залежатиме від того, які типи речей має виконувати ваша програма ... Не уточнюючи цього, всі ви можна зробити - отримати колекцію "звичайних підозрюваних"
Кріс Страттон

1
@Chris Stratton: Ну, ти маєш рацію. Але також "звичайні підозрювані" або невелика відповідь про певний фокус полегшать рішення інших, якщо ця "здогадка" - це те, що вони шукають (і якщо це корисно для їх конкретної ситуації).
Вроцлав

Смішно, скільки справді цікавих питань закриваються на цьому сайті.
Патрік

Прочитайте цей blogpost medium.com/@hammad_tariq/…
Developine

Відповіді:


68

В якийсь момент ви збираєтеся дістатись до тієї точки, коли використання відомих трюків вдарить за їх межі. Найкраще, що потрібно зробити в цей момент, - це профіль свого коду і подивитися, які саме ділянки є горловинами на основі ваших конкретних вимог.

Дослідження використання оперативної пам’яті за допомогою MAT та використання Traceview : стаття про те, як використовувати інструменти для профілю вашої програми.


Дякую! Мені дуже подобаються відповіді з ресурсами. :-)
Вроцлав

1
Прочитайте цей поштовий пост. medium.com/@hammad_tariq/…
Developine

37

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

Найкращий інструмент, який я знаю для цього, - це Tracker Allocation, включений до DDMS .

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

Ось приклад і невелика хитрість. У своєму додатку у мене є годинник, який показує поточний (звуковий) час, включаючи десяту секунду. Це оновлюється часто. І TextView виконує виділення всередині кожного разу, коли ви викликаєте setText () за допомогою CharSequence. Але він не виділяє нічого з варіантом setText (char [], int start, int len). Це не підтверджено документально, і ніхто не відповів, коли я запитав про це.

Є багато подібних. І це одна з причин, чому мій додаток містить 50% нативного коду (але є й інші причини).

Крім цього, я можу порекомендувати вам експериментувати з ProGuard . Він виконує кілька пропусків оптимізації та записує таку інформацію, як невикористані методи в рамках проекту, що може допомогти вам видалити залишки у своєму коді.


1
Чудова відповідь! Конкретні фокуси цінуються.
Вроцлав

22

Якщо у вашої програми буде багато часу на екрані, використовуйте чорний колір, де тільки зможете . Це зменшить витрату акумулятора у найгіршій частині пристрою: екрані, спеціально в телефонах та планшетах AMOLED.


Розумне використання темних кольорів означає виграш для акумулятора.
Роберт Массайолі

7
З іншого боку, чорний притягує більше енергії, ніж білий на РК-екранах, оскільки світло (джерело підсвічування) починає білим і його потрібно активно блокувати, щоб отримати чорний колір. [ scienceamerican.com/article.cfm?id=fact-or-fiction-black-is ] Підсумок: Не варто занадто розраховувати на цю кольорову оптимізацію.
Спаркі

16

У програмах із кількома видами діяльності перевірте, чи не перезапускаєте дії, які просто потрібно перенести на фронт, використовуючи відповідні прапорці Intent. Переконайтесь, що ваша купа знаходиться під контролем і чи не створюються непотрібні перегляди, прив’язки та контексти.

Я вважаю, що найкращий інструмент для показу всіх вас під час роботи програми:

adb shell dumpsys meminfo 'your apps package name'

1
О, це було нове. Дякую, що поділились!
Вроцлай

15

Під час використання SQLlite зверніть особливу увагу на індекси. Не припускайте нічого. Я отримав величезні прискорення у Цвітчері, коли ставлю індекси на стовпчики, які зазвичай використовуються для пошуку.


13

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

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

  • Може статися, що ваші макети не повністю оптимізовані та можуть бути покращені (наприклад, за допомогою злиття чи видалення батьків). Android інструмент layoutopt знайде таку ситуацію для вас. Його можна використовувати разом з HierarchyViewer для перевірки окремих поглядів. Більше інформації тут .

  • видаліть фоновий малюнок - Раніше для Android існувала проблема (чи все ще є?) з виявленням того, які погляди слід малювати. Є ймовірність, що ваш малюнок (за замовчуванням) фоновий малюнок буде намальований лише для того, щоб згодом був прихований вашим непрозорим інтерфейсом. Щоб позбутися цього марнотратного малюнка, просто видаліть фоновий малюнок.

Це можна зробити за допомогою користувацького стилю

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

Кілька порад, які допоможуть вам оптимізувати додаток з точки зору використання акумулятора :

  • перевірте тип мережі та зачекайте, поки користувач потрапить у зону за допомогою wifi чи 3G (а не роумінгу) і лише тоді дозвольте йому використовувати з'єднання

  • використовувати gzip для текстових даних, коли це можливо, щоб прискорити завантаження та аналіз

  • рецикла комплекс Java об'єкти , такі як XmlPullParserFactory/ BitmapFactory/ StringBuilder/ і Matcherт.д.

Докладніше про хитрощі акумулятора див. Кодування для життя - Термін служби акумулятора, тобто .


"переробити складні об'єкти java такі ..." Як? в той час як у Java є GC
Yousha Aleayoub

9

Щось задуматися: НЕ перенапружуйте String, наприклад у величезному циклі. Це створить багато об'єктів String, які повинні бути GC'ed. Приклад "Неправильне кодування" створюватиме по 2 рядкових об'єкти в кожному циклі. Наступний приклад створить лише одну кінцеву струну та одну структуру струнів. Це робить величезну різницю при оптимізації величезних циклів для швидкості. Я багато використовував stringbuilder, створюючи додаток 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);
    }

Я написав більш розширену публікацію про це. читайте тут


6

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


1
Я пам’ятаю, що десь читав, чи могли ви надати посилання?
Wesley Wiser

1
Не настільки впевнені, що вірно для кінцевих змінних, але можуть бути і для статичних кінцевих змінних - див. Stackoverflow.com/questions/3117770/…
Алістер Коллінз

Не можу надати посилання, але я познайомився із цим повідомленням у "Посібнику для початківців до андроїда" від Reto Meier (19 травня 2010 р.) / Google IO. Коротко кажучи, його безкоштовно завантажувати, і він має хороші поради щодо створення гарного додатка.
Стен

2
Кінцеві змінні можуть зробити код більш ефективним, оскільки це означатиме, що всі об'єкти будуть GC'd в одному циклі. Не в різний час залежно від того, коли ви встановите їх на нуль.
Роберт Массайолі

1
Питання: Чи не робить компілятор прямо це за вас? Я думаю, що це слід зробити на етапі аналізу коду.
Pawan

6

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

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

Якщо ви встановлюєте HTTP-з'єднання, переконайтеся, що ваш клієнт HTTP використовує стиснення вмісту. Якщо він кешує отримані відповіді HTTP, перевірте, чи він розуміє та правильно використовує заголовки HTTP, пов’язані з кешуванням.


Дякуємо за розуміння! Я ніколи про це не чув!
Вроцлав

5

Якщо у вас є мережеві операції, спробуйте повторно використовувати той же екземпляр httpclient. Уникайте використання регулярних виразів.


Причина? ви можете пояснити, чому?
Yousha Aleayoub

5

Спробуйте використовувати DDMS для відстеження всіх потоків, що працюють у системі. Наприклад, я помітив, що я використовував веб-перегляд для відображення HTML-вмісту, я помітив, що це створює кілька потоків для керування сеансом управління файлами cookie тощо. Тому, якщо у вас немає серйозної потреби у відображенні складного html, спробуйте використовувати звичайний утилітний клас "Html" в android для відображення вмісту html. Це може бути корисно людям, які відображають Eula, оскільки eula typl містить html-текст.

Якщо вам доведеться робити мережеві операції, спробуйте скористатися AndroidHttpClient, якщо ви новачок, він має хороші можливості для кешування сеансів SSL, і все це дійсно допомагає підвищити вашу ефективність. Завжди встановлюйте час очікування підключення до сокета приблизно на 60 секунд або на деякі кінцеві значення, тому що нескінченні тайм-аути можуть спричинити тупикові наслідки, особливо якщо ви перервете з'єднання під час рукостискання ssl.



4

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


3

Я знаю, що я приєднуюся трохи пізніше до цієї розмови, але було б ідеально мати багато хороших порад в одному місці, тому сподіваюся, що ця тема буде активною та оновлюваною досить часто. Мої поради:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.