Kuinka parantaa Android-projektien koontinopeutta

Äskettäin sitoutuin siirtämään Kuren Android-koodipohjan AndroidX: ään. Se vaikutti täydelliseltä mahdollisuudelta yrittää korjata projektin rakennusnopeudet.

Gradlella on aina ollut huono edustaja siitä, että hän on hidas ja resursseja kuluttanut, mutta olin yllättynyt siitä, kuinka pienet muutokset projektin rakennekokoonpanoon voisivat parantaa massan nopeutta.

Tässä on lyhyt katsaus aikaan, jonka pystyin irtoamaan puhtaista rakennuksistamme, tässä on ennen ja jälkeen koontiversiotiedot.

Menetkö alas 5,5 minuutista 17 sekuntiin ?? Se on kiusaaja.

On helppo mennä yli laidan optimoinnilla, jonka voit tehdä rakennusajan lyhentämiseksi entisestään. Mutta aion keskittyä tarkoituksellisesti pieniin, kivuttomiin toimenpiteisiin, jotka ryhdyin tulemaan lähelle tätä mittaria pitämään tämän post-aloittelijan ystävällisenä.

Mutta ensin!

Ennen kuin aloitat optimoinnin, on tärkeää vertailla projektiamme nähdäksesi, kuinka kauan sen rakentaminen kestää tällä hetkellä. Gradlessa on kätevä skannausvaihtoehto, jonka avulla voit analysoida tehtävän suorituskykyä. Käynnistä pääte Android Studiossa ja suorita seuraava komento:

./gradlew assembleDebug --scan

Kun koontiversio on saatu onnistuneesti päätökseen, se kehottaa sinua hyväksymään käyttöehdot ladataksesi koontitarkistuksen tulokset. Kirjoita Kyllä jatkaaksesi. Kun julkaisu on valmis, saat terminaaliin linkin tarkistamaan rakennuskannauksesi. Avaa linkki.

Sivustolla on melko monta vaihtoehtoa, mutta lyhyyden vuoksi tarkastelemme vain tärkeintä.

Yhteenvetonäkymä näyttää yhteenvedon suoritetuista tehtävistä ja kuinka kauan niiden suorittaminen kesti. Mutta meitä kiinnostaa täällä Suorituskyky- osa. Se antaa tarkemman erittelyn koko rakennusajasta alla olevan kuvan mukaisesti.

Suorituskykyä käsittelevässä osiossa on Asetukset ja ehdotukset -välilehti, joka antaa sinulle ehdotuksia rakennuksen nopeuksien parantamiseksi. Tarkistetaan se.

Tästä osiosta löytyy joitain helppoja korjauksia rakentamisnopeuksellemme. Joten jatketaan ja sovelletaan näitä ehdotuksia projektissamme.

Vaihe 1: Päivitä työkalut

Android-tiimi kehittää ja kehittää jatkuvasti Android-rakennusjärjestelmää. Joten suurimman osan ajasta voit saada merkittäviä parannuksia vain ottamalla käyttöön työkalun uusimman version.

Refaktorin aikaan projektimme oli Gradle-laajennuksen Android Studiolle versiossa 3.2.1 (joka on muutama versio vanhempaa kuin viimeisin julkaisu).

Voit käydä tällä linkillä saadaksesi version Gradle-laajennuksen uusimmasta versiosta.

Kun kirjoitat tätä viestiä, viimeisin versio sattuu olemaan versio 3.4.0.

Mutta sen mukana tulee kuppi, joka meidän on pidettävä mielessä myöhempää käyttöä varten:

Kun käytät Gradle 5.0: aa tai uudempaa, meidän on kasvatettava nimenomaisesti kasan kokoa varmistaaksemme, että rakennusnopeutemme ei huonone. Palaamme tähän hetkessä.

Avaa ylemmän tason build.gradle- tiedosto, jonka löydät projektisi juuresta, ja lisää seuraava rivi riippuvuusosioon:

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

Sinun on myös päivitettävä jakelun URL-osoite gradle wrapper -ominaisuustiedostossa, joka sijaitsee osoitteessa gradle / wrapper / gradle-wrapper.properties. Päivitä URL-osoite seuraavaksi.

(Tämä linkki on saatavilla Android Gradle -laajennuksen julkaisusivulla.)

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

Jos käytät Kotlinia projektissasi, törmäät virheeseen, jos Kotlin Gradle -laajennuksesi versio on alle 1.3.0 . Jos näin on, päivitä IDE: n kehote päivittämään Kotlin Gradle -laajennuksesi uusimpaan versioon (joka tämän viestin kirjoittamisen yhteydessä sattuu olemaan versio 1.3.31 ).

Selvä, ajetaan koontiversio uudelleen terminaalista nähdäksesi, saimmeko parannuksia.

Vaihe 2: Päivitä kokoonpanosi

Joten pystyimme irtoamaan noin 2,5 minuuttia rakennusajasta, mutta se ei silti ole tarpeeksi hyvä. Tutkittuani terminaalin rakennelokeja törmäsin yhteen meille kiinnostavaan linjaan:

Inkrementaalinen kokoaminen estää periaatteessa koko lähdetiedostojen tuhlaavan kokoamisen ja sen sijaan kokoaa vain muuttuneet tiedostot. Lokeja tarkasteltaessa on selvää, ettemme hyödynnä tätä ominaisuutta. Se ehdottaa meille, että käytämme android.enableSeparateAnnotationProcessing = true, mutta koska käytämme Kotlinia projekteissamme, meidän ei pitäisi missään tapauksessa käyttää annotationProcessor- kokoonpanoa.

Onneksi Kotlin- versio 1.3.30 lisäsi tuen lisäysmerkintöjen käsittelyyn.

Joten mennään

  1. Muuta annotationProcessor- kokoonpanoksi kapt
  2. Ota käyttöön inkrementaalinen merkinnän käsittely kokeellinen lippu

Avaa moduulitason build.gradle- tiedosto ja lisää seuraava rivi tiedoston yläosaan:

apply plugin: 'kotlin-kapt'

Muuta seuraavaksi kaikki riippuvuudet-osion annotationProcessor-määritykset käyttämään kapt. Tässä on esimerkki:

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

Avaa nyt gradle.properties- tiedosto, joka sijaitsee projektisi juuressa, ja lisää seuraava rivi:

kapt.incremental.apt=true

Suoritetaan koontiversio uudelleen. ??????

Selvä, näyttää siltä, ​​että pääsemme sinne.

Vaihe 3: Vaihda ominaisuudet

Olemme nyt viimeisessä vaiheessa. Muistatko gotchan, jonka törmäsimme päivittäessämme Gradle-laajennusversiota? On käynyt ilmi, että Gradlen uudemmat versiot pienentävät kasan kokoa 512 Mt: ksi. Tämän tarkoituksena on varmistaa, että alapään koneet eivät tukehdu. Olen 16 keikkakoneella, joten minulla on varaa antaa noin 2–3 keikkaa Gradle-demonille, mutta mittarilukema voi vaihdella.

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

Tämä ei suinkaan ole kattava kattavuus kaikista tavoista, joilla projektin rakennusnopeus voidaan optimoida. Tässä viestissä on paljon muita asioita, joita en ole käynyt läpi, kuten minSdk 21: n käyttö MultiDexiä käytettäessä, kirjastojen ennakoivien dexsien poistaminen, PNG-rypistämisen estäminen ja niin edelleen - muutamia mainitakseni.

Mutta useimmat näistä kokoonpanoista edellyttävät syvempää tuntemusta Androidin rakennusjärjestelmästä ja kokemusta työskentelystä suurissa monimoduuliprojekteissa (missä edut ovat ilmeisimmät) . Edellä mainitsemani vaiheet on helppo sisällyttää projektiin jopa nuorempien kehittäjien toimesta ja niillä on huomattavia voittoja. Toivon, että tämä auttaa sinua pienentämään rakennusnopeuksiasi!

Selvä seuraavaan kertaan asti, rauha! ✌?