Урок по треку Android 7 мин

Сборка Gradle за 7 минут

Модули, build types и flavors, version catalog, KSP, R8 и ускорение сборки.

Сборку спрашивают реже, чем Compose, но на middle и senior без неё не обойтись: долгая сборка стоит команде часов в день. Нужно понимать структуру проекта, варианты сборки, version catalog, KSP и способы ускорения.

Структура

settings.gradle.kts      // какие модули входят в проект, репозитории плагинов
build.gradle.kts         // корневой: объявление плагинов (apply false)
gradle/libs.versions.toml // version catalog
app/build.gradle.kts     // модуль приложения: com.android.application
core/network/build.gradle.kts // библиотека: com.android.library
gradle.properties        // флаги Gradle и AGP

Сборка проходит три фазы: инициализация (читается settings, определяются модули), конфигурация (выполняются все build.gradle.kts, строится граф задач), выполнение (запускаются нужные задачи). Тяжёлая логика в скриптах замедляет конфигурацию при каждом запуске.

Android Gradle Plugin (AGP) добавляет задачи компиляции, слияния ресурсов и манифестов, dex, упаковки. Версии AGP, Gradle и Kotlin должны быть совместимы.

Модуль приложения

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.compose)
    alias(libs.plugins.ksp)
    alias(libs.plugins.hilt)
}

android {
    namespace = "ru.example.app"
    compileSdk = 36

    defaultConfig {
        applicationId = "ru.example.app"
        minSdk = 24
        targetSdk = 36
        versionCode = 42
        versionName = "1.8.0"
    }

    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
}

dependencies {
    implementation(platform(libs.compose.bom))
    implementation(libs.compose.material3)
    ksp(libs.hilt.compiler)
    testImplementation(libs.junit)
}
  • compileSdk: против какой версии API компилируется код (какие API доступны в коде).
  • minSdk: минимальная версия устройства, ниже установить нельзя.
  • targetSdk: под какое поведение платформы приложение протестировано; система включает изменения поведения новых версий только если targetSdk не ниже. Google Play требует свежий targetSdk для публикации обновлений.
  • versionCode целое число, должно расти с каждой загрузкой в Play; versionName строка для людей.
  • Kotlin 2.0+ подключает компилятор Compose плагином org.jetbrains.kotlin.plugin.compose, версия совпадает с версией Kotlin.

Варианты сборки

Build types (debug, release, свой benchmark): как собирать (оптимизация, подпись, отладка). Product flavors (free/paid, prod/staging): что собирать (разный applicationId, ресурсы, URL сервера). Вариант это комбинация: stagingDebug, prodRelease. Для каждого варианта свой source set (src/staging/), свои зависимости (stagingImplementation) и поля buildConfigField.

Зависимости

  • implementation: зависимость видна только этому модулю, изменения в ней не перекомпилируют потребителей модуля.
  • api (в библиотеках): зависимость транзитивно видна потребителям; удобно, но ухудшает инкрементальность.
  • compileOnly, runtimeOnly, testImplementation, androidTestImplementation, debugImplementation (например, LeakCanary).
  • platform(bom): BOM задаёт согласованные версии группы библиотек (Compose BOM, Firebase BOM).

Version catalog libs.versions.toml: версии и координаты в одном месте, типобезопасный доступ libs.compose.material3, удобно в многомодульном проекте. Общую конфигурацию модулей выносят в convention plugins (build-logic), а не в subprojects {} и allprojects {}.

KSP вместо kapt

kapt запускает обработчики аннотаций Java, для этого генерирует Java-заглушки Kotlin-кода, это медленно. KSP (Kotlin Symbol Processing) работает с Kotlin-кодом напрямую, обычно в разы быстрее и поддерживает K2. Room, Hilt (Dagger), Moshi, Glide поддерживают KSP. kapt находится в режиме поддержки.

Как ускорить сборку

  • Configuration cache: кеш графа задач между запусками (org.gradle.configuration-cache=true).
  • Build cache: повторное использование выходов задач (org.gradle.caching=true), удалённый кеш для CI и команды.
  • Параллельное выполнение модулей (org.gradle.parallel=true) и модульность с implementation.
  • KSP вместо kapt, отказ от лишних обработчиков аннотаций.
  • Достаточно памяти демону (org.gradle.jvmargs).
  • Не делать тяжёлую работу на этапе конфигурации, не вычислять версии из git в каждом скрипте.
  • Build Analyzer в Android Studio и Build Scan показывают, что тормозит.

Подпись

Release подписывается ключом загрузки (upload key), а в Play включён Play App Signing: Google хранит ключ подписи приложения. Ключи и пароли не коммитят: их передают через переменные окружения или local.properties в CI.

Частые ошибки

  • Путать compileSdk, targetSdk и minSdk.
  • api вместо implementation везде.
  • kapt в новом проекте.
  • Логика с сетью или git в фазе конфигурации.
  • Ключи подписи и секреты в репозитории.
  • Разные версии одной библиотеки в модулях без catalog и BOM.

Что спросят на собесе

  • Чем отличаются compileSdk, minSdk и targetSdk?
  • Build types против product flavors.
  • implementation против api.
  • Что такое version catalog и convention plugins?
  • Почему KSP быстрее kapt?
  • Как ускорить сборку большого проекта?

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.