Zdroj: https://gradle.org/wp-content/uploads/2016/03/Build-Performance-Gradle.png

Jak zkrátit dobu výstavby Gradle o 65%?

Gradle je velmi výkonný systém sestavení. Zpracovává velmi složitý proces vytváření souborů .dx ze zdrojového kódu Java, sloučení všech zdrojů a prostředků do aplikačního balíčku (.apk) a podepsání aplikace.

Stupnice však není dokonalá. Je relativně pomalejší než jiné systémy sestavení.

Proč byste se měli starat o dobu výstavby vašeho projektu?

Dlouho jsem byl v pořádku se svými časy sestavení. Myslel jsem, že s tím můžu žít. Dřív jsem dělal další věci, jako je surfování na internetu, přípravu kávy a dokonce i oběd, zatímco stavba mého projektu staví.

Nyní řekněme, že pracujete na výše uvedeném aplikačním projektu I / O'16 po dobu 6 hodin denně a spustíte sestavení stupnice, abyste nainstalovali ladicí apk soubor na své testovací zařízení téměř 15krát, strávíte 35 minut denně a téměř 3 hodiny / týden (téměř 10% z celkového času) jen sedí nečinně a sleduje běh stupnice.

Proto je velmi důležité, abyste optimalizovali načasování sestavení. Čím méně času strávíte sledováním projektu budování projektu, tím více můžete být produktivní. Nakonec je čas drahý.

Použil jsem několik změn v procesu sestavení, abych zkrátil dobu sestavení. Zde je několik tipů, které vám pomohou snížit časování sestavení.

Zde například použijeme jako ukázkový projekt aplikaci Google I / O. Budeme spouštět všechna měřítka v tomto projektu. Tento projekt obsahuje více než 28 závislostí a 41538 metodických odkazů. Zdrojový kód aplikace je také otevřeně dostupný na GitHubu.

Výstup APK anlyser pro aplikaci Google I / O 16

Sestavte bez jakýchkoli úprav:

Pomocí příkazu níže změříme čas na sestavení a ladění aplikace z projektu s aktuální konfigurací.

./gradlew android: assembleDebug --profile
- profil řekne stupnice, aby změřila dobu potřebnou k provedení každé úlohy a výpis těchto dat do souboru HTML. Tuto zprávu najdete v adresáři / projectDir / build / reports / profile.
  • Jak vidíte, vytvoření ladicího apk ze zdroje na mém počítači trvá 2 minuty a 43 sekund. Udržujte tuto postavu ve své mysli.
Tato časová měřítka se mohou na vašem zařízení lišit v závislosti na konfiguraci vašeho systému. Zde budu používat svůj 13 "Macbook Pro 2016 s dotykovou lištou ke splnění všech těchto úkolů.

Nyní se pokusíme tento čas snížit.

Cyklus sestavení stupnice:

Gradle má tři odlišné fáze v životním cyklu stavby:

  1. Inicializace: V této fázi životního cyklu stavby vybere škála projekt a rozhodne, jaké věci bude stavět.
  2. Konfigurace: Zde gradle vyhodnotí skript build.gradle, nakonfiguruje všechny pluginy a vyhodnotí graf úkolů.
  3. Provedení: V této fázi stupnice ve skutečnosti spustí všechny úlohy, které byly vyhodnoceny v předchozí fázi, aby se dokončila práce a vytvořila aplikace.

Jak můžete vidět, že ze všech tří fází provádí všechny operace pouze fáze provádění. To znamená, že první dvě fáze jsou právě nad procesem vytváření stupnice. Nestaráme se o ně. Bohužel, kdykoli uděláte cokoli s odstupňováním, budou tyto dvě fáze vždy provedeny.

Jak tedy můžeme měřit čas potřebný k provedení prvních dvou fází? Naštěstí poskytuje gradle - příkaz dry-run, který říká, že stupnice má vyhodnotit projekt, ale nespouští žádný úkol. Realizační fáze tedy nebude provedena. Spusťte tento příkaz ve svém terminálu:

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

Tady je čas, který zabere první dvě fáze projektu I / O přes Google.

Sestavte načasování - běh nasucho

Ve výše uvedených statistikách můžete vidět, že měřítko uběhlo téměř 7,8 sekund, aby se projekt inicializoval a nakonfiguroval. To je pro nás úplně ztráta času.

Uvidíme, jestli můžeme zkrátit čas potřebný k inicializaci a konfiguraci projektu.

Konfigurovat na požádání:

Aplikace Google I / O má dvě součásti / moduly:

  • Android: Obsahuje zdrojový kód související s aplikací andorid a
  • Server: Obsahuje kód související se serverem backend.

Nyní, pokud vytváříte aplikaci pro Android, nechcete konfigurovat komponentu serveru. Že jo? Předchozí statistika však ukazuje, že stupnice uběhla téměř vteřinu, aby se nakonfigurovala pouze součást serveru.

Gradle poskytuje - příznak configure-on-demand, který řekne gradle, aby stavěl pouze projekty, které skutečně potřebuje. Spustíme tento příkaz.

./gradlew android: assembleDebug --dry-run --profile - nakonfigurovat na vyžádání
Budujte timimgs pomocí - configure-on-demand

Jak vidíte, pokud použijeme - configure-on-demand, gradle přeskočí konfiguraci serverového modulu a zkrátí dobu výstavby téměř o sekundu. Vím, že to není obrovský zisk, ale malé kapky mohou naplnit celé jezero !!!

Čas se snížil: 1 sekunda (6% výhra).

Jak můžete povolit konfiguraci na vyžádání v android studiu?

Můžete povolit - konfiguraci na vyžádání pro každé sestavení můžete přidat soubor org.gradle.configureondemand = true do svého souboru gradle.properties nebo do svého studia Android, přejděte na Předvolby> Sestavit, Provedení, Nasazení> Kompilátor a zkontrolujte konfiguraci na požádání volba.

Povolit - nakonfigurujte na vyžádání v Android Studio

Povolit démona:

Gradle má velmi dobrou funkci zvanou Gradle Daemon. Daemon udržuje instanci stupnice nahoru a běží na pozadí i po dokončení sestavení. Tím se odstraní čas potřebný k inicializaci stupnice a výrazně se sníží časování sestavení.

Nebudete mít možnost vidět časový rozdíl v prvním sestavení, protože gradle musí inicializovat a spustit démona, ale časy sestavení se v následujících sestavení zkrátí, protože démon je již inicializovaný.

./gradlew android: assembleDebug --dry-run --profile - nakonfigurovat na vyžádání - démon
Budujte čas s povoleným démonem stupnice

V našem případě je doba výstavby snížena asi o 4,5 sekundy. Hurá!!!

Čas se snížil o: 4,5 sekundy (71% výhra)

Jak můžete povolit démona v android studiu?

Pokud používáte verzi 3.0 nebo vyšší, je démon stupnice ve výchozím nastavení povolen. Pokud však používáte starší verze stupnice, můžete ji povolit pro každou sestavení přidáním org.gradle.daemon = true do souboru gradle.properties.

Vždy mějte přehled aktuální:

S každým novým vydáním se Gradle zrychlil. V nejnovějších verzích stupnice existuje mnoho vylepšení a zlepšení výkonu. Také pokud používáte verzi 2.4 nebo vyšší, gradle také uloží artefakty buildu do mezipaměti, což výrazně zlepší dobu sestavení.

Vždy se proto ujistěte, že používáte nejnovější verzi stupnice. Můžete přejít na /gradle/wrapper/gradle-wrapper.properties a upgradovat verzi stupnice změnou distribuceUrl.

Při psaní tohoto článku je nejnovější verzí stupnice 3.3. Zde je aktualizovaný soubor gradle-wrapper.properties pro I / O aplikace.

gradle-wrapper.properties
./gradlew android: assembleDebug --dry-run --profile - nakonfigurovat na vyžádání - démon
Vytvořte načasování pomocí Gradle 3.3
Čas se snížil o: 0,7 sekundy (82% výhra )

Dosud jsme dosáhli téměř 82% zisku v inicializaci a časování konfigurace. Nyní se pokusíme zkrátit čas potřebný ve fázi provedení.

Zvětšit velikost haldy:

Od aplikace Android Studio 2.0 používá stupnice dex v procesu snižování časování sestavení projektu.

„Dex in process“ je proces, který umožňuje spouštět více dexových procesů v rámci jediného virtuálního počítače, který je sdílen s stupnicí.

Obecně platí, že při vytváření aplikací běží více procesů dx na různých instancích VM.

Více procesů dx běžících na různých virtuálních počítačích. (Zdroj: https://www.youtube.com/watch?v=-SY5nkNVUn0)

Ale od Android Studio 2.0, všechny tyto dx procesy běží v jednom VM a že VM je sdílen s stupnicí. (Musíte povolit sestavovací nástroj verze 23.0.2 nebo vyšší, abyste mohli povolit dex v procesu.)

Na jednom virtuálním počítači běží více procesů dx. (Zdroj: https://www.youtube.com/watch?v=-SY5nkNVUn0)

To výrazně zkracuje dobu sestavení, protože všechny procesy dex běží na stejných instancích VM. Ale to vyžaduje větší paměť, aby se přizpůsobily všechny dex procesy a stupnice. To znamená, že musíte zvětšit velikost haldy, kterou vyžaduje démon stupnice. Ve výchozím nastavení je velikost haldy démona asi 1 GB. Velikost haldy musíte zvětšit přidáním pod řádek do vašich gradle.properties.

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

Požadovaná velikost haldy se v jednotlivých strojích liší. U mého stroje jsem zjistil, že velikost haldy 3 GB je perfektní. Jakékoli další zvýšení velikosti haldy neovlivní významně načasování sestavení.

Nyní spustíme plně čisté sestavení pomocí následujícího příkazu:

./gradlew android: assembleDebug --profile - nakonfigurovat na vyžádání - démon
Sestavte timimg s větší velikostí haldy.
Snížení času o: 1 min 43 s (63% výhra) - od 2 min 43 s do 1 min

Modulární a paralelní sestavení:

Umožněte stupnici postavit váš projekt paralelně. Pokud máte ve vašem projektu více modulů, pak povolíte, může škálování spustit paralelně operace sestavování nezávislých modulů. To může výrazně zkrátit dobu výstavby velmi složitých a multimodulových projektů.

Paralelismus můžete povolit přidáním org.gradle.parallel = true do souboru gradle.properties.

Vzhledem k tomu, že náš projekt nemá více modulů, nebude paralelní budování nijak výraznější.

Časování sestavení s povoleným paralelním sestavením
Snížení času o: 1 min 45 s (64,5% výhra)

Další drobnosti, které si musíte pamatovat:

  • Vyvarujte se náročným výpočtům, jako je zvýšení kódu verze z gitu, při vytváření projektu počítání nebo stahování některých souborů z adresy URL. Gradle bude trávit čas prováděním těchto výpočtů nebo síťových operací a bude ovlivňovat časování sestavení.
  • Nepoužívejte dynamickou závislost jako,
kompilovat 'com.android.support:appcompat-v7:23.0.+'

Pokud používáte dynamické závislosti, stupnice přejde do režimu online a zkontrolujte, zda je k dispozici novější verze knihovny, nebo ne? (Většinou je to jen ztráta drahocenného času výstavby). Místo toho použijte pevné závislosti a čas od času je aktualizujte ručně.

kompilovat 'com.android.support:appcompat-v7:23.0.2'

TL; DR:

Krátký příběh, přidejte pod řádek do souboru gradle.properties a získáte téměř 65% zkrácení doby sestavení.

~ Pokud se vám článek líbil, klikněte níže na , aby ho vidělo více lidí! Můžete mě také sledovat na médiu nebo na mém blogu, takže získáte aktualizace týkající se mých budoucích článků !! ~

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