Сборку спрашивают реже, чем 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?
- Как ускорить сборку большого проекта?