Migracja do wbudowanego języka Kotlin

Wtyczka Androida do obsługi Gradle w wersji 9.0 wprowadza wbudowaną obsługę języka Kotlin i domyślnie ją włącza. Oznacza to, że nie musisz już stosować wtyczki org.jetbrains.kotlin.android (ani kotlin-android) w plikach kompilacji do kompilowania plików źródłowych Kotlin. Dzięki wbudowanemu Kotlinowi pliki kompilacji są prostsze i możesz uniknąć problemów ze zgodnością między AGP a wtyczką kotlin-android.

Włączanie wbudowanego języka Kotlin

Aby mieć wbudowaną obsługę języka Kotlin, musisz mieć AGP w wersji 9.0 lub nowszej. AGP 9.0 umożliwia już wbudowaną obsługę języka Kotlin we wszystkich modułach, w których stosujesz AGP, więc nie musisz nic robić, aby ją włączyć. Jeśli jednak wcześniej zrezygnowano z wbudowanego języka Kotlin, ustawiając android.builtInKotlin=false w pliku gradle.properties, musisz usunąć to ustawienie lub ustawić android.builtInKotlin=true, aby włączyć tę funkcję.

Wbudowany Kotlin wymaga wprowadzenia pewnych zmian w projekcie, więc po włączeniu wbudowanego Kotlina wykonaj kolejne kroki, aby przenieść projekt.

Etapy migracji

Po uaktualnieniu projektu ze starszej wersji AGP do AGP 9.0 lub nowszej albo po ręcznym włączeniu wbudowanego języka Kotlin może pojawić się ten komunikat o błędzie:

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

...lub

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.

Dzieje się tak, ponieważ wbudowany Kotlin wymaga wprowadzenia pewnych zmian w projekcie. Aby rozwiązać ten problem, wykonaj te czynności.

  1. Usuń wtyczkę kotlin-android
  2. W razie potrzeby przenieś wtyczkę kotlin-kapt
  3. W razie potrzeby przenieś blok kotlinOptions{}

1. Usuń wtyczkę kotlin-android

Usuń wtyczkę org.jetbrains.kotlin.android (lub kotlin-android) z plików kompilacji na poziomie modułu, w których ją stosujesz. Dokładny kod do usunięcia zależy od tego, czy do deklarowania wtyczek używasz katalogów wersji.

Z katalogami wersji

Kotlin

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

Groovy

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

Brak katalogów wersji

Kotlin

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

Groovy

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

Następnie usuń wtyczkę z pliku kompilacji najwyższego poziomu:

Z katalogami wersji

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
}

Brak katalogów wersji

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
}

Jeśli używasz katalogów wersji, usuń też definicję wtyczki z pliku TOML katalogu wersji (zwykle gradle/libs.versions.toml):

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

2. W razie potrzeby przenieś wtyczkę kotlin-kapt.

Jeśli w plikach kompilacji używasz org.jetbrains.kotlin.kapt (lub kotlin-kapt), ta wtyczka nie będzie zgodna z wbudowanym Kotlinem. Musisz zastąpić tę wtyczkę wtyczką com.android.legacy-kapt, używając tej samej wersji co bieżąca wtyczka Androida do obsługi Gradle.

Na przykład w przypadku katalogów wersji zaktualizuj plik TOML katalogu wersji w ten sposób:

[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" }

Następnie zaktualizuj pliki kompilacji:

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. W razie potrzeby przenieś blok kotlinOptions{}.

Jeśli używasz DSL android.kotlinOptions{}, musisz przenieść go na DSL kotlin.compilerOptions{}.

Na przykład zaktualizuj ten kod:

Kotlin

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

Groovy

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

…do nowego DSL:

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
    }
}

Zgłoś problemy

Jeśli po wykonaniu powyższych czynności napotkasz problemy, zapoznaj się z opisem znanych problemów w zgłoszeniu nr 438678642 i w razie potrzeby prześlij nam opinię.

Rezygnacja z wbudowanego języka Kotlin

Jeśli nie możesz przenieść projektu, aby korzystać z wbudowanego języka Kotlin, ustaw wartość android.builtInKotlin = false w pliku gradle.properties, aby tymczasowo wyłączyć wbudowany język Kotlin. Gdy to zrobisz, w kompilacji pojawi się ostrzeżenie przypominające o przejściu na wbudowany język Kotlin, ponieważ w przyszłej wersji AGP 9.x nie będzie można wyłączyć wbudowanego języka Kotlin przed AGP 10.0.

Migracja moduł po module

Właściwość Gradle android.builtInKotlin umożliwia włączanie i wyłączanie wbudowanego języka Kotlin we wszystkich modułach, w których stosujesz AGP.

Jeśli migracja wszystkich modułów naraz jest trudna, możesz przenieść je pojedynczo:

  1. W pliku gradle.properties ustaw wartość android.builtInKotlin = false, aby wyłączyć wbudowany język Kotlin we wszystkich modułach.

  2. Zastosuj wtyczkę com.android.experimental.built-in-kotlin do modułu, w którym chcesz włączyć wbudowany język Kotlin, używając tej samej wersji co bieżąca wtyczka Androida do Gradle.

  3. Wykonaj poprzednie kroki migracji, aby przenieść ten moduł do wbudowanego języka Kotlin.

  4. Po przeniesieniu wszystkich modułów usuń ustawienie android.builtInKotlin = falsegradle.properties i wtyczkę com.android.experimental.built-in-kotlin w plikach kompilacji.