पहले से मौजूद Kotlin पर माइग्रेट करना

Android Gradle प्लगिन 9.0 में, Kotlin के लिए पहले से मौजूद सहायता की सुविधा जोड़ी गई है. साथ ही, इसे डिफ़ॉल्ट रूप से चालू किया गया है. इसका मतलब है कि अब आपको Kotlin सोर्स फ़ाइलों को कंपाइल करने के लिए, अपनी बिल्ड फ़ाइलों में org.jetbrains.kotlin.android (या kotlin-android) प्लगिन लागू करने की ज़रूरत नहीं है. Kotlin पहले से मौजूद होने की वजह से, आपकी बिल्ड फ़ाइलें आसान होती हैं. साथ ही, AGP और kotlin-android प्लगिन के बीच कंपैटिबिलिटी से जुड़ी समस्याओं से बचा जा सकता है.

Kotlin की सुविधा चालू करना

Kotlin के साथ काम करने वाले AGP के लिए, आपको AGP 9.0 या इसके बाद के वर्शन की ज़रूरत होगी. AGP 9.0 में, उन सभी मॉड्यूल के लिए Kotlin पहले से ही चालू होता है जहां AGP लागू किया जाता है. इसलिए, इसे चालू करने के लिए आपको कुछ भी करने की ज़रूरत नहीं है. हालांकि, अगर आपने gradle.properties फ़ाइल में android.builtInKotlin=false सेट करके, पहले से मौजूद Kotlin का इस्तेमाल बंद कर दिया था, तो आपको उस सेटिंग को हटाना होगा या उसे true पर सेट करना होगा.

Kotlin को बिल्ट-इन करने के लिए, आपको अपने प्रोजेक्ट में कुछ बदलाव करने होंगे. इसलिए, Kotlin को बिल्ट-इन करने की सुविधा चालू करने के बाद, अपने प्रोजेक्ट को माइग्रेट करने के लिए अगले चरण पूरे करें.

माइग्रेशन के चरण

अपने प्रोजेक्ट को एजीपी के पुराने वर्शन से एजीपी 9.0 या उसके बाद के वर्शन पर अपग्रेड करने के बाद, आपको यह गड़बड़ी का मैसेज दिख सकता है. इसके अलावा, अगर आपने बिल्ट-इन Kotlin को मैन्युअल तरीके से चालू किया है, तब भी आपको यह मैसेज दिख सकता है:

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

...या

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.

यह गड़बड़ी इसलिए होती है, क्योंकि बिल्ट-इन Kotlin को आपके प्रोजेक्ट में कुछ बदलाव करने पड़ते हैं. इस गड़बड़ी को ठीक करने के लिए, यह तरीका अपनाएं:

  1. kotlin-android प्लगिन हटाना
  2. अगर ज़रूरी हो, तो kotlin-kapt प्लगिन को माइग्रेट करें
  3. ज़रूरत पड़ने पर, android.kotlinOptions{} डीएसएल को माइग्रेट करें
  4. ज़रूरत पड़ने पर, kotlin.sourceSets{} डीएसएल को माइग्रेट करें

1. kotlin-android प्लगिन हटाना

org.jetbrains.kotlin.android (या kotlin-android) प्लगिन को मॉड्यूल-लेवल की उन बिल्ड फ़ाइलों से हटाएँ जहाँ आपने इसे लागू किया है. हटाया जाने वाला कोड, इस बात पर निर्भर करता है कि प्लगिन के बारे में जानकारी देने के लिए, वर्शन कैटलॉग का इस्तेमाल किया जाता है या नहीं.

वर्शन कैटलॉग के साथ

Kotlin

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

Groovy

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

कोई वर्शन कैटलॉग नहीं है

Kotlin

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

Groovy

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

इसके बाद, प्लगिन को सबसे ऊपर लेवल की बिल्ड फ़ाइल से हटाएं:

वर्शन कैटलॉग के साथ

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
}

कोई वर्शन कैटलॉग नहीं है

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
}

अगर वर्शन कैटलॉग का इस्तेमाल किया जाता है, तो वर्शन कैटलॉग की TOML फ़ाइल (आम तौर पर gradle/libs.versions.toml) से प्लगिन डेफ़िनिशन भी हटाएं:

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

2. अगर ज़रूरी हो, तो kotlin-kapt प्लगिन माइग्रेट करें

org.jetbrains.kotlin.kapt (या kotlin-kapt) प्लगिन, Kotlin के साथ काम नहीं करता. अगर kapt का इस्तेमाल किया जाता है, तो हमारा सुझाव है कि आप अपने प्रोजेक्ट को KSP पर माइग्रेट करें.

अगर आपको अब तक KSP पर माइग्रेट करने का विकल्प नहीं मिला है, तो kotlin-kapt प्लगिन की जगह com.android.legacy-kapt प्लगिन का इस्तेमाल करें. इसके लिए, Android Gradle प्लगिन के उसी वर्शन का इस्तेमाल करें.

उदाहरण के लिए, वर्शन कैटलॉग के साथ, अपने वर्शन कैटलॉग की TOML फ़ाइल को इस तरह अपडेट करें:

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

इसके बाद, अपनी बिल्ड फ़ाइलों को अपडेट करें:

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. अगर ज़रूरी हो, तो android.kotlinOptions{} DSL को माइग्रेट करें

अगर आपने android.kotlinOptions{} डीएसएल का इस्तेमाल किया है, तो आपको इसे kotlin.compilerOptions{} डीएसएल पर माइग्रेट करना होगा.

उदाहरण के लिए, इस कोड को अपडेट करें:

Kotlin

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

Groovy

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

...को नए डीएसएल में बदलें:

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. अगर ज़रूरी हो, तो kotlin.sourceSets{} DSL को माइग्रेट करें

kotlin-android प्लगिन का इस्तेमाल करने पर, AGP आपको android.sourceSets{} डीएसएल या kotlin.sourceSets{} डीएसएल का इस्तेमाल करके, अतिरिक्त Kotlin सोर्स डायरेक्ट्री जोड़ने की सुविधा देता है. android.sourceSets{} डीएसएल की मदद से, डायरेक्ट्री को AndroidSourceSet.kotlin सेट या AndroidSourceSet.java सेट में जोड़ा जा सकता है.

पहले से मौजूद Kotlin के साथ, सिर्फ़ यह विकल्प काम करता है: android.sourceSets{} DSL का इस्तेमाल करके, AndroidSourceSet.kotlin में डायरेक्ट्री जोड़ें. अगर ऐसे विकल्पों का इस्तेमाल किया जा रहा है जो काम नहीं करते हैं, तो उन्हें इस तरह माइग्रेट करें:

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

अगर आपको किसी खास वैरिएंट में Kotlin सोर्स डायरेक्ट्री जोड़नी है या डायरेक्ट्री को किसी टास्क से जनरेट किया गया है, तो वैरिएंट एपीआई में addStaticSourceDirectory या addGeneratedSourceDirectory तरीकों का इस्तेमाल किया जा सकता है:

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

समस्याओं की शिकायत करें

अगर ऊपर दिया गया तरीका अपनाने के बाद भी आपको समस्याएं आ रही हैं, तो समस्या #438678642 में बताई गई समस्याओं की समीक्षा करें. अगर आपको कोई समस्या आ रही है, तो हमें बताएं.

Kotlin के बिल्ट-इन वर्शन से ऑप्ट आउट करना

अगर आपको बिल्ट-इन Kotlin का इस्तेमाल करने के लिए, अपने प्रोजेक्ट को माइग्रेट करने में समस्या आ रही है, तो gradle.properties फ़ाइल में android.builtInKotlin=false को सेट करें, ताकि इसे कुछ समय के लिए बंद किया जा सके. ऐसा करने पर, बिल्ड में एक चेतावनी दिखेगी. इसमें आपको बिल्ट-इन Kotlin पर माइग्रेट करने के लिए कहा जाएगा. ऐसा इसलिए, क्योंकि AGP 10.0 में बिल्ट-इन Kotlin को बंद नहीं किया जा सकेगा.

जब आपका प्रोजेक्ट माइग्रेट करने के लिए तैयार हो जाए, तब बिल्ट-इन Kotlin को चालू करें और माइग्रेशन के चरणों का पालन करें.

मॉड्यूल के हिसाब से माइग्रेट करना

android.builtInKotlin Gradle प्रॉपर्टी की मदद से, उन सभी मॉड्यूल के लिए बिल्ट-इन Kotlin को चालू या बंद किया जा सकता है जहां AGP लागू किया जाता है.

अगर आपको एक साथ सभी मॉड्यूल माइग्रेट करने में मुश्किल हो रही है, तो एक-एक करके मॉड्यूल माइग्रेट किए जा सकते हैं:

  1. सभी मॉड्यूल के लिए, पहले से मौजूद Kotlin को बंद करने के लिए, gradle.properties फ़ाइल में android.builtInKotlin=false सेट करें.

  2. जिस मॉड्यूल में आपको Kotlin को बिल्ट-इन के तौर पर चालू करना है उस पर com.android.built-in-kotlin प्लगिन लागू करें. इसके लिए, Android Gradle प्लगिन के वर्शन का इस्तेमाल करें.

  3. इस मॉड्यूल को Kotlin में माइग्रेट करने के लिए, पिछले माइग्रेशन के चरण अपनाएं.

  4. सभी मॉड्यूल माइग्रेट करने के बाद, gradle.properties में android.builtInKotlin=false सेटिंग और अपनी बिल्ड फ़ाइलों में com.android.built-in-kotlin प्लगिन हटाएं.

पहले से मौजूद Kotlin को चुनिंदा तौर पर बंद करने का विकल्प

Android Gradle प्लगिन 9.0, उन सभी मॉड्यूल के लिए Kotlin को बिल्ट-इन के तौर पर चालू करता है जहां इसे लागू किया जाता है. हमारा सुझाव है कि बड़े प्रोजेक्ट में, उन मॉड्यूल के लिए बिल्ट-इन Kotlin को चुनिंदा तौर पर बंद करें जिनमें Kotlin सोर्स नहीं हैं. इससे Kotlin कंपाइलेशन टास्क हट जाता है. इस टास्क को पूरा करने में, बिल्ड परफ़ॉर्मेंस की थोड़ी लागत लगती है. साथ ही, इससे Kotlin स्टैंडर्ड लाइब्रेरी पर अपने-आप निर्भरता भी हट जाती है.

किसी मॉड्यूल के लिए, Kotlin के बिल्ट-इन वर्शन को बंद करने के लिए, उस मॉड्यूल की बिल्ड फ़ाइल में enableKotlin = false सेट करें:

Kotlin

android {
    enableKotlin = false
}

Groovy

android {
    enableKotlin = false
}