অ্যান্ড্রয়েড গ্র্যাডেল প্লাগইন ৪.০ আপনার গ্র্যাডেল বিল্ড কনফিগারেশনে কোটলিন ব্যবহারের জন্য সমর্থন যোগ করেছে, যা গ্র্যাডেল কনফিগারেশন ফাইলগুলিতে ঐতিহ্যগতভাবে ব্যবহৃত প্রোগ্রামিং ভাষা গ্রোভির প্রতিস্থাপন।
গ্রেডল স্ক্রিপ্ট লেখার জন্য গ্রুভির চেয়ে কোটলিনকে বেশি প্রাধান্য দেওয়া হয় কারণ কোটলিন বেশি পঠনযোগ্য এবং আরও ভালো কম্পাইল-টাইম চেকিং এবং IDE সাপোর্ট প্রদান করে।
যদিও কোটলিন বর্তমানে গ্রোভির তুলনায় অ্যান্ড্রয়েড স্টুডিওর কোড এডিটরে আরও ভালো ইন্টিগ্রেশন অফার করে, কোটলিন ব্যবহার করে তৈরি বিল্ডগুলি গ্রোভি ব্যবহার করে তৈরি বিল্ডের তুলনায় ধীর গতির হয়, তাই মাইগ্রেট করার সিদ্ধান্ত নেওয়ার সময় বিল্ড পারফরম্যান্স বিবেচনা করুন।
এই পৃষ্ঠাটি আপনার অ্যান্ড্রয়েড অ্যাপের গ্র্যাডল বিল্ড ফাইলগুলিকে গ্রোভি থেকে কোটলিনে রূপান্তর করার বিষয়ে প্রাথমিক তথ্য প্রদান করে। আরও বিস্তৃত মাইগ্রেশন গাইডের জন্য, গ্র্যাডলের অফিসিয়াল ডকুমেন্টেশন দেখুন।
সময়রেখা
 অ্যান্ড্রয়েড স্টুডিও জিরাফ দিয়ে শুরু করে, নতুন প্রকল্পগুলি বিল্ড কনফিগারেশনের জন্য ডিফল্টরূপে Kotlin DSL ( build.gradle.kts ) ব্যবহার করে। এটি সিনট্যাক্স হাইলাইটিং, কোড সমাপ্তি এবং ঘোষণায় নেভিগেশন সহ Groovy DSL ( build.gradle ) এর চেয়ে ভালো সম্পাদনার অভিজ্ঞতা প্রদান করে। আরও জানতে, Gradle Kotlin DSL Primer দেখুন।
সাধারণ শব্দ
কোটলিন ডিএসএল: মূলত অ্যান্ড্রয়েড গ্রেডল প্লাগইন কোটলিন ডিএসএল বা মাঝে মাঝে অন্তর্নিহিত গ্রেডল কোটলিন ডিএসএলকে বোঝায়।
এই মাইগ্রেশন গাইডে, "Kotlin" এবং "Kotlin DSL" পরস্পরের পরিবর্তে ব্যবহৃত হয়েছে। একইভাবে, "Groovy" এবং "Groovy DSL" পরস্পরের পরিবর্তে ব্যবহৃত হয়েছে।
স্ক্রিপ্ট ফাইলের নামকরণ
স্ক্রিপ্ট ফাইল এক্সটেনশনের নামগুলি বিল্ড ফাইলটি যে ভাষায় লেখা আছে তার উপর ভিত্তি করে তৈরি করা হয়:
-  গ্রোভিতে লেখা গ্রেডল বিল্ড ফাইলগুলি .gradleফাইল নেম এক্সটেনশন ব্যবহার করে।
-  কোটলিনে লেখা গ্রেডল বিল্ড ফাইলগুলি .gradle.ktsফাইল নেম এক্সটেনশন ব্যবহার করে।
সিনট্যাক্স রূপান্তর করুন
গ্রুভি এবং কোটলিনের মধ্যে সিনট্যাক্সের কিছু সাধারণ পার্থক্য রয়েছে, তাই আপনাকে আপনার বিল্ড স্ক্রিপ্ট জুড়ে এই পরিবর্তনগুলি প্রয়োগ করতে হবে।
মেথড কলে বন্ধনী যোগ করুন
Groovy আপনাকে মেথড কলে বন্ধনী বাদ দিতে দেয়, যেখানে Kotlin-এর জন্য বন্ধনী প্রয়োজন। আপনার কনফিগারেশন মাইগ্রেট করতে, এই ধরণের মেথড কলে বন্ধনী যোগ করুন। এই কোডটি দেখায় কিভাবে Groovy-তে একটি সেটিং কনফিগার করতে হয়:
compileSdkVersion 30
এটি কোটলিনে লেখা একই কোড:
compileSdkVersion(30)
 অ্যাসাইনমেন্ট কলে = যোগ করুন
 গ্রুভি ডিএসএল আপনাকে প্রপার্টি অ্যাসাইন করার সময় অ্যাসাইনমেন্ট অপারেটর = বাদ দিতে দেয়, যেখানে কোটলিনের এটি প্রয়োজন। এই কোডটি দেখায় যে গ্রুভিতে কীভাবে প্রপার্টি অ্যাসাইন করতে হয়:
java {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}
এই কোডটি দেখায় কিভাবে কোটলিনে বৈশিষ্ট্য বরাদ্দ করতে হয়:
java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}
স্ট্রিং রূপান্তর করুন
গ্রুভি এবং কোটলিনের মধ্যে স্ট্রিং পার্থক্যগুলি এখানে দেওয়া হল:
- স্ট্রিং-এর জন্য ডাবল কোট: গ্রুভি একক কোট ব্যবহার করে স্ট্রিং সংজ্ঞায়িত করার অনুমতি দেয়, কিন্তু কোটলিনে ডাবল কোট প্রয়োজন।
- ডটেড এক্সপ্রেশনে স্ট্রিং ইন্টারপোলেশন: গ্রুভিতে, আপনি ডটেড এক্সপ্রেশনে স্ট্রিং ইন্টারপোলেশনের জন্য কেবল - $প্রিফিক্স ব্যবহার করতে পারেন, কিন্তু কোটলিনের জন্য আপনাকে ডটেড এক্সপ্রেশনগুলিকে কোঁকড়া ব্রেস দিয়ে মোড়ানো প্রয়োজন। উদাহরণস্বরূপ, গ্রুভিতে আপনি- $project.rootDirব্যবহার করতে পারেন যেমনটি নিম্নলিখিত স্নিপেটে দেখানো হয়েছে:- myRootDirectory = "$project.rootDir/tools/proguard-rules-debug.pro" - তবে, কোটলিনে, পূর্ববর্তী কোডটি - project.rootDirতে নয়,- projectতে- toString()কল করে। রুট ডিরেক্টরির মান পেতে,- ${project.rootDir}এক্সপ্রেশনটি কোঁকড়া ব্রেস দিয়ে মুড়ে দিন:- myRootDirectory = "${project.rootDir}/tools/proguard-rules-debug.pro" - আরও জানতে, কোটলিন ডকুমেন্টেশনে স্ট্রিং টেমপ্লেটগুলি দেখুন। 
ফাইল এক্সটেনশনের নাম পরিবর্তন করুন
 প্রতিটি বিল্ড ফাইলের কন্টেন্ট মাইগ্রেট করার সাথে সাথে .kts যোগ করুন। উদাহরণস্বরূপ, settings.gradle ফাইলের মতো একটি বিল্ড ফাইল নির্বাচন করুন। ফাইলটির নাম পরিবর্তন করে settings.gradle.kts রাখুন এবং ফাইলের কন্টেন্টকে Kotlin এ রূপান্তর করুন। নিশ্চিত করুন যে প্রতিটি বিল্ড ফাইল মাইগ্রেট করার পরেও আপনার প্রোজেক্ট কম্পাইল হচ্ছে।
প্রথমে আপনার ছোট ফাইলগুলি স্থানান্তর করুন, অভিজ্ঞতা অর্জন করুন, এবং তারপর এগিয়ে যান। একটি প্রকল্পে আপনি কোটলিন এবং গ্রুভি বিল্ড ফাইলের মিশ্রণ পেতে পারেন, তাই সাবধানে স্থানান্তর করার জন্য আপনার সময় নিন।
 def val অথবা var দিয়ে প্রতিস্থাপন করুন
 Kotlin-এ def পরিবর্তে val অথবা var ব্যবহার করুন, যা দিয়ে আপনি ভেরিয়েবল নির্ধারণ করতে পারবেন । Groovy-তে এটি একটি ভেরিয়েবল ঘোষণা:
def building64Bit = false
এটি কোটলিনে লেখা একই কোড:
val building64Bit = false
 বুলিয়ান বৈশিষ্ট্যের উপসর্গ হল is
 Groovy প্রোপার্টির নামের উপর ভিত্তি করে প্রোপার্টি ডিডাকশন লজিক ব্যবহার করে। একটি বুলিয়ান প্রোপার্টির foo এর জন্য, এর ডিডাকশন করা পদ্ধতিগুলি getFoo , setFoo , অথবা isFoo হতে পারে। এভাবে একবার Kotlin এ রূপান্তরিত হয়ে গেলে, আপনাকে প্রোপার্টির নামগুলি সেই ডিডাকশন করা পদ্ধতিগুলিতে পরিবর্তন করতে হবে যা Kotlin দ্বারা সমর্থিত নয়। উদাহরণস্বরূপ, buildTypes DSL বুলিয়ান এলিমেন্টের জন্য, আপনাকে তাদের সাথে is প্রিফিক্স লাগাতে হবে। এই কোডটি দেখায় কিভাবে Groovy তে বুলিয়ান প্রোপার্টি সেট করতে হয়:
android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            ...
        }
        debug {
            debuggable true
            ...
        }
    ...
 কোটলিনে একই কোডটি নিচে দেওয়া হল। মনে রাখবেন যে বৈশিষ্ট্যগুলি is দ্বারা প্রিফিক্স করা হয়েছে। 
android {
    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            isShrinkResources = true
            ...
        }
        getByName("debug") {
            isDebuggable = true
            ...
        }
    ...
তালিকা এবং মানচিত্র রূপান্তর করুন
 Groovy এবং Kotlin-এ তালিকা এবং মানচিত্রগুলি ভিন্ন ভিন্ন সিনট্যাক্স ব্যবহার করে সংজ্ঞায়িত করা হয়। Groovy [] ব্যবহার করে, যেখানে Kotlin listOf বা mapOf ব্যবহার করে স্পষ্টভাবে সংগ্রহ তৈরির পদ্ধতিগুলি কল করে। মাইগ্রেট করার সময় [] listOf বা mapOf দিয়ে প্রতিস্থাপন করতে ভুলবেন না।
গ্রুভি বনাম কোটলিনে তালিকা কীভাবে সংজ্ঞায়িত করবেন তা এখানে দেওয়া হল:
jvmOptions += ["-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError</code>"]
এটি কোটলিনে লেখা একই কোড:
jvmOptions += listOf("-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError")
গ্রুভি বনাম কোটলিনে মানচিত্র কীভাবে সংজ্ঞায়িত করবেন তা এখানে দেওয়া হল:
def myMap = [key1: 'value1', key2: 'value2']
এটি কোটলিনে লেখা একই কোড:
val myMap = mapOf("key1" to "value1", "key2" to "value2")
বিল্ডের ধরণগুলি কনফিগার করুন
কোটলিন ডিএসএল-এ শুধুমাত্র ডিবাগ এবং রিলিজ বিল্ড টাইপগুলি অন্তর্নিহিতভাবে উপলব্ধ। অন্যান্য সমস্ত কাস্টম বিল্ড টাইপ ম্যানুয়ালি তৈরি করতে হবে।
 গ্রুভিতে আপনি ডিবাগ, রিলিজ এবং অন্যান্য কিছু বিল্ড টাইপ তৈরি না করেই ব্যবহার করতে পারেন। নিম্নলিখিত কোড স্নিপেটটি গ্রুভিতে debug , release এবং benchmark বিল্ড টাইপের একটি কনফিগারেশন দেখায়। 
buildTypes {
 debug {
   ...
 }
 release {
   ...
 }
 benchmark {
   ...
 }
}
কোটলিনে সমতুল্য কনফিগারেশন তৈরি করতে, আপনাকে স্পষ্টভাবে benchmark বিল্ড টাইপ তৈরি করতে হবে। 
buildTypes {
 debug {
   ...
 }
 release {
   ...
 }
 register("benchmark") {
    ...
 }
}
বিল্ডস্ক্রিপ্ট থেকে প্লাগইন ব্লকে স্থানান্তর করুন
 যদি আপনার বিল্ড প্রজেক্টে প্লাগইন যোগ করার জন্য buildscript {} ব্লক ব্যবহার করে, তাহলে আপনার উচিত plugins {} ব্লক ব্যবহার করার জন্য রিফ্যাক্টর করা। plugins {} ব্লক প্লাগইন প্রয়োগ করা সহজ করে তোলে এবং এটি সংস্করণ ক্যাটালগের সাথে ভালভাবে কাজ করে।
 এছাড়াও, যখন আপনি আপনার বিল্ড ফাইলগুলিতে plugins {} ব্লক ব্যবহার করেন, তখন বিল্ড ব্যর্থ হলেও অ্যান্ড্রয়েড স্টুডিও প্রেক্ষাপট সম্পর্কে সচেতন থাকে। এই প্রেক্ষাপট আপনার কোটলিন ডিএসএল ফাইলগুলিতে সংশোধন করতে সাহায্য করে কারণ এটি স্টুডিও আইডিইকে কোড সম্পূর্ণ করার এবং অন্যান্য সহায়ক পরামর্শ প্রদানের অনুমতি দেয়।
প্লাগইন আইডি খুঁজুন
 যদিও buildscript {} ব্লক প্লাগইনের Maven স্থানাঙ্ক ব্যবহার করে বিল্ড ক্লাসপাথে প্লাগইন যোগ করে, উদাহরণস্বরূপ com.android.tools.build:gradle:7.4.0 , plugins {} ব্লক পরিবর্তে প্লাগইন আইডি ব্যবহার করে।
 বেশিরভাগ প্লাগইনের ক্ষেত্রে, প্লাগইন আইডি হল সেই স্ট্রিং যা আপনি apply plugin ব্যবহার করে প্রয়োগ করার সময় ব্যবহার করেন। উদাহরণস্বরূপ, নিম্নলিখিত প্লাগইন আইডিগুলি Android Gradle Plugin এর অংশ:
-  com.android.application
-  com.android.library
-  com.android.lint
-  com.android.test
আপনি Google Maven সংগ্রহস্থলে সম্পূর্ণ প্লাগইন তালিকাটি খুঁজে পেতে পারেন।
Kotlin প্লাগইনগুলি একাধিক প্লাগইন আইডি দ্বারা রেফারেন্স করা যেতে পারে। আমরা namespaced প্লাগইন আইডি ব্যবহার করার পরামর্শ দিচ্ছি, এবং নিম্নলিখিত টেবিলের সাহায্যে শর্টহ্যান্ড থেকে namespaced প্লাগইন আইডিতে রিফ্যাক্টর করার পরামর্শ দিচ্ছি:
| শর্টহ্যান্ড প্লাগইন আইডি | নেমস্পেসড প্লাগইন আইডি | 
|---|---|
| kotlin | org.jetbrains.kotlin.jvm | 
| kotlin-android | org.jetbrains.kotlin.android | 
| kotlin-kapt | org.jetbrains.kotlin.kapt | 
| kotlin-parcelize | org.jetbrains.kotlin.plugin.parcelize | 
আপনি গ্র্যাডল প্লাগইন পোর্টাল , ম্যাভেন সেন্ট্রাল রিপোজিটরি এবং গুগল ম্যাভেন রিপোজিটরিতে প্লাগইন অনুসন্ধান করতে পারেন। প্লাগইন আইডি কীভাবে কাজ করে সে সম্পর্কে আরও জানতে ডেভেলপিং কাস্টম গ্র্যাডল প্লাগইন পড়ুন।
রিফ্যাক্টরিং সম্পাদন করুন
আপনার ব্যবহৃত প্লাগইনগুলির আইডি জানা হয়ে গেলে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:
- যদি আপনার এখনও - buildscript {}ব্লকে ঘোষিত প্লাগইনগুলির জন্য রিপোজিটরি থাকে, তাহলে সেগুলিকে- settings.gradleফাইলে সরান।
- টপ-লেভেল - build.gradleফাইলের- plugins {}ব্লকে plugins যোগ করুন। আপনাকে এখানে প্লাগইনের আইডি এবং সংস্করণ নির্দিষ্ট করতে হবে। যদি প্লাগইনটি রুট প্রজেক্টে প্রয়োগ করার প্রয়োজন না হয়, তাহলে- apply falseব্যবহার করুন।
- শীর্ষ-স্তরের - build.gradle.ktsফাইল থেকে- classpathএন্ট্রিগুলি সরান।
- মডিউল-লেভেল - build.gradleফাইলের- plugins {}ব্লকে প্লাগইনগুলি যুক্ত করে প্রয়োগ করুন। আপনাকে এখানে শুধুমাত্র প্লাগইনের আইডি নির্দিষ্ট করতে হবে কারণ সংস্করণটি রুট প্রকল্প থেকে উত্তরাধিকারসূত্রে প্রাপ্ত।
- মডিউল-লেভেল - build.gradleফাইল থেকে প্লাগইনের জন্য- apply pluginকলটি সরিয়ে ফেলুন।
 উদাহরণস্বরূপ, এই সেটআপটি buildscript {} ব্লক ব্যবহার করে: 
// Top-level build.gradle file
buildscript {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
    dependencies {
        classpath("com.android.tools.build:gradle:7.4.0")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0")
        ...
    }
}
// Module-level build.gradle file
apply(plugin: "com.android.application")
apply(plugin: "kotlin-android")
এটি plugins {} ব্লক ব্যবহার করে একটি সমতুল্য সেটআপ: 
// Top-level build.gradle file
plugins {
   id 'com.android.application' version '7.4.0' apply false
   id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
   ...
}
// Module-level build.gradle file
plugins {
   id 'com.android.application'
   id 'org.jetbrains.kotlin.android'
   ...
}
// settings.gradle
pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}
প্লাগইন ব্লক রূপান্তর করুন
 plugins {} ব্লক থেকে প্লাগইন প্রয়োগ করা Groovy এবং Kotlin-এ একই রকম। ভার্সন ক্যাটালগ ব্যবহার করার সময় Groovy-তে প্লাগইন কীভাবে প্রয়োগ করবেন তা নিম্নলিখিত কোডে দেখানো হয়েছে: 
// Top-level build.gradle file
plugins {
   alias libs.plugins.android.application apply false
   ...
}
// Module-level build.gradle file
plugins {
   alias libs.plugins.android.application
   ...
}
কোটলিনে কীভাবে একই কাজ করতে হয় তা নিম্নলিখিত কোডটি দেখায়:
// Top-level build.gradle.kts file
plugins {
   alias(libs.plugins.android.application) apply false
   ...
}
// Module-level build.gradle.kts file
plugins {
   alias(libs.plugins.android.application)
   ...
}
ভার্সন ক্যাটালগ ব্যবহার না করলে গ্রুভিতে প্লাগইন কীভাবে প্রয়োগ করবেন তা নিম্নলিখিত কোডে দেখানো হয়েছে:
// Top-level build.gradle file
plugins {
   id 'com.android.application' version '7.3.0' apply false
   ...
}
// Module-level build.gradle file
plugins {
   id 'com.android.application'
   ...
}
কোটলিনে কীভাবে একই কাজ করতে হয় তা নিম্নলিখিত কোডটি দেখায়:
// Top-level build.gradle.kts file
plugins {
   id("com.android.application") version "7.3.0" apply false
   ...
}
// Module-level build.gradle.kts file
plugins {
   id("com.android.application")
   ...
}
plugins {} ব্লক সম্পর্কে আরও তথ্যের জন্য, গ্র্যাডেল ডকুমেন্টেশনে প্লাগইন প্রয়োগ করা দেখুন।
বিবিধ
অন্যান্য কার্যকারিতার জন্য কোটলিন কোড নমুনার জন্য, নিম্নলিখিত ডকুমেন্টেশন পৃষ্ঠাগুলি দেখুন:
- যদি আপনার ProGuard কনফিগারেশন থাকে, তাহলে Enable shrinking, obfuscation, এবং optimization দেখুন।
-  যদি আপনার signingConfig {}ব্লক থাকে, তাহলে আপনার বিল্ড ফাইল থেকে স্বাক্ষর তথ্য সরান দেখুন।
- যদি আপনি প্রকল্প-ব্যাপী বৈশিষ্ট্য ব্যবহার করেন, তাহলে প্রকল্প-ব্যাপী বৈশিষ্ট্য কনফিগার করুন দেখুন।
জ্ঞাত সমস্যা
বর্তমানে, একটি পরিচিত সমস্যা হল যে গ্রোভির তুলনায় কোটলিনের নির্মাণ গতি ধীর হতে পারে।
সমস্যাগুলি কীভাবে রিপোর্ট করবেন
আপনার সমস্যা নির্ণয়ের জন্য প্রয়োজনীয় তথ্য কীভাবে প্রদান করবেন তার নির্দেশাবলীর জন্য, বিল্ড টুলস এবং গ্রেডল বাগের বিশদ বিবরণ দেখুন। তারপর, গুগল পাবলিক ইস্যু ট্র্যাকার ব্যবহার করে একটি বাগ ফাইল করুন।
আরও রিসোর্স
কোটলিন দিয়ে লেখা গ্রেডল বিল্ড ফাইলের একটি কার্যকরী উদাহরণের জন্য, GitHub-এ Now In Android নমুনা অ্যাপটি দেখুন।
