Източник: https://gradle.org/wp-content/uploads/2016/03/Build-Performance-Gradle.png

Как да намалите времето за изграждане на Gradle с 65%?

Gradle е много мощна система за изграждане. Той обработва много сложния процес на изграждане на .dx файлове от изходния код на Java, обединяване на всички ресурси и активи в пакета за приложения (.apk) и подписване на приложението.

Но граделът не е перфектен. Той е сравнително по-бавен от другите системи за изграждане там.

Защо трябва да се интересувате от времето за изграждане на вашия проект?

Дълго време бях ОКАЙ с моите времена на изграждане. Мислех, че мога да живея с това. Свикнах с други неща като сърфиране в интернет, правене на кафе и дори вземане на обяда си, докато gradle изгражда моя проект.

Нека сега да кажем, че работите по горния проект за приложение I / O'16 за 6 часа на ден и стартирайте gradle build, за да инсталирате debug apk файл на вашето тестово устройство за почти 15 пъти, ще отделяте 35 минути на ден и почти 3 часа / седмица (почти 10% от общото време) просто седящ бездействащ и гледайки как gradle работи как работи.

Ето защо е много важно да оптимизирате времето за изграждане. Колкото по-малко време прекарвате в гледане на gradle за изграждане на вашия проект, толкова повече можете да бъдете продуктивни. В крайна сметка времето е ценно.

Приложих някои модификации в процеса си на сглобяване, за да намаля времето за изграждане и ето няколко съвета за вас, които ще ви помогнат да намалите времето за изграждане.

Ето например цел, ще използваме приложението Google I / O като примерния проект. Ще изпълним всички показатели за този проект. Този проект съдържа повече от 28 зависимости и 41538 справки за методите. Също така изходният код на приложението е открито достъпен на GitHub.

APK anlyser изход за Google I / O 16 приложение

Съставете без никакви модификации:

Нека измерим времето за изграждане и отстраняване на грешки на приложението от проекта с текущата конфигурация, използвайки командата по-долу.

./gradlew android: assembleDebug --profile
- профилът ще каже на gradle да измери времето, необходимо за изпълнение на всяка задача и да зареже тези данни в HTML файл. Можете да намерите този отчет под / projectDir / build / отчети / директория профил.
  • Както можете да видите, са необходими 2 минути и 43 секунди, за да се изгради apk за отстраняване на грешки от източника на моята машина. Имайте предвид тази фигура.
Тези еталонни времена могат да варират в зависимост от вашата машина в зависимост от конфигурацията на вашата система. Тук ще използвам своя 13 "Macbook Pro 2016 с тъч лента, за да изпълня всички тези задачи.

Сега, нека се опитаме да намалим този път.

Цикъл на изграждане на Gradle:

Gradle има три отделни фази в жизнения цикъл на изграждане:

  1. Инициализация: В този етап от жизнения цикъл на изграждането, gradle избира проекта и решава какви неща да изгради.
  2. Конфигурация: Тук gradle ще оцени скрипта ви build.gradle, конфигурира всички приставки и ще оцени графиката на задачите.
  3. Изпълнение: В тази фаза gradle действително изпълнява всички задачи, които бяха оценени в предишната фаза, за да свършите работата и да изградите приложението.

Както можете да видите, че от трите фази, само фазата на изпълнение изпълнява всички операции. Това означава, че първите две фази са просто отгоре към процеса на изграждане на gradle. Не се интересуваме от тях. Но за съжаление винаги, когато правите каквото и да е с градел, тези две фази винаги ще се изпълняват.

И така, как можем да измерим времето, необходимо за изпълнение на първите две фази? За щастие, gradle предоставя - команда за сухо изпълнение, която казва на gradle да оцени проекта, но не изпълнява никаква задача. Така фазата на изпълнение няма да бъде изпълнена. Така че, изпълнете тази команда във вашия терминал:

./gradlew android: assembleDebug --dry-run --profile

Ето времето, изминато от първите две фази на проекта за Google I / O.

Изграждане на време за - сухо движение

В горната статистика можете да видите, че gradle премина почти 7,8 секунди само за инициализиране и конфигуриране на проекта. Това е напълно загуба на време за нас.

Нека да видим дали можем да намалим времето, необходимо за инициализиране и конфигуриране на проекта.

Конфигуриране при поискване:

Приложението Google I / O има два компонента / модула:

  • Android: Това съдържа изходния код, свързан с приложението andorid и
  • Сървър: Това съдържа код, свързан със сървъра за връщане.

Сега, ако изграждате приложение за Android, не искате да конфигурирате компонент на сървър. Така ли е? Но предишната статистика показва, че gradle премина почти секунда, за да конфигурира само сървърния компонент.

Gradle предоставя - конфигуриране на поискване флаг, което ще каже на gradle да изгражда само проектите, които наистина трябва да изгради. Нека изпълним тази команда

./gradlew android: assembleDebug --dry-run --profile --configure-on-demand
Изградете таймиги с - конфигуриране при поискване

Както можете да видите, ако използваме - конфигуриране при поискване, gradle ще пропусне конфигурирането на сървърния модул и ще намали времето за изграждане с почти секунда. Знам, че това не е огромна печалба, но малки капки могат да запълнят цялото езеро !!!

Времето намаля: 1 секунда (6% печалба).

Как можете да активирате конфигуриране по поръчка в андроид студио?

Можете да активирате - конфигуриране при поискване за всяка компилация, която можете да добавите org.gradle.configureondemand = true във файла gradle.properties или във вашето андроидно студио, отворете Предпочитания> Създаване, изпълнение, внедряване> Компилатор и проверете конфигуриране при поискване опция.

Активиране - конфигуриране при поискване в Android Studio

Активиране на демон:

Gradle има много добра характеристика, наречена Gradle Daemon. Daemon поддържа екземпляра на gradle и работи на заден план дори след завършване на вашето изграждане. Това ще премахне времето, необходимо за инициализиране на градуса и ще намали значително времето за изграждане.

Няма да можете да видите разликата във времето в първата си компилация, тъй като gradle трябва да инициализира и стартира демона, но времето за изграждане ще намалее в следващите компилации, тъй като демонът на gradle вече е инициализиран.

./gradlew android: assembleDebug --dry-run --profile --configure-on-demand --daemon
Време за изграждане с активиран демон gradle

В нашия случай времето за изграждане се намалява с около 4,5 секунди. Ура !!!

Времето намалява с: 4,5 секунди (71% печалба)

Как можете да активирате демон в андроид студио?

Ако използвате gradle версия 3.0 или по-нова, демонът на gradle по подразбиране е активиран. Но ако използвате старите версии на gradle, можете да го активирате за всяка компилация, като добавите org.gradle.daemon = true във файла gradle.properties.

Винаги актуализирайте градуса си:

Самият Gradle става по-бърз с всяка нова версия. Има много ощипвания и подобрения на производителността в най-новите версии на gradle. Освен това, ако работите на gradle 2.4 или по-висока, gradle също ще кешира изграждането на артефакти и това значително ще подобри времето за изграждане.

Затова винаги се уверете, че използвате най-новата версия на gradle. Можете да отидете на /gradle/wrapper/gradle-wrapper.properties и да надстроите версия на gradle, като промените разпределениеUrl.

Докато пишете тази статия, последната версия на gradle е 3.3. Ето актуализирания файл gradle-wrapper.properties за I / O приложение.

gradle-wrapper.properties
./gradlew android: assembleDebug --dry-run --profile --configure-on-demand --daemon
Време за изграждане с Gradle 3.3
Времето намалява с: 0.7 секунди (82% печалба )

Досега постигнахме почти 82% печалба при инициализиране и конфигуриране на времето. Сега, нека се опитаме да намалим времето, необходимо за фазата на изпълнение.

Увеличете размера на купчината:

Тъй като android studio 2.0, gradle използва dex в процеса, за да намали времето за изграждане на проекта.

„Dex в процес“ е процес, който позволява да се стартират множество dex процеси, които да се изпълняват в рамките на един VM, който също е споделен с gradle.

Като цяло, докато изграждате приложенията, множество dx процеси протичат в различни VM инстанции.

Множество dx процеси, работещи на различни виртуални машини. (Източник: https://www.youtube.com/watch?v=-SY5nkNVUn0)

Но като се започне от Android Studio 2.0, всички тези dx процеси протичат в единичната VM и VM също се споделя с gradle. (Трябва да имате инструмент за изграждане версия 23.0.2 или по-нова, за да активирате dex в процеса.)

Множество dx процеси, работещи на един VM. (Източник: https://www.youtube.com/watch?v=-SY5nkNVUn0)

Това намалява значително времето за сглобяване, тъй като всички dex процеси работят на едни и същи VM инстанции. Но това изисква по-голяма памет, за да се поберат всички dex процеси и градули. Това означава, че трябва да увеличите размера на купчината, необходим от демон-градус. По подразбиране размерът на купчината за демон е около 1 GB. Трябва да увеличите размера на купчината, като добавите под реда в своите gradle.properties.

org.gradle.jvmargs = -Xmx3072m -XX: MaxPermSize = 512m -XX: + HeapDumpOnOutOfMemoryError -Dfile.encoding = UTF-8

Необходимият размер на купчината варира от машина до машина. За моята машина открих, че размерът на 3GB хеп е перфектен. Всяко повече увеличение на размера на купчината не влияе значително на времето за изграждане.

Сега, нека да стартираме напълно чиста конструкция, използвайки командата по-долу:

./gradlew android: assembleDebug --profile --configure-on-demand --daemon
Изградете timimg с по-голям размер на купчината.
Намаляване на времето с: 1 мин. 43 сек. (63% печалба) - От 2 мин. 43 сек. До 1 мин

Модулна и паралелна изграждане:

Позволете на gradle да изгради вашия проект паралелно. Ако имате няколко модула във вашия проект, тогава като го активирате, gradle може да изпълнява операции за изграждане на независими модули паралелно. Това може да намали значително времето за изграждане за много сложни и многомодулни проекти.

Можете да активирате паралелизма, като добавите org.gradle.parallel = true във файла gradle.properties.

Тъй като нашият проект няма множество модули, изграждането на паралел няма да има голяма разлика.

Време за изграждане с активирано успоредно изграждане
Намаляване на времето с: 1 мин 45 сек (64,5% печалба)

Други малки неща, които трябва да запомните:

  • Избягвайте тежки изчисления, като увеличаване на кода на версията от git извършва преброяване или изтегляне на някои файлове от url, докато изграждате проекта. Gradle ще отдели време за извършване на тези изчисления или мрежови операции и това ще повлияе на времето за изграждане.
  • Не използвайте динамична зависимост като,
компилирайте 'com.android.support:appcompat-v7:23.0.+'

Ако използвате динамичните зависимости, gradle ще влезе в интернет и ще провери дали има налична по-нова версия за библиотеката или не? (През повечето време това е просто загуба на ценното време за изграждане). Вместо това използвайте фиксираните зависимости и ги актуализирайте ръчно от време на време.

компилирайте 'com.android.support:appcompat-v7:23.0.2'

TL; DR:

Дългата история накратко, добавете по-долу редове към файла си gradle.properties и ще получите почти 65% намаление на времето за изграждане.

~ Ако статията ви е харесала, щракнете върху по-долу, така че повече хора да я видят! Също така, можете да ме следите в Medium или в My Blog, така че да получавате актуализации относно моите бъдещи статии !! ~

https://paypal.me/kpatel2106?locale.x=en_GB