Gradle — Android tətbiqlərinin kompilasiyasını, test edilməsini və yığılmasını avtomatlaşdıran qurma sistemidir. Apache Ant və ya Maven-dən fərqli olaraq, o, inkremental qurma və nəticələrin keşləşdirilməsini dəstəkləyir. İmkanlar haqqında daha ətraflı rəsmi Gradle sənədlərində oxuyun. 2013-cü ildən bu alət Android Studio-da Android layihələri üçün standart qurma sistemi kimi istifadə olunur.
Əsas məqamlar
Gradle — JVM-də işləyən, Java ilə açıq mənbə qurma avtomatlaşdırma alətidir. O, girişdə mənbə kodu, asılılıqları və resursları qəbul edir, çıxışda isə hazır tətbiq — Android üçün APK və ya AAB verir. Gradle-in əsasında tapşırıqların yönəldilmiş asiklik qrafı (DAG) konsepsiyası dayanır, burada hər bir tapşırıq atomik iş vahididir, aralarındakı əlaqələr isə icra sırasını müəyyən edir. Make və ya Ant-dan fərqli olaraq, Gradle addımların ardıcıllığını əl ilə təsvir etməyi tələb etmir: tapşırıqlar arasında asılılıqları bəyan etmək kifayətdir və sistem özü optimal sıranı quracaq. Belə yanaşma Gradle-i istənilən ölçülü layihələr üçün çevik və miqyaslana bilən edir.
Sistem üç icra mərhələsindən istifadə edir: inisializasiya (iştirak edən layihələrin müəyyən edilməsi), konfiqurasiya (tapşırıq qrafının qurulması) və icra (tapşırıqların lazımi ardıcıllıqla işə salınması). Konfiqurasiya mərhələsi Gradle-in əsas fərqidir: bütün qurma skripti tapşırıqlar işə salınmazdan əvvəl icra olunur ki, bu da şərtlərdən asılı olaraq qrafı dinamik dəyişməyə imkan verir. Bu, məsələn, kodu təkrarlamadan yalnız müəyyən qurma variantları üçün tapşırıqlar əlavə etməyə imkan verir. Qurucu Groovy dilində yazılmışdır, lakin konfiqurasiya faylları iki dili dəstəkləyir: Groovy DSL və Kotlin DSL.
Android üçün Gradle plaqini — com.android.application və com.android.library, layihəyə Android alətləri ilə işləmək üçün tapşırıqlar əlavə edir. Tərtibatçı qurmanı işə saldıqda, Gradle ardıcıl olaraq onlarla tapşırığı yerinə yetirir: javac və ya kotlinc vasitəsilə Kotlin və Java-nın kompilasiyası, AAPT2 vasitəsilə resursların işlənməsi, R.java-nın generasiyası, D8 və ya R8 vasitəsilə baytkodun DEX-ə kompilasiyası, APK-nın imzalanması və zip-lənməsi. Hər bir tapşırıq onun giriş məlumatlarının dəyişib-dəyişmədiyini yoxlayır və əgər dəyişməyibsə — keşləşdirilmiş nəticədən istifadə edir. Bu mexanizm inkremental qurma adlanır və təkrar kompilasiyanı tam yenidən qurma ilə müqayisədə 60–80% sürətləndirir.
Android modulunun konfiqurasiyası build.gradle.kts faylının android blokunda verilir. Blok daxilində compileSdk, minSdk, targetSdk, tətbiq versiyası, imzalar və digər parametrlər müəyyən edilir. Gradle hər bir modul üçün avtomatik olaraq bir neçə qurma variantı yaradır — tip (release, debug) və flavorun kombinasiyası. Məsələn, iki flavorlu və iki tipli modul üçün Gradle dörd tapşırıq yaradır: assembleDemoDebug, assembleDemoRelease, assembleFullDebug, assembleFullRelease. Bütün bu tapşırıqları ayrıca yerinə yetirmək və ya bütün variantlar üçün bir əmrlə işə salmaq olar.
Hər bir Android layihəsi iki konfiqurasiya səviyyəsini ehtiva edir: kök build.gradle.kts (bütün modullar üçün parametrlər) və modul build.gradle.kts (konkret modul üçün parametrlər). Kök faylda tətbiq edilmədən plaginlər, depozitoriyalar və ümumi dəyişənlər bəyan edilir. Modul faylında plaginlər konkret modula tətbiq edilir və qurma parametrləri konfiqurasiya olunur. Belə yanaşma versiya kataloqu və ya ext-bloku vasitəsilə asılılıq versiyalarını mərkəzləşdirilmiş şəkildə idarə etməyə imkan verir.
@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 bloku — build.gradle.kts-in daha bir kritik elementidir. Orada tətbiq üçün lazım olan kitabxanalar, modullar və fayl asılılıqları sadalanır. Gradle bir neçə asılılıq konfiqurasiyasını dəstəkləyir: implementation (yalnız cari modula əlçatandır), api (asılı modullara da əlçatandır), testImplementation (yalnız testlər üçün), androidTestImplementation (instrumental testlər üçün) və compileOnly (yalnız kompilasiya mərhələsində). Hər bir konfiqurasiya asılılıq qrafında siniflərin görünməsini idarə edir ki, bu da qurma vaxtına və yekun artefaktın ölçüsünə təsir edir.
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 və product flavor-un kombinasiyasıdır və unikal parametrlər, kod və resurslarla tətbiq versiyasını müəyyən edir. Build type (qurma növü) yığma parametrlərini təyin edir: debug (debug ilə və .debug suffiksi) və ya release (obfuskasiya və imza ilə). Product flavor (məhsul flavoru) funksional variantları müəyyən edir: məsələn, demo (məhdud versiya) və full (əlavə imkanlarla tam versiya). Gradle avtomatik olaraq hər kombinasiya üçün tapşırıqlar yaradır ki, bu da bütün versiyaları bir əmrlə yığmağa imkan verir.
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"
}
}
}Hər build variant-a ayrıca source set uyğun gəlir. Gradle src/demo/release, src/full/debug və digər qovluqlardan istifadə edir, burada konkret variant üçün unikal resurslar, manifestlər və mənbələr saxlanılır. Ümumi kod src/main qovluğunda qalır. Belə yanaşma əsas məntiqi təkrar istifadə etməyə və yalnız fərqlənən hissələri əvəz etməyə imkan verir: sətirlər, ikonlar, API endpointləri və ya konfiqurasiya faylları. Source set main-dən istənilən resursu ləğv edə bilər: manifest, drawable, values və ya hətta Kotlin siniflərini. Konkret variantın qurulması zamanı Gradle main və müvafiq source set-dən faylları birləşdirir, variantdakı fayllar prioritetə malikdir.
Gradle plaginləri ekosistemi Android tətbiqlərinin hazırlanmasının bütün mərhələlərini əhatə edir. Google-dan rəsmi plaginlərə com.android.application (tətbiq modulu üçün), com.android.library (kitabxana modulu üçün), com.android.test (test modulları üçün) və JetBrains-dən Kotlin plaginləri daxildir. Plaginlər layihəyə yeni tapşırıqlar əlavə edir, DSL-i yeni konfiqurasiya blokları ilə genişləndirir və əlavə alətlər qoşur. com.android.application plaqlini olmadan layihə APK yığa bilməz: bu plaqlin bütün Android-spesifik tapşırıqları qeydiyyatdan keçirir və onları qurma qrafında birləşdirir.
Üçüncü tərəf plaginləri daha dar məsələləri həll edir. Google Services (com.google.gms.google-services) Firebase və Google Play Services-i inteqrasiya edir, qurma zamanı google-services.json-u avtomatik əlavə edir. Hilt (dagger.hilt.android.plugin) kompilasiya mərhələsində asılılıqların daxil edilməsi üçün kod yaradır. Safe Args (androidx.navigation.safeargs.kotlin) fraqmentlər arasında naviqasiya üçün tip təhlükəsiz siniflər yaradır. Hər bir plaqlin kök build.gradle.kts-də plugins bloku vasitəsilə qoşulur və adətən minimal konfiqurasiya tələb edir. Gradle plaginlər arasında tranzitiv asılılıqları avtomatik həll edir və Bom faylları və versiya kataloqu vasitəsilə versiya uyğunluğunu təmin edir.
Task (tapşırıq) — Gradle-də atomik iş vahididir. Hər bir tapşırığın giriş məlumatları, çıxış məlumatları və hərəkəti var. Android üçün daxili tapşırıqlara assemble (bütün variantların yığılması), lint (kodun yoxlanılması), test (unit testlərin işə salınması) və clean (müvəqqəti faylların təmizlənməsi) daxildir. Tərtibatçı Groovy və ya Kotlin DSL vasitəsilə öz tapşırıqlarını əlavə edə bilər. Fərdi tapşırıqlar rutin əməliyyatların avtomatlaşdırılması üçün faydalıdır: hesabatların yaradılması, artefaktların surətinin çıxarılması, test cihazlarına yerləşdirmə və ya CI sistemləri ilə inteqrasiya.
tasks.register("printBuildInfo") {
description = "Qurma haqqında məlumatı göstərir"
group = "custom"
doLast {
println("Build variant: ${project.name}")
println("Version: ${android.defaultConfig.versionName}")
}
}Hər bir tapşırıq dependsOn mexanizmi vasitəsilə digər tapşırıqlardan asılı ola bilər. Əgər A tapşırığı B tapşırığından asılıdırsa, Gradle B-nin A-dan əvvəl yerinə yetiriləcəyinə zəmanət verir. Sistem hər bir cüt üçün əl ilə sıranı göstərməyi tələb etmir — asılılıqları bəyan etmək kifayətdir və Gradle müstəqil tapşırıqların paralel icrası üçün optimallaşdırılmış yönəldilmiş qraf quracaq. Android plaqlininin daxili tapşırıqları artıq bir-biri ilə əlaqəlidir: lint kompilasiyadan asılıdır, test assemble-dan asılıdır, assembleDebug compileDebugKotlin-dən asılıdır. Tərtibatçı öz tapşırıqlarını dependsOn, mustRunAfter və ya shouldRunAfter istifadə edərək qrafın istənilən qovşağına yerləşdirə bilər.
Tez-tez rast gəlinən problemlərdən biri — asiılılıq versiyalarının konfliktidir, iki kitabxana eyni tranzitiv asılılığın müxtəlif versiyalarını tələb etdikdə. Gradle konflikt xətası barədə məlumat verir, lakin həmişə avtomatik həll təklif etmir. Diaqnostika üçün ./gradlew :app:dependencies əmrindən istifadə edin, bu, asılılıqların tam ağacını göstərir. Konfliktli kitabxananın versiyasını resolutionStrategy bloku vasitəsilə məcburi göstərmək tövsiyə olunur. Digər geniş yayılmış ssenari — inkremental emalın olmaması səbəbindən yavaş qurmadır. Bütün plaginlərin yeniləndiyini, Gradle Daemon-un aktiv olduğunu (org.gradle.daemon=true) və gradle.properties-də kifayət qədər yaddaşın göstərildiyini yoxlayın: org.gradle.jvmargs=-Xmx4096m.
Keşləşdirmə ilə problemlər asılılıqlar yeniləndikdən sonra yaranır: Gradle köhnəlmiş keşdən istifadə edə bilər və qurma xəta ilə başa çatır. Həll yolu — qurmanı --refresh-dependencies flagı ilə işə salmaq və ya ./gradlew cleanBuildCache vasitəsilə keşi əl ilə təmizləmək. Tezliyə görə üçüncü səhv — Android Gradle Plugin (AGP) və Gradle versiyalarının uyğunsuzluğudur. AGP-nin hər bir versiyası müəyyən minimal Gradle versiyası tələb edir. Uyğunluq cədvəli developer.android.com saytında dərc olunur. Versiyalar uyğun gəlmirsə, Gradle konfiqurasiya mərhələsində minimal tələb olunan versiya haqqında mesajla xəta verir. Həmişə Gradle wrapper versiyasının AGP tələblərinə uyğun olduğunu yoxlayın.
Tez-tez verilən suallar
Gradle — layihələrin yığılması üçün proqram-avtomatlaşdırıcıdır. O, sizin Kotlin və ya Java mənbə kodunuzu götürür, kitabxanaları internetdən qoşur, hər şeyi baytkoda kompilə edir və APK-ya yığır. JVM-də işləyir və əl ilə təlimatlar əvəzinə deklarativ skriptlərdən istifadə edir. Tərtibatçı yalnız qaydaları təsvir etməlidir, qalanını Gradle özü edir.
Build.gradle Groovy dilində yazılır — çevik sintaksis və daha az sərtlik ilə dinamik dildir. Build.gradle.kts Kotlin DSL istifadə edir: sərt tipizasiya, Android Studio-da avtomatik tamamlama və kompilasiya mərhələsində xətaların yoxlanılması. Google bütün yeni layihələr üçün Kotlin DSL-i tövsiyə edir. Groovy faylları miqrasiya etmək daha asandır, lakin Kotlin faylları dəstəkləməkdə daha etibarlıdır.
Gradle Daemon-u (org.gradle.daemon=true) və paralel qurmanı (org.gradle.parallel=true) aktiv edin. JVM yaddaşını org.gradle.jvmargs vasitəsilə 4–8 GB-a qədər artırın. Tələb üzrə layihə konfiqurasiyasından istifadə edin (org.gradle.configureondemand=true). Android layihələri üçün tapşırıq keşləşdirməsini və yalnız lazımi ABI üçün qurmanı konfiqurasiya edin. Android Studio-da darboğazları tapmaq üçün Build Analyzer-i işə salın.
Build variant — build type (məsələn, debug və ya release) və product flavor-un (məsələn, demo və ya full) kombinasiyasıdır. Hər bir variantın öz paket adı, versiyası, resursları və mənbə faylları ola bilər. Gradle hər variant üçün avtomatik olaraq ayrıca qurma tapşırığı yaradır. Bu, bir layihədən tətbiqin bir neçə versiyasını yığmağa imkan verir.
Asılılıqlar build.gradle.kts faylının dependencies blokunda əlavə edilir. Yazı formatı: configuration("group:artifact:version"). Məsələn, implementation("androidx.core:core-ktx:1.12.0"). Testlər üçün testImplementation, instrumental testlər üçün androidTestImplementation istifadə edin. Versiyaları libs.versions.toml faylı vasitəsilə ayrıca versiya kataloquna (version catalog) çıxarmaq rahatdır.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun