Το Gradle είναι ένα σύστημα δόμησης που αυτοματοποιεί τη μεταγλώττιση, τη δοκιμή και τη συσκευασία εφαρμογών Android. Σε αντίθεση με το Apache Ant ή το Maven, υποστηρίζει σταδιακή δόμηση και προσωρινή αποθήκευση αποτελεσμάτων. Διαβάστε περισσότερα για τις δυνατότητες στην επίσημη τεκμηρίωση του Gradle. Από το 2013, το εργαλείο χρησιμοποιείται ως το τυπικό σύστημα δόμησης για έργα Android στο Android Studio.
Κύρια σημεία
Το Gradle είναι ένα εργαλείο αυτοματοποίησης δόμησης ανοιχτού κώδικα γραμμένο σε Java, που εκτελείται στο JVM. Λαμβάνει ως είσοδο πηγαίο κώδικα, εξαρτήσεις και πόρους, και ως έξοδο δίνει μια έτοιμη εφαρμογή — APK ή AAB για Android. Στον πυρήνα του Gradle βρίσκεται η έννοια του κατευθυνόμενου ακυκλικού γράφου εργασιών (DAG), όπου κάθε εργασία είναι μια ατομική μονάδα εργασίας και οι συνδέσεις μεταξύ τους καθορίζουν τη σειρά εκτέλεσης. Σε αντίθεση με το Make ή το Ant, το Gradle δεν απαιτεί μη αυτόματη περιγραφή της ακολουθίας βημάτων: αρκεί να δηλώσετε εξαρτήσεις μεταξύ εργασιών και το σύστημα θα χτίσει μόνο του τη βέλτιστη σειρά. Αυτή η προσέγγιση κάνει το Gradle ευέλικτο και κλιμακώσιμο για έργα οποιουδήποτε μεγέθους.
Το σύστημα χρησιμοποιεί τρεις φάσεις εκτέλεσης: αρχικοποίηση (καθορισμός συμμετεχόντων έργων), διαμόρφωση (χτίσιμο γράφου εργασιών) και εκτέλεση (εκκίνηση εργασιών με τη σωστή σειρά). Η φάση διαμόρφωσης είναι η βασική διαφορά του Gradle: ολόκληρο το σενάριο δόμησης εκτελείται πριν από την εκκίνηση των εργασιών, επιτρέποντας δυναμική αλλαγή του γράφου ανάλογα με τις συνθήκες. Αυτό δίνει τη δυνατότητα, για παράδειγμα, προσθήκης εργασιών μόνο για ορισμένες παραλλαγές δόμησης χωρίς διπλασιασμό κώδικα. Ο δομητής είναι γραμμένος σε Groovy, αλλά τα αρχεία διαμόρφωσης υποστηρίζουν δύο γλώσσες: Groovy DSL και Kotlin DSL.
Το πρόσθετο Android για το Gradle — com.android.application και com.android.library, τα οποία προσθέτουν εργασίες στο έργο για εργασία με εργαλεία Android. Όταν ο προγραμματιστής ξεκινά τη δόμηση, το Gradle εκτελεί διαδοχικά δεκάδες εργασίες: μεταγλώττιση Kotlin και Java μέσω javac ή kotlinc, επεξεργασία πόρων μέσω AAPT2, δημιουργία R.java, μεταγλώττιση bytecode σε DEX μέσω D8 ή R8, υπογραφή και συμπίεση APK. Κάθε εργασία ελέγχει αν τα δεδομένα εισόδου της έχουν αλλάξει και αν όχι — χρησιμοποιεί το προσωρινά αποθηκευμένο αποτέλεσμα. Αυτός ο μηχανισμός ονομάζεται σταδιακή δόμηση και επιταχύνει την επαναμεταγλώττιση κατά 60–80% σε σύγκριση με την πλήρη αναδόμηση.
Η διαμόρφωση της μονάδας Android ορίζεται στο μπλοκ android του αρχείου build.gradle.kts. Μέσα στο μπλοκ καθορίζονται compileSdk, minSdk, targetSdk, έκδοση εφαρμογής, υπογραφές και άλλες παράμετροι. Το Gradle δημιουργεί αυτόματα για κάθε μονάδα πολλές παραλλαγές δόμησης — συνδυασμό τύπου (release, debug) και γεύσης. Για παράδειγμα, για μια μονάδα με δύο γεύσεις και δύο τύπους, το Gradle δημιουργεί τέσσερις εργασίες: assembleDemoDebug, assembleDemoRelease, assembleFullDebug, assembleFullRelease. Όλες αυτές οι εργασίες μπορούν να εκτελεστούν ξεχωριστά ή να ξεκινήσουν με μία εντολή για όλες τις παραλλαγές ταυτόχρονα.
Κάθε έργο Android περιέχει δύο επίπεδα διαμόρφωσης: ριζικό build.gradle.kts (ρυθμίσεις για όλες τις μονάδες) και αρθρωτό build.gradle.kts (ρυθμίσεις για συγκεκριμένη μονάδα). Στο ριζικό αρχείο δηλώνονται πρόσθετα χωρίς εφαρμογή, αποθετήρια και κοινές μεταβλητές. Στο αρθρωτό αρχείο, τα πρόσθετα εφαρμόζονται στη συγκεκριμένη μονάδα και διαμορφώνονται οι παράμετροι δόμησης. Αυτή η προσέγγιση επιτρέπει κεντρική διαχείριση των εκδόσεων εξαρτήσεων μέσω καταλόγου εκδόσεων ή μπλοκ ext.
@Suppress("UnstableApiUsage")
plugins {
id("com.android.application") version "8.2.2"
id("org.jetbrains.kotlin.android") version "1.9.22"
}
android {
namespace = "com.example.myapp"
compileSdk = 34
defaultConfig {
applicationId = "com.example.myapp"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"
}
}Το μπλοκ dependencies — ένα άλλο κρίσιμο στοιχείο του build.gradle.kts. Σε αυτό αναφέρονται οι βιβλιοθήκες, οι μονάδες και οι εξαρτήσεις αρχείων που χρειάζεται η εφαρμογή. Το Gradle υποστηρίζει πολλές διαμορφώσεις εξάρτησης: implementation (προσβάσιμη μόνο στην τρέχουσα μονάδα), api (προσβάσιμη και σε εξαρτώμενες μονάδες), testImplementation (μόνο για δοκιμές), androidTestImplementation (για δοκιμές ενόργανου ελέγχου) και compileOnly (μόνο στο στάδιο μεταγλώττισης). Κάθε διαμόρφωση διαχειρίζεται την ορατότητα των κλάσεων στον γράφο εξαρτήσεων, επηρεάζοντας τον χρόνο δόμησης και το μέγεθος του τελικού τεχνουργήματος.
dependencies {
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.activity:activity-compose:1.8.2")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
}Build variant — συνδυασμός build type και product flavor που ορίζει μια έκδοση της εφαρμογής με μοναδικές ρυθμίσεις, κώδικα και πόρους. Το build type (τύπος δόμησης) καθορίζει τις παραμέτρους συσκευασίας: debug (με εντοπισμό σφαλμάτων και επίθημα .debug) ή release (με συσκότιση και υπογραφή). Το product flavor (γεύση προϊόντος) καθορίζει λειτουργικές παραλλαγές: για παράδειγμα, demo (περιορισμένη έκδοση) και full (πλήρης έκδοση με πρόσθετες δυνατότητες). Το Gradle δημιουργεί αυτόματα εργασίες για κάθε συνδυασμό, επιτρέποντας τη δόμηση όλων των εκδόσεων με μία εντολή.
android {
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
debug {
applicationIdSuffix = ".debug"
}
}
flavorDimensions += "version"
productFlavors {
create("demo") {
dimension = "version"
applicationIdSuffix = ".demo"
}
create("full") {
dimension = "version"
applicationIdSuffix = ".full"
}
}
}Κάθε build variant αντιστοιχεί σε ξεχωριστό source set. Το Gradle χρησιμοποιεί καταλόγους src/demo/release, src/full/debug και άλλους, όπου αποθηκεύονται μοναδικοί πόροι, manifest και πηγαίος κώδικας για τη συγκεκριμένη παραλλαγή. Ο κοινός κώδικας παραμένει στο src/main. Αυτή η προσέγγιση επιτρέπει επαναχρησιμοποίηση της κύριας λογικής και αντικατάσταση μόνο των διαφορετικών τμημάτων: συμβολοσειρών, εικονιδίων, τελικών σημείων API ή αρχείων διαμόρφωσης. Το source set μπορεί να παρακάμψει οποιουσδήποτε πόρους από το main: manifest, drawable, values ή ακόμα και κλάσεις Kotlin. Κατά τη δόμηση συγκεκριμένης παραλλαγής, το Gradle συνδυάζει αρχεία από το main και το αντίστοιχο source set, με τα αρχεία από την παραλλαγή να έχουν προτεραιότητα.
Το οικοσύστημα πρόσθετων Gradle καλύπτει όλα τα στάδια ανάπτυξης εφαρμογών Android. Τα επίσημα πρόσθετα από την Google περιλαμβάνουν com.android.application (για τη μονάδα εφαρμογής), com.android.library (για τη μονάδα βιβλιοθήκης), com.android.test (για μονάδες δοκιμής) και πρόσθετα Kotlin από τη JetBrains. Τα πρόσθετα προσθέτουν νέες εργασίες στο έργο, επεκτείνουν το DSL με νέα μπλοκ διαμόρφωσης και συνδέουν πρόσθετα εργαλεία. Χωρίς το πρόσθετο com.android.application, το έργο δεν μπορεί να δημιουργήσει APK: αυτό το πρόσθετο καταχωρεί όλες τις εργασίες ειδικές για Android και τις συνδέει στον γράφο δόμησης.
Πρόσθετα τρίτων λύνουν πιο συγκεκριμένες εργασίες. Το Google Services (com.google.gms.google-services) ενσωματώνει τα Firebase και Google Play Services, προσθέτοντας αυτόματα το google-services.json στη δόμηση. Το Hilt (dagger.hilt.android.plugin) δημιουργεί κώδικα για έγχυση εξαρτήσεων στο στάδιο μεταγλώττισης. Το Safe Args (androidx.navigation.safeargs.kotlin) δημιουργεί κλάσεις ασφαλούς τύπου για πλοήγηση μεταξύ τμημάτων. Κάθε πρόσθετο συνδέεται στο ριζικό build.gradle.kts μέσω του μπλοκ plugins και συνήθως απαιτεί ελάχιστη διαμόρφωση. Το Gradle επιλύει αυτόματα μεταβατικές εξαρτήσεις μεταξύ πρόσθετων και εγγυάται συμβατότητα εκδόσεων μέσω αρχείων Bom και καταλόγου εκδόσεων.
Η εργασία (task) — ατομική μονάδα εργασίας στο Gradle. Κάθε εργασία έχει δεδομένα εισόδου, δεδομένα εξόδου και μια ενέργεια. Οι ενσωματωμένες εργασίες για Android περιλαμβάνουν assemble (δόμηση όλων των παραλλαγών), lint (έλεγχος κώδικα), test (εκτέλεση δοκιμών μονάδας) και clean (εκκαθάριση προσωρινών αρχείων). Ο προγραμματιστής μπορεί να προσθέσει δικές του εργασίες χρησιμοποιώντας Groovy ή Kotlin DSL. Οι προσαρμοσμένες εργασίες είναι χρήσιμες για αυτοματοποίηση συνήθων λειτουργιών: δημιουργία αναφορών, αντιγραφή τεχνουργημάτων, ανάπτυξη σε συσκευές δοκιμής ή ενσωμάτωση με συστήματα CI.
tasks.register("printBuildInfo") {
description = "Εμφανίζει πληροφορίες σχετικά με τη δόμηση"
group = "custom"
doLast {
println("Build variant: ${project.name}")
println("Version: ${android.defaultConfig.versionName}")
}
}Κάθε εργασία μπορεί να εξαρτάται από άλλες εργασίες μέσω του μηχανισμού dependsOn. Αν η εργασία A εξαρτάται από την εργασία B, το Gradle εγγυάται ότι η B θα εκτελεστεί πριν από την A. Το σύστημα δεν απαιτεί μη αυτόματη υπόδειξη σειράς για κάθε ζεύγος — αρκεί να δηλώσετε εξαρτήσεις και το Gradle θα χτίσει έναν κατευθυνόμενο γράφο, βελτιστοποιημένο για παράλληλη εκτέλεση ανεξάρτητων εργασιών. Οι ενσωματωμένες εργασίες του πρόσθετου Android είναι ήδη συνδεδεμένες μεταξύ τους: το lint εξαρτάται από τη μεταγλώττιση, το test εξαρτάται από το assemble, το assembleDebug εξαρτάται από το compileDebugKotlin. Ο προγραμματιστής μπορεί να ενσωματώσει τις δικές του εργασίες σε οποιονδήποτε κόμβο του γράφου χρησιμοποιώντας dependsOn, mustRunAfter ή shouldRunAfter.
Ένα από τα συνηθισμένα προβλήματα — σύγκρουση εκδόσεων εξαρτήσεων, όταν δύο βιβλιοθήκες απαιτούν διαφορετικές εκδόσεις της ίδιας μεταβατικής εξάρτησης. Το Gradle αναφέρει σφάλμα σύγκρουσης, αλλά δεν προσφέρει πάντα αυτόματη λύση. Για διαγνωστικά, χρησιμοποιήστε την εντολή ./gradlew :app:dependencies, η οποία εμφανίζει το πλήρες δέντρο εξαρτήσεων. Συνιστάται η επιβολή της έκδοσης της συγκρουόμενης βιβλιοθήκης μέσω του μπλοκ resolutionStrategy. Ένα άλλο συνηθισμένο σενάριο — αργή δόμηση λόγω έλλειψης σταδιακής επεξεργασίας. Ελέγξτε ότι όλα τα πρόσθετα είναι ενημερωμένα, ο Gradle Daemon είναι ενεργοποιημένος (org.gradle.daemon=true) και στο gradle.properties έχει οριστεί επαρκής μνήμη: org.gradle.jvmargs=-Xmx4096m.
Προβλήματα με προσωρινή αποθήκευση προκύπτουν μετά από ενημέρωση εξαρτήσεων: το Gradle μπορεί να χρησιμοποιεί παλιά προσωρινή μνήμη και η δόμηση αποτυγχάνει με σφάλμα. Λύση — εκτελέστε τη δόμηση με τη σημαία --refresh-dependencies ή καθαρίστε την προσωρινή μνήμη χειροκίνητα μέσω ./gradlew cleanBuildCache. Το τρίτο πιο συχνό σφάλμα — ασυμβατότητα εκδόσεων Android Gradle Plugin (AGP) και Gradle. Κάθε έκδοση AGP απαιτεί μια συγκεκριμένη ελάχιστη έκδοση Gradle. Ο πίνακας συμβατότητας δημοσιεύεται στο developer.android.com. Αν οι εκδόσεις δεν είναι συμβατές, το Gradle τερματίζεται με σφάλμα στη φάση διαμόρφωσης με μήνυμα σχετικά με την ελάχιστη απαιτούμενη έκδοση. Πάντα ελέγχετε ότι η έκδοση του Gradle wrapper αντιστοιχεί στις απαιτήσεις AGP.
Συχνές Ερωτήσεις
Το Gradle είναι ένα πρόγραμμα αυτοματισμού δόμησης έργων. Παίρνει τον πηγαίο κώδικά σας σε Kotlin ή Java, συνδέει βιβλιοθήκες από το διαδίκτυο, μεταγλωττίζει τα πάντα σε bytecode και τα συσκευάζει σε APK. Λειτουργεί σε JVM και χρησιμοποιεί δηλωτικά σενάρια αντί για χειροκίνητες οδηγίες. Ο προγραμματιστής χρειάζεται μόνο να περιγράψει τους κανόνες και τα υπόλοιπα τα κάνει το Gradle μόνο του.
Το Build.gradle γράφεται σε Groovy — μια δυναμική γλώσσα με ευέλικτη σύνταξη και λιγότερη αυστηρότητα. Το Build.gradle.kts χρησιμοποιεί Kotlin DSL: αυστηρή τυποποίηση, αυτόματη συμπλήρωση στο Android Studio και έλεγχο σφαλμάτων στο στάδιο μεταγλώττισης. Η Google συνιστά Kotlin DSL για όλα τα νέα έργα. Τα αρχεία Groovy μεταφέρονται ευκολότερα, αλλά τα αρχεία Kotlin είναι πιο αξιόπιστα στη συντήρηση.
Ενεργοποιήστε τον Gradle Daemon (org.gradle.daemon=true) και την παράλληλη δόμηση (org.gradle.parallel=true). Αυξήστε τη μνήμη JVM σε 4–8 GB μέσω org.gradle.jvmargs. Χρησιμοποιήστε διαμόρφωση έργων κατ' απαίτηση (org.gradle.configureondemand=true). Για έργα Android, διαμορφώστε προσωρινή αποθήκευση εργασιών και δόμηση μόνο για το απαιτούμενο ABI. Στο Android Studio, εκτελέστε το Build Analyzer για να βρείτε σημεία συμφόρησης.
Build variant — είναι ένας συνδυασμός build type (για παράδειγμα debug ή release) και product flavor (για παράδειγμα demo ή full). Κάθε παραλλαγή μπορεί να έχει το δικό της όνομα πακέτου, έκδοση, πόρους και αρχεία πηγαίου κώδικα. Το Gradle δημιουργεί αυτόματα ξεχωριστή εργασία δόμησης για κάθε παραλλαγή. Αυτό επιτρέπει τη δόμηση πολλαπλών εκδόσεων της εφαρμογής από ένα έργο.
Οι εξαρτήσεις προστίθενται στο μπλοκ dependencies του αρχείου build.gradle.kts. Η μορφή γραφής: configuration("group:artifact:version"). Για παράδειγμα, implementation("androidx.core:core-ktx:1.12.0"). Για δοκιμές χρησιμοποιήστε testImplementation, για δοκιμές ενόργανου ελέγχου — androidTestImplementation. Οι εκδόσεις είναι βολικό να τοποθετηθούν σε ξεχωριστό κατάλογο εκδόσεων (version catalog) μέσω του αρχείου libs.versions.toml.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης