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 olan Groovy'nin yerine, Gradle derleme yapılandırmanızda Kotlin 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ı yazmak için Groovy yerine Kotlin'i tercih eder.

Kotlin, Android Studio'nun kod düzenleyicisiyle Groovy ile karşılaştırıldığında şu anda daha iyi entegrasyon sunsa da Kotlin kullanan derlemeler, Groovy kullanan derlemelerden daha yavaş olma eğilimindedir. Bu nedenle, taşıma konusunda 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 sağlanmaktadır. Daha kapsamlı bir taşıma rehberi için Gradle'ın resmi belgelerini inceleyin.

Zaman Çizelgesi

Android Studio Giraffe'dan başlayarak, yeni projelerde derleme yapılandırması için varsayılan olarak Kotlin DSL (build.gradle.kts) kullanılmaktadır. Bu özellik, söz dizimi vurgulama, kod tamamlama ve bildirimlere gitme özellikleriyle Groovy DSL'den (build.gradle) daha iyi bir düzenleme deneyimi sunar. Daha fazla bilgi için Gradle Kotlin DSL Primer sayfasına bakın.

Ortak terimler

Kotlin DSL: Öncelikle Android Gradle eklentisi Kotlin DSL'yi veya bazen alttaki Gradle Kotlin DSL'sini ifade eder.

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

Komut dosyası dosyası adlandırma

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

  • Groovy ile yazılan Gradle derleme dosyalarında .gradle dosya adı uzantısı kullanılı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 vardır. Bu nedenle, 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 için bunlar gerekir. 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 kodla aynıdır:

compileSdkVersion(30)

= adlı kişiyi atama görüşmelerine 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 mülklerin nasıl atanacağını gösterir:

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

Dizeleri dönüştür

Groovy ve Kotlin arasındaki dize farkları:

  • Dizeler için çift tırnak: Groovy, dizelerin tek tırnak kullanılarak tanımlanmasına izin verirken Kotlin, çift tırnak gerektirir.
  • Noktalı ifadelerde dize interpolasyonu: Groovy'de, noktalı ifadelerdeki dize interpolasyonları için yalnızca $ ön ekini kullanabilirsiniz ancak Kotlin, noktalı ifadeleri süslü ayraçlarla sarmalamanızı gerektirir. Örneğin, Groovy'de $project.rootDir öğesini aşağıdaki snippet'te gösterildiği gibi kullanabilirsiniz:

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

    Ancak Kotlin'de önceki kod toString() işlevini project.rootDir değil project üzerinde ç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 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. Dosyayı settings.gradle.kts olarak yeniden adlandırın ve dosyanın içeriğini Kotlin'e dönüştürün. 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 sonra yolunuza devam edin. Bir projede Kotlin ve Groovy derleme dosyalarını karışık olarak bulundurabilirsiniz. Bu yüzden, dikkatli bir şekilde harekete geçmek için acele etmeyin.

def yerine val veya var koyun

def öğesini val veya var ile değiştirin. Bu, Kotlin'de değişkenleri açıklama şeklidir. Bu, Groovy'deki bir değişken bildirimidir:

def building64Bit = false

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

val building64Bit = false

Boole özelliklerini is ile öne çıkarın

Groovy, mülk adlarına göre mülk kesinti mantığını kullanır. foo boole özelliği için çıkarılmış yöntemler getFoo, setFoo veya isFoo olabilir. Böylece, Kotlin'e dönüştürüldükten sonra özellik adlarını Kotlin tarafından desteklenmeyen çıkarım yapılan 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ürme

Groovy ve Kotlin'deki listeler ve haritalar farklı söz dizimi kullanılarak tanımlanır. Groovy [] kullanırken Kotlin, listOf veya mapOf kullanarak koleksiyon oluşturma yöntemlerini açık bir şekilde ç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ılan kodla aynıdır:

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

Groovy ve Kotlin'de bir haritayı nasıl tanımlayacağınız aşağıda açıklanmıştır:

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 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 belirli diğer derleme türlerini oluşturmadan önce kullanabilirsiniz. Aşağıdaki kod snippet'i, Groovy'de debug, release ve benchmark derleme türlerini içeren 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") {
    ...
 }
}

Buildscript'ten eklenti blokuna taşı

Derlemeniz, projeye eklenti eklemek için buildscript {} bloğunu 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, derleme başarısız olsa bile Android Studio bağlamdan haberdar olur. Bu bağlam, Studio IDE'nin kod tamamlamayı gerçekleştirmesine ve başka yararlı ö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, örneğin com.android.tools.build:gradle:7.4.0 gibi eklentinin Maven koordinatlarını kullanarak eklentileri derleme sınıf yoluna eklerken plugins {} bloğu bunun yerine eklenti kimliklerini kullanır.

Çoğu eklentide, eklenti kimliği, eklentileri apply plugin kullanarak uyguladığınızda kullanılan dizedir. Örneğin, aşağıdaki eklenti kimlikleri Android Gradle Plugin'in 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ış eklenti kimliğini kullanmanızı ve aşağıdaki tabloya göre yeniden düzenleme yaparak ad alanı oluşturulmuş eklenti kimliğini kullanmanızı öneririz:

Steno eklenti kimlikleri Ad alanlı 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 Central Repository'de 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ştirin

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

  1. buildscript {} blokunda bildirilen eklentiler için depolarınız hâlâ 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. classpath girişlerini üst düzey build.gradle.kts dosyasından kaldırın.

  4. Eklentileri, modül düzeyindeki build.gradle dosyasındaki plugins {} blokuna 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 {} blokundan eklentiler 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österir:

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

// 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österir:

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

// 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 {} bloku hakkında daha fazla bilgi için Gradle dokümanlarındaki Eklentileri uygulama bölümüne bakın.

Diğer

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, kotlin ile derleme hızının Groovy ile kıyaslandığında daha yavaş olabilmesidir.

Sorunları bildirme

Sorununuzu önceliklendirmek amacıyla ihtiyacımız olan bilgileri nasıl sağlayacağımız hakkında talimatlar için Derleme araçları ve Gradle hataları ile ilgili ayrıntılar bölümüne bakın. Ardından, Google herkese açık sorun izleyicisini kullanarak bir 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.