Как да подобрите скоростта на изграждане на вашите Android проекти

Наскоро се заех със задачата да мигрирам кодовата база на Android в Kure към AndroidX. Изглеждаше перфектната възможност да се опитате да определите скоростта на изграждане на проекта.

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

За да ви дам кратък поглед на времето, което успях да отделя от нашите чисти компилации, ето метрика преди и след от сканирането на компилация.

Слизане от 5,5 минути до 17 секунди ?? Това са бонбони.

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

Но първо!

Преди да започнете с оптимизацията, важно е да сравните нашия проект, за да видите колко време отнема изграждането му. Gradle има удобна опция за сканиране, която можете да използвате, за да анализирате изпълнението на вашата задача. Задействайте терминала в Android Studio и изпълнете следната команда:

./gradlew assembleDebug --scan

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

Има доста опции на сайта, но за краткост ще разгледаме само най-важното.

Обобщениетоview ви показва обобщение на изпълнените задачи и колко време е отнело изпълнението им. Но това, което ни интересува тук, е раздел „ Производителност “. Това ви дава по-подробна разбивка на общото време за изграждане, както е показано по-долу.

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

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

Стъпка 1: Актуализирайте инструментите си

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

По време на този рефактор нашият проект беше на версия 3.2.1 на приставката Gradle за Android Studio (която е с няколко версии по-стари от последната версия).

Можете да посетите тази връзка, за да получите версията за най-новата версия на Gradle Plugin.

По време на писането на тази публикация последната версия е версия 3.4.0.

Но той идва с урок, който трябва да имаме предвид за по-късно:

Когато използваме Gradle 5.0 и по-нови , ще трябва изрично да увеличим размера на купчината, за да гарантираме, че скоростта ни на изграждане не се влошава. Ще се върнем към това само след минута.

Отворете файла с най-високо ниво build.gradle, който ще намерите в корена на проекта си, и добавете следния ред в раздела за зависимости:

classpath 'com.android.tools.build:gradle:3.4.0'

Също така ще трябва да актуализирате URL адреса за разпространение във файла със свойствата на обвивката на gradle, намиращ се на gradle / wrapper / gradle-wrapper.properties. Актуализирайте URL адреса на следното.

(Тази връзка ще бъде достъпна на страницата за издание на приставката Android Gradle.)

distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

Ако използвате Kotlin във вашия проект, ще срещнете грешка, ако версията на приставката ви Kotlin Gradle е по-малка от 1.3.0 . Ако случаят е такъв, използвайте подканата на IDE, за да актуализирате приставката си Kotlin Gradle до най-новата версия (която по време на писането на тази публикация е версия 1.3.31 ).

Добре, нека стартираме компилацията отново от терминала, за да видим дали сме постигнали някакви подобрения.

Стъпка 2: Актуализирайте конфигурациите си

Така че успяхме да хвърлим около 2,5 минути от времето за изграждане, но все още не е достатъчно добро. При разследването на дневниците за компилация в терминала попаднах на един ред, който представлява интерес за нас:

Постепенната компилация по същество предотвратява разточителното компилиране на целия набор от изходни файлове и вместо това компилира само файловете, които са се променили. Разглеждайки дневниците, става ясно, че не се възползваме от тази функция. Предлага ни да използваме android.enableSeparateAnnotationProcessing = true, но тъй като използваме Kotlin в нашите проекти, не бива да използваме конфигурацията „annotationProcessor“ така или иначе.

За щастие, Kotlin версия 1.3.30 добави поддръжка за допълнителна обработка на анотации.

Нека

  1. Променете конфигурацията на annotationProcessor на kapt
  2. Активирайте експерименталния флаг за допълнителна обработка на анотации

Open your module level build.gradle file and add the following line to the top of the file:

apply plugin: 'kotlin-kapt'

Next, change all annotationProcessor configurations in the dependencies section to use kapt. Here’s an example:

//Before annotationProcessor 'com.google.dagger:dagger-compiler:2.9' //After kapt 'com.google.dagger:dagger-compiler:2.9'

Now open up your gradle.properties file located at the root of your project and add the following line:

kapt.incremental.apt=true

Let’s run the build again. ??????

Alright, looks like we’re getting there.

Step #3: Gradle Properties

We’re in the last stage now. Remember the gotcha we came across while updating our Gradle plugin version? Turns out the newer versions of Gradle reduce the heap size to 512 MB. This is to make sure lower end machines don’t choke up. I am on a 16 gig machine so I can afford to give around 2–3gigs to the Gradle daemon, but your mileage may vary.

Open the gradle.properties file located at the root of your project and add the following line. Remember to select the size according to your requirements and machine specification.

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

While we’re at it, let’s also enable parallel builds and configure on demand in the properties.

Here’s what my final gradle.properties file looks like:

org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.configureondemand=true kapt.incremental.apt=true
  • org.gradle.parallel - This flag allows Gradle to build modules within a project in parallel instead of sequentially. This is only beneficial in a multi-module project.
  • org.gradle.configureondemand - This flag configures only the modules needed by the project, instead of building all of them.

With these, let’s see where we are on our build speed metric:

And there we go. ???

Closing remarks

This is by no means an extensive coverage of all the ways one can optimize the build speed of their project. There are tons of other things which I did not go over in this post like using minSdk 21 when using MultiDex, pre-dexing your libraries, disabling PNG crunching, and so on — to name a few.

But most of these configurations require a deeper understanding of Android’s build system and experience working on large multi-module projects (which is where the benefits are most apparent). The steps I mentioned above are easy to incorporate in a project even by junior devs and have considerable payoffs. I hope this helps you trim down your build speeds!

Alright until next time, peace! ✌?