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 को आपके प्रोजेक्ट में कुछ बदलाव करने की ज़रूरत होती है. इस गड़बड़ी को ठीक करने के लिए, यह तरीका अपनाएं:
kotlin-androidप्लगिन हटाना- अगर ज़रूरी हो, तो
kotlin-kaptप्लगिन को माइग्रेट करें - ज़रूरत पड़ने पर,
android.kotlinOptions{}डीएसएल को माइग्रेट करें - ज़रूरत पड़ने पर,
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 पर माइग्रेट करने का विकल्प नहीं मिला है, तो 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 definitionkotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "KOTLIN_VERSION" }
इसके बाद, अपनी बिल्ड फ़ाइलें अपडेट करें:
Kotlin
// Top-level build file plugins { alias(libs.plugins.legacy.kapt) apply falsealias(libs.plugins.kotlin.kapt) apply false}
Groovy
// Top-level build file plugins { alias(libs.plugins.legacy.kapt) apply falsealias(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 supportedkotlin.sourceSets.named("main") { kotlin.srcDir("additionalSourceDirectory/kotlin") }# Adding Kotlin source directories to AndroidSourceSet.java is also not supportedandroid.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 supportedkotlin.sourceSets.named("main") { kotlin.srcDir("additionalSourceDirectory/kotlin") }# Adding Kotlin source directories to AndroidSourceSet.java is also not supportedandroid.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 लागू किया जाता है.
अगर आपको एक साथ सभी मॉड्यूल माइग्रेट करने में मुश्किल हो रही है, तो एक-एक करके मॉड्यूल माइग्रेट करें:
सभी मॉड्यूल के लिए, पहले से मौजूद Kotlin को बंद करने के लिए,
gradle.propertiesफ़ाइल मेंandroid.builtInKotlin=falseसेट करें.जिस मॉड्यूल में आपको Kotlin को पहले से मौजूद सुविधा के तौर पर चालू करना है उस पर
com.android.built-in-kotlinप्लगिन लागू करें. इसके लिए, Android Gradle प्लगिन के वर्शन का इस्तेमाल करें.इस मॉड्यूल को बिल्ट-इन Kotlin पर माइग्रेट करने के लिए, पिछले माइग्रेशन के चरण अपनाएं.
सभी मॉड्यूल माइग्रेट करने के बाद,
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 }