৬৪ হাজারের বেশি মেথড সহ অ্যাপের জন্য মাল্টিডেক্স চালু করা

আপনার অ্যাপে minSdk API 20 বা তার আগের যেকোনও ভার্সন থাকলে এবং আপনার অ্যাপ ও এর রেফারেন্স করা লাইব্রেরি ৬৫,৫৩৬টি মেথড অতিক্রম করলে, আপনি নিম্নলিখিত বিল্ড সংক্রান্ত সমস্যার সম্মুখীন হবেন যা ইঙ্গিত করে যে আপনার অ্যাপ Android বিল্ড আর্কিটেকচারের সীমায় পৌঁছে গেছে:

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

এইসব সমস্যার ক্ষেত্রে একটি সাধারণ নম্বর দেখা যায়: 65536. এই সংখ্যাটি একটি Dalvik Executable (DEX) বাইটকোড ফাইলের মধ্যে কোড দ্বারা ইনভোক করা যেতে পারে এমন রেফারেন্সের মোট সংখ্যাকে প্রতিনিধিত্ব করে। এই পৃষ্ঠায় ব্যাখ্যা করা হয়েছে যে কীভাবে মাল্টিডেক্স নামে পরিচিত অ্যাপ কনফিগারেশন চালু করে এই সীমাবদ্ধতা অতিক্রম করা যায়। এটি আপনার অ্যাপকে একাধিক DEX ফাইল তৈরি ও পড়তে দেয়।

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

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

কম্পিউটার বিজ্ঞানের প্রেক্ষিতে, কিলো বা K শব্দটি ১০২৪ (বা ২^১০) বোঝায়। যেহেতু ৬৫,৫৩৬ হল ৬৪x১০২৪-এর সমান, তাই এই সীমাটিকে _৬৪K রেফারেন্স সীমা_ বলা হয়।

Android 5.0-এর আগের ভার্সনে মাল্টিডেক্স কাজ করে

Android 5.0 (API লেভেল ২১)-এর আগের প্ল্যাটফর্মের ভার্সন অ্যাপ কোড এক্সিকিউট করার জন্য Dalvik রানটাইম ব্যবহার করে। ডিফল্ট হিসেবে, Dalvik অ্যাপকে একটি classes.dex APK পিছু বাইটকোড ফাইলে সীমাবদ্ধ করে। এই সীমাবদ্ধতা এড়াতে, মডিউল-লেভেল build.gradle বা build.gradle.kts ফাইলে মাল্টিডেক্স লাইব্রেরি যোগ করুন:

গ্ৰুভি

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

Kotlin

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

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

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

Android 5.0 এবং তার পরবর্তী ভার্সনের জন্য মাল্টিডেক্স সাপোর্ট

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

Android 5.0 রানটাইম সম্পর্কে আরও জানতে, Android রানটাইম (ART) ও Dalvik নিবন্ধটি পড়ুন।

মনে রাখবেন: Android Studio ব্যবহার করে আপনার অ্যাপ চালানোর সময়, আপনি যে টার্গেট ডিভাইসে ডিপ্লয় করেন সেটির জন্য বিল্ড অপ্টিমাইজ করা হয়। টার্গেট ডিভাইসে Android 5.0 বা তার পরবর্তী যেকোনও ভার্সন চললে, মাল্টিডেক্স চালু করাও এর মধ্যে অন্তর্ভুক্ত। Android Studio ব্যবহার করে আপনার অ্যাপ ডিপ্লয় করার সময় শুধুমাত্র এই অপ্টিমাইজেশন প্রয়োগ করা হয় বলে, 64K সীমা এড়াতে মাল্টিডেক্সের জন্য আপনাকে এখনও আপনার রিলিজ বিল্ড কনফিগার করতে হতে পারে।

৬৪K সীমা এড়িয়ে যাওয়া

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

নিম্নলিখিত কৌশলগুলি আপনাকে 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"
    }

    Kotlin

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

      <?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 এক্সটেন্ড করতে পরিবর্তন করুন, যেমন:

      Kotlin

      class MyApplication : MultiDexApplication() {...}

      জাভা

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

      Kotlin

      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-এর মাধ্যমে এক্সিকিউট করবেন না। মাল্টিডেক্স ট্রেসিং সেইসব কল ফলো করবে না, এর ফলে DEX ফাইলের মধ্যে ভুল ক্লাস পার্টিশনের কারণে ClassNotFoundExceptionবা যাচাইকরণ সংক্রান্ত সমস্যা হবে।

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

রানটাইমে, শুধুমাত্র প্রধান classes.dex ফাইলে সার্চ করার পরিবর্তে, মাল্টিডেক্স API আপনার পদ্ধতির জন্য উপলভ্য সব DEX ফাইল সার্চ করতে একটি বিশেষ ক্লাস লোডার ব্যবহার করে।

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

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

  • স্টার্টআপের সময় ডিভাইসের ডেটা পার্টিশনে DEX ফাইল ইনস্টল করা জটিল এবং সেকেন্ডারি DEX ফাইল বড় হলে 'অ্যাপ্লিকেশন সাড়া দিচ্ছে না (ANR)' সংক্রান্ত সমস্যা হতে পারে। এই সমস্যা এড়াতে, DEX ফাইলের সাইজ কমাতে এবং কোডের অব্যবহৃত অংশ সরাতে কোড সঙ্কুচিত করার সুবিধা চালু করুন।
  • Android 5.0 (API লেভেল 21)-এর আগের যেকোনও ভার্সনে রান করার সময়, লিনিয়ার অ্যালোকেশন সীমা (issue 37008143) এড়িয়ে যাওয়ার জন্য multidex ব্যবহার করাই যথেষ্ট নয়। এই সীমা Android 4.0 (API লেভেল 14)-এ বাড়ানো হয়েছে, তবে এটি সমস্যার সম্পূর্ণ সমাধান করেনি।

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

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

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

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

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

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

multiDexKeepProguard প্রপার্টি

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

multiDexKeepProguard-এ উল্লেখ করা ফাইলে -keep যেকোনও সঠিক ProGuard সিনট্যাক্সে বিকল্প থাকতে হবে। যেমন, -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')
            ...
        }
    }
}

Kotlin

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

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

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

ইনক্রিমেন্টাল বিল্ডের সময় কমানোর জন্য, বিল্ডের মধ্যে মাল্টিডেক্স আউটপুট আবার ব্যবহার করতে, প্রি-ডেক্সিং ব্যবহার করুন। প্রি-ডেক্সিং ART ফর্ম্যাটের উপর নির্ভর করে যা শুধুমাত্র Android 5.0 (API লেভেল 21) ও তার পরবর্তী যেকোনও ভার্সনে উপলভ্য। আপনি Android Studio ব্যবহার করলে, Android 5.0 (API লেভেল ২১) বা তার পরবর্তী ভার্সন চলছে এমন ডিভাইসে আপনার অ্যাপ ডিপ্লয় করার সময় IDE অটোমেটিক প্রি-ডেক্সিং ব্যবহার করে। তবে, আপনি কমান্ড লাইন থেকে Gradle বিল্ড চালালে, প্রি-ডেক্সিং চালু করতে আপনাকে 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"
}

Kotlin

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

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

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

মাল্টিডেক্স অ্যাপ টেস্ট করা

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

Kotlin

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

জাভা

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