Το build.gradle είναι το κύριο αρχείο δόμησης ενός Android έργου στο Gradle, το οποίο περιέχει οδηγίες για μεταγλώττιση, συσκευασία και υπογραφή της εφαρμογής. Κάθε module στο έργο έχει το δικό του build.gradle: ένα σε επίπεδο έργου (project-level) και ένα για κάθε module (module-level). Σύμφωνα με το Google Android Developers, 2025, η σωστή διαμόρφωση του build.gradle επιταχύνει τη δόμηση έως 40% και εξαλείφει τις συγκρούσεις εξαρτήσεων. Η σύνταξη υποστηρίζει δύο γλώσσες: Groovy (build.gradle) και Kotlin DSL (build.gradle.kts).
Βασικά σημεία
build.gradle είναι ένα σενάριο δόμησης στη γλώσσα Groovy (επέκταση .gradle) ή Kotlin (.gradle.kts) που διαχειρίζεται όλες τις πτυχές μεταγλώττισης μιας εφαρμογής Android. Το Gradle είναι ένα αυτόματο σύστημα δόμησης που υιοθετήθηκε από την Google το 2013 ως πρότυπο για Android. Το build.gradle περιγράφει: ποια πρόσθετα εφαρμόζονται (Android, Kotlin, βιβλιοθήκες), ποιες εξαρτήσεις συνδέονται, ποιες εκδόσεις SDK χρησιμοποιούνται, πώς να υπογράψετε την εφαρμογή και πού να δημοσιεύσετε.
Η διαδικασία δόμησης περιλαμβάνει τρεις φάσεις: Initialization (καθορισμός module), Configuration (εκτέλεση σεναρίων build.gradle), Execution (εκτέλεση εργασιών). Το build.gradle εκτελείται στη φάση Configuration, όταν το Gradle δημιουργεί το γράφημα εργασιών. Σε αυτό το σημείο καθορίζονται τα Build Variants, υπολογίζονται οι εξαρτήσεις και διαμορφώνονται οι εργασίες. Σημαντικό: το build.gradle είναι κώδικας, όχι απλώς διαμόρφωση. Μπορεί να περιέχει συνθήκες, βρόχους, κλήσεις μεθόδων και εξωτερικά σενάρια.
Τα αρχεία Gradle αποθηκεύονται στη ρίζα του module (app/build.gradle) και στη ρίζα του έργου (build.gradle). Επιπλέον, το Gradle υποστηρίζει apply from — σύνδεση εξωτερικών σεναρίων Gradle. Αυτό επιτρέπει την εξαγωγή επαναλαμβανόμενης λογικής σε αρχεία με κοινές ρυθμίσεις. Με την εμφάνιση των Convention Plugins (AGP 7+), το apply from θεωρείται παρωχημένο — τα Convention Plugins παρέχουν έναν type-safe και σύνθετο τρόπο επαναχρησιμοποίησης της διαμόρφωσης μεταξύ module.
Από το 2013, η σύνταξη του build.gradle έχει υποστεί σημαντικές αλλαγές: από το Groovy με δυναμικές διαμορφώσεις έως το Kotlin DSL με ελέγχους σε χρόνο μεταγλώττισης. Το AGP εξελίχθηκε από την έκδοση 1.0 στην 8.7 (2025). Βασικά ορόσημα: AGP 3.0 (Java 8 desugar, new variant API), AGP 4.0 (view binding, Java 11), AGP 7.0 (Kotlin DSL προεπιλεγμένο, Java 11 min), AGP 8.0 (non-transitive R classes, διαμόρφωση δόμησης σε Kotlin), AGP 8.7 (KSP αντί kapt, γρήγορη διαμόρφωση).
Project-level build.gradle (ρίζα) καθορίζει τα πρόσθετα, τα αποθετήρια και τις διαμορφώσεις κοινές για όλα τα module. Κύρια μπλοκ: plugins (σύνδεση πρόσθετων Gradle), repositories (πηγές εξαρτήσεων: mavenCentral, google, jitpack). Στη ρίζα build.gradle συνήθως δεν υπάρχει μπλοκ android — εμφανίζεται στα module. Το Project-level μπορεί επίσης να περιέχει μπλοκ subprojects για κοινή διαμόρφωση όλων των υποέργων, αν και τα Convention Plugins είναι προτιμότερα.
Module-level build.gradle (π.χ., app/build.gradle) περιγράφει ένα συγκεκριμένο module. Αν το module είναι εφαρμογή, εφαρμόζει το πρόσθετο com.android.application. Αν είναι βιβλιοθήκη — com.android.library. Στο module-level βρίσκονται: το μπλοκ android (compileSdk, defaultConfig, buildTypes, productFlavors), το μπλοκ dependencies (εξαρτήσεις module) και προαιρετικά μπλοκ για διαμόρφωση δοκιμών και δόμησης. Το Module-level εκτελείται μετά το project-level και μπορεί να παρακάμψει κοινές ρυθμίσεις.
Από το AGP 8.0, η ρίζα build.gradle μπορεί να χρησιμοποιεί version catalogs (libs.versions.toml) για κεντρική διαχείριση εκδόσεων εξαρτήσεων. Το version catalog είναι ένα αρχείο στον κατάλογο gradle/ που περιέχει εκδόσεις, βιβλιοθήκες και πρόσθετα. Στο build.gradle, οι εξαρτήσεις συνδέονται μέσω libs: implementation(libs.retrofit). Τα version catalogs είναι υποχρεωτικά για νέα έργα και συνιστώνται για όλα τα έργα με τρία ή περισσότερα module.
// settings.gradle.kts — ρίζα έργου
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
// build.gradle.kts (επίπεδο έργου)
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 (επίπεδο module)
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 είναι μια δυναμική γλώσσα JVM που ήταν η αρχική σύνταξη του Gradle. Τα σενάρια Groovy (.gradle) χρησιμοποιούν δυναμική τυποποίηση: οι τύποι μπορούν να παραλειφθούν, τα εισαγωγικά μπορούν να χρησιμοποιηθούν ή όχι, μέθοδοι που δεν υπάρχουν στη φάση μεταγλώττισης μπορούν να κληθούν. Η ευελιξία του Groovy είναι επίσης το μειονέκτημά του: το IDE δεν μπορεί να ελέγξει τη σύνταξη και τους τύπους πριν από την εκτέλεση του σεναρίου, οδηγώντας σε σφάλματα χρόνου εκτέλεσης με λανθασμένο όνομα παραμέτρου ή τύπο.
Kotlin DSL (.gradle.kts) χρησιμοποιεί τη στατική τυποποίηση του Kotlin. Το IDE ελέγχει τους τύπους, προτείνει διαθέσιμες παραμέτρους μέσω αυτόματης συμπλήρωσης και επισημαίνει σφάλματα στη φάση επεξεργασίας. Το Kotlin DSL είναι πιο αργό στη φάση Configuration (λόγω μεταγλώττισης αρχείων .kts σε bytecode), αλλά η Google βελτιώνει συνεχώς την απόδοση: το AGP 8.5+ χρησιμοποιεί Gradle Configuration Cache και Caching Kotlin DSL compilation, μειώνοντας τη διαφορά σε 1-2 δευτερόλεπτα.
Η Google συνιστά Kotlin DSL για όλα τα νέα έργα και σταδιακή μετεγκατάσταση υπαρχόντων έργων. Η μετεγκατάσταση από Groovy σε Kotlin DSL είναι απλή: τα εισαγωγικά αντικαθίστανται από παρενθέσεις, προστίθενται τύποι, οι τελεστές μετατρέπονται σε συναρτήσεις. Οι περισσότερες βιβλιοθήκες παρέχουν παραδείγματα Kotlin DSL στην τεκμηρίωση. Για σύνθετες περιπτώσεις (Custom Plugin, Task Graph), το Kotlin DSL παρέχει type-safe API και αποτρέπει σφάλματα που στο Groovy ανακαλύπτονται μόνο κατά το χρόνο εκτέλεσης. Τα version catalogs (libs.versions.toml) λειτουργούν το ίδιο και με τις δύο συντάξεις.
| Χαρακτηριστικό | Groovy (.gradle) | Kotlin DSL (.gradle.kts) |
|---|---|---|
| Τυποποίηση | Δυναμική | Στατική |
| Έλεγχος IDE | Περιορισμένος | Πλήρης (αυτόματη συμπλήρωση, τύποι) |
| Ταχύτητα διαμόρφωσης | Γρηγορότερη (χωρίς μεταγλώττιση) | Αργότερη (μεταγλώττιση .kts) |
| Σφάλματα | Χρόνου εκτέλεσης | Χρόνου μεταγλώττισης |
| Σύσταση | Μόνο παλιά έργα | Νέα έργα και μετεγκατάσταση |
Μπλοκ android — το κεντρικό στοιχείο του module-level build.gradle. Μέσα σε αυτό διαμορφώνονται: namespace (για R και BuildConfig), compileSdk, defaultConfig, buildTypes, productFlavors, sourceSets, compileOptions, packaging, bundle. Όλες οι παράμετροι του μπλοκ android ισχύουν μόνο για module Android. Αν το module είναι βιβλιοθήκη, αντί για εφαρμογή χρησιμοποιείται το πρόσθετο βιβλιοθήκης και δεν υπάρχει applicationId στο μπλοκ android.
compileSdk — η έκδοση SDK με την οποία μεταγλωττίζεται ο κώδικας. Πρέπει να είναι ίση με το πιο πρόσφατο Android API (κατά τη σύνταξη — 35). minSdk — η ελάχιστη έκδοση API για υποστήριξη. targetSdk — η έκδοση στην οποία στοχεύει η εφαρμογή (οι αλλαγές συμπεριφοράς αυτής της έκδοσης εφαρμόζονται). Διαφορά μεταξύ compileSdk και targetSdk: το compileSdk καθορίζει τα διαθέσιμα API, το targetSdk — τη συμπεριφορά χρόνου εκτέλεσης. Σύσταση: compileSdk = latest, targetSdk = latest - 1 (για δοκιμή προσαρμογής σε νέες αλλαγές).
compileOptions ορίζει τη συμβατότητα Java: sourceCompatibility και targetCompatibility. Το AGP 8+ απαιτεί Java 17+ για μεταγλώττιση. packaging διαχειρίζεται τη συμπερίληψη αρχείων από βιβλιοθήκες: exclude, merge, pickFirst για επίλυση συγκρούσεων META-INF. buildFeatures ενεργοποιεί/απενεργοποιεί τα ViewBinding, DataBinding, Compose. aaptOptions διαμορφώνει την επεξεργασία πόρων: ignoreAssetsPattern, cruncherEnabled. Κάθε στοιχείο του μπλοκ android βελτιστοποιεί μια συγκεκριμένη πτυχή της δόμησης.
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
}
}
Εξαρτήσεις στο build.gradle είναι οι βιβλιοθήκες και τα module που συνδέονται στο έργο. Το μπλοκ dependencies βρίσκεται στο ίδιο επίπεδο με το μπλοκ android. Το Gradle υποστηρίζει διάφορες διαμορφώσεις: implementation (βιβλιοθήκη διαθέσιμη σε αυτό το module, μη μεταβατική), api (βιβλιοθήκη μεταβατικά διαθέσιμη σε εξαρτώμενα module), compileOnly (μόνο για μεταγλώττιση, δεν περιλαμβάνεται στο APK), runtimeOnly (μόνο σε χρόνο εκτέλεσης), annotationProcessor / ksp (επεξεργαστές σχολιασμών), testImplementation (μόνο για δοκιμές), androidTestImplementation (μόνο για ενόργανες δοκιμές).
Από το AGP 8.0, Non-Transitive R classes — κάθε βιβλιοθήκη έχει τη δική της κλάση R, αποτρέποντας συγκρούσεις πόρων. Στο μπλοκ dependencies είναι σημαντικό να χρησιμοποιείτε σωστές διαμορφώσεις: το implementation δεν αποκαλύπτει μεταβατικές εξαρτήσεις, επιταχύνοντας τη δόμηση. Το api αποκαλύπτει — χρησιμοποιείται όταν η βιβλιοθήκη εξάγει τύπους από άλλη βιβλιοθήκη (π.χ., το Retrofit χρησιμοποιεί τύπους OkHttp στο δημόσιο API του).
Για τη διαχείριση εκδόσεων συνιστάται η χρήση BOM (Bill of Materials) — ενός αρχείου δόμησης που καθορίζει συμβατές εκδόσεις βιβλιοθηκών. Firebase BOM: implementation(platform("com.google.firebase:firebase-bom:33.0.0")). Μετά τη σύνδεση BOM, μπορεί να καθοριστεί μόνο το όνομα βιβλιοθήκης χωρίς έκδοση — το BOM θα επιλέξει αυτόματα τη συμβατή έκδοση. Αυτό εξαλείφει συγκρούσεις μεταξύ μεταβατικών εξαρτήσεων διαφορετικών βιβλιοθηκών. Το BOM είναι διαθέσιμο για Firebase, Compose, Kotlin, Ktor, AndroidX.
dependencies {
// BOM — διαχείριση εκδόσεων
implementation(platform("androidx.compose:compose-bom:2024.12.01"))
implementation(platform("com.google.firebase:firebase-bom:33.0.0"))
// AndroidX και 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)
implementation("com.google.firebase:firebase-firestore")
implementation("com.google.firebase:firebase-crashlytics")
// Δοκιμές
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
}
Σε πολυαρθρωτικά έργα, κάθε module έχει το δικό του build.gradle. Για τη σύνδεση ενός module με ένα άλλο, χρησιμοποιείται η σύνταξη implementation(project(":module-name")). Το Gradle δημιουργεί αυτόματα το module αν η διαμόρφωσή του έχει αλλάξει. Η πολυαρθρωτική αρχιτεκτονική βελτιώνει τον χρόνο δόμησης (σταδιακή δόμηση, παραλληλισμός) και διαχωρίζει την ευθύνη μεταξύ module λειτουργιών, βασικών module και βιβλιοθηκών.
Το βασικό πρόβλημα των πολυαρθρωτικών έργων — διπλασιασμός διαμόρφωσης. Αν 10 module έχουν τα ίδια minSdk, compileSdk και εξαρτήσεις Compose, αυτό σημαίνει 10 αντίγραφα σε διαφορετικά build.gradle. Η λύση — Convention Plugins (πρώην buildSrc). Το Convention Plugin είναι ένα πρόσθετο Gradle γραμμένο σε Kotlin που εφαρμόζεται σε module: plugins { id("myapp.android.library") }. Το πρόσθετο περιέχει κοινή διαμόρφωση και οι αλλαγές εφαρμόζονται άμεσα σε όλα τα module.
Για την οργάνωση Convention Plugins χρησιμοποιείται ο κατάλογος build-logic/ στη ρίζα του έργου. Περιέχει includeBuild στο settings.gradle και πρόσθετα Kotlin. Τα Convention Plugins μπορούν να δημοσιευτούν σε αποθετήριο maven για επαναχρησιμοποίηση μεταξύ έργων. Η Google συνιστά τα Convention Plugins ως πρότυπο για πολυαρθρωτικά έργο, αντικαθιστώντας τα subprojects { } και apply from. Η μετάβαση σε Convention Plugins μειώνει το build.gradle του module σε 10-15 γραμμές.
// 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 — μετά το Convention Plugin
plugins {
id("myapp.android.library")
}
dependencies {
implementation(project(":core:network"))
}
Συχνές ερωτήσεις
Kotlin DSL (.gradle.kts) — η επίσημη σύσταση της Google. Η στατική τυποποίηση αποτρέπει σφάλματα, το IDE παρέχει αυτόματη συμπλήρωση. Το Groovy (.gradle) υποστηρίζεται, αλλά οι νέες λειτουργίες Gradle και AGP δοκιμάζονται πρώτα στο Kotlin DSL.
namespace καθορίζει το πακέτο για τις παραγόμενες κλάσεις (R.java, BuildConfig). Προηγουμένως, το namespace καθοριζόταν στο AndroidManifest.xml. Από το AGP 7+, το namespace καθορίζεται μόνο στο build.gradle. Η τιμή πρέπει να συμπίπτει με το applicationId (ή να διαφέρει αν χρησιμοποιείται applicationIdSuffix).
Ενεργοποιήστε το Gradle Configuration Cache (org.gradle.configuration-cache=true), χρησιμοποιήστε το Build Cache (org.gradle.caching=true), μεταβείτε σε KSP αντί kapt, χωρίστε το πολυαρθρωτικό έργο και χρησιμοποιήστε Convention Plugins. Επίσης, απενεργοποιήστε τα περιττά product flavors: στη δόμηση διαφθοράς δημιουργήστε μόνο ένα flavor.
implementation: η εξάρτηση είναι ορατή μόνο εντός του module. Τα εξαρτώμενα module δεν έχουν πρόσβαση σε μεταβατικές κλάσεις. api: η εξάρτηση αποκαλύπτεται προς τα έξω. Χρησιμοποιήστε api όταν τύποι από την εξάρτηση χρησιμοποιούνται στο δημόσιο API του module (π.χ., το Retrofit εξάγει τύπους OkHttp). Το implementation επιταχύνει τη δόμηση — το Gradle δεν αναδομεί τα εξαρτώμενα module όταν αλλάζει η εξάρτηση implementation.
Το build.gradle είναι ένα αρχείο ειδικό για Android. Για iOS χρησιμοποιείται Xcode project (.xcodeproj) και Swift Package Manager (Package.swift). Ωστόσο, υπάρχουν εργαλεία πολλαπλών πλατφορμών (Kotlin Multiplatform, Flutter, React Native) όπου το build.gradle χρησιμοποιείται για τη δόμηση του τμήματος Android. Στο KMP, το build.gradle διαμορφώνει τον στόχο Android.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης