Gradle — це система збірки, яка автоматизує компіляцію, тестування та пакування Android-додатків. На відміну від Apache Ant або Maven, вона підтримує інкрементальну збірку та кешування результатів. Докладніше про можливості читайте в офіційній документації Gradle. З 2013 року інструмент використовується як стандартна система збірки для Android-проєктів в Android Studio.
Головне
Gradle — це інструмент автоматизації збірки з відкритим кодом на Java, що працює на JVM. Він приймає на вхід вихідний код, залежності та ресурси, а на виході видає готовий додаток — APK або AAB для Android. В основі Gradle лежить концепція орієнтованого ациклічного графа задач (DAG), де кожна задача — це атомарна одиниця роботи, а зв'язки між ними визначають порядок виконання. На відміну від Make або Ant, Gradle не вимагає опису послідовності кроків вручну: достатньо оголосити залежності між задачами, і система сама вибудує оптимальний порядок. Такий підхід робить Gradle гнучким та масштабованим для проєктів будь-якого розміру.
Система використовує три фази виконання: ініціалізацію (визначення учасників проєктів), конфігурацію (побудова графа задач) та виконання (запуск задач у потрібному порядку). Фаза конфігурації — ключова відмінність Gradle: весь скрипт збірки виконується до запуску задач, що дозволяє динамічно змінювати граф залежно від умов. Це дає можливість, наприклад, додавати задачі тільки для певних варіантів збірки без дублювання коду. Збірник написаний на Groovy, але конфігураційні файли підтримують дві мови: Groovy DSL та Kotlin DSL.
Android-плагін для Gradle — це com.android.application та com.android.library, які додають у проєкт задачі для роботи з Android-інструментами. Коли розробник запускає збірку, Gradle послідовно виконує десятки задач: компіляцію Kotlin та Java через javac або kotlinc, обробку ресурсів через AAPT2, генерацію R.java, компіляцію байткоду в DEX через D8 або R8, підписання та зіппінг APK. Кожна задача перевіряє, чи змінилися її вхідні дані, і якщо ні — використовує закешований результат. Цей механізм називається інкрементальною збіркою і прискорює повторну компіляцію на 60–80% порівняно з повною перезбіркою.
Конфігурація Android-модуля задається в блоці android файлу build.gradle.kts. Всередині блоку визначаються compileSdk, minSdk, targetSdk, версія додатку, підписи та інші параметри. Gradle автоматично створює для кожного модуля кілька варіантів збірки — комбінацію типу (release, debug) та флейвору. Наприклад, для модуля з двома флейворами та двома типами Gradle генерує чотири задачі: assembleDemoDebug, assembleDemoRelease, assembleFullDebug, assembleFullRelease. Всі ці задачі можна виконувати окремо або запускати однією командою для всіх варіантів одразу.
Кожен Android-проєкт містить два рівні конфігурації: кореневий build.gradle.kts (налаштування для всіх модулів) та модульний build.gradle.kts (налаштування для конкретного модуля). У кореневому файлі оголошуються плагіни без застосування, репозиторії та загальні змінні. У модульному файлі плагіни застосовуються до конкретного модуля та налаштовуються параметри збірки. Такий підхід дозволяє централізовано керувати версіями залежностей через каталог версій або ext-блок.
@Suppress("UnstableApiUsage")
plugins {
id("com.android.application") version "8.2.2"
id("org.jetbrains.kotlin.android") version "1.9.22"
}
android {
namespace = "com.example.myapp"
compileSdk = 34
defaultConfig {
applicationId = "com.example.myapp"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"
}
}Блок dependencies — ще один критичний елемент build.gradle.kts. У ньому перераховуються бібліотеки, модулі та файлові залежності, які потрібні додатку. Gradle підтримує кілька конфігурацій залежності: implementation (доступна тільки поточному модулю), api (доступна і залежним модулям), testImplementation (тільки для тестів), androidTestImplementation (для інструментальних тестів) та compileOnly (тільки на етапі компіляції). Кожна конфігурація керує видимістю класів у графі залежностей, що впливає на час збірки та розмір фінального артефакту.
dependencies {
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.activity:activity-compose:1.8.2")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
}Build variant — це комбінація build type та product flavor, яка визначає версію додатку з унікальними налаштуваннями, кодом та ресурсами. Build type (тип збірки) задає параметри пакування: debug (з налагодженням та суфіксом .debug) або release (з обфускацією та підписом). Product flavor (продуктовий флейвор) визначає функціональні варіанти: наприклад, demo (обмежена версія) та full (повна версія з додатковими можливостями). Gradle автоматично генерує задачі для кожної комбінації, що дозволяє збирати всі версії однією командою.
android {
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
debug {
applicationIdSuffix = ".debug"
}
}
flavorDimensions += "version"
productFlavors {
create("demo") {
dimension = "version"
applicationIdSuffix = ".demo"
}
create("full") {
dimension = "version"
applicationIdSuffix = ".full"
}
}
}Кожному build variant відповідає окремий source set. Gradle використовує каталоги src/demo/release, src/full/debug та інші, де зберігаються унікальні ресурси, маніфести та вихідні файли для конкретного варіанту. Загальний код залишається в src/main. Такий підхід дозволяє перевикористовувати основну логіку та замінювати тільки відмінні частини: рядки, іконки, API-ендпоінти або конфігураційні файли. Source set може перевизначати будь-які ресурси з main: маніфест, drawable, values або навіть Kotlin-класи. При збірці конкретного варіанту Gradle об'єднує файли з main та відповідного source set, при цьому файли з варіанту мають пріоритет.
Екосистема плагінів Gradle охоплює всі етапи розробки Android-додатків. Офіційні плагіни від Google включають com.android.application (для модуля додатку), com.android.library (для бібліотечного модуля), com.android.test (для тестових модулів) та Kotlin-плагіни від JetBrains. Плагіни додають у проєкт нові задачі, розширюють DSL новими блоками конфігурації та підключають додаткові інструменти. Без плагіна com.android.application проєкт не може зібрати APK: цей плагін реєструє всі Android-специфічні задачі та зв'язує їх у граф збірки.
Сторонні плагіни вирішують більш вузькі задачі. Google Services (com.google.gms.google-services) інтегрує Firebase та Google Play Services, автоматично підставляючи google-services.json у збірку. Hilt (dagger.hilt.android.plugin) генерує код для впровадження залежностей на етапі компіляції. Safe Args (androidx.navigation.safeargs.kotlin) створює типобезпечні класи для навігації між фрагментами. Кожен плагін підключається в кореневому build.gradle.kts через блок plugins і зазвичай вимагає мінімальної конфігурації. Gradle автоматично розв'язує транзитивні залежності між плагінами та гарантує сумісність версій через Bom-файли та каталог версій.
Таска (task) — це атомарна одиниця роботи в Gradle. Кожна таска має вхідні дані, вихідні дані та дію. Вбудовані таски для Android включають assemble (збірка всіх варіантів), lint (перевірка коду), test (запуск unit-тестів) та clean (очищення тимчасових файлів). Розробник може додавати власні таски за допомогою Groovy або Kotlin DSL. Користувацькі таски корисні для автоматизації рутинних операцій: генерації звітів, копіювання артефактів, деплою на тестові пристрої або інтеграції з CI-системами.
tasks.register("printBuildInfo") {
description = "Виводить інформацію про збірку"
group = "custom"
doLast {
println("Build variant: ${project.name}")
println("Version: ${android.defaultConfig.versionName}")
}
}Кожна таска може залежати від інших тасок через механізм dependsOn. Якщо таска A залежить від таски B, Gradle гарантує, що B виконається раніше A. Система не вимагає ручного вказівки порядку для кожної пари — достатньо оголосити залежності, і Gradle побудує орієнтований граф, оптимізований для паралельного виконання незалежних тасок. Вбудовані таски Android-плагіна вже пов'язані між собою: lint залежить від компіляції, test залежить від assemble, assembleDebug залежить від compileDebugKotlin. Розробник може вбудовувати свої таски в будь-який вузол графа, використовуючи dependsOn, mustRunAfter або shouldRunAfter.
Одна з частих проблем — конфлікт версій залежностей, коли дві бібліотеки вимагають різні версії однієї й тієї ж транзитивної залежності. Gradle повідомляє про помилку конфлікту, але не завжди пропонує автоматичне рішення. Для діагностики використовуйте команду ./gradlew :app:dependencies, яка виводить повне дерево залежностей. Рекомендується примусово вказати версію конфліктуючої бібліотеки через блок resolutionStrategy. Інший поширений сценарій — повільна збірка через відсутність інкрементальної обробки. Перевірте, що всі плагіни оновлені, Gradle Daemon увімкнено (org.gradle.daemon=true) та в gradle.properties задано достатній обсяг пам'яті: org.gradle.jvmargs=-Xmx4096m.
Проблеми з кешуванням виникають після оновлення залежностей: Gradle може використовувати застарілий кеш, і збірка завершується помилкою. Рішення — запустити збірку з прапорцем --refresh-dependencies або очистити кеш вручну через ./gradlew cleanBuildCache. Третя за частотою помилка — несумісність версій Android Gradle Plugin (AGP) та Gradle. Кожна версія AGP вимагає певної мінімальної версії Gradle. Таблиця сумісності публікується на developer.android.com. Якщо версії несумісні, Gradle завершується помилкою на етапі конфігурації з повідомленням про мінімальну необхідну версію. Завжди перевіряйте, що версія Gradle wrapper відповідає вимогам AGP.
Часті запитання
Gradle — це програма-автоматизатор збірки проєктів. Вона бере ваш вихідний код на Kotlin або Java, підключає бібліотеки з інтернету, компілює все в байткод та пакує в APK. Працює на JVM та використовує декларативні скрипти замість ручних інструкцій. Розробнику потрібно тільки описати правила, а решта Gradle робить сам.
Build.gradle пишеться на Groovy — динамічній мові з гнучким синтаксисом і меншою строгістю. Build.gradle.kts використовує Kotlin DSL: строга типізація, автодоповнення в Android Studio та перевірка помилок на етапі компіляції. Google рекомендує Kotlin DSL для всіх нових проєктів. Groovy-файли легше мігрувати, але Kotlin-файли надійніші в підтримці.
Увімкніть Gradle Daemon (org.gradle.daemon=true) та паралельну збірку (org.gradle.parallel=true). Збільште пам'ять JVM до 4–8 ГБ через org.gradle.jvmargs. Використовуйте конфігурацію проєктів on-demand (org.gradle.configureondemand=true). Для Android-проєктів налаштуйте кешування задач та збірку тільки для потрібної ABI. В Android Studio запустіть Build Analyzer, щоб знайти вузькі місця.
Build variant — це комбінація build type (наприклад, debug або release) та product flavor (наприклад, demo або full). Кожен варіант може мати своє ім'я пакета, версію, ресурси та вихідні файли. Gradle автоматично створює окрему задачу збірки для кожного варіанту. Це дозволяє збирати кілька версій додатку з одного проєкту.
Залежності додаються в блок dependencies файлу build.gradle.kts. Формат запису: configuration("group:artifact:version"). Наприклад, implementation("androidx.core:core-ktx:1.12.0"). Для тестів використовуйте testImplementation, для інструментальних тестів — androidTestImplementation. Версії зручно виносити в окремий каталог версій (version catalog) через файл libs.versions.toml.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.