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.

Kotlin, daha okunabilir olması ve daha iyi derleme zamanı kontrolü ile IDE desteği sunması nedeniyle Gradle komut dosyaları yazmak için Groovy'ye tercih edilir.

Kotlin şu anda Android Studio'nun kod düzenleyicisinde Groovy'ye kıyasla daha iyi entegrasyon sunsa da Kotlin kullanılarak oluşturulan derlemeler Groovy kullanılarak oluşturulan derlemelere göre daha yavaş olma eğilimindedir. Bu nedenle, geçiş 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ürme hakkında temel bilgiler verilmektedir. Daha kapsamlı bir taşıma kılavuzu için Gradle'ın resmi belgelerine bakın.

Zaman Çizelgesi

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

Genel terimler

Kotlin DSL: Öncelikle Android Gradle eklentisi Kotlin DSL'yi veya bazen de temel Gradle Kotlin DSL'yi ifade eder.

Bu taşıma kılavuzunda "Kotlin" ve "Kotlin DSL" terimleri birbirinin yerine kullanılmaktadır. Aynı şekilde, "Groovy" ve "Groovy DSL" terimleri birbirinin yerine kullanılır.

Komut dosyası adlandırma

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

  • Groovy ile yazılmış 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 dizimi açısından bazı genel farklılıklar vardır. Bu nedenle, bu değişiklikleri derleme komut dosyalarınızda uygulamanız gerekir.

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

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

compileSdkVersion 30

Aynı kod Kotlin'de şu şekilde yazılır:

compileSdkVersion(30)

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

Groovy DSL, özellik atarken atama operatörünü = atlamanıza olanak tanır. Kotlin ise bu operatörün kullanılmasını zorunlu kılar. Bu kod, Groovy'de özelliklerin nasıl atanacağını gösterir:

java {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}

Bu kod, Kotlin'de özelliklerin nasıl atanacağını gösterir:

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

Dizeleri dönüştürme

Groovy ile Kotlin arasındaki dize farklılıkları:

  • Dizeler için çift tırnak: Groovy, dizelerin tek tırnak kullanılarak tanımlanmasına izin verirken Kotlin'de çift tırnak kullanılması gerekir.
  • Noktalı ifadelerde dize enterpolasyonu: Groovy'de noktalı ifadelerde dize enterpolasyonları için yalnızca $ önekini kullanabilirsiniz ancak Kotlin'de noktalı ifadeleri küme parantezleriyle sarmalamanız gerekir. Ö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 yukarıdaki kod, toString() işlevini project.rootDir üzerinde değil, project üzerinde çağırır. Kök dizinin değerini almak 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 belgelerindeki 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 dosya içeriğini Kotlin'e dönüştürün. Her derleme dosyası taşındıktan sonra projenizin derlenmeye 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ı birlikte kullanabilirsiniz. Bu nedenle, geçişi dikkatli bir şekilde yapmak için zaman ayırın.

def yerine val veya var koyun

def yerine val veya var kullanın. val veya var, Kotlin'de değişkenleri tanımlama şeklinizdir. Bu, Groovy'deki bir değişken bildirimidir:

def building64Bit = false

Aynı kod Kotlin'de şu şekilde yazılır:

val building64Bit = false

Boole özelliklerinin önüne is ekleyin

Groovy, mülk adlarına dayalı mülk çıkarımı mantığı kullanır. Bir boole özelliği foo için çıkarılan 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 çıkarılmış yöntemlerle değiştirmeniz gerekir. Örneğin, buildTypes DSL boolean öğelerine is önekini 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ğıda, Kotlin'deki aynı kod verilmiştir. Özelliklerin başına 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 dizimleri 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 [] yerine listOf veya mapOf yazdığınızdan emin olun.

Groovy ve Kotlin'de liste tanımlama arasındaki farklar:

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

Aynı kod Kotlin'de şu şekilde yazılır:

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

Groovy ve Kotlin'de harita tanımlama arasındaki farklar:

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

Aynı kod Kotlin'de şu şekilde yazılı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ın derleme türleri örtülü olarak kullanılabilir. Diğer tüm özel derleme türleri manuel olarak oluşturulmalıdır.

Groovy'de hata ayıklama, yayın ve belirli diğer derleme türlerini önce oluşturmadan kullanabilirsiniz. Aşağıdaki kod snippet'inde, Groovy'de debug, release ve benchmark derleme türlerini içeren bir yapılandırma gösterilmektedir.

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 plugins bloğuna taşıma

Derlemeniz, projeye eklentiler eklemek için buildscript {} bloğunu kullanıyorsa bunun yerine plugins {} bloğunu kullanacak şekilde yeniden düzenlemeniz gerekir. plugins {} bloğu, eklentileri uygulamayı 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 derleme başarısız olsa bile Android Studio bağlamın farkındadır. Bu bağlam, Studio IDE'nin kod tamamlama işlemini gerçekleştirmesine ve diğer faydalı önerileri sunmasına olanak tanıdığı için Kotlin DSL dosyalarınızda düzeltmeler yapmanıza yardımcı olur.

Eklenti kimliklerini bulma

buildscript {} bloğu, eklentilerin com.android.tools.build:gradle:7.4.0 gibi Maven koordinatlarını kullanarak eklentileri 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 uyguladığınızda 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

Eklentilerin tam listesini Google Maven deposunda bulabilirsiniz.

Kotlin eklentilerine birden fazla eklenti kimliğiyle referans verilebilir. Ad alanı içeren eklenti kimliğini kullanmanızı ve aşağıdaki tabloya göre kısaltılmış eklenti kimliğinden ad alanı içeren eklenti kimliğine yeniden düzenleme yapmanızı öneririz:

Kısa 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

Eklentileri Gradle Plugin Portal, Maven Central Repository 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 düzenlemeyi gerçekleştirme

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

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

  2. Eklentileri üst düzeydeki plugins {} dosyasında build.gradle 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. Eklentileri, modül düzeyindeki build.gradle dosyasında 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. Eklenti için apply plugin çağrısını modül düzeyindeki build.gradle dosyadan kaldırın.

Örneğin, bu 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ğu kullanılarak yapılan 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()
    }
}

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

plugins {} bloğundan eklentileri uygulama, 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 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'de 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 belgelerindeki Eklentileri uygulama bölümüne bakın.

Çeşitli

Diğer işlevlere yönelik Kotlin kodu örnekleri için aşağıdaki doküman sayfalarına bakın:

Bilinen sorunlar

Şu anda bilinen bir sorun olarak, Kotlin ile derleme hızının Groovy'ye kıyasla daha yavaş olabileceği belirtilmektedir.

Sorun bildirme

Sorununuzu önceliklendirmek için ihtiyacımız olan bilgileri nasıl sağlayacağınızla ilgili talimatları Derleme araçları ve Gradle hatalarıyla ilgili ayrıntılar başlıklı makalede 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.