অন্তর্নির্মিত কোটলিনে স্থানান্তর করুন

অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০-তে বিল্ট-ইন কোটলিন সাপোর্ট যুক্ত করা হয়েছে এবং এটি ডিফল্টভাবে সক্রিয় থাকে। এর মানে হলো, কোটলিন সোর্স ফাইল কম্পাইল করার জন্য আপনাকে আর আপনার বিল্ড ফাইলে org.jetbrains.kotlin.android (বা kotlin-android ) প্লাগইনটি প্রয়োগ করতে হবে না। বিল্ট-ইন কোটলিনের ফলে আপনার বিল্ড ফাইলগুলো আরও সরল হয় এবং আপনি AGP ও kotlin-android প্লাগইনের মধ্যেকার সামঞ্জস্যজনিত সমস্যা এড়াতে পারেন।

বিল্ট-ইন কোটলিন সক্রিয় করুন

বিল্ট-ইন কোটলিন সাপোর্টের জন্য আপনার AGP 9.0 বা তার উচ্চতর সংস্করণ প্রয়োজন। AGP 9.0 আপনার সমস্ত মডিউলে, যেখানে আপনি AGP প্রয়োগ করেন, সেখানে আগে থেকেই বিল্ট-ইন কোটলিন সক্রিয় করে রাখে, তাই এটি চালু করার জন্য আপনাকে কিছু করতে হবে না। তবে, যদি আপনি আগে gradle.properties ফাইলে android.builtInKotlin=false সেট করে বিল্ট-ইন কোটলিন ব্যবহার করা থেকে বিরত থেকে থাকেন , তাহলে আপনাকে সেই সেটিংটি মুছে ফেলতে হবে অথবা এটিকে true তে সেট করতে হবে।

বিল্ট-ইন কোটলিন ব্যবহার করার জন্য আপনার প্রজেক্টে কিছু পরিবর্তন প্রয়োজন, তাই বিল্ট-ইন কোটলিন সক্রিয় করার পর আপনার প্রজেক্ট মাইগ্রেট করতে নিম্নলিখিত ধাপগুলো অনুসরণ করুন।

অভিবাসনের পদক্ষেপ

আপনার প্রজেক্টটি পুরোনো AGP ভার্সন থেকে AGP 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.

এই ত্রুটিটি ঘটে কারণ বিল্ট-ইন কোটলিন আপনার প্রোজেক্টে কিছু পরিবর্তন করতে চায়। এই ত্রুটিটি সমাধান করতে, নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করুন:

  1. kotlin-android প্লাগইনটি সরান
  2. প্রয়োজনে kotlin-kapt প্লাগইনটি স্থানান্তর করুন।
  3. প্রয়োজনে android.kotlinOptions{} DSL স্থানান্তর করুন।
  4. প্রয়োজনে kotlin.sourceSets{} DSL স্থানান্তর করুন।

১. kotlin-android প্লাগইনটি সরিয়ে ফেলুন

মডিউল-স্তরের বিল্ড ফাইলগুলি থেকে org.jetbrains.kotlin.android (বা kotlin-android ) প্লাগইনটি সরিয়ে ফেলুন, যেখানে আপনি এটি প্রয়োগ করেন। ঠিক কোন কোডটি সরাতে হবে তা নির্ভর করে আপনি প্লাগইন ঘোষণা করার জন্য ভার্সন ক্যাটালগ ব্যবহার করেন কিনা তার উপর।

সংস্করণ ক্যাটালগ সহ

কোটলিন

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

গ্রুভি

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

কোন সংস্করণ ক্যাটালগ নেই

কোটলিন

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

গ্রুভি

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

তারপর, আপনার টপ-লেভেল বিল্ড ফাইল থেকে প্লাগইনটি সরিয়ে ফেলুন:

সংস্করণ ক্যাটালগ সহ

কোটলিন

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

গ্রুভি

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

কোন সংস্করণ ক্যাটালগ নেই

কোটলিন

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

গ্রুভি

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

২. প্রয়োজনে kotlin-kapt প্লাগইনটি স্থানান্তর করুন।

org.jetbrains.kotlin.kapt (বা kotlin-kapt ) প্লাগইনটি বিল্ট-ইন কোটলিনের সাথে সামঞ্জস্যপূর্ণ নয়। আপনি যদি kapt ব্যবহার করেন, তাহলে আমরা আপনার প্রজেক্টটি KSP-তে স্থানান্তরিত করার পরামর্শ দিই।

আপনি যদি এখনও KSP-তে মাইগ্রেট করতে না পারেন, তাহলে আপনার অ্যান্ড্রয়েড গ্রেডল প্লাগইনের সাথে একই সংস্করণ ব্যবহার করে kotlin-kapt প্লাগইনটি com.android.legacy-kapt প্লাগইন দিয়ে প্রতিস্থাপন করুন।

উদাহরণস্বরূপ, ভার্সন ক্যাটালগের ক্ষেত্রে, আপনার ভার্সন ক্যাটালগ 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" }

তারপর, আপনার বিল্ড ফাইলগুলো আপডেট করুন:

কোটলিন

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

গ্রুভি

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

কোটলিন

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

গ্রুভি

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

৩. প্রয়োজনে android.kotlinOptions{} DSL স্থানান্তর করুন।

আপনি যদি android.kotlinOptions{} DSL ব্যবহার করেন, তাহলে আপনাকে এটি kotlin.compilerOptions{} DSL-এ মাইগ্রেট করতে হবে।

উদাহরণস্বরূপ, এই কোডটি আপডেট করুন:

কোটলিন

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

গ্রুভি

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

...নতুন ডিএসএল-এ:

কোটলিন

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

গ্রুভি

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

৪. প্রয়োজনে kotlin.sourceSets{} DSL স্থানান্তর করুন।

যখন আপনি kotlin-android প্লাগইনটি ব্যবহার করেন, তখন AGP আপনাকে android.sourceSets{} DSL অথবা kotlin.sourceSets{} DSL ব্যবহার করে অতিরিক্ত Kotlin সোর্স ডিরেক্টরি যোগ করার সুযোগ দেয়। android.sourceSets{} DSL ব্যবহার করে, আপনি ডিরেক্টরিগুলো AndroidSourceSet.kotlin সেট অথবা AndroidSourceSet.java সেটে যোগ করতে পারেন।

বিল্ট-ইন কোটলিনের ক্ষেত্রে, একমাত্র সমর্থিত উপায় হলো android.sourceSets{} DSL ব্যবহার করে ডিরেক্টরিগুলোকে AndroidSourceSet.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"
}

গ্রুভি

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

যদি আপনি কোনো নির্দিষ্ট ভ্যারিয়েন্টে একটি কোটলিন সোর্স ডিরেক্টরি যোগ করতে চান অথবা যদি ডিরেক্টরিটি কোনো টাস্ক দ্বারা তৈরি হয়, তাহলে আপনি ভ্যারিয়েন্ট API- তে addStaticSourceDirectory বা addGeneratedSourceDirectory মেথডগুলো ব্যবহার করতে পারেন:

কোটলিন

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

গ্রুভি

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

সমস্যা রিপোর্ট করুন

পূর্ববর্তী ধাপগুলো সম্পন্ন করার পরেও যদি আপনি কোনো সমস্যার সম্মুখীন হন, তাহলে ইস্যু #438678642 -এ থাকা জ্ঞাত সমস্যাগুলো পর্যালোচনা করুন এবং প্রয়োজনে আমাদের মতামত দিন।

বিল্ট-ইন কোটলিন থেকে অপ্ট আউট করুন

আপনি যদি আপনার প্রজেক্টকে বিল্ট-ইন কোটলিন ব্যবহারে মাইগ্রেট করতে না পারেন, তবে এটিকে সাময়িকভাবে নিষ্ক্রিয় করতে gradle.properties ফাইলে android.builtInKotlin=false সেট করুন। যখন আপনি এটি করবেন, বিল্ড একটি সতর্কবার্তা দেখাবে যা আপনাকে বিল্ট-ইন কোটলিনে মাইগ্রেট করার কথা মনে করিয়ে দেবে, কারণ আপনি AGP 10.0-এ বিল্ট-ইন কোটলিন নিষ্ক্রিয় করতে পারবেন না।

আপনার প্রজেক্ট মাইগ্রেট করার জন্য প্রস্তুত হয়ে গেলে, বিল্ট-ইন কোটলিন সক্রিয় করুন এবং মাইগ্রেশনের ধাপগুলো অনুসরণ করুন।

মডিউল-ভিত্তিক স্থানান্তর

android.builtInKotlin গ্রেডল প্রপার্টিটি আপনাকে আপনার সেই সমস্ত মডিউলের জন্য বিল্ট-ইন কোটলিন চালু বা বন্ধ করার সুযোগ দেয়, যেখানে আপনি AGP প্রয়োগ করেন।

একসাথে আপনার সমস্ত মডিউল স্থানান্তর করা কঠিন হলে, আপনি একবারে একটি করে মডিউল স্থানান্তর করতে পারেন:

  1. সমস্ত মডিউলের জন্য বিল্ট-ইন কোটলিন নিষ্ক্রিয় করতে gradle.properties ফাইলে android.builtInKotlin=false সেট করুন।

  2. যে মডিউলটিতে আপনি বিল্ট-ইন কোটলিন সক্রিয় করতে চান, সেটিতে আপনার অ্যান্ড্রয়েড গ্রেডল প্লাগইনের সংস্করণের সাথে একই সংস্করণ ব্যবহার করে com.android.built-in-kotlin প্লাগইনটি প্রয়োগ করুন।

  3. এই মডিউলটিকে বিল্ট-ইন কোটলিনে মাইগ্রেট করতে পূর্ববর্তী মাইগ্রেশন ধাপগুলো অনুসরণ করুন।

  4. আপনার সমস্ত মডিউল মাইগ্রেট করা হয়ে গেলে, gradle.properties থেকে android.builtInKotlin=false সেটিংটি এবং আপনার বিল্ড ফাইলগুলো থেকে com.android.built-in-kotlin প্লাগইনটি সরিয়ে ফেলুন।

বিল্ট-ইন কোটলিন বেছে বেছে নিষ্ক্রিয় করার বিকল্প

অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ যে সকল মডিউলে এটি প্রয়োগ করা হয়, সেগুলোর জন্য বিল্ট-ইন কোটলিন সক্রিয় করে। বড় প্রজেক্টে, যে মডিউলগুলোতে কোটলিন সোর্স নেই, সেগুলোর জন্য আমরা বেছে বেছে বিল্ট-ইন কোটলিন নিষ্ক্রিয় করার পরামর্শ দিই। এর ফলে কোটলিন কম্পাইলেশনের কাজটি, যা বিল্ড পারফরম্যান্সে সামান্য প্রভাব ফেলে, এবং কোটলিন স্ট্যান্ডার্ড লাইব্রেরির উপর স্বয়ংক্রিয় নির্ভরতা—উভয়ই দূর হয়।

কোনো মডিউলের জন্য বিল্ট-ইন কোটলিন নিষ্ক্রিয় করতে, সেই মডিউলের বিল্ড ফাইলে enableKotlin = false সেট করুন:

কোটলিন

android {
    enableKotlin = false
}

গ্রুভি

android {
    enableKotlin = false
}