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 kullanma desteği ekledi.

Kotlin, daha okunaklı olduğu, daha iyi derleme süresi kontrolü ve IDE desteği sunduğu için Gradle komut dosyaları yazarken Groovy'ye tercih edilir.

Kotlin şu anda Android Studio'nun kod düzenleyicisinde Groovy'ye kıyasla daha iyi entegrasyon sunsa da Kotlin kullanan derlemeler Groovy kullanan derlemelerden daha yavaş olma eğilimindedir. 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 geçiş rehberi için Gradle'ın resmi belgelerini inceleyin.

Zaman çizelgesi

Android Studio Giraffe'den itibaren yeni projeler, derleme yapılandırması için varsayılan olarak Kotlin DSL'yi (build.gradle.kts) kullanır. Bu, 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ını inceleyin.

Sık kullanılan terimler

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

Bu geçiş rehberinde "Kotlin" ve "Kotlin DSL" birbirinin yerine kullanılmaktadır. Benzer şekilde, "Groovy" ve "Groovy DSL" 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 dilinde 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ızın tamamında 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 kullanmanız 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ılmış aynı koddur:

compileSdkVersion(30)

Atama aramalarına = ekleyin

Groovy DSL, özellik atarken atama operatörünü (=) atlamanıza olanak tanır. Kotlin ise bu operatörü kullanmanızı zorunlu kılar. Bu kodda, Groovy'de özelliklerin nasıl atanacağı gösterilmektedir:

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 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, çift tırnak gerektirir.

  • Noktalı ifadelerde dize interpolasyonu: Groovy'de, noktalı ifadelerdeki dize interpolasyonları için yalnızca $ ön ekini kullanabilirsiniz ancak Kotlin'de noktalı ifadeleri süslü parantez içine almanız gerekir. Ö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 project.rootDir üzerinde değil, project üzerinde toString() çağrısı yapar. Kök dizinin değerini almak için ${project.rootDir} ifadesini küme parantezleri içine alı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 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 ardından devam edin. Bir projede Kotlin ve Groovy derleme dosyalarını bir arada kullanabilirsiniz. Bu nedenle, geçişi dikkatli bir şekilde yapmak için acele etmeyin.

def yerine val veya var koyun

def yerine val veya var kullanın. Kotlin'de değişkenleri bu şekilde tanımlarsınız. Groovy'de değişken bildirimi şu şekildedir:

def building64Bit = false

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

val building64Bit = false

Boole özelliklerinin önüne is ekleyin.

Groovy, mülk adlarına göre mülk çıkarım mantığını kullanır. Boole özelliği foo için çıkarılan yöntemleri 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 boole öğeleri için is ön ekini kullanmanız 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 önünde is ön eki bulunduğ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 eşlemeler farklı söz dizimi kullanılarak tanımlanır. Groovy, [] kullanırken Kotlin, listOf veya mapOf kullanarak koleksiyon oluşturma yöntemlerini 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:

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:

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ınlanan 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, yayınlama ve diğer bazı derleme türlerini önceden 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 geçiş yapma

Derlemeniz projeye eklenti 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 Android Studio, derleme başarısız olsa bile bağlamı bilir. Bu bağlam, Studio IDE'nin kod tamamlama ve diğer faydalı öneriler 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, eklentinin Maven koordinatlarını (ör. com.android.tools.build:gradle:7.4.0) 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, eklentileri apply plugin kullanarak uygularken 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

Eklentilerin tam listesini Google Maven deposunda bulabilirsiniz.

Kotlin eklentilerine birden fazla eklenti kimliğiyle referans verilebilir. Ad alanlı eklenti kimliğini kullanmanızı ve aşağıdaki tabloya göre kısa formdan ad alanlı eklenti kimliğine yeniden düzenlemenizi öneririz:

Kısa eklenti kimlikleri Ad alanına sahip 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üzenleme işlemini gerçekleştirme

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

  1. buildscript {} bloğunda 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ındaki 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. 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 dosyasından kaldırın.

Örneğin, bu kurulumda buildscript {} bloğu kullanılı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ürme

plugins {} bloğundan eklenti uygulama işlemi Groovy ve Kotlin'de benzerdir. Aşağıdaki kodda, sürüm kataloglarını kullanırken Groovy'de 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'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 Eklenti uygulama bölümüne bakın.

Çeşitli

Diğer işlevlerle ilgili Kotlin kod örnekleri için aşağıdaki doküman sayfalarına bakın:

Bilinen sorunlar

Kotlin ile derleme hızının Groovy'ye göre daha yavaş olabileceği bilinen bir sorundur.

Sorun bildirme

Sorununuzu önceliklendirmek için ihtiyaç duyduğumuz bilgileri nasıl sağlayacağınızla ilgili talimatları Derleme araçları ve Gradle hatalarıyla ilgili ayrıntılar bölümünde bulabilirsiniz. Ardından, Google'ın herkese açık Issue Tracker'ını 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.