KMP এর জন্য Android Gradle Library Plugin সেট আপ করুন

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

KMP ডেভেলপমেন্টের জন্য com.android.library প্লাগইন ব্যবহার করা এমন কিছু Android Gradle Plugin API-এর উপর নির্ভরশীল, যেগুলো Android Gradle plugin 9.0 এবং তার পরবর্তী সংস্করণগুলোতে (২০২৫ সালের চতুর্থ ত্রৈমাসিক) অপ্রচলিত এবং ঐচ্ছিকভাবে ব্যবহারের প্রয়োজন হয়আশা করা যায়, এই API-গুলো Android Gradle plugin 10.0 (২০২৬ সালের দ্বিতীয়ার্ধে) সংস্করণ থেকে সরিয়ে ফেলা হবে

এই প্লাগইনটি প্রয়োগ করতে, "অ্যান্ড্রয়েড-কেএমপি প্লাগইন প্রয়োগ করুন" বিভাগটি দেখুন। যদি আপনার লিগ্যাসি এপিআই থেকে মাইগ্রেট করার প্রয়োজন হয়, তাহলে মাইগ্রেশন গাইডটি দেখুন।

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

মূল বৈশিষ্ট্য এবং পার্থক্য

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

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

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

  • ডিফল্টরূপে নিষ্ক্রিয় পরীক্ষাসমূহ: বিল্ডের গতি বাড়ানোর জন্য ইউনিট এবং ডিভাইস (ইনস্ট্রুমেন্টেশন) উভয় পরীক্ষাই ডিফল্টরূপে নিষ্ক্রিয় থাকে। প্রয়োজন হলে আপনি এগুলো সক্রিয় করতে পারেন।

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

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

অ্যান্ড্রয়েড-কেএমপি লাইব্রেরি প্লাগইনের সুবিধাসমূহ

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

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

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

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

অসমর্থিত বৈশিষ্ট্যগুলির জন্য বিকল্প সমাধান

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

  • বিভিন্ন নির্মাণ

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

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

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

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

  • নেটিভ বিল্ড সমর্থন

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

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

  • BuildConfig ক্লাস

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

পূর্বশর্ত

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

  • অ্যান্ড্রয়েড গ্রেডল প্লাগইন (এজিপি) : ৮.১০.০
  • কোটলিন গ্রেডল প্লাগইন (কেজিপি) : ২.০.০

একটি বিদ্যমান মডিউলে 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.1.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 ব্লকে প্লাগইন অ্যালিয়াসগুলো যোগ করুন। এর ফলে, রুট প্রোজেক্টে প্লাগইন লজিক প্রয়োগ না করেই প্লাগইন অ্যালিয়াসগুলো সমস্ত সাবপ্রোজেক্টের জন্য উপলব্ধ হয়।

    কোটলিন

    // 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 ব্লকের মধ্যে প্লাগইনটি প্রয়োগ করুন:

    কোটলিন

    // 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. অ্যান্ড্রয়েড কেএমপি টার্গেট কনফিগার করুন। অ্যান্ড্রয়েড টার্গেট নির্ধারণ করতে কোটলিন মাল্টিপ্ল্যাটফর্ম ব্লক ( kotlin ) কনফিগার করুন। kotlin ব্লকের মধ্যে, android : ব্যবহার করে অ্যান্ড্রয়েড টার্গেট নির্দিষ্ট করুন।

    কোটলিন

    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 ব্লকটি কনফিগার করার পরে, পরিবর্তনগুলি প্রয়োগ করতে আপনার গ্রেডল প্রজেক্টটি সিঙ্ক করুন।

লিগ্যাসি প্লাগইন থেকে মাইগ্রেট করুন

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

১. উৎস পরিবর্তন

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

২. নির্ভরতা ঘোষণা করা

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

অ্যান্ড্রয়েড-কেএমপি

নতুন প্লাগইনটি androidMain সোর্স সেটের মধ্যে অ্যান্ড্রয়েড ডিপেন্ডেন্সিগুলোকে একত্রিত করে একটি পরিচ্ছন্ন কাঠামো তৈরি করে। মূল সোর্স সেট ছাড়াও, দুটি টেস্ট সোর্স সেট রয়েছে, যেগুলো প্রয়োজন অনুযায়ী তৈরি করা হয়: 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")
        }
    }
}

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

// build.gradle.kts

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

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

পুরানো প্লাগইনটির সাহায্যে, টপ-লেভেল ডিপেন্ডেন্সি ব্লকে অ্যান্ড্রয়েড-নির্দিষ্ট ডিপেন্ডেন্সিগুলো ঘোষণা করা যেত, যা একটি মাল্টিপ্ল্যাটফর্ম মডিউলের ক্ষেত্রে মাঝে মাঝে বিভ্রান্তিকর হতে পারত।

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

৩. অ্যান্ড্রয়েড রিসোর্স সক্রিয় করা

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

অ্যান্ড্রয়েড-কেএমপি

আপনাকে অবশ্যই অ্যান্ড্রয়েড রিসোর্স প্রসেসিং স্পষ্টভাবে সক্রিয় করতে হবে। রিসোর্সগুলো 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

৪. হোস্ট এবং ডিভাইস পরীক্ষা কনফিগার করা

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

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

অ্যান্ড্রয়েড-কেএমপি

নতুন প্লাগইনটিতে, আপনি 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

৫. জাভা সোর্স কম্পাইলেশন সক্রিয় করুন

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

অ্যান্ড্রয়েড-কেএমপি

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

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

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

জাভা কম্পাইলেশন ডিফল্টরূপে সক্রিয় ছিল। অ্যান্ড্রয়েড ব্লকে compileOptions ব্যবহার করে জাভা এবং কোটলিন উভয় সোর্সের জন্য JVM টার্গেট সেট করা হয়েছিল।

// 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 এপিআই-এর বেশিরভাগই একই রয়েছে, নতুন AndroidKotlinMultiplatformVariant ইন্টারফেসটি আরও সীমিত, কারণ প্লাগইনটি কেবল একটি ভ্যারিয়েন্ট তৈরি করে।

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

অ্যান্ড্রয়েড-কেএমপি

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

// build.gradle.kts

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

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

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

// build.gradle.kts

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

৭. অ্যান্ড্রয়েড লাইব্রেরি নির্ভরতার বিভিন্ন রূপ নির্বাচন করুন

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

অ্যান্ড্রয়েড-কেএমপি

নতুন প্লাগইনটি 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 ব্যবহার করা অন্তর্ভুক্ত ছিল।

এপিআই ব্যবহার সম্পর্কে আরও বিস্তারিত তথ্যের জন্য ‘ম্যাচিং ত্রুটি সমাধান করুন’ অংশটি দেখুন।

৮. কম্পোজ প্রিভিউ নির্ভরতা

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

অ্যান্ড্রয়েড-কেএমপি

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

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

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

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

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

৯. KMP অ্যান্ড্রয়েড টার্গেটের জন্য JVM টার্গেট কনফিগার করুন

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

অ্যান্ড্রয়েড-কেএমপি

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

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

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

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

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

এই কনফিগারেশনটি kotlinc এবং javac উভয়কেই JVM 21 টার্গেট করতে সাহায্য করে। এটি আপনার সম্পূর্ণ প্রোজেক্টের জন্য একটি সামঞ্জস্যপূর্ণ ভিত্তি স্থাপন করার একটি চমৎকার উপায়।

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

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

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

এক্ষেত্রে, jvmToolchain ভিন্ন সংস্করণে সেট করা থাকলেও, অ্যান্ড্রয়েড টার্গেটের কোটলিন এবং জাভা কোড JVM 11-কে টার্গেট করে কম্পাইল করা হবে।

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

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

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

এই কনফিগারেশনটি নিশ্চিত করে যে অ্যান্ড্রয়েড টার্গেটের মধ্যেকার সমস্ত কম্পাইলেশন JVM 11 ব্যবহার করে, যা সূক্ষ্ম নিয়ন্ত্রণ প্রদান করে।

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

স্ট্যান্ডার্ড অ্যান্ড্রয়েড লাইব্রেরি প্লাগইন ( com.android.library ) ব্যবহার করে তৈরি একটি KMP প্রোজেক্টের কনফিগারেশন, KMP অ্যান্ড্রয়েড প্লাগইন ব্যবহারের চেয়ে কিছুটা ভিন্ন (তবে ধারণাগতভাবে একই রকম)।

কোটলিন টুলচেইন ব্যবহার করে

kotlin.jvmToolchain() মেথডটি হুবহু একই রকমভাবে কাজ করে, যা জাভার জন্য sourceCompatibilitytargetCompatibility এবং কোটলিনের জন্য jvmTarget সেট করে। আমরা এই পদ্ধতিটি ব্যবহার করার পরামর্শ দিই।

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

compileOptions এবং kotlinOptions

যদি আপনি কোটলিন টুলচেইন ব্যবহার না করেন, তাহলে আপনাকে জাভা এবং কোটলিনের জন্য আলাদা ব্লক ব্যবহার করে জেভিএম টার্গেটগুলো কনফিগার করতে হবে।

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

    kotlinOptions {
        jvmTarget = "11"
    }
}

১০. গ্রাহক রাখার নিয়মাবলী প্রকাশ করুন

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

অ্যান্ড্রয়েড-কেএমপি

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

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

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

com.android.library এর ক্ষেত্রে, android.defaultConfigconsumerProguardFiles দিয়ে নির্দিষ্ট করা যেকোনো রুলস ফাইল ডিফল্টরূপে লাইব্রেরির আর্টিফ্যাক্টসে প্রকাশিত হয়।

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

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

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

অ্যান্ড্রয়েড-কেএমপি

com.android.kotlin.multiplatform.library প্লাগইনটি স্ট্যান্ডার্ড কোটলিন মাল্টিপ্ল্যাটফর্ম পাবলিশিং পদ্ধতির সাথে সমন্বিত হয়। স্ট্যান্ডার্ড KMP লাইব্রেরি পাবলিশিং প্রক্রিয়া ছাড়া অ্যান্ড্রয়েড-নির্দিষ্ট কোনো পদক্ষেপের প্রয়োজন নেই।

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

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

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

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

প্লাগইন এপিআই রেফারেন্স

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

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

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

{% হুবহু %} {% endverbatim %} {% হুবহু %} {% endverbatim %}