Irbisa · Шпаргалка
Gradle и модуляризация
Gradle KTS, каталоги версий, convention-плагины, KSP, варианты сборки, configuration cache, модули
Из каких Gradle-файлов состоит Android-проект и за что отвечает каждый?
// settings.gradle.ktspluginManagement { repositories { google() mavenCentral() gradlePluginPortal()…Что такое Android Lint и как заставить его ронять сборку, а не генерировать отчёт, который никто не читает?
// app/build.gradle.ktsandroid { lint { abortOnError = true // the default: errors fail the task warningsAsErrors = true baseline = file("lint-baseline.xml") // report only issues newer than this file…Что такое multidex, зачем он был нужен и нужен ли он сейчас?
Что выведет
./gradlew helloдля этого build-скрипта и что выведет./gradlew help?// build.gradle.ktsprintln("1: script body") tasks.register("hello") { println("2: configuring hello") doLast { println("3: running hello") }} tasks.register("cleanup") { println("4: configuring cleanup")} println("5: end of script")В чём разница между
implementation,api,compileOnlyиruntimeOnly?// core/network/build.gradle.ktsdependencies { api(project(":core:model")) // `User` from :core:model is in this module's public API implementation(libs.retrofit) // used inside, never exposed compileOnly(libs.javax.annotation) // annotations only, not packaged runtimeOnly(libs.slf4j.android) // a backend nobody imports…Что такое version catalog и зачем рядом с ним всё равно нужен BOM?
// gradle/libs.versions.toml// [versions]// composeBom = "2025.09.00"// retrofit = "3.0.0"//// [libraries]…В чём разница между build types и product flavors и как собрать staging-приложение со своим API URL и иконкой рядом с продакшеном?
android { namespace = "com.example.app" buildFeatures { buildConfig = true } // off by default since AGP 8 defaultConfig { applicationId = "com.example.app"…Сколько build variants даёт эта конфигурация и какие source sets компилирует
freePlayDebug?android { flavorDimensions += listOf("tier", "store") productFlavors { create("free") { dimension = "tier" } create("paid") { dimension = "tier" } create("play") { dimension = "store" } create("huawei") { dimension = "store" } } buildTypes { getByName("debug") getByName("release") create("qa") { initWith(getByName("release")) } }}Что происходит между
./gradlew assembleReleaseи подписанным APK?В чём разница между kapt и KSP и что даёт миграция?
// before:// plugins { id("org.jetbrains.kotlin.kapt") }// kapt(libs.room.compiler) plugins { alias(libs.plugins.android.library)…Как Gradle разрешает конфликты версий зависимостей и как разобраться с ошибкой «Duplicate class»?
// Who asked for it, and why did this version win?// ./gradlew :app:dependencyInsight --configuration releaseRuntimeClasspath --dependency okio dependencies { // one family, one version implementation(platform(libs.okhttp.bom))…Что делает Java toolchain в Android-сборке и что означает «Inconsistent JVM-target compatibility»?
kotlin { jvmToolchain(17) } android { compileOptions { // both must name the same level sourceCompatibility = JavaVersion.VERSION_17…Почему любое изменение в
buildSrcпереконфигурирует весь проект и что меняется, когда convention-плагины живут в included build?// settings.gradle.ktspluginManagement { includeBuild("build-logic") // a separate build, not a project dependency} // build-logic/convention/build.gradle.kts…Эта задача кодогенерации перезапускается на каждой сборке и падает при включённом configuration cache: что с ней не так и как это исправить?
tasks.register("generateConfig") { doLast { val dir = project.layout.buildDirectory.dir("generated/config").get().asFile dir.mkdirs() val url = System.getenv("API_URL") ?: "https://api.example.com" File(dir, "Config.kt").writeText("package com.example\n\nconst val API_URL = \"$url\"\n") }} tasks.named("preBuild") { dependsOn("generateConfig") }В чём разница между build cache и configuration cache и что мешает каждому из них срабатывать?
Gradle-сборка медленная: как выяснить почему и какие изменения обычно дают самый большой выигрыш?
# gradle.properties - change one thing at a time and measure againorg.gradle.caching=trueorg.gradle.configuration-cache=trueorg.gradle.parallel=trueorg.gradle.jvmargs=-Xmx6g -XX:+UseParallelGCkotlin.daemon.jvmargs=-Xmx3g…Когда разделение модуля на
:apiи:implускоряет сборку, а когда это лишний бойлерплейт?Как сделать разрешение зависимостей воспроизводимым, чтобы тот же коммит через месяц получил те же артефакты?
Что нужно сделать правильно при публикации Android-библиотеки в виде AAR в Maven-репозиторий?
// core/network/build.gradle.ktsplugins { alias(libs.plugins.android.library) `maven-publish`}…Как dynamic feature module меняет граф зависимостей и как базовое приложение открывает его экран?
// app/build.gradle.ktsandroid { dynamicFeatures += setOf(":feature:scan")} // feature/scan/build.gradle.kts - note the direction of the dependency…