build.gradle is het belangrijkste buildbestand van een Android-project in Gradle, dat instructies bevat voor compilatie, verpakking en ondertekening van de app. Elke module in het project heeft een eigen build.gradle: één op projectniveau (project-level) en één voor elke module (module-level). Volgens Google Android Developers, 2025 versnelt een correcte configuratie van build.gradle de build met tot 40% en elimineert het conflicten tussen afhankelijkheden. De syntaxis ondersteunt twee talen: Groovy (build.gradle) en Kotlin DSL (build.gradle.kts).
Belangrijkste punten
build.gradle is een buildscript in de taal Groovy (.gradle extensie) of Kotlin (.gradle.kts) dat alle aspecten van de compilatie van een Android-app beheert. Gradle is een automatisch buildsysteem dat in 2013 door Google als standaard voor Android is aangenomen. build.gradle beschrijft: welke plugins zijn toegepast (Android, Kotlin, bibliotheken), welke afhankelijkheden zijn verbonden, welke SDK-versies worden gebruikt, hoe de app te ondertekenen en waar te publiceren.
Het buildproces omvat drie fasen: Initialization (bepalen van modules), Configuration (uitvoeren van build.gradle-scripts), Execution (uitvoeren van taken). build.gradle wordt uitgevoerd in de Configuration-fase, wanneer Gradle de taakgraaf maakt. Op dit moment worden Build Variants bepaald, afhankelijkheden berekend en taken geconfigureerd. Belangrijk: build.gradle is code, niet alleen configuratie. Het kan condities, lussen, methodeaanroepen en externe scripts bevatten.
Gradle-bestanden worden opgeslagen in de root van de module (app/build.gradle) en de root van het project (build.gradle). Bovendien ondersteunt Gradle apply from — het aansluiten van externe Gradle-scripts. Dit maakt het mogelijk om herhalende logica te verplaatsen naar bestanden met gedeelde instellingen. Met de komst van Convention Plugins (AGP 7+) wordt apply from als verouderd beschouwd — Convention Plugins bieden een type-safe en samengestelde manier om configuratie tussen modules te hergebruiken.
Sinds 2013 heeft de syntaxis van build.gradle aanzienlijke veranderingen ondergaan: van Groovy met dynamische configuraties tot Kotlin DSL met compile-time controles. AGP is geëvolueerd van versie 1.0 naar 8.7 (2025). Belangrijke mijlpalen: AGP 3.0 (Java 8 desugar, new variant API), AGP 4.0 (view binding, Java 11), AGP 7.0 (Kotlin DSL standaard, Java 11 min), AGP 8.0 (non-transitive R classes, build config in Kotlin), AGP 8.7 (KSP in plaats van kapt, snelle configuratie).
Project-level build.gradle (root) bepaalt de plugins, repositories en configuraties die gemeenschappelijk zijn voor alle modules. Belangrijkste blokken: plugins (aansluiten van Gradle-plugins), repositories (bronnen van afhankelijkheden: mavenCentral, google, jitpack). In de root build.gradle is er meestal geen android-blok — dit verschijnt in de modules. Project-level kan ook het subprojects-blok bevatten voor gemeenschappelijke configuratie van alle subprojecten, hoewel Convention Plugins de voorkeur hebben.
Module-level build.gradle (bijv. app/build.gradle) beschrijft een specifieke module. Als de module een app is, past hij de plugin com.android.application toe. Als het een bibliotheek is — com.android.library. In module-level bevinden zich: het android-blok (compileSdk, defaultConfig, buildTypes, productFlavors), het dependencies-blok (afhankelijkheden van de module) en optionele blokken voor het configureren van tests en builds. Module-level wordt uitgevoerd na project-level en kan gemeenschappelijke instellingen overschrijven.
Vanaf AGP 8.0 kan de root build.gradle version catalogs (libs.versions.toml) gebruiken voor gecentraliseerd beheer van afhankelijkheidsversies. Een version catalog is een bestand in de gradle/ map dat versies, bibliotheken en plugins bevat. In build.gradle worden afhankelijkheden via libs aangesloten: implementation(libs.retrofit). Version catalogs zijn verplicht voor nieuwe projecten en aanbevolen voor alle projecten met drie of meer modules.
// settings.gradle.kts — projectroot
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
// build.gradle.kts (projectniveau)
plugins {
id("com.android.application") version "8.7.0" apply false
id("org.jetbrains.kotlin.android") version "2.0.21" apply false
}
// app/build.gradle.kts (moduleniveau)
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("com.google.devtools.ksp")
}
android {
namespace = "com.example.myapp"
compileSdk = 35
defaultConfig {
applicationId = "com.example.myapp"
minSdk = 26
targetSdk = 35
versionCode = 1
versionName = "1.0.0"
}
}
Groovy is een dynamische JVM-taal die de oorspronkelijke syntaxis van Gradle was. Groovy-scripts (.gradle) gebruiken dynamische typering: types kunnen worden weggelaten, aanhalingstekens kunnen wel of niet worden gebruikt, methoden die niet bestaan in de compile-fase kunnen worden aangeroepen. De flexibiliteit van Groovy is ook het nadeel: de IDE kan de syntaxis en types niet controleren vóór uitvoering van het script, wat leidt tot runtime-fouten bij een verkeerde parameternaam of type.
Kotlin DSL (.gradle.kts) gebruikt de statische typering van Kotlin. De IDE controleert types, suggereert beschikbare parameters via autocomplete en markeert fouten in de bewerkingsfase. Kotlin DSL is langzamer in de Configuration-fase (vanwege compilatie van .kts-bestanden naar bytecode), maar Google verbetert continu de prestaties: AGP 8.5+ gebruikt Gradle Configuration Cache en Caching Kotlin DSL compilation, wat het verschil terugbrengt tot 1-2 seconden.
Google beveelt Kotlin DSL aan voor alle nieuwe projecten en geleidelijke migratie van bestaande projecten. Migratie van Groovy naar Kotlin DSL is eenvoudig: aanhalingstekens worden vervangen door haakjes, types worden toegevoegd, operatoren worden omgezet in functies. De meeste bibliotheken bieden Kotlin DSL-voorbeelden in de documentatie. Voor complexe gevallen (Custom Plugin, Task Graph) biedt Kotlin DSL een type-safe API en voorkomt fouten die in Groovy alleen in runtime worden ontdekt. Version catalogs (libs.versions.toml) werken hetzelfde met beide syntaxissen.
| Kenmerk | Groovy (.gradle) | Kotlin DSL (.gradle.kts) |
|---|---|---|
| Typering | Dynamisch | Statisch |
| IDE-controle | Beperkt | Volledig (autocomplete, types) |
| Snelheid configuratie | Sneller (geen compilatie) | Langzamer (.kts compilatie) |
| Fouten | Runtime | Compile-time |
| Aanbeveling | Alleen oude projecten | Nieuwe projecten en migratie |
Het android-blok — het centrale element van module-level build.gradle. Binnenin worden geconfigureerd: namespace (voor R en BuildConfig), compileSdk, defaultConfig, buildTypes, productFlavors, sourceSets, compileOptions, packaging, bundle. Alle parameters van het android-blok zijn alleen van toepassing op Android-modules. Als de module een bibliotheek is, wordt in plaats van de app de bibliotheek-plugin gebruikt en is er geen applicationId in het android-blok.
compileSdk — de SDK-versie waarmee de code wordt gecompileerd. Moet gelijk zijn aan de nieuwste Android API (op het moment van schrijven — 35). minSdk — de minimale API-versie voor ondersteuning. targetSdk — de versie waarop de app is gericht (gedragsveranderingen van deze versie worden toegepast). Het verschil tussen compileSdk en targetSdk: compileSdk bepaalt de beschikbare API's, targetSdk — het runtime-gedrag. Aanbeveling: compileSdk = latest, targetSdk = latest - 1 (voor het testen van aanpassing aan nieuwe wijzigingen).
compileOptions stelt Java-compatibiliteit in: sourceCompatibility en targetCompatibility. AGP 8+ vereist Java 17+ voor compilatie. packaging beheert het opnemen van bestanden uit bibliotheken: exclude, merge, pickFirst voor het oplossen van META-INF-conflicten. buildFeatures schakelt ViewBinding, DataBinding, Compose in/uit. aaptOptions configureert de verwerking van bronnen: ignoreAssetsPattern, cruncherEnabled. Elk element van het android-blok optimaliseert een specifiek aspect van de build.
android {
namespace = "com.example.myapp"
compileSdk = 35
buildToolsVersion = "35.0.0"
defaultConfig {
applicationId = "com.example.myapp"
minSdk = 26
targetSdk = 35
versionCode = 5
versionName = "2.3.1"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
getByName("debug") { isDebuggable = true }
getByName("release") {
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"))
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
buildFeatures {
viewBinding = true
compose = true
}
}
Afhankelijkheden in build.gradle zijn bibliotheken en modules die aan het project worden gekoppeld. Het dependencies-blok bevindt zich op hetzelfde niveau als het android-blok. Gradle ondersteunt verschillende configuraties: implementation (bibliotheek is beschikbaar in deze module, niet transitief), api (bibliotheek is transitief beschikbaar voor afhankelijke modules), compileOnly (alleen voor compilatie, niet opgenomen in APK), runtimeOnly (alleen in runtime), annotationProcessor / ksp (annotatieverwerkers), testImplementation (alleen voor tests), androidTestImplementation (alleen voor instrumentele tests).
Vanaf AGP 8.0 hebben Non-Transitive R classes — elke bibliotheek heeft zijn eigen R-klasse, wat resourceconflicten voorkomt. In het dependencies-blok is het belangrijk om de juiste configuraties te gebruiken: implementation onthult geen transitieve afhankelijkheden, wat de build versnelt. api onthult — wordt gebruikt wanneer de bibliotheek types uit een andere bibliotheek exporteert (bijv. Retrofit gebruikt OkHttp-types in zijn publieke API).
Voor versiebeheer wordt aanbevolen om BOM (Bill of Materials) te gebruiken — een buildbestand dat compatibele versies van bibliotheken bepaalt. Firebase BOM: implementation(platform("com.google.firebase:firebase-bom:33.0.0")). Na het aansluiten van BOM kan alleen de bibliotheeknaam zonder versie worden opgegeven — BOM selecteert automatisch de compatibele versie. Dit elimineert conflicten tussen transitieve afhankelijkheden van verschillende bibliotheken. BOM is beschikbaar voor Firebase, Compose, Kotlin, Ktor, AndroidX.
dependencies {
// BOM — versiebeheer
implementation(platform("androidx.compose:compose-bom:2024.12.01"))
implementation(platform("com.google.firebase:firebase-bom:33.0.0"))
// AndroidX en Compose
implementation("androidx.core:core-ktx")
implementation("androidx.lifecycle:lifecycle-runtime-ktx")
implementation("androidx.activity:activity-compose")
implementation("androidx.compose.ui:ui")
// Network
implementation("com.squareup.retrofit2:retrofit:2.11.0")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
// Firebase (BOM-versies)
implementation("com.google.firebase:firebase-firestore")
implementation("com.google.firebase:firebase-crashlytics")
// Testen
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
}
In multimodulaire projecten heeft elke module zijn eigen build.gradle. Voor het koppelen van de ene module aan de andere wordt de syntaxis implementation(project(":module-name")) gebruikt. Gradle bouwt de module automatisch als de configuratie is gewijzigd. Multimodulaire architectuur verbetert de buildtijd (incrementele build, parallellisme) en verdeelt de verantwoordelijkheid tussen feature-modules, core-modules en bibliotheken.
Het belangrijkste probleem van multimodulaire projecten — duplicatie van configuratie. Als 10 modules dezelfde minSdk, compileSdk en Compose-afhankelijkheden hebben, zijn dat 10 kopieën in verschillende build.gradle-bestanden. De oplossing — Convention Plugins (voorheen buildSrc). Convention Plugin is een Gradle-plugin geschreven in Kotlin die wordt toegepast op modules: plugins { id("myapp.android.library") }. De plugin bevat de gemeenschappelijke configuratie en wijzigingen worden onmiddellijk toegepast op alle modules.
Voor het organiseren van Convention Plugins wordt de map build-logic/ in de projectroot gebruikt. Deze bevat includeBuild in settings.gradle en Kotlin-plugins. Convention Plugins kunnen worden gepubliceerd in een maven-repository voor hergebruik tussen projecten. Google beveelt Convention Plugins aan als standaard voor multimodulaire projecten, ter vervanging van subprojects { } en apply from. De overstap naar Convention Plugins reduceert de build.gradle van een module tot 10-15 regels.
// build-logic/src/main/kotlin/AndroidLibraryConventionPlugin.kt
class AndroidLibraryConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(plugins) {
apply("com.android.library")
apply("org.jetbrains.kotlin.android")
}
extensions.configure<CommonExtension<*, *, *, *>> {
compileSdk = 35
defaultConfig { minSdk = 26 }
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
}
}
}
// module/build.gradle.kts — na Convention Plugin
plugins {
id("myapp.android.library")
}
dependencies {
implementation(project(":core:network"))
}
Veelgestelde vragen
Kotlin DSL (.gradle.kts) — de officiële aanbeveling van Google. Statische typering voorkomt fouten, de IDE biedt automatische aanvulling. Groovy (.gradle) wordt ondersteund, maar nieuwe features van Gradle en AGP worden in de eerste plaats getest op Kotlin DSL.
namespace bepaalt het pakket voor gegenereerde klassen (R.java, BuildConfig). Voorheen werd namespace opgegeven in AndroidManifest.xml. Vanaf AGP 7+ wordt namespace alleen in build.gradle opgegeven. De waarde moet overeenkomen met applicationId (of verschillen als applicationIdSuffix wordt gebruikt).
Schakel Gradle Configuration Cache in (org.gradle.configuration-cache=true), gebruik Build Cache (org.gradle.caching=true), stap over op KSP in plaats van kapt, splits het multimodulaire project en gebruik Convention Plugins. Schakel ook onnodige product flavors uit: bouw in debug maar één flavor.
implementation: de afhankelijkheid is alleen zichtbaar binnen de module. Afhankelijke modules krijgen geen toegang tot transitieve klassen. api: de afhankelijkheid wordt naar buiten onthuld. Gebruik api wanneer types uit de afhankelijkheid worden gebruikt in de publieke API van de module (bijv. Retrofit exporteert OkHttp-types). implementation versnelt de build — Gradle bouwt afhankelijke modules niet opnieuw bij wijziging van een implementation-afhankelijkheid.
build.gradle is een Android-specifiek bestand. Voor iOS wordt Xcode project (.xcodeproj) en Swift Package Manager (Package.swift) gebruikt. Er bestaan echter cross-platform tools (Kotlin Multiplatform, Flutter, React Native) waarbij build.gradle wordt gebruikt voor het bouwen van het Android-gedeelte. In KMP configureert build.gradle de Android-target.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook