Gradle — dasturiy loyihalarni compile qilish, testdan o‘tkazish, package yaratish va dependencylarni boshqarish uchun ishlatiladigan build automation tizimi. U Java, Kotlin, Android va boshqa ko‘plab ekotizimlarda qo‘llanadi. Gradle build jarayonini tasklar va pluginlar orqali ifodalaydi.
Gradle build scriptlari Kotlin DSL yoki Groovy DSL bilan yozilishi mumkin. Android Studio loyihalarida Gradle Android plugin bilan birga application variantlarini yaratadi.
Build script
Project root va module darajasida build fayllari bo‘ladi:
build.gradle
build.gradle.kts
settings.gradle
settings.gradle.kts
Kotlin DSL .gradle.kts, Groovy DSL .gradle extensionidan foydalanadi.
Project
Gradle build bir yoki bir nechta projectdan tashkil topadi.
Multi-project buildda:
alohida project bo‘lishi mumkin.
settings fayli qaysi modulelar buildga kirishini belgilaydi.
Task
Task builddagi bajariladigan ish birligi.
Misollar:
Task boshqa taskga dependency bo‘lishi mumkin.
Gradle directed acyclic task graph tuzadi.
Plugin
Plugin buildga task, extension va convention qo‘shadi.
Android uchun:
- application plugin;
- library plugin;
- Kotlin plugin;
- serialization;
- code quality plugin
ishlatilishi mumkin.
Plugin versionlari build toolchain compatibility’siga ta’sir qiladi.
Dependency
External library coordinate orqali qo‘shiladi:
implementation("group:artifact:version")
Configuration dependency qayerda ishlatilishini belgilaydi:
implementation;api;testImplementation;runtimeOnly;- boshqalar.
Android plugin qo‘shimcha configurationlar beradi.
Repository
Gradle dependencylarni repository’dan oladi.
Misollar:
- Maven Central;
- Google repository;
- internal Maven;
- local repository.
Repository tartibi va content filter supply-chain xavfsizligiga ta’sir qiladi.
Noma’lum public repository’ni keraksiz qo‘shish xavfli.
Dependency resolution
Bir dependency boshqa transitive dependencylarni olib keladi.
Turli version talab qilinsa conflict resolution qoidasi tanlaydi.
Yakuniy resolved graph report orqali tekshiriladi.
Dependency locking reproducible versionlarni saqlashga yordam beradi.
Version catalog
Dependency va plugin aliaslari markaziy katalogda saqlanishi mumkin.
Masalan:
libs.versions.toml
Bu multi-module loyihada versionlarni bir joydan boshqaradi.
Catalog dependency’ni avtomatik yangilamaydi.
Wrapper
Gradle Wrapper loyiha uchun kerakli Gradle versionini belgilaydi.
Fayllar:
gradlew;gradlew.bat;- wrapper properties;
- wrapper JAR.
Developer global Gradle o‘rnatmasdan bir xil versionni ishlatadi.
Wrapper distribution hash bilan tekshirilishi mumkin.
Build lifecycle
Gradle uch umumiy bosqichga ega:
- initialization;
- configuration;
- execution.
Configurationda project va task graph tayyorlanadi.
Executionda faqat talab qilingan tasklar ishlaydi.
Configuration vaqtida og‘ir I/O buildni sekinlashtiradi.
Incremental build
Task input va outputlari o‘zgarmagan bo‘lsa qayta bajarilmasligi mumkin.
Gradle up-to-date check qiladi.
Custom task input va outputni to‘g‘ri e’lon qilishi kerak.
Aks holda stale yoki keraksiz rebuild yuz beradi.
Build cache
Task outputlari cache’da saqlanadi.
Ayni input bilan boshqa build outputni qayta ishlatishi mumkin.
Local va remote cache mavjud.
Task deterministik bo‘lmasa noto‘g‘ri cache natijasi beradi.
Configuration cache
Configuration phase natijasini qayta ishlatishga yordam beradi.
Plugin va build script configuration cache talablariga mos bo‘lishi kerak.
Global mutable state va configurationdagi runtime access compatibilityni buzishi mumkin.
Daemon
Gradle Daemon JVMni buildlar orasida saqlab, startup vaqtini kamaytiradi.
CI muhitida memory va process lifecycle hisobga olinadi.
Daemon heap settinglari katta projectda muhim.
Muammo diagnostikasida daemon loglari tekshiriladi.
Android build variant
Android Gradle plugin build type va product flavorlarni birlashtirib variant yaratadi.
Masalan:
demoDebug
productionRelease
Har variant boshqa:
ga ega bo‘lishi mumkin.
Signing
Release build signing configurationdan foydalanadi.
Keystore parol va private key source controlga yozilmaydi.
CI secret yoki secure signing service ishlatiladi.
Debug signing production identity bilan aralashtirilmaydi.
Test
Gradle unit test, instrumentation test va static analysis tasklarini boshqaradi.
CI kerakli tasklarni wrapper orqali chaqiradi.
Test report va coverage artifact sifatida saqlanadi.
Task muvaffaqiyatsiz bo‘lsa build to‘xtaydi.
Custom task
Plugin yetarli bo‘lmasa custom task yaratiladi.
Task action ichida side effect bajariladi.
Input property va output file aniq e’lon qilinadi.
Build scriptni umumiy programming scriptiga aylantirish maintenance’ni qiyinlashtiradi.
Performance
Buildni tezlashtirish:
- parallel execution;
- build cache;
- configuration cache;
- incremental task;
- dependency cleanup;
- Kotlin compilation setting;
- module boundary.
Avval build scan yoki profiler orqali bottleneck aniqlanadi.
Convention plugin
Katta multi-module loyihada bir xil compiler, test va Android settinglarini har module’da takrorlash o‘rniga convention plugin yaratiladi. U organization qoidalarini markazlashtiradi. Application va library module faqat o‘ziga xos dependency hamda parametrlarni e’lon qiladi. Plugin o‘zgarsa barcha modulelarga bir xil qoida qo‘llanadi.
Dependency verification
Gradle yuklangan artifact checksum yoki signature’larini verification metadata bilan tekshirishi mumkin. Repositorydagi package almashtirilsa build to‘xtaydi. Yangi dependency qo‘shilganda metadata code reviewdan o‘tadi.
Build scan
Build scan tasklar va dependency resolution vaqtini ko‘rsatadi. Cache miss, sekin plugin va critical path aniqlanadi. Maxfiy environment qiymatlari reportga chiqmasligi uchun sanitization qo‘llanadi.
Bog‘liq tushunchalar
Gradle, Build automation, Task, Plugin, Dependency resolution, Gradle Wrapper, Build cache, Kotlin DSL, Android Gradle Plugin, Multi-project build