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

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

Daha okunabilir olduğu ve daha iyi derleme zamanı denetimi ve IDE desteği sunduğu için Kotlin, Gradle komut dosyaları yazma konusunda Groovy yerine Kotlin'i tercih eder.

Kotlin, Android Studio'nun kod düzenleyicide Groovy ile karşılaştırıldığında şu anda daha iyi entegrasyon sunsa da Kotlin kullanan derlemeler genellikle Groovy ile yapılan derlemelere göre daha yavaştır. Bu nedenle, geçiş yapıp yapmamaya karar verirken derleme performansını göz önünde bulundurun.

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

Zaman Çizelgesi

Android Studio Zürafa'dan başlayarak, yeni projelerde derleme yapılandırması için varsayılan olarak Kotlin DSL (build.gradle.kts) kullanılmaktadır. Söz dizimi vurgulama, kod tamamlama ve bildirimlerde gezinme özellikleriyle Groovy DSL'ye (build.gradle) kıyasla daha iyi bir düzenleme deneyimi sunar. Daha fazla bilgi için Gradle Kotlin DSL Primer'a bakın.

Ortak terimler

Kotlin DSL: Öncelikle Android Gradle eklentisi Kotlin DSL'ye veya bazen de temel Gradle Kotlin DSL'sine atıfta bulunur.

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

Komut dosyası adlandırma

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

  • Groovy ile 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.

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

Groovy ve Kotlin arasında söz diziminde bazı genel farklar olduğundan bu değişiklikleri derleme komut dosyalarınıza uygulamanız gerekir.

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

Groovy, yöntem çağrılarında parantezleri atlamanıza olanak tanırken Kotlin bunları 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ılmış kodun aynısıdır:

compileSdkVersion(30)

= adlı kullanıcıyı atama aramalarına ekle

Groovy DSL, mülk atarken atama operatörünü = atlamanızı sağlar ancak 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 nasıl mülk atanacağını gösterir:

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 kullanılarak tanımlanmasına izin verirken Kotlin için çift tırnak kullanılması gerekir.
  • Noktalı ifadelerde dize interpolasyonu: Groovy'de, noktalı ifadelerde dize interpolasyonları için yalnızca $ önekini kullanabilirsiniz ancak Kotlin, noktalı ifadeleri süslü ayraçlarla 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'de değil project üzerinde toString() çağırır. Kök dizinin değerini elde etmek için ${project.rootDir} ifadesini küme parantezleriyle sarmalayın:

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

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

Dosya uzantılarını yeniden adlandırma

İçeriğini taşırken her derleme dosyasına .kts ekleyin. Örneğin, settings.gradle dosyası gibi bir derleme dosyası seçin. Dosyanın adını settings.gradle.kts ve içeriğini Kotlin olarak değiştirin. Her derleme dosyasının taşınmasından sonra projenizin hâlâ derlendiğinden emin olun.

Önce en küçük dosyalarınızı taşıyın, deneyim kazanın ve daha sonra yolunuza devam edin. Projede Kotlin ve Groovy derleme dosyalarını karışık olarak bulundurabilirsiniz. Bu nedenle, çok dikkatli bir şekilde harekete geçmek için acele etmeyin.

def yerine val veya var yazın

def değerini, Kotlin'de değişkenleri tanımlama yöntemi olan val veya var ile değiştirin. Bu, Groovy'de kullanılan bir değişken bildirimidir:

def building64Bit = false

Bu, Kotlin'de yazılmış kodun aynısıdır:

val building64Bit = false

Boole özelliklerini is ile önek

Groovy, özellik adlarına dayalı özellik kesinti mantığını kullanır. foo boole özelliği için türetilen yöntemler getFoo, setFoo veya isFoo olabilir. Bu nedenle, Kotlin'e dönüştürüldükten sonra özellik adlarını Kotlin tarafından desteklenmeyen türetilmiş yöntemlerle değiştirmeniz gerekir. Örneğin, buildTypes DSL boole öğeleri için bunların önüne is eklemeniz gerekir. Bu kod, Groovy'de boole özelliklerinin nasıl ayarlanacağını gösterir:

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

Aşağıdaki kod Kotlin'de aynıdır. Özelliklerin önekinin is olduğunu unutmayın.

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

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

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

Groovy ve Kotlin karşılaştırmasında bir listeyi şu şekilde tanımlayabilirsiniz:

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

Bu, Kotlin'de yazılmış kodun aynısıdır:

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

Groovy ve Kotlin için harita şu şekilde tanımlanır:

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

Bu, Kotlin'de yazılmış kodun aynısı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 sürüm derleme türleri dolaylı olarak kullanılabilir. Diğer tüm özel derleme türleri manuel olarak oluşturulmalıdır.

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

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") {
    ...
 }
}

Buildscript'ten eklenti bloğuna geçiş

Derlemeniz projeye eklenti eklemek için buildscript {} blokunu kullanıyorsa bunun yerine plugins {} blokunu kullanmak için yeniden düzenleme yapmanız gerekir. plugins {} bloku, eklentilerin uygulanmasını kolaylaştırır ve sürüm kataloglarıyla uyumlu bir şekilde çalışır.

Ayrıca, derleme dosyalarınızda plugins {} blokunu kullandığınızda Android Studio, derleme başarısız olsa bile içeriğin farkındadır. Bu bağlam, Studio IDE'nin kod tamamlamayı gerçekleştirmesine ve başka faydalı öneriler sağlamasına olanak tanıdığından Kotlin DSL dosyalarınızda düzeltmeler yapılmasına yardımcı olur.

Eklenti kimliklerini bulma

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

Çoğu eklentide, eklenti kimliği, bunları apply plugin kullanarak uyguladığınızda kullanılan dizedir. Örneğin, aşağıdaki eklenti kimlikleri Android Gradle Eklentisi'nin 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. Adlandırılmış alanlı eklenti kimliğini kullanmanızı ve aşağıdaki tabloyu kullanarak kısaltma yerine ad alanlı eklenti kimliğini yeniden düzenlemenizi öneririz:

Steno eklentisi kimlikleri Ad aralıklı 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

Gradle Eklenti Portalı'nda, Maven Merkezi Veri Havuzu'nda ve Google Maven deposunda da eklenti arayabilirsiniz. Eklenti kimliklerinin işleyiş şekli hakkında daha fazla bilgi edinmek için Özel Gradle Eklentileri Geliştirme bölümünü okuyun.

Yeniden düzenleme işlemini gerçekleştirme

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

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

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

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

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

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

Örneğin, şu kurulumda buildscript {} bloğu kullanılmaktadı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")

Bu, plugins {} bloğunu kullanan eşdeğer bir kurulumdur:

// 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ür

plugins {} bloğundaki eklentileri uygulamak Groovy ve Kotlin'de benzerdir. Aşağıdaki kod, sürüm kataloglarını kullanırken Groovy'de eklentilerin nasıl uygulanacağını göstermektedir:

// 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 kod, aynı işlemi Kotlin'de nasıl yapacağınızı göstermektedir:

// 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 kod, sürüm kataloglarını kullanmadığınızda Groovy'de eklentilerin nasıl uygulanacağını göstermektedir:

// 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 kod, aynı işlemi Kotlin'de nasıl yapacağınızı göstermektedir:

// 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ındaki Eklentileri uygulama bölümüne bakın.

Çeşitli

Diğer işlevlere yönelik Kotlin kod örnekleri için aşağıdaki belge sayfalarına bakın:

Bilinen sorunlar

Şu anda bilinen bir sorun, derleme hızının Kotlin ile Groovy ile kıyaslandığında daha yavaş olabilmesidir.

Sorun bildirme

Sorununuzun önceliğini belirlemek için gereken bilgilerin nasıl sağlanacağıyla ilgili talimatları Derleme araçları ve Gradle hatalarıyla ilgili ayrıntılar bölümünde bulabilirsiniz. Ardından Google genel 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.