Derleme yapılandırmanızı Groovy'den Kotlin'e taşıyın

Android Gradle Plugin 4.0, Gradle yapılandırma dosyalarında geleneksel olarak kullanılan programlama dili Groovy'nin yerine Gradle yapılandırmanızda Kotlin'i kullanma desteği ekledi.

Kotlin, daha okunaklı olduğu ve derleme zamanında daha iyi kontrol ve IDE desteği sunduğu için Gradle komut dosyaları yazmak için Groovy'ye tercih edilir.

Kotlin, şu anda Groovy ile karşılaştırıldığında Android Studio'nun kod düzenleyicisinde daha iyi entegrasyon sunsa da Kotlin kullanan derlemeler, Groovy kullanan derlemelerden daha yavaş olma eğilimindedir. Bu nedenle, taşıma yapıp yapmayacağınıza karar verirken derleme performansını göz önünde bulundurun.

Bu sayfada, Android uygulamanızın Gradle derleme dosyalarını Groovy'den Kotlin'e dönüştürmeyle ilgili temel bilgiler yer almaktadır. Daha kapsamlı bir taşıma kılavuzu için Gradle'ın resmi belgelerine bakın.

Zaman Çizelgesi

Android Studio Giraffe'tan itibaren yeni projeler, derleme yapılandırması için varsayılan olarak Kotlin DSL'yi (build.gradle.kts) kullanır. Söz dizimi vurgulama, kod tamamlama ve tanımlara gezinme özellikleri sayesinde Groovy DSL'den (build.gradle) daha iyi bir düzenleme deneyimi sunar. Daha fazla bilgi için Gradle Kotlin DSL Primer başlıklı makaleyi inceleyin.

Genel terimler

Kotlin DSL: Temel olarak Android Gradle eklentisi Kotlin DSL'yi veya bazen temel Gradle Kotlin DSL'yi ifade eder.

Bu geçiş kılavuzunda, "Kotlin" ve "Kotlin DSL" birbirinin yerine kullanılmaktadır. Benzer şekilde, "Groovy" ve "Groovy DSL" terimleri birbirinin yerine kullanılır.

Komut dosyası dosyası adlandırma

Komut dosyası uzantısı adları, derleme dosyasının yazıldığı dile göre belirlenir:

  • Groovy'de yazılmış Gradle derleme dosyaları .gradle dosya adı uzantısını kullanır.
  • Kotlin ile yazılmış Gradle derleme dosyaları .gradle.kts dosya adı uzantısını kullanır.

Söz dizimini dönüştürme

Groovy ve Kotlin arasındaki söz diziminde bazı genel farklılıklar olduğundan, bu değişiklikleri derleme komut dosyalarınıza uygulamanız gerekir.

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

Groovy, yöntem çağrılarında parantezleri atlamanıza izin verirken Kotlin bunları zorunlu kılar. Yapılandırmanızı taşımak için bu tür yöntem çağrılarına parantez ekleyin. Aşağıdaki kodda, Groovy'da bir ayarın nasıl yapılandırılacağı gösterilmektedir:

compileSdkVersion 30

Bu, Kotlin'de yazılmış aynı koddur:

compileSdkVersion(30)

Ödev çağrılarına = ekleme

Groovy DSL, özellik atarken = atama operatörünü atlamanıza olanak tanırken Kotlin bunu gerektirir. Aşağıdaki kodda, Groovy'da özelliklerin nasıl atanacağı gösterilmektedir:

java {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}

Bu kodda, Kotlin'de mülklerin nasıl atanacağı gösterilmektedir:

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

Dizeleri dönüştürme

Groovy ve Kotlin arasındaki dize farkları şunlardır:

  • Dizeler için çift tırnak: Groovy, dizelerin tek tırnak işareti kullanılarak tanımlanmasına izin verirken Kotlin için çift tırnak işareti gerekir.
  • Noktalı ifadelerde dize ekleme: Groovy'de, noktalı ifadelerde dize ekleme için yalnızca $ ön ekini kullanabilirsiniz. Ancak Kotlin, noktalı ifadeleri köşeli parantezle sarmalamanızı gerektirir. Örneğin, Groovy'de aşağıdaki snippet'te gösterildiği gibi $project.rootDir kullanabilirsiniz:

        myRootDirectory = "$project.rootDir/tools/proguard-rules-debug.pro"
        

    Ancak Kotlin'de önceki kod, project.rootDir üzerinde değil, project üzerinde toString() çağırır. Kök dizinin değerini elde etmek için ${project.rootDir} ifadesini süslü ayraçlarla sarmalayın:

        myRootDirectory = "${project.rootDir}/tools/proguard-rules-debug.pro"
        

    Daha fazla bilgi için Kotlin dokümanlarında Dize şablonları bölümüne bakın.

Dosya uzantılarını yeniden adlandırma

İçeriklerini taşırken her derleme dosyasına .kts ekleyin. Örneğin, settings.gradle dosyası gibi bir derleme dosyası seçin. Dosyayı settings.gradle.kts olarak yeniden adlandırın ve dosya içeriğini Kotlin'e dönüştürün. Her derleme dosyasının taşınmasından sonra projenizin derlemeye devam ettiğinden emin olun.

Önce en küçük dosyalarınızı taşıyın, deneyim kazanın ve ardından devam edin. Bir projede Kotlin ve Groovy derleme dosyalarının bir karışımı olabilir. Bu nedenle, taşıma işlemini dikkatlice ve acele etmeden yapın.

def yerine val veya var koyun

def değerini val veya var ile değiştirin. Bu, Kotlin'de değişkenleri tanımlama şeklidir. Aşağıda Groovy'da bir değişken beyanı verilmiştir:

def building64Bit = false

Bu, Kotlin'de yazılmış aynı koddur:

val building64Bit = false

Boole özelliklerinin önüne is ekleme

Groovy, mülk adlarına göre mülk çıkarma mantığını kullanır. foo adlı bir boole özelliğinin çıkarılmış yöntemleri getFoo, setFoo veya isFoo olabilir. Dolayısıyla, Kotlin'e dönüştürdüğünüzde özellik adlarını Kotlin tarafından desteklenmeyen, çıkarılmış yöntemlerle değiştirmeniz gerekir. Örneğin, buildTypes DSL mantıksal öğelerinin önüne is eklemeniz gerekir. Aşağıdaki kodda, Groovy'da boole özelliklerinin nasıl ayarlanacağı gösterilmektedir:

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            ...
        }
        debug {
            debuggable true
            ...
        }
    ...

Aşağıdaki kod, Kotlin'dekiyle aynıdır. Mülklerin önüne is eklendiğini unutmayın.

android {
    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            isShrinkResources = true
            ...
        }
        getByName("debug") {
            isDebuggable = true
            ...
        }
    ...

Listeleri ve haritaları dönüştürme

Groovy ve Kotlin'deki listeler ve haritalar farklı söz dizimi kullanılarak tanımlanır. Groovy [] kullanırken Kotlin, koleksiyon oluşturma yöntemlerini listOf veya mapOf kullanarak açıkça çağırır. Taşıma işlemi sırasında [] değerini listOf veya mapOf ile değiştirdiğinizden emin olun.

Groovy ve Kotlin'de liste şu şekilde tanımlanır:

jvmOptions += ["-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError</code>"]

Bu, Kotlin'de yazılan kodla aynıdır:

jvmOptions += listOf("-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError")

Groovy ve Kotlin'de bir haritayı şu şekilde tanımlayabilirsiniz:

def myMap = [key1: 'value1', key2: 'value2']

Bu, Kotlin'de yazılan kodla aynıdır:

val myMap = mapOf("key1" to "value1", "key2" to "value2")

Derleme türlerini yapılandırma

Kotlin DSL'de yalnızca hata ayıklama ve yayınlama derleme türleri varsayılan olarak kullanılabilir. Diğer tüm özel derleme türleri manuel olarak oluşturulmalıdır.

Groovy'da hata ayıklama, sürüm ve belirli diğer derleme türlerini önce oluşturmadan kullanabilirsiniz. Aşağıdaki kod snippet'i, Groovy'de debug, release ve benchmark derleme türlerine sahip bir yapılandırmayı göstermektedir.

buildTypes {
 debug {
   ...
 }
 release {
   ...
 }
 benchmark {
   ...
 }
}

Kotlin'de eşdeğer yapılandırmayı oluşturmak için benchmark derleme türünü açıkça oluşturmanız gerekir.

buildTypes {
 debug {
   ...
 }

 release {
   ...
 }
 register("benchmark") {
    ...
 }
}

Derleme komut dosyasından eklenti blokuna taşı

Derlemenizde projeye eklenecek eklentiler için buildscript {} bloğu kullanılıyorsa bunun yerine plugins {} bloğunu kullanacak şekilde yeniden yapılandırmanız gerekir. plugins {} bloğu, eklentilerin uygulanmasını kolaylaştırır ve sürüm kataloglarıyla iyi çalışır.

Ayrıca, derleme dosyalarınızda plugins {} bloğunu kullandığınızda Android Studio, derleme başarısız olsa bile bağlamın farkındadır. Bu bağlam, Studio IDE'nin kod tamamlama işlemi gerçekleştirmesine ve diğer yararlı öneriler sunmasına olanak tanıdığından Kotlin DSL dosyalarınızda düzeltme yapmanıza yardımcı olur.

Eklenti kimliklerini bulma

buildscript {} bloğu, eklentileri Maven koordinatlarını (ör. com.android.tools.build:gradle:7.4.0) kullanarak derleme sınıf yoluna eklerken plugins {} bloğu bunun yerine eklenti kimliklerini kullanır.

Çoğu eklenti için eklenti kimliği, apply plugin kullanarak eklentiyi uygularken kullanılan dizedir. Örneğin, aşağıdaki eklenti kimlikleri Android Gradle eklentisinin bir parçasıdır:

  • com.android.application
  • com.android.library
  • com.android.lint
  • com.android.test

Eklenti listesinin tamamını Google Maven deposunda bulabilirsiniz.

Kotlin eklentilerine birden fazla eklenti kimliği tarafından referans verilebilir. Alan adı belirtilmiş eklenti kimliğini kullanmanızı ve aşağıdaki tabloya göre kısayoldan alan adı belirtilmiş eklenti kimliğine yeniden yapılandırmanızı öneririz:

Kısaltma eklenti kimlikleri Ad alanı eklenti kimlikleri
kotlin org.jetbrains.kotlin.jvm
kotlin-android org.jetbrains.kotlin.android
kotlin-kapt org.jetbrains.kotlin.kapt
kotlin-parcelize org.jetbrains.kotlin.plugin.parcelize

Eklentileri Gradle Eklenti Portalı, Maven Merkezi Veri Havuzu ve Google Maven deposunda da arayabilirsiniz. Eklenti kimliklerinin işleyiş şekli hakkında daha fazla bilgi edinmek için Özel Gradle Eklentileri Geliştirme başlıklı makaleyi okuyun.

Yeniden yapılandırmayı gerçekleştirin

Kullandığınız eklentilerin kimliklerini öğrendikten sonra aşağıdaki adımları uygulayın:

  1. buildscript {} blokunda tanımlanan eklentiler için hâlâ depolarınız varsa bunları settings.gradle dosyasına taşıyın.

  2. Eklentileri, üst düzey build.gradle dosyasında plugins {} bloğuna ekleyin. Burada eklentinin kimliğini ve sürümünü belirtmeniz gerekir. Eklentinin kök projeye uygulanması gerekmiyorsa apply false kullanın.

  3. Üst düzey build.gradle.kts dosyasından classpath girişlerini kaldırın.

  4. Modül düzeyindeki build.gradle dosyasında plugins {} bloğuna ekleyerek eklentileri uygulayın. Sürüm kök projeden devralındığı için yalnızca eklentinin kimliğini burada belirtmeniz yeterlidir.

  5. Eklenti için apply plugin çağrısını modül düzeyindeki build.gradle dosyasından kaldırın.

Örneğin, şu kurulumda buildscript {} bloğu kullanılmıştır:

// Top-level build.gradle file
buildscript {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
    dependencies {
        classpath("com.android.tools.build:gradle:7.4.0")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0")
        ...
    }
}

// Module-level build.gradle file
apply(plugin: "com.android.application")
apply(plugin: "kotlin-android")

plugins {} bloğu kullanılarak oluşturulan eşdeğer kurulum:

// Top-level build.gradle file
plugins {
   id 'com.android.application' version '7.4.0' apply false
   id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
   ...
}

// Module-level build.gradle file
plugins {
   id 'com.android.application'
   id 'org.jetbrains.kotlin.android'
   ...
}

// settings.gradle
pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

Eklenti bloğunu dönüştürme

plugins {} bloğundaki eklentileri uygulama, Groovy ve Kotlin'de benzer şekilde yapılır. Aşağıdaki kodda, sürüm kataloglarını kullanırken Groovy'da eklentilerin nasıl uygulanacağı gösterilmektedir:

// Top-level build.gradle file
plugins {
   alias libs.plugins.android.application apply false
   ...
}

// Module-level build.gradle file
plugins {
   alias libs.plugins.android.application
   ...
}

Aşağıdaki kodda, aynı işlemin Kotlin'de nasıl yapılacağı gösterilmektedir:

// Top-level build.gradle.kts file
plugins {
   alias(libs.plugins.android.application) apply false
   ...
}

// Module-level build.gradle.kts file
plugins {
   alias(libs.plugins.android.application)
   ...
}

Aşağıdaki kodda, sürüm kataloglarını kullanmadığınızda Groovy'da eklentilerin nasıl uygulanacağı gösterilmektedir:

// Top-level build.gradle file
plugins {
   id 'com.android.application' version '7.3.0' apply false
   ...
}

// Module-level build.gradle file
plugins {
   id 'com.android.application'
   ...
}

Aşağıdaki kodda, aynı işlemin Kotlin'de nasıl yapılacağı gösterilmektedir:

// Top-level build.gradle.kts file
plugins {
   id("com.android.application") version "7.3.0" apply false
   ...
}

// Module-level build.gradle.kts file
plugins {
   id("com.android.application")
   ...
}

plugins {} bloğu hakkında daha fazla bilgi için Gradle dokümanlarında Eklentileri uygulama bölümüne bakın.

Çeşitli

Diğer işlevler için Kotlin kod örnekleri için aşağıdaki belge sayfalarını inceleyin:

Bilinen sorunlar

Şu anda Kotlin ile derleme hızının Groovy'ya kıyasla daha yavaş olabileceği bir bilinen sorun vardır.

Sorun bildirme

Sorununuzu önceliklendirmek için ihtiyaç duyduğumuz bilgileri nasıl sağlayacağınızla ilgili talimatlar için Derleme araçları ve Gradle hataları ile ilgili ayrıntılar başlıklı makaleyi inceleyin. Daha sonra, Google herkese açık sorun izleyicisini kullanarak hata bildiriminde bulunun.

Diğer kaynaklar

Kotlin ile yazılmış Gradle derleme dosyalarının çalışan bir örneği için GitHub'daki Now In Android örnek uygulamasına bakın.