Как настроить 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.

Если нужно — добавлю готовые шаблоны build.gradle.kts, примеры proguard-rules или шаги CI для сборки конкретных variant'ов.