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 Android Studio'nun kod düzenleyicisinde Groovy'ya kıyasla daha iyi entegrasyon sunsa da Kotlin kullanan derlemeler genellikle Groovy kullanan derlemelerden daha yavaştır. Bu nedenle, taşıma işlemine 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 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 taşıma kılavuzunda "Kotlin" ve "Kotlin DSL" terimleri birbirinin yerine kullanılır. Benzer şekilde, "Groovy" ve "Groovy DSL" terimleri birbirinin yerine kullanılır.

Komut 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 ile 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ıza uygulamanız gerekir.

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

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, mülkleri atarken atama operatörünü = atlamanıza olanak tanır. Kotlin ise bunu zorunlu kılar. 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 özelliklerin nasıl atanacağı gösterilmektedir:

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

Dizeleri dönüştürme

Groovy ile Kotlin arasındaki dize farklılıkları aşağıda belirtilmiştir:

  • 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 almak için ${project.rootDir} ifadesini kıvrık parantezle sarın:

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

    Daha fazla bilgi için Kotlin belgelerindeki 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 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ı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 şeklinizdir. 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. Bu nedenle, Kotlin'e dönüştürüldükten sonra mülk adlarını Kotlin tarafından desteklenmeyen çıkarılan 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ğıda, aynı kodun Kotlin'deki hali verilmiştir. 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 tanımlama işlemi aşağıda açıklanmıştır:

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

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

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

Groovy ve Kotlin'de harita tanımlama işlemi aşağıdaki gibidir:

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

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

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 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'inde, Groovy'da debug, release ve benchmark derleme türlerinin kullanıldığı 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

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, eklentinin Maven koordinatlarını (ör. com.android.tools.build:gradle:7.4.0) kullanarak eklentileri derleme sınıf yoluna ekler. plugins {} bloğu ise 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 ile 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ı adı verilen 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 {} bloğunda tanımlanmış eklenti 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ığından 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, 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")

plugins {} bloğu kullanılarak oluşturulan eşdeğer bir 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ğundan eklenti uygulamak Groovy ve Kotlin'de benzerdir. 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şlevlere yönelik Kotlin kod örnekleri için aşağıdaki doküman sayfalarına bakın:

Bilinen sorunlar

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

Sorunları 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. Ardından, Google herkese açık sorun izleyicisini kullanarak hata bildirin.

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.