64K এর বেশি পদ্ধতি সহ অ্যাপগুলির জন্য মাল্টিডেক্স সক্ষম করুন

যদি আপনার অ্যাপের minSdk এপিআই ২০ বা তার কম হয় এবং আপনার অ্যাপ ও এতে ব্যবহৃত লাইব্রেরিগুলোতে ৬৫,৫৩৬টির বেশি মেথড থাকে, তাহলে আপনি নিম্নলিখিত বিল্ড এররটির সম্মুখীন হবেন, যা নির্দেশ করে যে আপনার অ্যাপটি অ্যান্ড্রয়েড বিল্ড আর্কিটেকচারের সীমায় পৌঁছে গেছে:

trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.

বিল্ড সিস্টেমের পুরোনো সংস্করণগুলো একটি ভিন্ন ত্রুটি দেখায়, যা একই সমস্যার ইঙ্গিত দেয়:

Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536

এই ত্রুটিগুলোতে একটি সাধারণ সংখ্যা দেখা যায়: ৬৫৫৩৬। এই সংখ্যাটি একটিমাত্র ডালভিক এক্সিকিউটেবল (DEX) বাইটকোড ফাইলের ভেতরের কোড দ্বারা আহ্বান করা যেতে পারে এমন মোট রেফারেন্সের সংখ্যা নির্দেশ করে। এই পৃষ্ঠাটিতে মাল্টিডেক্স (multidex) নামে পরিচিত একটি অ্যাপ কনফিগারেশন সক্রিয় করার মাধ্যমে এই সীমাবদ্ধতা অতিক্রম করার উপায় ব্যাখ্যা করা হয়েছে, যা আপনার অ্যাপকে একাধিক DEX ফাইল বিল্ড এবং রিড করার সুযোগ দেয়।

৬৪কে রেফারেন্স সীমা সম্পর্কে

অ্যান্ড্রয়েড অ্যাপ (APK) ফাইলগুলিতে ডালভিক এক্সিকিউটেবল (DEX) ফাইলের আকারে এক্সিকিউটেবল বাইটকোড ফাইল থাকে, যেগুলিতে আপনার অ্যাপ চালানোর জন্য ব্যবহৃত কম্পাইল করা কোড থাকে। ডালভিক এক্সিকিউটেবল স্পেসিফিকেশন একটি একক DEX ফাইলের মধ্যে রেফারেন্স করা যেতে পারে এমন মোট মেথডের সংখ্যা ৬৫,৫৩৬-এ সীমাবদ্ধ করে—যার মধ্যে অ্যান্ড্রয়েড ফ্রেমওয়ার্ক মেথড, লাইব্রেরি মেথড এবং আপনার নিজের কোডের মেথড অন্তর্ভুক্ত।

কম্পিউটার বিজ্ঞানের প্রেক্ষাপটে, কিলো বা K পরিভাষাটি 10²⁴ (বা 2^10) বোঝায়। যেহেতু 65,536 সংখ্যাটি 64x10²⁴-এর সমান, তাই এই সীমাটিকে _64K রেফারেন্স লিমিট_ বলা হয়।

অ্যান্ড্রয়েড ৫.০ এর আগে মাল্টিডেক্স সমর্থন

অ্যান্ড্রয়েড ৫.০ (এপিআই লেভেল ২১)-এর পূর্ববর্তী প্ল্যাটফর্মের সংস্করণগুলো অ্যাপ কোড কার্যকর করার জন্য ডালভিক রানটাইম ব্যবহার করে। ডিফল্টরূপে, ডালভিক প্রতিটি APK-এর জন্য অ্যাপগুলোকে একটিমাত্র classes.dex বাইটকোড ফাইলে সীমাবদ্ধ রাখে। এই সীমাবদ্ধতা এড়াতে, মডিউল-স্তরের build.gradle অথবা build.gradle.kts ফাইলে `multidex` লাইব্রেরিটি যোগ করুন:

গ্রুভি

dependencies {
    def multidex_version = "2.0.1"
    implementation "androidx.multidex:multidex:$multidex_version"
}

কোটলিন

dependencies {
    val multidex_version = "2.0.1"
    implementation("androidx.multidex:multidex:$multidex_version")
}

এই লাইব্রেরিটি আপনার অ্যাপের মূল DEX ফাইলের একটি অংশ হয়ে যায় এবং এরপর অতিরিক্ত DEX ফাইল ও সেগুলোর অন্তর্ভুক্ত কোডে প্রবেশাধিকার নিয়ন্ত্রণ করে। এই লাইব্রেরির বর্তমান সংস্করণগুলো দেখতে, মাল্টিডেক্স সংস্করণসমূহ (multidex versions) দেখুন।

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

অ্যান্ড্রয়েড ৫.০ এবং তার উচ্চতর সংস্করণের জন্য মাল্টিডেক্স সমর্থন

অ্যান্ড্রয়েড ৫.০ (এপিআই লেভেল ২১) এবং এর উচ্চতর সংস্করণ ART নামক একটি রানটাইম ব্যবহার করে, যা APK ফাইল থেকে একাধিক DEX ফাইল লোড করাকে নেটিভভাবে সমর্থন করে। ART অ্যাপ ইনস্টলের সময় প্রি-কম্পাইলেশন সম্পন্ন করে, যেখানে এটি classes N .dex ফাইল স্ক্যান করে এবং অ্যান্ড্রয়েড ডিভাইসে চালানোর জন্য সেগুলোকে একটিমাত্র OAT ফাইলে কম্পাইল করে। সুতরাং, যদি আপনার minSdkVersion ২১ বা তার বেশি হয়, তাহলে মাল্টিডেক্স ডিফল্টভাবে সক্রিয় থাকে এবং আপনার মাল্টিডেক্স লাইব্রেরির প্রয়োজন হয় না।

অ্যান্ড্রয়েড ৫.০ রানটাইম সম্পর্কে আরও তথ্যের জন্য, অ্যান্ড্রয়েড রানটাইম (ART) এবং ডালভিক পড়ুন।

দ্রষ্টব্য: অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে আপনার অ্যাপ চালানোর সময়, বিল্ডটি আপনি যে টার্গেট ডিভাইসগুলিতে ডেপ্লয় করছেন সেগুলির জন্য অপ্টিমাইজ করা হয়। এর মধ্যে মাল্টিডেক্স সক্রিয় করাও অন্তর্ভুক্ত, যখন টার্গেট ডিভাইসগুলিতে অ্যান্ড্রয়েড ৫.০ বা তার উচ্চতর সংস্করণ চলে। যেহেতু এই অপ্টিমাইজেশনটি শুধুমাত্র অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে আপনার অ্যাপ ডেপ্লয় করার সময় প্রয়োগ করা হয়, তাই ৬৪কেবি সীমাবদ্ধতা এড়াতে আপনার রিলিজ বিল্ডে মাল্টিডেক্স কনফিগার করার প্রয়োজন হতে পারে।

৬৪কে সীমা এড়িয়ে চলুন

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

নিম্নলিখিত কৌশলগুলি আপনাকে DEX রেফারেন্স সীমাতে পৌঁছানো এড়াতে সাহায্য করতে পারে:

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

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

মাল্টিডেক্সের জন্য আপনার অ্যাপটি কনফিগার করুন।

দ্রষ্টব্য: যদি আপনার minSdkVersion ২১ বা তার বেশি সেট করা থাকে, তাহলে মাল্টিডেক্স ডিফল্টরূপে সক্রিয় থাকে এবং আপনার মাল্টিডেক্স লাইব্রেরির প্রয়োজন নেই।

যদি আপনার minSdkVersion ২০ বা তার কম সেট করা থাকে, তাহলে আপনাকে অবশ্যই মাল্টিডেক্স লাইব্রেরি ব্যবহার করতে হবে এবং আপনার অ্যাপ প্রজেক্টে নিম্নলিখিত পরিবর্তনগুলি করতে হবে:

  1. এখানে দেখানো অনুযায়ী, মাল্টিডেক্স সক্রিয় করতে এবং মাল্টিডেক্স লাইব্রেরিকে একটি ডিপেন্ডেন্সি হিসেবে যোগ করতে মডিউল-স্তরের build.gradle ফাইলটি পরিবর্তন করুন:

    গ্রুভি

    android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 36
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
        implementation "androidx.multidex:multidex:2.0.1"
    }

    কোটলিন

    android {
        defaultConfig {
            ...
            minSdk = 15 
            targetSdk = 36
            multiDexEnabled = true
        }
        ...
    }
    
    dependencies {
        implementation("androidx.multidex:multidex:2.0.1")
    }
  2. আপনি Application ক্লাসটি ওভাররাইড করেছেন কি না, তার উপর নির্ভর করে নিম্নলিখিতগুলির মধ্যে একটি সম্পাদন করুন:
    • আপনি যদি Application ক্লাসটি ওভাররাইড না করেন, তাহলে আপনার ম্যানিফেস্ট ফাইলটি সম্পাদনা করে <application> ট্যাগের মধ্যে android:name নিম্নরূপে সেট করুন:

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.myapp">
          <application
                  android:name="androidx.multidex.MultiDexApplication" >
              ...
          </application>
      </manifest>
    • যদি আপনি Application ক্লাসটি ওভাররাইড করেন, তবে এটিকে MultiDexApplication এক্সটেন্ড করার জন্য নিম্নরূপভাবে পরিবর্তন করুন:

      কোটলিন

      class MyApplication : MultiDexApplication() {...}

      জাভা

      public class MyApplication extends MultiDexApplication { ... }
    • যদি আপনি Application ক্লাসটি ওভাররাইড করেন কিন্তু বেস ক্লাস পরিবর্তন করা সম্ভব না হয়, তাহলে তার পরিবর্তে attachBaseContext() মেথডটি ওভাররাইড করুন এবং মাল্টিডেক্স সক্রিয় করতে MultiDex.install(this) কল করুন:

      কোটলিন

      class MyApplication : SomeOtherApplication() {
      
          override fun attachBaseContext(base: Context) {
              super.attachBaseContext(base)
              MultiDex.install(this)
          }
      }

      জাভা

      public class MyApplication extends SomeOtherApplication {
        @Override
        protected void attachBaseContext(Context base) {
           super.attachBaseContext(base);
           MultiDex.install(this);
        }
      }

      সতর্কতা: MultiDex.install( MultiDex.install() সম্পূর্ণ হওয়ার আগে রিফ্লেকশন বা JNI-এর মাধ্যমে MultiDex.install() বা অন্য কোনো কোড চালাবেন না। মাল্টিডেক্স ট্রেসিং ঐ কলগুলোকে অনুসরণ করবে না, যার ফলে DEX ফাইলগুলোর মধ্যে ভুল ক্লাস পার্টিশনের কারণে ClassNotFoundException বা ভেরিফাই এরর দেখা দেবে।

এখন যখন আপনি আপনার অ্যাপ বিল্ড করেন, তখন অ্যান্ড্রয়েড বিল্ড টুলগুলো একটি প্রধান DEX ফাইল ( classes.dex ) এবং প্রয়োজন অনুযায়ী সহায়ক DEX ফাইলগুলো ( classes2.dex , classes3.dex , ইত্যাদি) তৈরি করে। এরপর বিল্ড সিস্টেমটি সমস্ত DEX ফাইলকে প্যাকেজ করে আপনার APK-তে পরিণত করে।

রানটাইমে, শুধুমাত্র প্রধান classes.dex ফাইলে খোঁজার পরিবর্তে, মাল্টিডেক্স এপিআইগুলো আপনার মেথডগুলো খুঁজে বের করার জন্য একটি বিশেষ ক্লাস লোডার ব্যবহার করে উপলব্ধ সমস্ত `DEX` ফাইল অনুসন্ধান করে।

মাল্টিডেক্স লাইব্রেরির সীমাবদ্ধতা

মাল্টিডেক্স লাইব্রেরির কিছু জ্ঞাত সীমাবদ্ধতা রয়েছে। আপনার অ্যাপের বিল্ড কনফিগারেশনে লাইব্রেরিটি অন্তর্ভুক্ত করার সময় নিম্নলিখিত বিষয়গুলো বিবেচনা করুন:

  • ডিভাইসের ডেটা পার্টিশনে স্টার্টআপের সময় DEX ফাইল ইনস্টল করা একটি জটিল প্রক্রিয়া এবং সেকেন্ডারি DEX ফাইলগুলো বড় হলে এর ফলে 'অ্যাপ্লিকেশন নট রেসপন্ডিং' (ANR) ত্রুটি দেখা দিতে পারে। এই সমস্যা এড়াতে, DEX ফাইলের আকার কমাতে এবং কোডের অব্যবহৃত অংশগুলো মুছে ফেলতে কোড শ্রিংকিং সক্রিয় করুন
  • অ্যান্ড্রয়েড ৫.০ (এপিআই লেভেল ২১)-এর পূর্ববর্তী সংস্করণগুলিতে, লিনিয়ারঅ্যালক (linearalloc) সীমাবদ্ধতা এড়ানোর জন্য মাল্টিডেক্স (multidex) ব্যবহার করা যথেষ্ট ছিল না ( ইস্যু ৩৭০০৮১৪৩ )। অ্যান্ড্রয়েড ৪.০ (এপিআই লেভেল ১৪)-তে এই সীমাবদ্ধতা বাড়ানো হয়েছিল, কিন্তু তাতে সমস্যাটির সম্পূর্ণ সমাধান হয়নি।

    অ্যান্ড্রয়েড ৪.০-এর চেয়ে নিম্ন সংস্করণগুলিতে, আপনি DEX ইনডেক্স লিমিটে পৌঁছানোর আগেই linearalloc লিমিটে পৌঁছে যেতে পারেন। তাই আপনি যদি ১৪-এর চেয়ে নিম্ন API লেভেলকে টার্গেট করেন, তবে প্ল্যাটফর্মের সেই সংস্করণগুলিতে পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন, কারণ আপনার অ্যাপটি চালু হওয়ার সময় অথবা নির্দিষ্ট কিছু ক্লাস গ্রুপ লোড হওয়ার সময় সমস্যায় পড়তে পারে।

    কোড সঙ্কুচিত করার মাধ্যমে এই সমস্যাগুলো কমানো বা সম্ভবত দূর করা যেতে পারে।

প্রাথমিক DEX ফাইলে প্রয়োজনীয় ক্লাসগুলো ঘোষণা করুন।

একটি মাল্টিডেক্স অ্যাপের জন্য প্রতিটি DEX ফাইল বিল্ড করার সময়, বিল্ড টুলগুলো জটিল সিদ্ধান্ত গ্রহণের মাধ্যমে নির্ধারণ করে যে মূল DEX ফাইলে কোন ক্লাসগুলোর প্রয়োজন, যাতে আপনার অ্যাপটি সফলভাবে চালু হতে পারে। যদি স্টার্টআপের সময় প্রয়োজনীয় কোনো ক্লাস মূল DEX ফাইলে সরবরাহ করা না থাকে, তাহলে আপনার অ্যাপটি java.lang.NoClassDefFoundError ত্রুটি দেখিয়ে ক্র্যাশ করে।

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

যদি আপনি java.lang.NoClassDefFoundError পান, তাহলে আপনাকে অবশ্যই আপনার বিল্ড টাইপে multiDexKeepProguard প্রপার্টি ব্যবহার করে প্রয়োজনীয় অতিরিক্ত ক্লাসগুলো ডিক্লেয়ার করে প্রাইমারি DEX ফাইলে ম্যানুয়ালি উল্লেখ করতে হবে। যদি multiDexKeepProguard ফাইলে কোনো ক্লাস মিলে যায়, তাহলে সেই ক্লাসটি প্রাইমারি DEX ফাইলে যুক্ত হয়ে যায়।

মাল্টিডেক্সকিপপ্রোগার্ড সম্পত্তি

multiDexKeepProguard ফাইলটি ProGuard-এর মতোই ফরম্যাট ব্যবহার করে এবং সম্পূর্ণ ProGuard গ্রামার সমর্থন করে। আপনার অ্যাপে কী রাখা হবে তা কীভাবে কাস্টমাইজ করবেন সে সম্পর্কে আরও তথ্যের জন্য, ‘কোন কোড রাখতে হবে তা কাস্টমাইজ করুন ’ দেখুন।

multiDexKeepProguard এ আপনি যে ফাইলটি নির্দিষ্ট করবেন, তাতে যেকোনো বৈধ ProGuard সিনট্যাক্সে -keep অপশনগুলো থাকতে হবে। উদাহরণস্বরূপ, -keep com.example.MyClass.class । আপনি multidex-config.pro নামে একটি ফাইল তৈরি করতে পারেন যা দেখতে এইরকম:

-keep class com.example.MyClass
-keep class com.example.MyClassToo

যদি আপনি একটি প্যাকেজের সমস্ত ক্লাস নির্দিষ্ট করতে চান, তাহলে ফাইলটি দেখতে এইরকম হবে:

-keep class com.example.** { *; } // All classes in the com.example package

তারপর আপনি সেই ফাইলটিকে একটি বিল্ড টাইপের জন্য নিম্নোক্তভাবে ঘোষণা করতে পারেন:

গ্রুভি

android {
    buildTypes {
        release {
            multiDexKeepProguard file('multidex-config.pro')
            ...
        }
    }
}

কোটলিন

android {
    buildTypes {
        getByName("release") {
            multiDexKeepProguard = file("multidex-config.pro")
            ...
        }
    }
}

ডেভেলপমেন্ট বিল্ডগুলিতে মাল্টিডেক্স অপ্টিমাইজ করুন

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

দীর্ঘতর ইনক্রিমেন্টাল বিল্ড টাইম কমাতে, বিল্ডগুলোর মধ্যে মাল্টিডেক্স আউটপুট পুনরায় ব্যবহার করার জন্য প্রি-ডেক্সিং ব্যবহার করুন। প্রি-ডেক্সিং একটি ART ফরম্যাটের উপর নির্ভর করে যা শুধুমাত্র অ্যান্ড্রয়েড ৫.০ (API লেভেল ২১) এবং তার উপরের সংস্করণগুলোতে উপলব্ধ। আপনি যদি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করেন, তাহলে অ্যান্ড্রয়েড ৫.০ (API লেভেল ২১) বা তার উপরের সংস্করণে চালিত কোনো ডিভাইসে আপনার অ্যাপ ডেপ্লয় করার সময় IDE স্বয়ংক্রিয়ভাবে প্রি-ডেক্সিং ব্যবহার করে। তবে, আপনি যদি কমান্ড লাইন থেকে গ্রেডল বিল্ড চালান, তাহলে প্রি-ডেক্সিং সক্রিয় করার জন্য আপনাকে minSdkVersion ২১ বা তার বেশি সেট করতে হবে।

আপনার প্রোডাকশন বিল্ডের জন্য সেটিংস সংরক্ষণ করতে, আপনি প্রোডাক্ট ফ্লেভার ব্যবহার করে আপনার অ্যাপের দুটি সংস্করণ তৈরি করতে পারেন — একটি ডেভেলপমেন্ট ফ্লেভারের এবং অন্যটি রিলিজ ফ্লেভারের — যেখানে minSdkVersion এর মান ভিন্ন হবে, যেমনটি দেখানো হয়েছে:

গ্রুভি

android {
    defaultConfig {
        ...
        multiDexEnabled true
        // The default minimum API level you want to support.
        minSdkVersion 15
    }
    productFlavors {
        // Includes settings you want to keep only while developing your app.
        dev {
            // Enables pre-dexing for command-line builds. When using
            // Android Studio 2.3 or higher, the IDE enables pre-dexing
            // when deploying your app to a device running Android 5.0
            // (API level 21) or higher, regardless of minSdkVersion.
            minSdkVersion 21
        }
        prod {
            // If you've configured the defaultConfig block for the production version of
            // your app, you can leave this block empty and Gradle uses configurations in
            // the defaultConfig block instead. You still need to include this flavor.
            // Otherwise, all variants use the "dev" flavor configurations.
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                                                 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation "androidx.multidex:multidex:2.0.1"
}

কোটলিন

android {
    defaultConfig {
        ...
        multiDexEnabled = true
        // The default minimum API level you want to support.
        minSdk = 15
    }
    productFlavors {
        // Includes settings you want to keep only while developing your app.
        create("dev") {
            // Enables pre-dexing for command-line builds. When using
            // Android Studio 2.3 or higher, the IDE enables pre-dexing
            // when deploying your app to a device running Android 5.0
            // (API level 21) or higher, regardless of minSdkVersion.
            minSdk = 21
        }
        create("prod") {
            // If you've configured the defaultConfig block for the production version of
            // your app, you can leave this block empty and Gradle uses configurations in
            // the defaultConfig block instead. You still need to include this flavor.
            // Otherwise, all variants use the "dev" flavor configurations.
        }
    }
    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            proguardFiles(getDefaultProguardFile("proguard-android.txt"),
                                                 "proguard-rules.pro")
        }
    }
}

dependencies {
    implementation("androidx.multidex:multidex:2.0.1")
}

অ্যান্ড্রয়েড স্টুডিও অথবা কমান্ড লাইন থেকে বিল্ডের গতি উন্নত করার আরও কৌশল জানতে, ‘আপনার বিল্ডের গতি অপ্টিমাইজ করুন’ পড়ুন। বিল্ড ভ্যারিয়েন্ট ব্যবহার সম্পর্কে আরও তথ্যের জন্য, ‘বিল্ড ভ্যারিয়েন্ট কনফিগার করুন’ দেখুন।

পরামর্শ: আপনার যদি বিভিন্ন মাল্টিডেক্স প্রয়োজনের জন্য আলাদা বিল্ড ভ্যারিয়েন্ট থাকে, তাহলে আপনি প্রতিটি ভ্যারিয়েন্টের জন্য একটি ভিন্ন ম্যানিফেস্ট ফাইল দিতে পারেন, যাতে শুধুমাত্র API লেভেল ২০ এবং তার নিচের সংস্করণের ফাইলটি <application> ট্যাগের নাম পরিবর্তন করে। এছাড়াও আপনি প্রতিটি ভ্যারিয়েন্টের জন্য একটি ভিন্ন Application সাবক্লাস তৈরি করতে পারেন, যাতে শুধুমাত্র API লেভেল ২০ এবং তার নিচের সংস্করণের সাবক্লাসটি MultiDexApplication ক্লাসকে এক্সটেন্ড করে অথবা MultiDex.install(this) কল করে।

মাল্টিডেক্স অ্যাপ পরীক্ষা করুন

মাল্টিডেক্স অ্যাপের জন্য ইন্সট্রুমেন্টেশন টেস্ট লেখার সময়, যদি আপনি একটি MonitoringInstrumentation বা একটি AndroidJUnitRunner ইন্সট্রুমেন্টেশন ব্যবহার করেন, তাহলে কোনো অতিরিক্ত কনফিগারেশনের প্রয়োজন নেই। যদি আপনি অন্য কোনো Instrumentation ব্যবহার করেন, তাহলে আপনাকে অবশ্যই নিম্নলিখিত কোড দিয়ে এর onCreate() মেথডটি ওভাররাইড করতে হবে:

কোটলিন

fun onCreate(arguments: Bundle) {
  MultiDex.install(targetContext)
  super.onCreate(arguments)
  ...
}

জাভা

public void onCreate(Bundle arguments) {
  MultiDex.install(getTargetContext());
  super.onCreate(arguments);
  ...
}