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

অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ বিল্ট-ইন কোটলিন সাপোর্ট চালু করে এবং ডিফল্টভাবে এটি সক্ষম করে। এর অর্থ হল কোটলিন সোর্স ফাইলগুলি কম্পাইল করার জন্য আপনাকে আর আপনার বিল্ড ফাইলগুলিতে 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" }

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

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

কোটলিন

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

...নতুন DSL-এর কাছে:

কোটলিন

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

যদি আপনি একটি নির্দিষ্ট ভেরিয়েন্টে একটি Kotlin সোর্স ডিরেক্টরি যোগ করতে চান অথবা যদি ডিরেক্টরিটি একটি টাস্ক দ্বারা তৈরি হয়, তাহলে আপনি variant 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 এর আগে AGP 9.x এর ভবিষ্যতের সংস্করণে বিল্ট-ইন কোটলিন নিষ্ক্রিয় করতে পারবেন না।

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

মডিউল-বাই-মডিউল মাইগ্রেশন

android.builtInKotlin Gradle প্রপার্টি আপনাকে আপনার সমস্ত মডিউলের জন্য বিল্ট-ইন Kotlin সক্ষম বা নিষ্ক্রিয় করতে দেয় যেখানে আপনি 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
}