Как настроить Gradle в Android Studio и правильно управлять зависимостями
Краткий ответ: Gradle настраивается через корневые файлы (settings.gradle, build.gradle или build.gradle.kts, gradle.properties) и модульные build.gradle — в них задают плагины, android{} (compileSdk, defaultConfig), buildTypes и productFlavors, а зависимости указывают в блоке dependencies; версионирование лучше выносить в один источник (version catalog, buildSrc или constants).
Структура Gradle в проекте и за что отвечает каждый файл
- settings.gradle / settings.gradle.kts — подключение модулей, pluginManagement и dependencyResolutionManagement.
- Корневой build.gradle — репозитории, настройки плагинов, общие скрипты (иногда classpath для старых схем).
- gradle.properties — флаги производительности и пользовательские свойства (API_URL и т.п.).
- Модульный build.gradle (app) — плагины, android{}, buildTypes, productFlavors, dependencies.
Пример минимального блока android в модуле:
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' }
android {
namespace "com.example.app"
compileSdk 34
defaultConfig {
applicationId "com.example.app"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
}
}
Если проект большой — применяйте модульность (feature/core/library) и единый источник версий (libs.versions.toml или buildSrc).
Практическая настройка buildTypes, productFlavors и сборочных вариаций
- buildTypes: обычно debug и release. В debug включайте debuggable, отключайте minify; в release включайте minify и proguard/consumer-rules.
- productFlavors: используются для окружений (dev/prod), редакций (free/paid) или рынков. Обязательно задавайте flavorDimensions.
Пример комбинации:
android {
flavorDimensions "env"
productFlavors {
dev { dimension "env"; applicationIdSuffix ".dev"; buildConfigField "String","BASE_URL","\"https://dev.api\""}
prod { dimension "env"; buildConfigField "String","BASE_URL","\"https://api\""}
}
buildTypes {
debug { applicationIdSuffix ".debug"; versionNameSuffix "-debug" }
release { minifyEnabled true; proguardFiles(getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro') }
}
}
Gradle создаст devDebug, devRelease, prodDebug, prodRelease.
Для CI удобно генерировать артефакты по конкретным variant'ам: ./gradlew assembleProdRelease или assembleDevDebug.
Управление зависимостями и версиями — лучшие практики
- Используйте конфигурации: implementation, api (только если нужно «пропускать» зависимости), compileOnly, runtimeOnly, testImplementation, androidTestImplementation.
- Не злоупотребляйте api в библиотечных модулях — это увеличивает связанность и время сборки.
- Централизуйте версии: version catalog (gradle/libs.versions.toml) — современный и рекомендуемый способ; альтернативы — buildSrc или отдельный файл dependencies.gradle.
Пример использования Version Catalog:
# gradle/libs.versions.toml
[versions]
core = "1.13.1"
[libraries]
androidx-core = { group="androidx.core", name="core-ktx", version.ref="core" }
В модуле: implementation libs.androidx.core
Работа с локальными модулями
- Для internal-модулей используйте implementation project(":core"). Для публичных API — api project(":ui-common") с осторожностью.
- Поддерживайте совместимость версий и выполняйте dependencyUpdates (плагин) в CI.
Не оставляйте версии разбросанными по множеству модулей — это чаще всего приводит к конфликтам и трудночитаемым билд-ошибкам.
Оптимизация времени сборки (ключевые шаги)
- Включите gradle.properties: org.gradle.jvmargs=-Xmx4096m, org.gradle.daemon=true, org.gradle.parallel=true.
- Используйте кэширование: build cache и configuration cache (проверяйте совместимость плагинов).
- Минимизируйте количество kapt/annotation processors или отключайте их для тестов.
- Разделяйте проект на модули, чтобы ре-кадирование затрагивало меньше кода.
Частые ошибки
- Неправильно настроенные flavorDimensions — приводит к ошибке "All flavors must now belong to a flavor dimension".
- Использование api там, где хватило бы implementation — увеличивает связывание модулей.
- Версии библиотек разбросаны по модулям — возникают конфликты runtime/compile.
- Включённый minify без корректных proguard-rules — обфускация ломает работу приложения.
FAQ
- Как использовать переменные из gradle.properties в build.gradle?
- В Kotlin DSL: val apiUrl: String = project.findProperty("API_URL") as String; в Groovy: project.property("API_URL").
- Что лучше — libs.versions.toml или buildSrc?
- libs.versions.toml проще и официально поддерживается; buildSrc даёт гибкость (Kotlin), но усложняет сборку.
- Как быстро увидеть список всех buildVariants?
- В Android Studio: View -> Tool Windows -> Build Variants; в консоли выполните ./gradlew tasks --all и ищите assemble
.
- В Android Studio: View -> Tool Windows -> Build Variants; в консоли выполните ./gradlew tasks --all и ищите assemble
Если нужно — добавлю готовые шаблоны build.gradle.kts, примеры proguard-rules или шаги CI для сборки конкретных variant'ов.