2- Migrate to Kotlin DSL in QNB Android Mobile📢

Musa Erbay
IBTech
Published in
4 min readJul 26, 2024

Herkese selam, ben Musa 👋

Bu makalemizde QNB Mobil uygulamamıza eklediğimiz harika bir özellikle karşınızdayım. Kotlin DSL (Domain-Specific Language)’in sunduğu benzersiz katkıları ve geçiş adımlarını sizinle paylaşmak istiyorum. Kotlin DSL, Gradle configuration dosyalarınızı Groovy yerine Kotlin kullanarak yazmanızı sağlar. Geçiş sürecinde özellikle `buildscript`, `plugins` ve `dependencies` bloklarında değişiklikler yapılır.

Bu değişiklikler, daha güçlü bir type safety, daha iyi IDE desteği ve daha okunabilir kodlar sunar. Type safety, derleme zamanı hatalarını azaltır ve kodun daha güvenilir olmasını sağlar.Bu sayede, hataları daha erken yakalayarak ve daha açık bir yapı sunarak projelerinizin bakımını ve geliştirmesini kolaylaştırır.

Artık projemize yeni dependency’ler eklerken daha eğlenceli ve üretken bir şekilde ilerliyoruz.

Siz de Kotlin DSL dünyasına katılmaya hazır mısınız?” 🌟

Kotlin DSL

Android Studio Giraffe’den itibaren, yeni proje oluşturduğunuz da varsayılan olarak Kotlin DSL (build.gradle.kts) kullanır.

Avantajlar :

Kod Okunabilirliği: Daha az boilerplate kod ile temiz ve okunabilir kod yazımına olanak tanır.

🔒 Type Safety: Kotlin, statik tip sistemi sayesinde daha güvenli ve öngörülebilir kod yazımı sağlar.

🔒 Null Safety: Null pointer hatalarını önlemek için tasarlanmış bir dil yapısı vardır.

🛠️ IDE Support: Gelişmiş IDE desteği ile kod yazımı sırasında daha iyi otomatik tamamlama ve hata tespiti sunar.

🔄 Coroutines: Asenkron işlemleri kolaylaştıran ve performansı artıran coroutine desteği bulunur.

🌟 Modern Dil Özellikleri: Extension functions ve smart casts gibi modern programlama özellikleri içerir.

Dezavantajlar :

Compile Time: Groovy’ye kıyasla derleme süresi biraz daha uzun olabilir.

📈 Öğrenme Eğrisi: Kotlin DSL, Groovy’ye göre daha yeni ve farklı bir syntax sahip olduğu için, öğrenmesi biraz daha zaman alabilir.

💡Mevcut Scriptlerle Uyumluluk: Mevcut Groovy script’lerini Kotlin DSL’ye dönüştürmek ekstra çaba gerektirebilir.

Kotlin DSL vs Groovy :

Kotlin DSL vs Groovy

Migrate to Kotlin DSL: Değişim Zamanı!

Android için Kotlin DSL’ye geçiş yaparken öncelikli olarak izleyeceğimiz adımlar ;

1. Ön Koşullar :

  • Gradle Wrapper: En az 5.0 veya daha yüksek bir sürüm kullanın.
  • Java: Java 8 veya üzeri bir sürüm kullanın.
  • Gradle Eklentileri: Tüm Gradle eklentilerinizi güncelleyin.

2. Dosya Adı Değişiklikleri :

  • “.gradle” dosya uzantılarını “.gradle.kts” olarak değiştirin.

3. Syntax Değişiklikleri :

  • Groovy ve Kotlin arasındaki syntax farklarını göz önünde bulundurarak gerekli değişiklikleri uygulayın.

Syntax Değişiklikleri

Projenizin ihtiyaçlarına göre çeşitli syntax değişikliklerine ihtiyaç duyabilirsiniz. En sık rastlanan değişikliklere örnekler vererek birlikte göz atalım. Kodlarınızı güncellemek için beraber keşif zamanı!

method çağrılarına parantez () ekleyin :

Groovy:

compileSdkVersion 30

Kotlin:

compileSdkVersion(30)

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

Groovy:

java {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}

Kotlin:

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

Tek tırnakları (‘) çift tırnaklarla (“) değiştirin,

‘compile’ yerine ‘implementation’ kullanalım

Groovy:

dependencies {
compile 'com.google.android.gms:play-services-maps:17.0.0'
}

Kotlin:

dependencies {
implementation("com.google.android.gms:play-services-maps:17.0.0")
}

“def” yerine “var veya val” kullanalım

Groovy:

def apiKey = "YOUR_API_KEY"

Kotlin:

val apiKey = "YOUR_API_KEY"

Build Types:

Groovy:

buildTypes {
release {
minifEnabled true
proguardFiles(
getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
)
}
}

Kotlin:

buildTypes {
getByName("release") {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android.txt"),
"proguard-rules.pro"
)
}
}

Signing Configuration

Groovy:

signingConfigs {
release {
storeFile file("mykeystore.jks")
storePassword "password"
keyAlia "key1"
keyPassword "key_password"

}
}

release {
signingConfig signingConfigs.release
}

Kotlin:

signingConfigs {
create("release") {
storeFile = file("mykeystore.jks")
storePassword = "password"
keyAlias = "key1"
keyPassword = "key_password"

}
}

getByName("release") {
signingConfig = signingConfigs.getByName("release")
}

Product Flavors

Groovy:

productFlavors {
dev {
applicationIdSuffix '.dev'
...
}
prod {
applicationIdSuffix '.prod'
...
}
}

flavorDimensions 'env'

Kotlin:

productFlavors {
create("dev") {
applicationIdSuffix = ".dev"
...
}
create("prod") {
applicationIdSuffix = ".prod"
...
}
}

productDimensions("env")

Task Configuration

Groovy:

def check = tasks.register("check")
tasks.register("detekt") { detekt ->
// Configure detekt

check.get().dependsOn detekt
}

check.configure {
dependsOn detekt
}

Kotlin:

val check by tasks.registering
tasks.register("detekt") {
// Configure detekt

check.get().dependsOn(this)
}

check {
dependsOn(detekt)
}

Kotlin DSL ile Kazanımlarımız

Kotlin DSL’e geçiş sürecimiz, projemizin geliştirme aşamalarında önemli bir dönüşüm sağladı.Multi-module projemizde, her modülü tek tek Kotlin DSL’ye geçirerek kod tekrarını minimuma indirdik ve bakım süreçlerimizi iyileştirdik. Modüller arası bağımlılıkları yönetirken, `build.gradle.kts` dosyalarındaki benzerliklerden faydalanarak ortak yapılar oluşturmak genel tutarlılığı artırdı.Ortak yapıları `buildSrc` içindeki Kotlin dosyalarında tanımlayarak, tüm modüllerde aynı yapılandırmaları kullandık.

Örneğin; `Dependencies` ve `Versions` dosyalarını oluşturduk. Tüm modüllerimizde kullanılan dependency ve versiyon tanımlarını bu dosyalara ekledik.Böylece, bir dependency versiyonunu güncellemek veya yeni bir dependency eklemek gerektiğinde tek bir yerden yönetebilir hale geldik. Tüm modüllerde aynı `compileSdkVersion` ve `targetSdkVersion` değerlerini kullanarak proje tutarlılığını sağladık.Statik tiplendirme özelliği sayesinde, yanlış tanımlanmış bağımlılıkları veya yapılandırmaları derleme aşamasında tespit edebiliyoruz. Bu, runtime hatalarını azaltarak daha güvenilir bir geliştirme ortamı sağlıyor.

Kotlin DSL’nin projemize getirdiği bu yenilikler sayesinde, geliştirme süreçlerimizde büyük adımlar attık.Artık daha temiz kodlar yazıyor ve projelerimizi daha hızlı ve güvenilir bir şekilde geliştiriyoruz.

Siz de bu dönüşüme katılarak projelerinizi Kotlin DSL ile daha verimli hale getirebilirsiniz. Haydi, kod dünyasında Kotlin DSL’nin sunduğu avantajların tadını çıkaralım! 🚀

KAYNAKÇA

--

--