Android App Development
Jetpack Compose: Gradle Kotlin DSL’e Geçiş
Mart 21, 2022
Hadi gelin birlikte buildSrc ile gradle kotlin dsl kullanımını açıklayalım.
Bu blogda, Kotlin DSL yardımıyla Android uygulama projemizi Groovy tabanlı bir Gradle sisteminden Kotlin tabanlı bir Gradle sistemine nasıl taşıyacağımızı öğreneceğiz.
Giriş
Gradle bağımlılıklarını yönetmenin farklı yolları:
- Manuel Yönetim
- Google’ın “ext” kullanan önerisi
- Kotlin DSL + buildSrc
Projelerimizde Kotlin DSL + buildSrc adımını uygulayacağız.
buildSrc Nedir
buildSrc, proje kök dizini seviyesinde bulunan ve derleme (build) bilgilerini içeren bir dizindir. Kotlin dsl’i aktif etmek, özel yapılandırmalarla ilgili mantıkları yazmak ve bunları proje genelinde paylaşmak için bu dizini kullanabiliriz.
Test edilebilirliği nedeniyle son günlerde en çok kullanılan yaklaşımlardan biri olmuştur. buildSrc dizini, dahil edilen bir derleme (included build) olarak kabul edilir. Dizinin keşfedilmesiyle birlikte Gradle, bu kodu otomatik olarak derler, test eder ve derleme betiğinizin (build script) classpath’ine yerleştirir. Çoklu proje derlemelerinde yalnızca bir tane buildSrc dizini olabilir ve bu dizinin kök proje dizininde yer alması gerekir. Kodun bakımı, refactor edilmesi ve test edilmesi daha kolay olduğu için buildSrc, betik eklentilerine (script plugins) tercih edilmelidir. — Gradle Dokümantasyonu
Dokümantasyonun da belirttiği gibi, çoklu modül (multi module) projelerinde yalnızca bir tane buildSrc modülü bulunur ve derleme betiğinin classpath’ine yerleştirildiği için tüm modüller buna erişebilir; Gradle mantıklarımızı yeniden kullanılmak üzere koymak için iyi bir yer gibi görünüyor
Neden buildSrc — Kotlin DSL
- Derleme zamanı (Compile Time) hata kontrolü
- Otomatik tamamlama (Auto Completion) ve içerik yardımları
- Kolay kod navigasyonu
- Hızlı dokümantasyon (Kotlin fonksiyon tabanlı)
- Uygulama genelinde aynı dili kullanmanın tutarlılığı
- Gelişmiş IDE düzenleme deneyimi
buildSrc Kotlin Modülü Oluşturma
- İlk Adım, buildSrc adında bir Kotlin Library modülü oluşturun.

- Finish (Bitir) seçeneğini seçtikten sonra aşağıdaki hatayı alacaksınız.
FAILURE: Build failed with an exception.
* What went wrong:
‘buildSrc’ cannot be used as a project name as it is a reserved name

- settings.gradle dosyasındaki include ‘:buildSrc’ satırını kaldırın.

- buildSrc klasöründeki build.gradle dosya adını build.gradle.kts olarak değiştirin.


- Refactor seçeneğini seçtikten sonra, build.gradle.kts içinde ‘kotlin-dsl’ seçeneğini etkinleştirin.
buildSrc/build.gradle.kts
plugins {
`kotlin-dsl`
}repositories {
google()
mavenCentral()
gradlePluginPortal()
}
- Kurulumu tamamlamak için şimdi sync now (şimdi senkronize et) butonuna tıklayın

settings.gradle Dosyasını Dönüştürme
- Dosya adını settings.gradle yerine settings.gradle.kts olarak değiştirin. Bundan sonra derlemeye çalışırsanız, aşağıdaki gibi hatalar gösterilecektir.

- include ‘:app’ ifadesini include(“:app”) olarak değiştirmeniz gerekir.

İşte bu kadar. settings.gradle.kts için işiniz bitti. Projeyi derleyebilirsiniz ve diğer Gradle dosyalarıyla birlikte çalışır.
Kök Proje build.gradle Dosyasını Dönüştürme
- İlk dosya ile aynı şekilde, yukarıda verilen adımları kullanarak build.gradle dosyasını build.gradle.kts olarak dönüştürün. Şimdi sözdizimini (syntax) uygun şekilde düzeltmeniz gerekiyor.
Önce

Sonra

Uygulama Modülünün (App Module) build.gradle Dosyasını Dönüştürme
Son olarak, en çok sözdizimi değişikliğine sahip olan, Kotlin’e dönüştürülecek son dosya.
Ancak ondan önce, yukarıda sağlanan adımları kullanarak build.gradle dosyasını build.gradle.kts olarak dönüştürelim.
Şimdi, sözdizimini aşağıdaki gibi dönüştürmeye devam edebiliriz.
- plugin code block
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
aşağıdakine dönüşür:
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
- android code block
android {
compileSdk 32
defaultConfig {
applicationId "com.developersancho.migrationgradledsl"
minSdk 23
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion compose_version
}
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}
aşağıdakine dönüşür:
android {
compileSdk = 32
defaultConfig {
applicationId = "com.developersancho.migrationgradledsl"
minSdk = 23
targetSdk = 32
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = rootProject.extra["compose_version"] as String
}
packagingOptions {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}
- dependencies code block
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation "androidx.compose.ui:ui:$compose_version"
implementation "androidx.compose.material:material:$compose_version"
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
implementation 'androidx.activity:activity-compose:1.4.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
}
aşağıdakine dönüşür:
dependencies {
implementation("androidx.core:core-ktx:1.7.0")
implementation("androidx.compose.ui:ui:${rootProject.extra["compose_version"]}")
implementation("androidx.compose.material:material:${rootProject.extra["compose_version"]}")
implementation("androidx.compose.ui:ui-tooling-preview:${rootProject.extra["compose_version"]}")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.1")
implementation("androidx.activity:activity-compose:1.4.0")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.3")
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
androidTestImplementation("androidx.compose.ui:ui-test-junit4:${rootProject.extra["compose_version"]}")
debugImplementation("androidx.compose.ui:ui-tooling:${rootProject.extra["compose_version"]}")
debugImplementation("androidx.compose.ui:ui-test-manifest:${rootProject.extra["compose_version"]}")
}
Şimdi bitirdik. Tüm Gradle dosyası artık Kotlin’e dönüştürüldü.
Sonuç
“Kotlin DSL + buildSrc” seçeneğini şiddetle tavsiye ediyorum. Çok büyük bir mesele gibi görünmeyebilir ancak Gradle bağımlılıklarını yönetmek zahmetlidir ve otomatik tamamlama ile tıklama desteğine sahip olmak ezber bozan bir şeydir. Artık dosyalar arasında manuel olarak ileri geri geçiş yapmak yok.
Mutlu ve sağlıklı kodlamalar!
Yazar: Mesut Genç