Android Build Sistemi Nasıl Yapılandırılır?

Feyza Ürkut
Huawei Developers - Türkiye
5 min readJun 27, 2024
Photo by Eilis Garvey on Unsplash

Giriş

Bu yazımda sizlere modern yazılım geliştirme süreçlerinin vazgeçilmez unsurlarından olan yazılım yapılandırma yönetimi ve derleme araçlarından bahsedeceğim. Android build sistemi üzerinde güncel olarak tercih edilen bu teknolojilerin örneklerini bu yazıda bulabilirsiniz.

Keyifli okumalarr şimdiden!

1- DSL (Domain Specific Language)

2- Sürüm Katalogları (Version Catalogs)

3- HMS Entegrasyonu için Sürüm Kataloglarının Kullanımı

4- KAPT’den KSP’ye

Yazılım Yapılandırma Yönetimi

Yazılım projelerinin kaynak kodu, dokümantasyon ve ilgili diğer varlıklarının sürüm kontrolü, değişiklik yönetimi ve yapılandırma bilgilerini yönetmek için kullanılan yöntem ve araçları kapsar. Bu sayede, ekipler karmaşık projelerde bile düzenli ve koordineli bir şekilde çalışabilirler.

Derleme Araçları

Kaynak kodun çalıştırılabilir bir hale getirilmesi sürecinde devreye girer ve bu süreci otomatikleştirir. İyi yapılandırılmış derleme araçları, yazılımın doğru bir şekilde derlenmesini, test edilmesini ve dağıtılmasını sağlayarak, geliştiricilerin verimliliğini artırır ve hata olasılığını azaltır.

1. DSL (Domain Specific Language) ile Yapılandırma:

  • Groovy DSL: Gradle gibi araçlarda kullanılan, Groovy dili ile yazılmış yapılandırma dosyaları.
  • Kotlin DSL: Gradle gibi araçlarda kullanılan, Kotlin dili ile yazılmış yapılandırma dosyaları.

2. Bağımlılık Yönetimi:

  • Version Catalogs: Proje bağımlılıklarının merkezi bir yerde tanımlanmasını sağlayan yapılandırma yöntemi.

3. Derleme Zamanı İşleme ve Araçlar:

  • KAPT (Kotlin Annotation Processing Tool): Kotlin’de, Java Annotation Processing ile aynı işlemi gerçekleştiren araç.
  • KSP (Kotlin Symbol Processing): Kotlin için özel olarak tasarlanmış, daha hızlı ve verimli bir derleme zamanı işleme aracı.

1- DSL (Domain Specific Language)

DSL (Domain Specific Language), belirli bir alan veya problem için optimize edilmiş özel bir dil türüdür.

1- Groovy DSL

Groovy DSL, Groovy programlama dili kullanılarak oluşturulan DSL’lerdir. Groovy, Java Sanal Makinesi (JVM) üzerinde çalışan dinamik bir dildir ve DSL yazmak için oldukça uygun özelliklere sahiptir.

// build.gradle dosyası (Groovy DSL kullanarak Gradle yapılandırma)
plugins {
id 'java'
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

2- Kotlin DSL

Kotlin DSL, Kotlin programlama dili kullanılarak oluşturulan DSL’lerdir. Kotlin, modern ve statik olarak yazılmış bir JVM dilidir ve DSL yazmak için güçlü özellikler sunar. Gradle gibi yapı araçları, artık yapılandırma dosyaları için Kotlin DSL’yi desteklemektedir.

// build.gradle.kts dosyası (Kotlin DSL kullanarak Gradle yapılandırma)
plugins {
kotlin("jvm") version "1.5.21"
}

repositories {
mavenCentral()
}

dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib")
testImplementation("org.jetbrains.kotlin:kotlin-test")
}

İki teknolojiyi de aktardıktan sonra, son güncel Android Studio Koala versiyonunda bizlere Kotlin DSL kullanmamızı önerdiğini görebilirsiniz.

Build Configuration Language

📌 Komut dosyası adlandırma

Komut dosyası (script file) uzantısı adları, derleme dosyasının yazıldığı dile bağlıdır:

  • Groovy’de yazılan Gradle derleme dosyaları, .gradle dosya adı uzantısını kullanır.
  • Kotlin’de yazılan Gradle derleme dosyaları .gradle.kts dosya adı uzantısını kullanır.

📌 Yöntem çağrılarına parantez ekleyin

Groovy, yöntem çağrılarında parantezleri atlamanıza izin verirken, Kotlin bunu gerektirir. Yapılandırmanızı taşımak için bu tür yöntem çağrılarına parantez ekleyin.

Bu kod, Groovy’de bir ayarın nasıl yapılandırılacağını gösterir:

compileSdkVersion 30

Bu Kotlin’de yazılan kodun aynısıdır:

compileSdkVersion(30)

📌Atama çağrılarına “=” ekleyin

Groovy DSL, özellikleri atarken = atama operatörünü atlamanıza izin verir, oysa Kotlin bunu gerektirir. Bu kod, Groovy’de özelliklerin nasıl atanacağını gösterir:

java {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}

Bu kod, Kotlin’de özelliklerin nasıl atanacağını gösterir:

java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}

2- Sürüm Katalogları (Version Catalogs)

Gradle 7.0 ile birlikte tanıtılan Version Catalogs, proje bağımlılıklarının merkezi bir yerde tanımlanmasını sağlar. Bu, bağımlılık versiyonlarını yönetmeyi ve paylaşmayı kolaylaştırır.

// gradle/libs.versions.toml dosyası
[versions]
kotlin = "1.5.21"
springBoot = "2.5.3"

[libraries]
kotlinStdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
springBootStarterWeb = { module = "org.springframework.boot:spring-boot-starter-web", version.ref = "springBoot" }
// build.gradle.kts dosyası
plugins {
kotlin("jvm") version libs.versions.kotlin
}
repositories {
mavenCentral()
}

dependencies {
implementation(libs.kotlinStdlib)
implementation(libs.springBootStarterWeb)
}

3- HMS Entegrasyonu için Sürüm Kataloglarının Kullanımı

Bu örnekte aşağıdaki adımları takip ederek HMS Map Kit ve Location Kit implementasyonları yapacağız.

💫 İlgili kod parçalarını devamında bulabilirsiniz

  1. build.gradle.kts (project level): buildscript > dependencies gidin ve AppGallery Connect eklenti yapılandırmasını ekleyin.
  2. settings.gradle.kts: HMS Core SDK için Maven repository adresini yapılandırın.
  3. build.gradle.kts (app level): dependencies bloğuna yapı bağımlılıklarını ekleyin.
  4. build.gradle.kts (app level): Eklenti yapılandırmasını plugins bloğuna ekleyin.
  • libs.versions.toml dosyasında dependency ve pluginleri belirtelim:
[versions]
...
agconnect = "1.9.1.300"
agconnect-agcp = "1.7.1.300"
gradle = "8.0.0"
hmsMap = "6.11.0.304"
hmsLocation = "6.12.0.300"

[libraries]
...
agconnect-core = { group = "com.huawei.agconnect", name = "agconnect-core", version.ref = "agconnect" }
agconnect-agcp = { group = "com.huawei.agconnect", name = "agcp", version.ref = "agconnect-agcp" }
tools-gradle = { group = "com.android.tools.build", name = "gradle", version.ref = "gradle" }
hms-map-kit = { group = "com.huawei.hms", name = "maps", version.ref = "hmsMap" }
hms-location-kit = { group = "com.huawei.hms", name = "location", version.ref = "hmsLocation" }

[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
agconnect = { id = "com.huawei.agconnect", version.ref = "agconnect-agcp" }
  • build.gradle.kts (app level) dosyasında gerekli bağımlılıkları ve plugini çağıralım (plugin’i bulmada sorun yaşadığı için id’si ile çağırdık):
plugins {
alias(libs.plugins.androidApplication)
alias(libs.plugins.jetbrainsKotlinAndroid)
id(libs.plugins.agconnect.get().pluginId)
}

android {
...
}

dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
implementation(libs.androidx.activity)
implementation(libs.androidx.constraintlayout)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
implementation(libs.agconnect.core)
implementation(libs.hms.location.kit)
implementation(libs.hms.map.kit)
}
  • build.gradle.kts (project level) dosyasında ilgili AppGallery Connect plugin classpath’ini veriyoruz:
buildscript{
dependencies {
// Add dependencies.
classpath(libs.tools.gradle)
classpath(libs.agconnect.agcp)
}
}
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
alias(libs.plugins.androidApplication) apply false
alias(libs.plugins.jetbrainsKotlinAndroid) apply false
}
  • settings.gradle.kts dosyasında HMS Core SDK için Maven repository adresini veriyoruz:
pluginManagement {
repositories {
google {
content {
includeGroupByRegex("com\\.android.*")
includeGroupByRegex("com\\.google.*")
includeGroupByRegex("androidx.*")
}
}
mavenCentral()
gradlePluginPortal()

maven("https://developer.huawei.com/repo/" )
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()

maven("https://developer.huawei.com/repo/" )
}
}

rootProject.name = "*"
include(":app")

4- KAPT’den KSP’ye

KAPT (Kotlin Annotation Processing Tool), Kotlin’de Java Annotation Processing (APT) ile aynı işlemi gerçekleştirir. KSP (Kotlin Symbol Processing), daha iyi performans ve Kotlin’in tüm özelliklerini daha etkin kullanma imkanı sunar.

⭐KSP, Kotlin için özel olarak tasarlandığından, KAPT’a göre daha hızlı ve daha verimlidir.

// build.gradle.kts dosyası (KAPT kullanarak)
plugins {
kotlin("jvm") version "1.5.21"
kotlin("kapt") version "1.5.21"
}

dependencies {
implementation("com.google.dagger:dagger:2.37")
kapt("com.google.dagger:dagger-compiler:2.37")
}

// build.gradle.kts dosyası (KSP kullanarak)
plugins {
kotlin("jvm") version "1.5.21"
}

dependencies {
implementation("com.google.dagger:dagger:2.37")
ksp("com.google.dagger:dagger-compiler:2.37")
}

Sonuç

Yazılım yapılandırma yönetimi ve derleme araçları, modern yazılım geliştirme süreçlerinde kalite, verimlilik ve sürdürülebilirlik açısından kritik bir rol oynar. Bu araçların doğru ve etkin kullanımı, projelerin başarıyla tamamlanmasını ve bakım süreçlerinin kolaylaşmasını sağlar.

Tüm bu yöntemleri doğru ve etkili bir şekilde kullanarak, projelerimizde gradle işlemlerini otomatikleştirip optimize edebiliriz.

Yeni yazılarda görüşmek üzere!

Referanslar

--

--