Yerleşik Kotlin'e taşıma

Android Gradle eklentisi 9.0, yerleşik Kotlin desteği sunar ve bu desteği varsayılan olarak etkinleştirir. Bu nedenle, Kotlin kaynak dosyalarını derlemek için artık derleme dosyalarınızda org.jetbrains.kotlin.android (veya kotlin-android) eklentisini uygulamanız gerekmez. Yerleşik Kotlin ile derleme dosyalarınız daha basittir ve AGP ile kotlin-android eklentisi arasındaki uyumluluk sorunlarını önleyebilirsiniz.

Yerleşik Kotlin'i etkinleştirme

Yerleşik Kotlin desteği için AGP 9.0 veya sonraki bir sürüm gerekir. AGP 9.0, AGP'yi uyguladığınız tüm modüllerinizde yerleşik Kotlin'i zaten etkinleştirir. Bu nedenle, Kotlin'i etkinleştirmek için herhangi bir işlem yapmanız gerekmez. Ancak daha önce gradle.properties dosyasında android.builtInKotlin=false ayarını yaparak yerleşik Kotlin'i devre dışı bıraktıysanız bu ayarı kaldırmanız veya true olarak ayarlamanız gerekir.

Yerleşik Kotlin'in kullanılabilmesi için projenizde bazı değişiklikler yapmanız gerekir. Bu nedenle, yerleşik Kotlin'i etkinleştirdikten sonra projenizi taşımak için sonraki adımları uygulayın.

Taşıma adımları

Projenizi eski bir AGP sürümünden AGP 9.0'a yükselttikten veya yerleşik Kotlin'i manuel olarak etkinleştirdikten sonra aşağıdaki hata mesajını görebilirsiniz:

Failed to apply plugin 'org.jetbrains.kotlin.android'.
> Cannot add extension with name 'kotlin', as there is an extension already registered with that name.

...veya

Failed to apply plugin 'com.jetbrains.kotlin.android'
> The 'org.jetbrains.kotlin.android' plugin is no longer required for Kotlin support since AGP 9.0.

Bu hata, yerleşik Kotlin'in projenizde bazı değişiklikler yapılmasını gerektirmesinden kaynaklanır. Bu hatayı düzeltmek için aşağıdaki adımları uygulayın:

  1. kotlin-android eklentisini kaldırma
  2. Gerekirse kotlin-kapt eklentisini taşıyın
  3. Gerekirse android.kotlinOptions{} DSL'yi taşıyın
  4. Gerekirse kotlin.sourceSets{} DSL'yi taşıyın

1. kotlin-android eklentisini kaldırın

org.jetbrains.kotlin.android (veya kotlin-android) eklentisini, uyguladığınız modül düzeyindeki derleme dosyalarından kaldırın. Kaldırılacak tam kod, eklentileri bildirmek için sürüm kataloglarını kullanıp kullanmadığınıza bağlıdır.

Sürüm kataloglarıyla

Kotlin

// Module-level build file
plugins {
    alias(libs.plugins.kotlin.android)
}

Groovy

// Module-level build file
plugins {
    alias(libs.plugins.kotlin.android)
}

Sürüm kataloğu yok

Kotlin

// Module-level build file
plugins {
    id("org.jetbrains.kotlin.android")
}

Groovy

// Module-level build file
plugins {
    id 'org.jetbrains.kotlin.android'
}

Ardından, eklentiyi üst düzey derleme dosyanızdan kaldırın:

Sürüm kataloglarıyla

Kotlin

// Top-level build file
plugins {
    alias(libs.plugins.kotlin.android) apply false
}

Groovy

// Top-level build file
plugins {
    alias(libs.plugins.kotlin.android) apply false
}

Sürüm kataloğu yok

Kotlin

// Top-level build file
plugins {
    id("org.jetbrains.kotlin.android") version "KOTLIN_VERSION" apply false
}

Groovy

// Top-level build file
plugins {
    id 'org.jetbrains.kotlin.android' version 'KOTLIN_VERSION' apply false
}

Sürüm katalogları kullanıyorsanız eklenti tanımını sürüm kataloğu TOML dosyasından (genellikle gradle/libs.versions.toml) da kaldırın:

[plugins]
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "KOTLIN_VERSION" }

2. Gerekirse kotlin-kapt eklentisini taşıyın

org.jetbrains.kotlin.kapt (veya kotlin-kapt) eklentisi, yerleşik Kotlin ile uyumlu değil. kapt kullanıyorsanız projenizi KSP'ye taşımanızı öneririz.

Henüz KSP'ye geçemiyorsanız kotlin-kapt eklentisini com.android.legacy-kapt eklentisiyle değiştirin. Android Gradle eklentinizle aynı sürümü kullanın.

Örneğin, sürüm kataloglarında sürüm kataloğu TOML dosyanızı aşağıdaki gibi güncelleyin:

[plugins]
android-application = { id = "com.android.application", version.ref = "AGP_VERSION" }

# Add the following plugin definition
legacy-kapt = { id = "com.android.legacy-kapt", version.ref = "AGP_VERSION" }

# Remove the following plugin definition
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "KOTLIN_VERSION" }

Ardından, derleme dosyalarınızı güncelleyin:

Kotlin

// Top-level build file
plugins {
    alias(libs.plugins.legacy.kapt) apply false
    alias(libs.plugins.kotlin.kapt) apply false
}

Groovy

// Top-level build file
plugins {
    alias(libs.plugins.legacy.kapt) apply false
    alias(libs.plugins.kotlin.kapt) apply false
}

Kotlin

// Module-level build file
plugins {
    alias(libs.plugins.legacy.kapt)
    alias(libs.plugins.kotlin.kapt)
}

Groovy

// Module-level build file
plugins {
    alias(libs.plugins.legacy.kapt)
    alias(libs.plugins.kotlin.kapt)
}

3. Gerekirse android.kotlinOptions{} DSL'yi taşıyın

android.kotlinOptions{} DSL'yi kullanıyorsanız kotlin.compilerOptions{} DSL'ye taşımanız gerekir.

Örneğin, şu kodu güncelleyin:

Kotlin

android {
    kotlinOptions {
        languageVersion = "2.0"
        jvmTarget = "11"
    }
}

Groovy

android {
    kotlinOptions {
        languageVersion = "2.0"
        jvmTarget = "11"
    }
}

...yeni DSL'ye:

Kotlin

kotlin {
    compilerOptions {
        languageVersion = org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0
        // Optional: Set jvmTarget
        // jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11
    }
}

Groovy

kotlin {
    compilerOptions {
        languageVersion = org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0
        // Optional: Set jvmTarget
        // jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11
    }
}

4. Gerekirse kotlin.sourceSets{} DSL'yi taşıyın

kotlin-android eklentisini kullandığınızda AGP, android.sourceSets{} DSL'sini veya kotlin.sourceSets{} DSL'sini kullanarak ek Kotlin kaynak dizinleri eklemenize olanak tanır. android.sourceSets{} DSL ile dizinleri AndroidSourceSet.kotlin veya AndroidSourceSet.java kümesine ekleyebilirsiniz.

Yerleşik Kotlin ile desteklenen tek seçenek, android.sourceSets{} DSL'sini kullanarak dizinleri AndroidSourceSet.kotlin kümesine eklemektir. Desteklenmeyen seçenekler kullanıyorsanız bunları aşağıdaki şekilde taşıyın:

Kotlin

# Adding Kotlin source directories to kotlin.sourceSets is not supported
kotlin.sourceSets.named("main") {
    kotlin.srcDir("additionalSourceDirectory/kotlin")
}

# Adding Kotlin source directories to AndroidSourceSet.java is also not supported
android.sourceSets.named("main") {
    java.directories += "additionalSourceDirectory/kotlin"
}

# Add Kotlin source directories to AndroidSourceSet.kotlin
android.sourceSets.named("main") {
    kotlin.directories += "additionalSourceDirectory/kotlin"
}

Groovy

# Adding Kotlin source directories to kotlin.sourceSets is not supported
kotlin.sourceSets.named("main") {
    kotlin.srcDir("additionalSourceDirectory/kotlin")
}

# Adding Kotlin source directories to AndroidSourceSet.java is also not supported
android.sourceSets.named("main") {
    java.directories.add("additionalSourceDirectory/kotlin")
}

# Add Kotlin source directories to AndroidSourceSet.kotlin
android.sourceSets.named("main") {
    kotlin.directories.add("additionalSourceDirectory/kotlin")
}

Belirli bir varyanta Kotlin kaynak dizini eklemek istiyorsanız veya dizin bir görev tarafından oluşturuluyorsa variant API'deki addStaticSourceDirectory veya addGeneratedSourceDirectory yöntemlerini kullanabilirsiniz:

Kotlin

androidComponents.onVariants { variant ->
    variant.sources.kotlin!!.addStaticSourceDirectory("additionalSourceDirectory/kotlin")
    variant.sources.kotlin!!.addGeneratedSourceDirectory(TASK_PROVIDER, TASK_OUTPUT)
}

Groovy

androidComponents.onVariants { variant ->
    variant.sources.kotlin!!.addStaticSourceDirectory("additionalSourceDirectory/kotlin")
    variant.sources.kotlin!!.addGeneratedSourceDirectory(TASK_PROVIDER, TASK_OUTPUT)
}

Sorun bildir

Önceki adımları tamamladıktan sonra sorunlarla karşılaşırsanız 438678642 numaralı sorundaki bilinen sorunları inceleyin ve gerekirse bize geri bildirim gönderin.

Yerleşik Kotlin'i devre dışı bırakma

Projenizi yerleşik Kotlin'i kullanacak şekilde taşıyamıyorsanız geçici olarak devre dışı bırakmak için gradle.properties dosyasında android.builtInKotlin=false değerini ayarlayın. Bu işlemi yaptığınızda derlemede, AGP 10.0'dan önce AGP 9.x'in gelecekteki bir sürümünde yerleşik Kotlin'i devre dışı bırakamayacağınız için yerleşik Kotlin'e geçmenizi hatırlatan bir uyarı gösterilir.

Projenizi taşımaya hazır olduğunuzda yerleşik Kotlin'i etkinleştirin ve taşıma adımlarını uygulayın.

Modül modül taşıma

android.builtInKotlin Gradle özelliği, AGP'yi uyguladığınız tüm modüllerinizde yerleşik Kotlin'i etkinleştirmenize veya devre dışı bırakmanıza olanak tanır.

Tüm modüllerinizi tek seferde taşımak zor geliyorsa modülleri teker teker taşıyabilirsiniz:

  1. android.builtInKotlin=false dosyasında gradle.properties değerini ayarlayarak tüm modüller için yerleşik Kotlin'i devre dışı bırakın.

  2. Android Gradle eklentinizle aynı sürümü kullanarak yerleşik Kotlin'i etkinleştirmek istediğiniz modüle com.android.built-in-kotlin eklentisini uygulayın.

  3. Bu modülü yerleşik Kotlin'e taşımak için önceki taşıma adımlarını uygulayın.

  4. Tüm modüllerinizi taşıdıktan sonra gradle.properties içindeki android.builtInKotlin=false ayarını ve derleme dosyalarınızdaki com.android.built-in-kotlin eklentisini kaldırın.

Yerleşik Kotlin'i seçerek devre dışı bırakma seçeneği

Android Gradle eklentisi 9.0, uygulandığı tüm modüllerde yerleşik Kotlin'i etkinleştirir. Büyük projelerde Kotlin kaynakları olmayan modüller için yerleşik Kotlin'i seçerek devre dışı bırakmanızı öneririz. Bu, hem küçük bir derleme performansı maliyeti olan Kotlin derleme görevini hem de Kotlin standart kitaplığına yönelik otomatik bağımlılığı kaldırır.

Bir modülde yerleşik Kotlin'i devre dışı bırakmak için modülün derleme dosyasında enableKotlin = false değerini ayarlayın:

Kotlin

android {
    enableKotlin = false
}

Groovy

android {
    enableKotlin = false
}