আপনার বিল্ড কনফিগারেশন Groovy থেকে Kotlin-এ স্থানান্তর করুন

অ্যান্ড্রয়েড গ্র্যাডল প্লাগইন ৪.০-তে আপনার গ্র্যাডল বিল্ড কনফিগারেশনে গ্রুভির (যা ঐতিহ্যগতভাবে গ্র্যাডল কনফিগারেশন ফাইলে ব্যবহৃত প্রোগ্রামিং ভাষা) বিকল্প হিসেবে কোটলিন ব্যবহারের সুবিধা যোগ করা হয়েছে।

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

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

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

সময়রেখা

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

সাধারণ পরিভাষা

কোটলিন ডিএসএল: প্রধানত অ্যান্ড্রয়েড গ্রেডল প্লাগইন কোটলিন ডিএসএল অথবা, ক্ষেত্রবিশেষে, অন্তর্নিহিত গ্রেডল কোটলিন ডিএসএল- কে বোঝায়।

এই মাইগ্রেশন গাইডে, 'Kotlin' এবং 'Kotlin DSL' শব্দ দুটি একই অর্থে ব্যবহৃত হয়েছে। একইভাবে, 'Groovy' এবং 'Groovy DSL' শব্দ দুটিও একই অর্থে ব্যবহৃত হয়েছে।

স্ক্রিপ্ট ফাইলের নামকরণ

স্ক্রিপ্ট ফাইলের এক্সটেনশন নামগুলো বিল্ড ফাইলটি যে ভাষায় লেখা হয়েছে, তার ওপর ভিত্তি করে নির্ধারিত হয়:

  • Groovy-তে লেখা Gradle বিল্ড ফাইলগুলোতে .gradle ফাইল নেম এক্সটেনশন ব্যবহার করা হয়।
  • কোটলিনে লেখা গ্রেডল বিল্ড ফাইলগুলো .gradle.kts ফাইল নেম এক্সটেনশন ব্যবহার করে।

সিনট্যাক্স রূপান্তর করুন

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

মেথড কলে বন্ধনী যোগ করুন

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

compileSdkVersion 30

এটি কোটলিনে লেখা একই কোড:

compileSdkVersion(30)

অ্যাসাইনমেন্ট কলে = করুন

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

java {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}

এই কোডটি দেখায় কিভাবে কোটলিনে প্রোপার্টি অ্যাসাইন করতে হয়:

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

স্ট্রিং রূপান্তর করুন

Groovy এবং Kotlin-এর মধ্যে স্ট্রিং-এর পার্থক্যগুলো নিচে দেওয়া হলো:

  • স্ট্রিংয়ের জন্য ডাবল কোট: গ্রুভিতে সিঙ্গেল কোট ব্যবহার করে স্ট্রিং সংজ্ঞায়িত করা গেলেও, কোটলিনে ডাবল কোট আবশ্যক।
  • ডটেড এক্সপ্রেশনে স্ট্রিং ইন্টারপোলেশন: গ্রুভিতে, ডটেড এক্সপ্রেশনে স্ট্রিং ইন্টারপোলেশনের জন্য আপনি শুধু $ প্রিফিক্স ব্যবহার করতে পারেন, কিন্তু কোটলিনে ডটেড এক্সপ্রেশনগুলোকে কার্লি ব্রেসের মধ্যে রাখতে হয়। উদাহরণস্বরূপ, গ্রুভিতে আপনি $project.rootDir ব্যবহার করতে পারেন, যেমনটি নিচের কোড স্নিপেটে দেখানো হয়েছে:

        myRootDirectory = "$project.rootDir/tools/proguard-rules-debug.pro"
        

    তবে কোটলিনে, পূর্ববর্তী কোডটি project এর উপর toString() কল করে, project.rootDir এর উপর নয়। রুট ডিরেক্টরির মান পেতে, ${project.rootDir} এক্সপ্রেশনটিকে কার্লি ব্র্যাকেটের মধ্যে রাখুন:

        myRootDirectory = "${project.rootDir}/tools/proguard-rules-debug.pro"
        

    আরও জানতে, কোটলিন ডকুমেন্টেশনে স্ট্রিং টেমপ্লেট দেখুন।

ফাইল এক্সটেনশনের নাম পরিবর্তন করুন

প্রতিটি বিল্ড ফাইলের বিষয়বস্তু মাইগ্রেট করার সময় সেটির শেষে .kts যুক্ত করুন। উদাহরণস্বরূপ, settings.gradle ফাইলের মতো একটি বিল্ড ফাইল নির্বাচন করুন। ফাইলটির নাম পরিবর্তন করে settings.gradle.kts রাখুন এবং ফাইলটির বিষয়বস্তু কোটলিনে রূপান্তর করুন। প্রতিটি বিল্ড ফাইল মাইগ্রেট করার পরেও যেন আপনার প্রজেক্টটি কম্পাইল হয়, তা নিশ্চিত করুন।

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

def val বা var দিয়ে প্রতিস্থাপন করুন।

def val বা var দিয়ে প্রতিস্থাপন করুন, এভাবেই Kotlin-এ ভেরিয়েবল সংজ্ঞায়িত করা হয় । এটি Groovy-তে একটি ভেরিয়েবল ঘোষণা:

def building64Bit = false

এটি কোটলিনে লেখা একই কোড:

val building64Bit = false

বুলিয়ান প্রোপার্টিগুলোর আগে ' is উপসর্গটি যুক্ত করুন।

গ্রুভি প্রপার্টির নামের উপর ভিত্তি করে প্রপার্টি ডিডাকশন লজিক ব্যবহার করে। একটি বুলিয়ান প্রপার্টি ' foo এর জন্য, এর ডিডিউসড মেথডগুলো হতে পারে getFoo , setFoo , বা isFoo '। সুতরাং, কোটলিনে রূপান্তর করার পর, আপনাকে প্রপার্টির নামগুলো পরিবর্তন করে সেইসব ডিডিউসড মেথডে পরিণত করতে হবে যেগুলো কোটলিন দ্বারা সমর্থিত নয়। উদাহরণস্বরূপ, buildTypes DSL' বুলিয়ান এলিমেন্টগুলোর জন্য, আপনাকে সেগুলোর আগে is প্রিফিক্স যোগ করতে হবে। এই কোডটি দেখায় কিভাবে গ্রুভিতে বুলিয়ান প্রপার্টি সেট করতে হয়:

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

বিল্ড প্রকার কনফিগার করুন

Kotlin DSL-এ কেবল ডিবাগ এবং রিলিজ বিল্ড টাইপগুলোই স্বয়ংক্রিয়ভাবে উপলব্ধ থাকে। অন্য সব কাস্টম বিল্ড টাইপ ম্যানুয়ালি তৈরি করতে হয়।

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

buildTypes {
 debug {
   ...
 }
 release {
   ...
 }
 benchmark {
   ...
 }
}

Kotlin-এ সমতুল্য কনফিগারেশন তৈরি করতে, আপনাকে অবশ্যই benchmark বিল্ড টাইপটি স্পষ্টভাবে তৈরি করতে হবে।

buildTypes {
 debug {
   ...
 }

 release {
   ...
 }
 register("benchmark") {
    ...
 }
}

বিল্ডস্ক্রিপ্ট থেকে প্লাগইন ব্লকে স্থানান্তর করুন

আপনার বিল্ড যদি প্রজেক্টে প্লাগইন যোগ করার জন্য buildscript {} ` ব্লক ব্যবহার করে, তবে এর পরিবর্তে plugins {} ` ব্লক ব্যবহার করার জন্য কোডটি রিফ্যাক্টর করা উচিত। ` plugins {} ব্লক প্লাগইন প্রয়োগ করা সহজ করে তোলে এবং এটি ভার্সন ক্যাটালগের সাথে ভালোভাবে কাজ করে।

এছাড়াও, যখন আপনি আপনার বিল্ড ফাইলগুলিতে plugins {} ব্লক ব্যবহার করেন, তখন বিল্ড ব্যর্থ হলেও অ্যান্ড্রয়েড স্টুডিও সেই কনটেক্সট সম্পর্কে অবগত থাকে। এই কনটেক্সট আপনার কোটলিন ডিএসএল (DSL) ফাইলগুলিতে সংশোধন করতে সাহায্য করে, কারণ এটি স্টুডিও আইডিই-কে কোড কমপ্লিশন সম্পাদন করতে এবং অন্যান্য সহায়ক পরামর্শ প্রদান করতে সক্ষম করে।

প্লাগইন আইডিগুলো খুঁজুন

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

আপনি গুগল ম্যাভেন রিপোজিটরিতে সম্পূর্ণ প্লাগইন তালিকাটি খুঁজে পাবেন।

কোটলিন প্লাগইন একাধিক প্লাগইন আইডি দ্বারা রেফারেন্স করা যেতে পারে। আমরা নেমস্পেসড প্লাগইন আইডি ব্যবহার করার পরামর্শ দিই, এবং নিম্নলিখিত টেবিল অনুসারে শর্টহ্যান্ড থেকে নেমস্পেসড প্লাগইন আইডিতে রিফ্যাক্টর করুন:

সংক্ষিপ্ত প্লাগইন আইডি নেমস্পেসড প্লাগইন আইডি
kotlin org.jetbrains.kotlin.jvm
kotlin-android org.jetbrains.kotlin.android
kotlin-kapt org.jetbrains.kotlin.kapt
kotlin-parcelize org.jetbrains.kotlin.plugin.parcelize

আপনি গ্রেডল প্লাগইন পোর্টাল , ম্যাভেন সেন্ট্রাল রিপোজিটরি এবং গুগল ম্যাভেন রিপোজিটরিতেও প্লাগইন অনুসন্ধান করতে পারেন। প্লাগইন আইডি কীভাবে কাজ করে সে সম্পর্কে আরও জানতে ‘কাস্টম গ্রেডল প্লাগইন তৈরি করা’ পড়ুন।

রিফ্যাক্টরিং সম্পাদন করুন

আপনার ব্যবহৃত প্লাগইনগুলোর আইডি জানা হয়ে গেলে, নিম্নলিখিত ধাপগুলো অনুসরণ করুন:

  1. যদি আপনার buildscript {} ব্লকে এখনও প্লাগইনগুলির রিপোজিটরি ঘোষিত থাকে, তাহলে সেগুলিকে settings.gradle ফাইলে সরিয়ে নিন।

  2. টপ-লেভেল build.gradle ফাইলের plugins {} ব্লকে প্লাগইনগুলো যোগ করুন। এখানে আপনাকে প্লাগইনের আইডি এবং ভার্সন উল্লেখ করতে হবে। যদি প্লাগইনটি রুট প্রজেক্টে প্রয়োগ করার প্রয়োজন না হয়, apply false ব্যবহার করুন।

  3. শীর্ষ-স্তরের build.gradle.kts ফাইল থেকে classpath এন্ট্রিগুলো মুছে ফেলুন।

  4. মডিউল-স্তরের build.gradle ফাইলের plugins {} ব্লকে প্লাগইনগুলো যোগ করে প্রয়োগ করুন। এখানে আপনাকে শুধুমাত্র প্লাগইনের আইডি উল্লেখ করতে হবে, কারণ ভার্সনটি রুট প্রজেক্ট থেকে উত্তরাধিকারসূত্রে প্রাপ্ত হয়।

  5. মডিউল-স্তরের 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()
    }
}

প্লাগইন ব্লকটি রূপান্তর করুন

Groovy এবং Kotlin-এ plugins {} ব্লক থেকে প্লাগইন প্রয়োগ করার পদ্ধতি একই রকম। নিচের কোডটি দেখায় যে, ভার্সন ক্যাটালগ ব্যবহার করার সময় 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)
   ...
}

নিম্নলিখিত কোডটি দেখায় যে, ভার্সন ক্যাটালগ ব্যবহার না করে কীভাবে Groovy-তে প্লাগইন প্রয়োগ করতে হয়:

// 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 {} ব্লক সম্পর্কে আরও বিস্তারিত জানতে, Gradle ডকুমেন্টেশনে ' Applying plugins' অংশটি দেখুন।

বিবিধ

অন্যান্য কার্যকারিতার জন্য কোটলিন কোডের নমুনা পেতে, নিম্নলিখিত ডকুমেন্টেশন পৃষ্ঠাগুলি দেখুন:

পরিচিত সমস্যা

বর্তমানে, একটি জ্ঞাত সমস্যা হলো যে Kotlin-এর ক্ষেত্রে বিল্ড স্পিড Groovy-র চেয়ে ধীর হতে পারে।

সমস্যাগুলি কীভাবে রিপোর্ট করবেন

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

আরও তথ্য

কোটলিনে লেখা গ্রেডল বিল্ড ফাইলের একটি কার্যকরী উদাহরণের জন্য, গিটহাবে থাকা ‘Now In Android’ স্যাম্পল অ্যাপটি দেখুন।