KMP-এর জন্য Android Gradle লাইব্রেরি প্লাগ-ইন সেট-আপ করা

com.android.kotlin.multiplatform.library Gradle প্লাগ-ইন হল Kotlin Multiplatform (KMP) লাইব্রেরি মডিউলে Android টার্গেট যোগ করার জন্য আনুষ্ঠানিকভাবে সমর্থিত টুল। এটি প্রোজেক্ট কনফিগারেশন সহজ করে, বিল্ড পারফর্ম্যান্স উন্নত করে এবং Android Studio-র সাথে আরও ভালো ইন্টিগ্রেশন অফার করে।

KMP ডেভেলপমেন্টের জন্য com.android.library প্লাগ-ইন ব্যবহার করা Android Gradle প্লাগ-ইন API-এর উপর নির্ভর করে যা বন্ধ করে দেওয়া হয়েছে এবং Android Gradle প্লাগ-ইন 9.0 ও তার পরবর্তী ভার্সনে (Q4 2025) চালু করতে হবে। Android Gradle প্লাগ-ইন 10.0 (২০২৬-এর দ্বিতীয়ার্ধ) থেকে এইসব API সরিয়ে দেওয়া হবে বলে আশা করা হচ্ছে।

এই প্লাগ-ইন প্রয়োগ করতে, Android-KMP প্লাগ-ইন প্রয়োগ করুন বিভাগ দেখুন। আপনাকে পুরনো API থেকে মাইগ্রেট করতে হলে, মাইগ্রেশন গাইড চেক করুন।

AGP 9.0+ মাইগ্রেশনের ব্যাপারে সাহায্য পেতে, আপনি KMP অ্যাপের জন্য JetBrains-এর তৈরি করা এজেন্ট স্কিল ব্যবহার করতে পারেন। Android Studio-তে স্কিল ব্যবহার করার ব্যাপারে আরও জানতে, স্কিলের মাধ্যমে এজেন্ট মোড এক্সটেন্ড করুন দেখুন। মনে রাখবেন, AI-এর ফলাফল সম্পূর্ণভাবে অনুমান করা যায় না।

মূল ফিচার ও পার্থক্য

Android-KMP প্লাগ-ইন বিশেষভাবে KMP প্রোজেক্টের জন্য তৈরি করা হয়েছে এবং এটি স্ট্যান্ডার্ড com.android.library প্লাগ-ইন থেকে বেশ কিছু মূল দিক থেকে আলাদা:

  • সিঙ্গেল ভেরিয়েন্ট আর্কিটেকচার: প্লাগ-ইনটি একটি সিঙ্গেল ভেরিয়েন্ট ব্যবহার করে, প্রোডাক্ট ফ্লেভার এবং বিল্ড টাইপের জন্য সহায়তা সরিয়ে দেয়, যা কনফিগারেশনকে সহজ করে এবং বিল্ড পারফর্ম্যান্সকে উন্নত করে।

  • KMP-এর জন্য অপ্টিমাইজ করা: প্লাগ-ইনটি KMP লাইব্রেরির জন্য ডিজাইন করা হয়েছে, যা শেয়ার করা Kotlin কোড এবং ইন্টারঅপারেবিলিটির উপর ফোকাস করে, Android-নির্দিষ্ট নেটিভ বিল্ড, AIDL এবং RenderScript-এর জন্য সহায়তা বাদ দেয়।

  • ডিফল্ট হিসেবে টেস্ট বন্ধ করা আছে: বিল্ড স্পিড বাড়ানোর জন্য ডিফল্ট হিসেবে ইউনিট ও ডিভাইস (ইনস্ট্রুমেন্টেশন) টেস্ট বন্ধ করা আছে। প্রয়োজন হলে আপনি সেগুলি চালু করতে পারবেন।

  • কোনও টপ-লেভেল Android এক্সটেনশন নেই: Gradle KMP DSL-এর মধ্যে android ব্লকের মাধ্যমে কনফিগারেশন ম্যানেজ করা হয়, যা একটি সামঞ্জস্যপূর্ণ KMP প্রোজেক্ট স্ট্রাকচার বজায় রাখে। কোনও টপ-লেভেল android এক্সটেনশন ব্লক নেই।

  • Java কম্পাইলেশন চালু করা: ডিফল্ট হিসেবে Java কম্পাইলেশন বন্ধ করা থাকে। এটি চালু করতে android ব্লকে withJava() ব্যবহার করুন। জাভা কম্পাইলেশনের প্রয়োজন না হলে, এটি বিল্ড টাইম উন্নত করে।

Android-KMP লাইব্রেরি প্লাগ-ইনের সুবিধা

Android-KMP প্লাগ-ইন KMP প্রোজেক্টের জন্য নিম্নলিখিত সুবিধা প্রদান করে:

  • বিল্ড পারফর্ম্যান্স ও স্টেবিলিটি উন্নত করা হয়েছে: KMP প্রোজেক্টের মধ্যে বিল্ড স্পিড অপ্টিমাইজ করা এবং স্টেবিলিটি উন্নত করার জন্য এটি ডিজাইন করা হয়েছে। KMP ওয়ার্কফ্লোতে এর ফোকাস আরও দক্ষ ও নির্ভরযোগ্য বিল্ড প্রসেসে অবদান রাখে।

  • উন্নত IDE ইন্টিগ্রেশন: KMP Android লাইব্রেরি নিয়ে কাজ করার সময় এটি আরও ভালো কোড সম্পূর্ণ করা, নেভিগেশন, ডিবাগিং এবং সামগ্রিক ডেভেলপার অভিজ্ঞতা প্রদান করে।

  • সরলীকৃত প্রোজেক্ট কনফিগারেশন: প্লাগ-ইনটি বিল্ড ভেরিয়েন্টের মতো Android-নির্দিষ্ট জটিলতাগুলি সরিয়ে KMP প্রোজেক্টের জন্য কনফিগারেশনকে সহজ করে তোলে। এর ফলে আরও পরিচ্ছন্ন ও সহজে ম্যানেজ করা যায় এমন বিল্ড ফাইল তৈরি হয়। আগে, KMP প্রোজেক্টে com.android.library প্লাগ-ইন ব্যবহার করলে androidAndroidTest-এর মতো বিভ্রান্তিকর সোর্স সেট নাম তৈরি হতে পারত। এই নামকরণ কনভেনশনটি স্ট্যান্ডার্ড KMP প্রোজেক্ট স্ট্রাকচারের সাথে পরিচিত ডেভেলপারদের জন্য কম স্বজ্ঞাত ছিল।

কাজ করে না এমন ফিচারের বিকল্প সমাধান

com.android.library প্লাগ-ইনের সাথে KMP ইন্টিগ্রেশনের তুলনায়, com.android.kotlin.multiplatform.library প্লাগ-ইনে কিছু ফিচার নেই। কাজ করে না এমন ফিচারের জন্য এখানে কিছু সমাধান দেওয়া হল:

  • বিল্ড ভ্যারিয়েন্ট

    বিল্ডের ধরন ও প্রোডাক্ট ফ্লেভার কাজ করে না। এর কারণ হল, নতুন প্লাগ-ইন একটি সিঙ্গেল ভ্যারিয়েন্ট আর্কিটেকচার ব্যবহার করে, যা কনফিগারেশনকে সহজ করে তোলে এবং বিল্ড পারফর্ম্যান্স উন্নত করে।

    আপনার যদি বিল্ড ভেরিয়েন্ট প্রয়োজন হয়, তাহলে আমাদের সাজেশন হল com.android.library প্লাগ-ইন ব্যবহার করে একটি আলাদা স্ট্যান্ডঅ্যালোন Android লাইব্রেরি মডিউল তৈরি করুন, সেই মডিউলের মধ্যে বিল্ডের ধরন এবং প্রোডাক্ট ফ্লেভার কনফিগার করুন এবং তারপরে আপনার Kotlin মাল্টিপ্ল্যাটফর্ম লাইব্রেরির androidMain সোর্স সেট থেকে একটি স্ট্যান্ডার্ড প্রোজেক্ট ডিপেন্ডেন্সি হিসেবে এটি ব্যবহার করুন। আরও জানতে, Android লাইব্রেরি তৈরি করুন এবং বিল্ড ভেরিয়েন্ট কনফিগার করুন দেখুন।

  • ডেটা বাইন্ডিং ও ভিউ বাইন্ডিং

    এগুলি হল Android-নির্দিষ্ট UI ফ্রেমওয়ার্ক ফিচার যা Android View সিস্টেম এবং XML লেআউটের সাথে ঘনিষ্ঠভাবে যুক্ত। নতুন Android-KMP লাইব্রেরি প্লাগ-ইনের মাধ্যমে, আমরা সাজেস্ট করি যে আপনি Compose Multiplatform-এর মতো মাল্টিপ্ল্যাটফর্ম ফ্রেমওয়ার্ক ব্যবহার করে UI ম্যানেজ করুন। ডেটা বাইন্ডিং ও ভিউ বাইন্ডিংকে চূড়ান্ত Android অ্যাপের ইমপ্লিমেন্টেশন সংক্রান্ত বিবরণ হিসেবে বিবেচনা করা হয়, শেয়ার করার মতো লাইব্রেরি হিসেবে নয়।

  • নেটিভ বিল্ড সাপোর্ট

    নতুন প্লাগ-ইন Android টার্গেটের জন্য স্ট্যান্ডার্ড AAR তৈরি করার উপর ফোকাস করে। Kotlin Multiplatform-এ নেটিভ কোড ইন্টিগ্রেশন সরাসরি KMP-এর নিজস্ব নেটিভ টার্গেট (যেমন androidNativeArm64 এবং androidNativeX86) এবং এর C-ইন্টারঅপারেবিলিটি ক্ষমতার মাধ্যমে ম্যানেজ করা হয়। আপনাকে নেটিভ C/C++ কোড অন্তর্ভুক্ত করতে হলে, সেটি সাধারণ বা নেটিভ সোর্স সেটের অংশ হিসেবে সংজ্ঞায়িত করতে হবে এবং Android-নির্দিষ্ট externalNativeBuild মেকানিজম ব্যবহার করার পরিবর্তে kotlin ব্লকের মধ্যে C-ইন্টারঅপারেবিলিটি কনফিগার করতে হবে।

    বিকল্প হিসেবে, externalNativeBuild-এর মাধ্যমে নেটিভ বিল্ড সাপোর্ট প্রয়োজন হলে, আমরা সাজেস্ট করি যে আপনি একটি আলাদা স্ট্যান্ডঅ্যালোন com.android.library মডিউল তৈরি করুন যেখানে আপনি নেটিভ কোড ইন্টিগ্রেট করতে পারবেন এবং আপনার Kotlin মাল্টিপ্ল্যাটফর্ম লাইব্রেরি প্রোজেক্টের androidMain সোর্স সেট থেকে সেই স্ট্যান্ডঅ্যালোন লাইব্রেরি ব্যবহার করতে পারবেন। আরও বিবরণের জন্য, Android লাইব্রেরি তৈরি করুন এবং আপনার প্রোজেক্টে C এবং C++ কোড যোগ করুন দেখুন।

  • BuildConfig ক্লাস

    BuildConfig ফিচারটি মাল্টি-ভেরিয়েন্ট পরিবেশে সবচেয়ে বেশি উপযোগী। নতুন Kotlin Multiplatform লাইব্রেরি প্লাগ-ইন ভেরিয়েন্ট-অ্যাগনস্টিক এবং এতে বিল্ড টাইপ ও প্রোডাক্ট ফ্লেভারের জন্য সহায়তা নেই, তাই এই ফিচার প্রয়োগ করা হয়নি। বিকল্প হিসেবে, আমরা BuildKonfig প্লাগ-ইন বা একই ধরনের কমিউনিটি সমাধান ব্যবহার করে সব টার্গেটের জন্য মেটাডেটা তৈরি করার সাজেশন দিই।

পূর্বশর্ত

com.android.kotlin.multiplatform.library প্লাগ-ইন ব্যবহার করতে, আপনার প্রোজেক্ট অবশ্যই নিম্নলিখিত ন্যূনতম ভার্সন বা তার থেকে উন্নত ভার্সনের সাথে কনফিগার করা থাকতে হবে:

  • Android Gradle প্লাগ-ইন (AGP): 8.10.0
  • Kotlin Gradle প্লাগ-ইন (KGP): 2.0.0

আগে থেকে থাকা মডিউলে Android-KMP প্লাগ-ইন প্রয়োগ করা

আগে থেকে থাকা KMP লাইব্রেরি মডিউলে Android-KMP প্লাগ-ইন প্রয়োগ করতে, এইসব ধাপ অনুসরণ করুন:

  1. ভার্সন ক্যাটালগে প্লাগ-ইন ঘোষণা করুন। ভার্সন ক্যাটালগ TOML ফাইল খুলুন (সাধারণত gradle/libs.versions.toml) এবং প্লাগ-ইন ডেফিনিশন বিভাগ যোগ করুন:

    # To check the version number of the latest Kotlin release, go to
    # https://kotlinlang.org/docs/releases.html
    
    [versions]
    androidGradlePlugin = "9.4.0"
    kotlin = "KOTLIN_VERSION"
    
    [plugins]
    kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
    android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "androidGradlePlugin" }
    
  2. রুট বিল্ড ফাইলে প্লাগ-ইন ডিক্লারেশন প্রয়োগ করুন। আপনার প্রোজেক্টের রুট ডিরেক্টরিতে থাকা build.gradle.kts ফাইলটি খুলুন। apply false ব্যবহার করে plugins ব্লকে প্লাগ-ইন অ্যালিয়াস যোগ করুন। এর ফলে, রুট প্রোজেক্টে প্লাগ-ইন লজিক প্রয়োগ না করেই সব সাবপ্রোজেক্টে প্লাগ-ইন অ্যালিয়াস উপলভ্য হয়।

    Kotlin

    // Root build.gradle.kts file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform) apply false
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library) apply false
    }

    গ্ৰুভি

    // Root build.gradle file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform) apply false
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library) apply false
    }
  3. KMP লাইব্রেরি মডিউল বিল্ড ফাইলে প্লাগ-ইন প্রয়োগ করুন। আপনার KMP লাইব্রেরি মডিউলে build.gradle.kts ফাইলটি খুলুন এবং plugins ব্লকের মধ্যে আপনার ফাইলের উপরে প্লাগ-ইনটি প্রয়োগ করুন:

    Kotlin

    // Module-specific build.gradle.kts file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform)
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library)
    }

    গ্ৰুভি

    // Module-specific build.gradle file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform)
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library)
    }
  4. Android KMP টার্গেট কনফিগার করুন। Android টার্গেট নির্ধারণ করতে Kotlin মাল্টিপ্ল্যাটফর্ম ব্লক (kotlin) কনফিগার করুন। kotlin ব্লকের মধ্যে, android ব্যবহার করে Android টার্গেট নির্দিষ্ট করুন:

    Kotlin

    kotlin {
       android {
           namespace = "com.example.kmpfirstlib"
           compileSdk = 33
           minSdk = 24
    
           withJava() // enable java compilation support
           withHostTestBuilder {}.configure {}
           withDeviceTestBuilder {
               sourceSetTreeName = "test"
           }
    
           compilerOptions.configure {
               jvmTarget.set(
                   org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8
               )
           }
       }
    
       sourceSets {
           androidMain {
               dependencies {
                   // Add Android-specific dependencies here
               }
           }
           getByName("androidHostTest") {
               dependencies {
               }
           }
    
           getByName("androidDeviceTest") {
               dependencies {
               }
           }
       }
       // ... other targets (JVM, iOS, etc.) ...
    }

    গ্ৰুভি

    kotlin {
       android {
           namespace = "com.example.kmpfirstlib"
           compileSdk = 33
           minSdk = 24
    
           withJava() // enable java compilation support
           withHostTestBuilder {}.configure {}
           withDeviceTestBuilder {
               it.sourceSetTreeName = "test"
           }
    
           compilerOptions.options.jvmTarget.set(
               org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8
           )
       }
    
       sourceSets {
           androidMain {
               dependencies {
               }
           }
           androidHostTest {
               dependencies {
               }
           }
           androidDeviceTest {
               dependencies {
               }
           }
       }
       // ... other targets (JVM, iOS, etc.) ...
    }
  5. পরিবর্তন প্রয়োগ করুন। প্লাগ-ইন প্রয়োগ ও kotlin ব্লক কনফিগার করার পরে, পরিবর্তন প্রয়োগ করতে আপনার Gradle প্রোজেক্ট সিঙ্ক করুন।

পুরনো প্লাগ-ইন থেকে মাইগ্রেট করুন

এই নির্দেশিকা আপনাকে পুরনো com.android.library প্লাগ-ইন থেকে com.android.kotlin.multiplatform.library প্লাগ-ইনে মাইগ্রেট করতে সাহায্য করে।

১. সোর্স সরান

পুরনো প্লাগ-ইন আপনাকে src/androidMain, src/androidHostTest এবং src/androidDeviceTest ছাড়াও src/main, src/test এবং src/androidTest সোর্সেট ব্যবহার করার অনুমতি দেয়। নতুন প্লাগ-ইন শুধুমাত্র পরের সোর্স ডিরেক্টরিগুলি ব্যবহার করে, তাই আপনাকে সোর্সগুলি src/main থেকে src/androidMain-এ, src/test থেকে src/androidHostTest-এ এবং src/androidTest থেকে src/androidDeviceTest-এ সরাতে হবে।

২. কাস্টম সোর্স ও রিসোর্স ডিরেক্টরি কনফিগার করুন

আপনার কাছে নন-স্ট্যান্ডার্ড ডিরেক্টরিতে সোর্স বা রিসোর্স থাকলে, আপনি আগে sourceSets ব্লক ব্যবহার করে সেগুলি কনফিগার করেছেন। নতুন প্লাগ-ইনের মাধ্যমে, ভ্যারিয়েন্টে স্ট্যাটিক সোর্স ডিরেক্টরি যোগ করতে androidComponents এক্সটেনশন ব্যবহার করুন।

মনে রাখবেন যে নতুন প্লাগ-ইনের সাথে, addStaticSourceDirectory পদ্ধতিটি সোর্স ডিরেক্টরির বিদ্যমান তালিকায় ডিরেক্টরি যোগ করে। পুরনো প্লাগ-ইনের ক্ষেত্রে, setSrcDirs পদ্ধতিটি তালিকাটিকে প্রতিস্থাপন করে, যেখানে srcDir পদ্ধতিটি এতে যোগ করে।

Android-KMP

নতুন প্লাগ-ইনের মাধ্যমে, ভেরিয়েন্টের সোর্সের সাথে ইন্টার‍্যাক্ট করতে onVariants ব্লক ব্যবহার করুন।

// build.gradle.kts

androidComponents {
    onVariants { variant ->
        // Add a directory for Kotlin sources
        variant.sources.kotlin?.addStaticSourceDirectory("other/kotlin")

        // Add a directory for Android assets
        variant.sources.assets?.addStaticSourceDirectory("other/assets")
    }
}

লিগ্যাসি প্লাগ-ইন

com.android.library প্লাগ-ইনের মাধ্যমে, sourceSets ব্লক ব্যবহার করে সোর্স ডিরেক্টরি সেট বা যোগ করা হয়েছে।

// build.gradle.kts

android {
    sourceSets {
        getByName("main") {
            // Replaces the directory for Kotlin sources.
            kotlin.setSrcDirs(listOf("other/kotlin"))

            // Appends a directory for assets.
            assets.srcDir("other/assets")
        }
    }
}

৩. ডিপেন্ডেন্সি ঘোষণা করা

Android-নির্দিষ্ট সোর্স সেটের জন্য ডিপেন্ডেন্সি ঘোষণা করা একটি সাধারণ টাস্ক। নতুন প্লাগ-ইনের জন্য এগুলি স্পষ্টভাবে sourceSets ব্লকের মধ্যে রাখতে হবে, আগে ব্যবহৃত সাধারণ dependencies ব্লকের মতো নয়।

Android-KMP

নতুন প্লাগ-ইন androidMain সোর্স সেটের মধ্যে Android ডিপেন্ডেন্সি গ্রুপ করে আরও পরিষ্কার স্ট্রাকচার তৈরি করে। প্রধান সোর্স সেট ছাড়াও, দুটি টেস্ট সোর্স সেট আছে, যেগুলি চাহিদা অনুযায়ী তৈরি করা হয়: androidDeviceTest এবং androidHostTest (আরও তথ্যের জন্য হোস্ট এবং ডিভাইস টেস্ট কনফিগার করা দেখুন)।

// build.gradle.kts

kotlin {
    android {}
    //... other targets

    sourceSets {
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
        }

        // Dependencies are now scoped to the specific Android source set
        androidMain.dependencies {
            implementation("androidx.appcompat:appcompat:1.7.0")
            implementation("com.google.android.material:material:1.11.0")
        }
    }
}

সোর্স সেটে সংশ্লিষ্ট Kotlin কম্পাইলেশন আছে যার নাম main, deviceTest, এবং hostTest। সোর্স সেট ও কম্পাইলেশন বিল্ড স্ক্রিপ্টে এইভাবে কনফিগার করা যেতে পারে:

// build.gradle.kts

kotlin {
    android {
        compilations.getByName("deviceTest") {
            kotlinOptions.languageVersion = "2.0"
        }
    }
}

লিগ্যাসি প্লাগ-ইন

পুরনো প্লাগ-ইন ব্যবহার করে, আপনি টপ-লেভেল ডিপেন্ডেন্সি ব্লকে Android-নির্দিষ্ট ডিপেন্ডেন্সি ঘোষণা করতে পারতেন, যা কখনও কখনও মাল্টিপ্ল্যাটফর্ম মডিউলে বিভ্রান্তিকর হতে পারে।

// build.gradle.kts

kotlin {
  androidTarget()
  //... other targets
}

// Dependencies for all source sets were often mixed in one block
dependencies {
  // Common dependencies
  commonMainImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")

  // Android-specific dependencies
  implementation("androidx.appcompat:appcompat:1.7.0")
  implementation("com.google.android.material:material:1.11.0")
}

৪. Android রিসোর্স চালু করুন

বিল্ড পারফর্ম্যান্স অপ্টিমাইজ করার জন্য নতুন প্লাগ-ইনের সাথে Android রিসোর্সের (res ফোল্ডার) জন্য সহায়তা ডিফল্ট হিসেবে চালু করা নেই। এগুলি ব্যবহার করতে আপনাকে অপ্ট-ইন করতে হবে। এই পরিবর্তনটি নিশ্চিত করতে সাহায্য করে যে Android-নির্দিষ্ট রিসোর্সের প্রয়োজন নেই এমন প্রোজেক্টগুলি সংশ্লিষ্ট বিল্ড ওভারহেডের দ্বারা ভারাক্রান্ত হয় না।

Android-KMP

আপনাকে অবশ্যই Android রিসোর্স প্রসেসিং স্পষ্টভাবে চালু করতে হবে। রিসোর্সগুলি src/androidMain/res-এ রাখতে হবে।

// build.gradle.kts

kotlin {
  android {
    // ...
    // Enable Android resource processing
    androidResources {
      enable = true
    }
  }
}

// Project Structure
// └── src
//     └── androidMain
//         └── res
//             ├── values
//             │   └── strings.xml
//             └── drawable
//                 └── icon.xml

লিগ্যাসি প্লাগ-ইন

রিসোর্স প্রসেসিং ডিফল্ট হিসেবে চালু করা ছিল। আপনি অবিলম্বে src/main-এ একটি res ডিরেক্টরি যোগ করতে এবং XML ড্রয়েবল, ভ্যালু ইত্যাদি যোগ করা শুরু করতে পারেন।

// build.gradle.kts

android {
    namespace = "com.example.library"
    compileSdk = 34
    // No extra configuration was needed to enable resources.
}

// Project Structure
// └── src
//     └── main
//         └── res
//             ├── values
//             │   └── strings.xml
//             └── drawable
//                 └── icon.xml

৫. হোস্ট ও ডিভাইস টেস্ট কনফিগার করুন

ডিফল্ট হিসেবে, নতুন প্লাগ-ইন Android হোস্ট-সাইড (ইউনিট) এবং ডিভাইস-সাইড (ইনস্ট্রুমেন্টেড) টেস্ট বন্ধ করে দেয়। আপনাকে অবশ্যই টেস্ট সোর্স সেট ও কনফিগারেশন তৈরি করার জন্য স্পষ্টভাবে সম্মতি জানাতে হবে, যেখানে লিগ্যাসি প্লাগ-ইন সেগুলি অটোমেটিক তৈরি করে।

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

Android-KMP

নতুন প্লাগ-ইনের মাধ্যমে, আপনি kotlin.android ব্লকের মধ্যে পরীক্ষা চালু ও কনফিগার করতে পারবেন। এটি সেট-আপকে আরও স্পষ্ট করে তোলে এবং অব্যবহৃত টেস্ট কম্পোনেন্ট তৈরি করা এড়ায়। androidUnitTest সোর্স সেট androidHostTest হয়ে যায় (টেস্ট ডিরেক্টরি src/androidUnitTest থেকে src/androidHostTest-এ পরিবর্তিত হয়) এবং androidInstrumentedTest androidDeviceTest হয়ে যায় (টেস্ট ডিরেক্টরি src/androidInstrumentedTest থেকে src/androidDeviceTest-এ পরিবর্তিত হয়)।

// build.gradle.kts

kotlin {
  android {
    // ...

    // Opt-in to enable and configure host-side (unit) tests
    withHostTest {
      isIncludeAndroidResources = true
    }

    // Opt-in to enable and configure device-side (instrumented) tests
    withDeviceTest {
      instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
      execution = "HOST"
    }
  }
}

// Project Structure (After Opt-in)
// └── src
//     ├── androidHostTest
//     └── androidDeviceTest

লিগ্যাসি প্লাগ-ইন

com.android.library প্লাগ-ইনের মাধ্যমে, androidUnitTest এবং androidInstrumentedTest সোর্স সেট ডিফল্ট হিসেবে তৈরি করা হয়। আপনি android ব্লকের মধ্যে তাদের আচরণ কনফিগার করেন, সাধারণত testOptions DSL ব্যবহার করে।

// build.gradle.kts

android {
  defaultConfig {
    // Runner was configured in defaultConfig
    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
  }

  testOptions {
    // Configure unit tests (for the 'test' source set)
    unitTests.isIncludeAndroidResources = true

    // Configure device tests (for the 'androidTest' source set)
    execution = "HOST"
  }
}

// Project Structure (Defaults)
// └── src
//     ├── test
//     └── androidTest

৬. Java সোর্স কম্পাইলেশন চালু করুন

আপনার KMP লাইব্রেরিকে যদি Android টার্গেটের জন্য Java সোর্স কম্পাইল করতে হয়, তাহলে আপনাকে অবশ্যই নতুন প্লাগ-ইনের মাধ্যমে এই কার্যকারিতা স্পষ্টভাবে চালু করতে হবে। মনে রাখবেন যে এটি আপনার প্রোজেক্টের মধ্যে সরাসরি অবস্থিত Java ফাইলের জন্য কম্পাইলেশন চালু করে, এর নির্ভরতার জন্য নয়। Java ও Kotlin কম্পাইলারের JVM টার্গেট ভার্সন সেট করার পদ্ধতিও পরিবর্তিত হয়।

Android-KMP

withJava() কল করে আপনাকে অবশ্যই Java কম্পাইলেশন চালু করতে হবে। আরও ইউনিফায়েড সেট-আপের জন্য JVM টার্গেট এখন সরাসরি kotlin { android {} } ব্লকের মধ্যে কনফিগার করা হয়েছে। এখানে jvmTarget সেট করলে তা Android টার্গেটের জন্য Kotlin এবং Java কম্পাইলেশন, দুটির ক্ষেত্রেই প্রযোজ্য হয়।

// build.gradle.kts

kotlin {
  android {
    //  Opt-in to enable Java source compilation
    withJava()
    // Configure the JVM target for both Kotlin and Java sources
    compilerOptions {
      jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8)
    }
  }
  // ...
}

// Project Structure:
// └── src
//     └── androidMain
//         ├── kotlin
//         │   └── com/example/MyKotlinClass.kt
//         └── java
//             └── com.example/MyJavaClass.java

লিগ্যাসি প্লাগ-ইন

Java কম্পাইলেশন ডিফল্ট হিসেবে চালু করা ছিল। Java এবং Kotlin সোর্স, দুটির জন্যই JVM টার্গেট android ব্লকে compileOptions ব্যবহার করে সেট করা হয়েছে।

// build.gradle.kts

android {
  // ...
  compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
  }
}

kotlin {
  androidTarget {
    compilations.all {
      kotlinOptions.jvmTarget = "1.8"
    }
  }
}

৭. androidComponents ব্যবহার করে বিল্ড ভ্যারিয়েন্টের সাথে ইন্টার‍্যাক্ট করা

প্রোগ্রাম্যাটিক্যালি বিল্ড আর্টিফ্যাক্টের সাথে ইন্টার‍্যাক্ট করার জন্য androidComponents এক্সটেনশন এখনও উপলভ্য। Variant API-এর বেশিরভাগ অংশ একই থাকলেও, নতুন AndroidKotlinMultiplatformVariant ইন্টারফেস আরও সীমিত কারণ প্লাগ-ইন শুধুমাত্র একটি ভেরিয়েন্ট তৈরি করে।

ফলস্বরূপ, বিল্ডের ধরন এবং প্রোডাক্ট ফ্লেভার সম্পর্কিত প্রপার্টি ভেরিয়েন্ট অবজেক্টে আর উপলভ্য নেই।

Android-KMP

onVariants ব্লক এখন একটি ভেরিয়েন্টের উপর পুনরাবৃত্তি করে। আপনি এখনও name এবং artifacts-এর মতো সাধারণ প্রপার্টি অ্যাক্সেস করতে পারবেন, তবে বিল্ড-টাইপ-নির্দিষ্ট প্রপার্টি অ্যাক্সেস করতে পারবেন না।

// build.gradle.kts

androidComponents {
  onVariants { variant ->
      val artifacts = variant.artifacts
  }
}

লিগ্যাসি প্লাগ-ইন

একাধিক ভেরিয়েন্ট থাকলে, আপনি টাস্ক কনফিগার করার জন্য বিল্ড-টাইপ-স্পেসিফিক প্রপার্টি অ্যাক্সেস করতে পারবেন।

// build.gradle.kts

androidComponents {
  onVariants(selector().withBuildType("release")) { variant ->
    // ...
  }
}

৮. Android লাইব্রেরি ডিপেন্ডেন্সির ভেরিয়েন্ট বেছে নিন

আপনার KMP লাইব্রেরি Android-এর জন্য একটি ভেরিয়েন্ট তৈরি করে। তবে, আপনি স্ট্যান্ডার্ড Android লাইব্রেরির (com.android.library) উপর নির্ভর করতে পারেন, যার একাধিক ভেরিয়েন্ট (যেমন, free/paid প্রোডাক্ট ফ্লেভার) আছে। আপনার প্রোজেক্ট কীভাবে সেই ডিপেন্ডেন্সি থেকে একটি ভেরিয়েন্ট বেছে নেয় তা নিয়ন্ত্রণ করা একটি সাধারণ প্রয়োজনীয়তা।

Android-KMP

নতুন প্লাগ-ইন এই লজিককে কেন্দ্রীভূত করে এবং kotlin.android.localDependencySelection ব্লকের মধ্যে স্পষ্ট করে। এর ফলে, আপনার সিঙ্গল-ভেরিয়েন্ট KMP লাইব্রেরির জন্য এক্সটার্নাল ডিপেন্ডেন্সির কোন ভেরিয়েন্ট বেছে নেওয়া হবে তা অনেক বেশি স্পষ্ট হয়ে যায়।

// build.gradle.kts
kotlin {
  android {
    localDependencySelection {
      // For dependencies with multiple build types, select 'debug' first, and 'release' in case 'debug' is missing
      selectBuildTypeFrom.set(listOf("debug", "release"))

      // For dependencies with a 'type' flavor dimension...
      productFlavorDimension("type") {
        // ...select the 'typeone' flavor.
        selectFrom.set(listOf("typeone"))
      }
    }
  }
}

লিগ্যাসি প্লাগ-ইন

আপনি buildTypes and productFlavors ব্লকের মধ্যে ডিপেন্ডেন্সি বেছে নেওয়ার স্ট্র্যাটেজি কনফিগার করেছেন। এতে প্রায়ই missingDimensionStrategy ব্যবহার করা হয় যাতে আপনার লাইব্রেরিতে নেই এমন ডাইমেনশনের জন্য ডিফল্ট ফ্লেভার প্রদান করা যায়, অথবা সার্চ অর্ডার নির্ধারণ করার জন্য নির্দিষ্ট ফ্লেভারের মধ্যে matchingFallbacks ব্যবহার করা হয়।

API ব্যবহার সম্পর্কে আরও বিস্তারিত তথ্যের জন্য ম্যাচিং সংক্রান্ত সমস্যার সমাধান করুন লিঙ্ক দেখুন।

৯. Compose প্রিভিউ ডিপেন্ডেন্সি যোগ করা

সাধারণত, আমরা চাই যে আমাদের লোকাল ডেভেলপমেন্ট এনভায়রনমেন্টে নির্দিষ্ট লাইব্রেরি থাকুক যাতে ইন্টার্নাল টুল ফাইনাল প্রকাশিত আর্টিফ্যাক্টে লিক না হয়ে যায়। নতুন KMP Android প্লাগ-ইনের ক্ষেত্রে এটি একটি চ্যালেঞ্জ হয়ে দাঁড়ায় কারণ এটি রিলিজ কোড থেকে ডেভেলপমেন্ট ডিপেন্ডেন্সি আলাদা করার জন্য ব্যবহৃত বিল্ড টাইপ আর্কিটেকচার সরিয়ে দেয়।

Android-KMP

শুধুমাত্র লোকাল ডেভেলপমেন্ট ও টেস্টিংয়ের জন্য ডিপেন্ডেন্সি যোগ করতে, প্রধান Android কম্পাইলেশনের রানটাইম ক্লাসপাথ কনফিগারেশনে (টপ-লেভেল dependencies ব্লকে) সরাসরি ডিপেন্ডেন্সি যোগ করুন। এটি রানটাইমে ডিপেন্ডেন্সি উপলভ্য আছে কিনা তা নিশ্চিত করতে সাহায্য করে (যেমন, Compose Preview-এর মতো টুলের জন্য) কিন্তু এটি কম্পাইল ক্লাসপাথ বা আপনার লাইব্রেরির প্রকাশিত API-এর অংশ নয়।

// build.gradle.kts
dependencies {
  "androidRuntimeClasspath"(libs.androidx.compose.ui.tooling)
}

লিগ্যাসি প্লাগ-ইন

Kotlin মাল্টিপ্ল্যাটফর্ম প্রোজেক্ট যা Android টার্গেটের জন্য com.android.library প্লাগ-ইন ব্যবহার করে, সেটির debugImplementation কনফিগারেশন ব্যবহার করা উচিত, যা ডিপেন্ডেন্সি ডিবাগ বিল্ড টাইপে সীমাবদ্ধ করে এবং গ্রাহকদের দ্বারা ব্যবহৃত লাইব্রেরির রিলিজ ভেরিয়েন্টে এটি অন্তর্ভুক্ত হতে বাধা দেয়।

// build.gradle.kts
dependencies {
  debugImplementation(libs.androidx.compose.ui.tooling)
}

১০. KMP Android টার্গেটের জন্য JVM টার্গেট কনফিগার করুন

KMP Android প্লাগ-ইন android.compilerOptions.jvmTarget ব্যবহার করে JVM টার্গেট সেট করে, যা Java এবং Kotlin, উভয়ের ক্ষেত্রেই প্রযোজ্য, যা খাঁটি Android প্রোজেক্টে আলাদা compileOptions এবং kotlinOptions ব্লকের তুলনায় কনফিগারেশনকে সহজ করে তোলে।

Android-KMP

Kotlin Multiplatform (KMP) প্রোজেক্টে কাজ করার সময়, যাতে Android টার্গেট অন্তর্ভুক্ত থাকে, Kotlin ও Java কম্পাইলার, উভয়ের জন্যই JVM টার্গেট ভার্সন কনফিগার করার একাধিক উপায় আপনার কাছে থাকে। আপনার প্রোজেক্টের বাইটকোড কম্প্যাটিবিলিটি ম্যানেজ করার জন্য এইসব কনফিগারেশনের স্কোপ ও হায়ারার্কি বোঝা খুবই গুরুত্বপূর্ণ।

JVM টার্গেট সেট করার তিনটি প্রাথমিক উপায় এখানে দেওয়া হল, যা সবচেয়ে কম থেকে সবচেয়ে বেশি অগ্রাধিকারের ক্রমে সাজানো হয়েছে। JVM টার্গেট ভ্যালু যা বেশি অগ্রাধিকার পায় আপনার কনফিগার করা টার্গেটের ছোট সাবসেটে প্রযোজ্য হয় এবং ভ্যালু ওভাররাইড করে যা কম অগ্রাধিকার পায়, যার অর্থ হল আপনি বিভিন্ন টার্গেটের জন্য বিভিন্ন JVM ভার্সন এবং আপনার প্রোজেক্টে টার্গেটের মধ্যে কম্পাইলেশন সেট করতে পারবেন।

Kotlin টুলচেন ব্যবহার করা (সবচেয়ে কম অগ্রাধিকার)

JVM টার্গেট সেট করার সবচেয়ে সাধারণ উপায় হল আপনার build.gradle.kts ফাইলের kotlin ব্লকে টুলচেন নির্দিষ্ট করা। এই পদ্ধতি আপনার প্রোজেক্টে Android সহ সব JVM-ভিত্তিক টার্গেট জুড়ে Kotlin এবং Java কম্পাইলেশন টাস্কের জন্য টার্গেট সেট করে।

// build.gradle.kts
kotlin {
    jvmToolchain(21)
}

এই কনফিগারেশন kotlinc এবং javac উভয়কেই JVM 21 টার্গেট করে। এটি আপনার সম্পূর্ণ প্রোজেক্টের জন্য একটি ধারাবাহিক বেসলাইন তৈরি করার একটি দুর্দান্ত উপায়।

Android টার্গেট-লেভেল কম্পাইলার বিকল্প ব্যবহার করা (মাঝারি অগ্রাধিকার)

আপনি android ব্লকের মধ্যে Android KMP টার্গেটের জন্য JVM টার্গেট নির্দিষ্ট করতে পারেন। এই সেটিং প্রোজেক্ট-ওয়াইড jvmToolchain কনফিগারেশন ওভাররাইড করে এবং সব Android কম্পাইলেশনের ক্ষেত্রে প্রযোজ্য হয়।

// build.gradle.kts
kotlin {
    android {
        compilerOptions {
            jvmTarget.set(JvmTarget.JVM_11)
        }
    }
}

এই ক্ষেত্রে, jvmToolchain অন্য কোনও ভার্সনে সেট করা থাকলেও, Android টার্গেটের Kotlin ও Java কোড JVM 11 টার্গেট করার জন্য কম্পাইল করা হবে।

কম্পাইলেশন-লেভেল কম্পাইলার বিকল্প ব্যবহার করা (সর্বোচ্চ অগ্রাধিকার)

সবচেয়ে গ্র্যানুলার কন্ট্রোলের জন্য, আপনি প্রতি-কম্পাইলেশন ভিত্তিতে (যেমন, শুধুমাত্র androidMain বা androidHostTest-এ) কম্পাইলার বিকল্প কনফিগার করতে পারবেন। কোনও নির্দিষ্ট কম্পাইলেশনকে অন্য JVM ভার্সন টার্গেট করতে হলে এটি কাজে লাগে। এই সেটিং Kotlin টুলচেন এবং Android টার্গেট-লেভেল বিকল্প, উভয়কেই ওভাররাইড করে।

// build.gradle.kts
kotlin {
    android {
        compilations.all {
            compileTaskProvider.configure {
                compilerOptions.jvmTarget.set(JvmTarget.JVM_11)
            }
        }
    }
}

এই কনফিগারেশন Android টার্গেটের মধ্যে সমস্ত কম্পাইলেশন JVM 11 ব্যবহার করে তা নিশ্চিত করতে সাহায্য করে, যা ফাইন-গ্রেনড কন্ট্রোল প্রদান করে।

লিগ্যাসি প্লাগ-ইন

স্ট্যান্ডার্ড Android লাইব্রেরি প্লাগ-ইন (com.android.library) ব্যবহার করে KMP প্রোজেক্টে, কনফিগারেশনটি KMP Android প্লাগ-ইন ব্যবহার করার থেকে কিছুটা আলাদা (তবে ধারণাগতভাবে একই)।

Kotlin টুলচেন ব্যবহার করা

kotlin.jvmToolchain() পদ্ধতিটি একইভাবে কাজ করে, Java-এর জন্য sourceCompatibility ও targetCompatibility এবং Kotlin-এর জন্য jvmTarget সেট করে। আমরা এই পদ্ধতি ব্যবহার করার সাজেশন দিই।

// build.gradle.kts
kotlin {
    jvmToolchain(21)
}

compileOptions এবং kotlinOptions

আপনি Kotlin টুলচেন ব্যবহার না করলে, Java ও Kotlin-এর জন্য আলাদা ব্লক ব্যবহার করে আপনাকে JVM টার্গেট কনফিগার করতে হবে।

// build.gradle.kts
android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }

    kotlinOptions {
        jvmTarget = "11"
    }
}

১১. গ্রাহকের ডেটা রাখার নিয়ম প্রকাশ করুন

আপনার KMP লাইব্রেরিকে যদি তার গ্রাহকদের জন্য গ্রাহক রাখার নিয়ম (যেমন R8-এর জন্য ProGuard নিয়ম) পাঠাতে হয়, তাহলে আপনাকে নতুন প্লাগ-ইনের মাধ্যমে প্রকাশ করার সুবিধাটি স্পষ্টভাবে চালু করতে হবে। আগে, নির্দিষ্ট করা থাকলে, ডিফল্ট হিসেবে গ্রাহকের ডেটা রাখার নিয়ম প্রকাশ করা হত।

Android-KMP

নতুন প্লাগ-ইন ব্যবহার করে, গ্রাহকের রাখার নিয়ম প্রকাশ করতে, আপনাকে অবশ্যই consumerKeepRules ব্লকের মধ্যে optimization.consumerKeepRules.publish = true সেট করতে হবে এবং নিয়ম ফাইল নির্দিষ্ট করতে হবে।

// build.gradle.kts
kotlin {
  android {
    optimization {
      consumerKeepRules.apply {
        publish = true
        file("consumer-proguard-rules.pro")
      }
    }
  }
}

লিগ্যাসি প্লাগ-ইন

com.android.library-এর সাথে, android.defaultConfig-এ consumerProguardFiles-এর সাথে উল্লেখ করা যেকোনও রুল ফাইল ডিফল্ট হিসেবে লাইব্রেরির আর্টিফ্যাক্টে প্রকাশ করা হয়।

// build.gradle.kts
android {
  defaultConfig {
    consumerProguardFiles("consumer-proguard-rules.pro")
  }
}

১২. Maven-এ আপনার লাইব্রেরি প্রকাশ করুন

অন্যান্য প্রোজেক্টে ব্যবহারের জন্য আপনি যদি Maven-এ আপনার KMP লাইব্রেরি প্রকাশ করার পরিকল্পনা করেন, তাহলে আপনি নতুন Android-KMP প্লাগ-ইন নাকি লিগ্যাসি প্লাগ-ইন ব্যবহার করছেন তার উপর নির্ভর করে প্রসেসটি আলাদা হয়।

Android-KMP

com.android.kotlin.multiplatform.library প্লাগ-ইন স্ট্যান্ডার্ড Kotlin Multiplatform প্রকাশনা মেকানিজমের সাথে ইন্টিগ্রেট করে। স্ট্যান্ডার্ড KMP লাইব্রেরি প্রকাশ করার প্রক্রিয়া ছাড়া Android-এর জন্য নির্দিষ্ট কোনও ধাপ নেই।

আপনার লাইব্রেরি প্রকাশ করতে, JetBrains-এর অফিসিয়াল ডকুমেন্টেশন ফলো করুন: মাল্টিপ্ল্যাটফর্ম লাইব্রেরির জন্য প্রকাশনা সেট-আপ করুন।

লিগ্যাসি প্লাগ-ইন

KMP প্রোজেক্টে Android টার্গেটের জন্য com.android.library ব্যবহার করার সময়, Android-নির্দিষ্ট আর্টিফ্যাক্ট (.aar) প্রস্তুত ও প্রকাশ করতে আপনাকে স্ট্যান্ডার্ড Android লাইব্রেরি প্রকাশ করার নির্দেশিকা অনুসরণ করতে হবে।

বিস্তারিত নির্দেশাবলীর জন্য, রিলিজের জন্য আপনার লাইব্রেরি প্রস্তুত করুন দেখুন।

প্লাগ-ইন API রেফারেন্স

নতুন প্লাগ-ইনে com.android.library-এর থেকে আলাদা API সারফেস আছে। নতুন DSL ও ইন্টারফেস সম্পর্কে বিস্তারিত তথ্যের জন্য, API রেফারেন্স দেখুন:

Android-KMP লাইব্রেরি প্লাগ-ইন সংক্রান্ত পরিচিত সমস্যা

নতুন com.android.kotlin.multiplatform.library প্লাগ-ইন প্রয়োগ করার সময় এইসব পরিচিত সমস্যা দেখা দিতে পারে: