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

যদি আপনার অ্যাপে এপিআই 20 বা তার চেয়ে কম minSdk থাকে এবং আপনার অ্যাপ এবং এটিতে উল্লেখ করা লাইব্রেরিগুলি 65,536 পদ্ধতির বেশি হয়, তাহলে আপনি নিম্নলিখিত বিল্ড ত্রুটির সম্মুখীন হন যা নির্দেশ করে যে আপনার অ্যাপটি 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। এই সংখ্যাটি একটি একক ডালভিক এক্সিকিউটেবল (DEX) বাইটকোড ফাইলের মধ্যে কোড দ্বারা আহ্বান করা যেতে পারে এমন মোট রেফারেন্সের সংখ্যাকে প্রতিনিধিত্ব করে। এই পৃষ্ঠাটি ব্যাখ্যা করে কিভাবে মাল্টিডেক্স নামে পরিচিত একটি অ্যাপ কনফিগারেশন সক্ষম করে এই সীমাবদ্ধতা অতিক্রম করতে হয়, যা আপনার অ্যাপকে একাধিক DEX ফাইল তৈরি করতে এবং পড়তে দেয়।

64K রেফারেন্স সীমা সম্পর্কে

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

কম্পিউটার বিজ্ঞানের পরিপ্রেক্ষিতে, কিলো, বা K শব্দটি 1024 (বা 2^10) বোঝায়। কারণ 65,536 64x1024 এর সমান, এই সীমাটিকে _64K রেফারেন্স সীমা_ হিসাবে উল্লেখ করা হয়।

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

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

গ্রোভি

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 ফাইল এবং সেগুলিতে থাকা কোডগুলিতে অ্যাক্সেস পরিচালনা করে৷ এই লাইব্রেরির বর্তমান সংস্করণগুলি দেখতে, মাল্টিডেক্স সংস্করণগুলি দেখুন।

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

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

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

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

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

64K সীমা এড়িয়ে চলুন

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

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

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

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

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

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

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

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

    গ্রোভি

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

    কোটলিন

    android {
        defaultConfig {
            ...
            minSdk = 15 
            targetSdk = 33
            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() সম্পূর্ণ হওয়ার আগে প্রতিফলন বা JNI এর মাধ্যমে MultiDex.install() বা অন্য কোন কোড চালাবেন না। মাল্টিডেক্স ট্রেসিং সেই কলগুলি অনুসরণ করবে না, যার ফলে ClassNotFoundException বা DEX ফাইলগুলির মধ্যে একটি খারাপ ক্লাস পার্টিশনের কারণে ত্রুটিগুলি যাচাই করা হবে৷

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

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

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

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

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

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

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

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

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

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

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

multiDexKeepProguard সম্পত্তি

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

আপনি 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 ফাইলগুলিতে অন্তর্ভুক্ত করা যেতে পারে। এর মানে হল যে মাল্টিডেক্স ব্যবহার করে ক্রমবর্ধমান বিল্ডগুলি সাধারণত বেশি সময় নেয় এবং সম্ভাব্যভাবে আপনার বিকাশ প্রক্রিয়াকে ধীর করে দিতে পারে।

দীর্ঘ ক্রমবর্ধমান বিল্ড সময় কমাতে, বিল্ডগুলির মধ্যে মাল্টিডেক্স আউটপুট পুনরায় ব্যবহার করতে প্রি-ডেক্সিং ব্যবহার করুন। প্রি-ডেক্সিং শুধুমাত্র Android 5.0 (API লেভেল 21) এবং উচ্চতর সংস্করণে উপলব্ধ একটি ART ফর্ম্যাটের উপর নির্ভর করে। আপনি যদি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করেন, তাহলে অ্যান্ড্রয়েড 5.0 (এপিআই লেভেল 21) বা তার বেশি চলমান ডিভাইসে আপনার অ্যাপ স্থাপন করার সময় IDE স্বয়ংক্রিয়ভাবে প্রি-ডেক্সিং ব্যবহার করে। যাইহোক, আপনি যদি কমান্ড লাইন থেকে Gradle বিল্ড চালাচ্ছেন, তাহলে প্রি-ডেক্সিং সক্ষম করতে আপনাকে minSdkVersion 21 বা তার বেশি সেট করতে হবে।

আপনার প্রোডাকশন বিল্ডের জন্য সেটিংস সংরক্ষণ করতে, আপনি পণ্যের স্বাদ ব্যবহার করে আপনার অ্যাপের দুটি সংস্করণ তৈরি করতে পারেন—একটি সংস্করণ একটি বিকাশের স্বাদের এবং একটি সংস্করণটি প্রকাশের স্বাদের সঙ্গে— 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 স্তর 20 এবং নীচের ফাইল <application> ট্যাগের নাম পরিবর্তন করে। এছাড়াও আপনি প্রতিটি ভেরিয়েন্টের জন্য একটি ভিন্ন Application সাবক্লাস তৈরি করতে পারেন তাই শুধুমাত্র API স্তর 20 এবং নিম্নতর জন্য সাবক্লাস 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);
  ...
}
,

যদি আপনার অ্যাপে এপিআই 20 বা তার চেয়ে কম minSdk থাকে এবং আপনার অ্যাপ এবং এটিতে উল্লেখ করা লাইব্রেরিগুলি 65,536 পদ্ধতির বেশি হয়, তাহলে আপনি নিম্নলিখিত বিল্ড ত্রুটির সম্মুখীন হন যা নির্দেশ করে যে আপনার অ্যাপটি 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। এই সংখ্যাটি একটি একক ডালভিক এক্সিকিউটেবল (DEX) বাইটকোড ফাইলের মধ্যে কোড দ্বারা আহ্বান করা যেতে পারে এমন মোট রেফারেন্সের সংখ্যাকে প্রতিনিধিত্ব করে। এই পৃষ্ঠাটি ব্যাখ্যা করে কিভাবে মাল্টিডেক্স নামে পরিচিত একটি অ্যাপ কনফিগারেশন সক্ষম করে এই সীমাবদ্ধতা অতিক্রম করতে হয়, যা আপনার অ্যাপকে একাধিক DEX ফাইল তৈরি করতে এবং পড়তে দেয়।

64K রেফারেন্স সীমা সম্পর্কে

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

কম্পিউটার বিজ্ঞানের পরিপ্রেক্ষিতে, কিলো, বা K শব্দটি 1024 (বা 2^10) বোঝায়। কারণ 65,536 64x1024 এর সমান, এই সীমাটিকে _64K রেফারেন্স সীমা_ হিসাবে উল্লেখ করা হয়।

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

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

গ্রোভি

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 ফাইল এবং সেগুলিতে থাকা কোডগুলিতে অ্যাক্সেস পরিচালনা করে৷ এই লাইব্রেরির বর্তমান সংস্করণগুলি দেখতে, মাল্টিডেক্স সংস্করণগুলি দেখুন।

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

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

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

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

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

64K সীমা এড়িয়ে চলুন

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

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

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

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

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

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

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

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

    গ্রোভি

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

    কোটলিন

    android {
        defaultConfig {
            ...
            minSdk = 15 
            targetSdk = 33
            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() সম্পূর্ণ হওয়ার আগে প্রতিফলন বা JNI এর মাধ্যমে MultiDex.install() বা অন্য কোন কোড চালাবেন না। মাল্টিডেক্স ট্রেসিং সেই কলগুলি অনুসরণ করবে না, যার ফলে ClassNotFoundException বা DEX ফাইলগুলির মধ্যে একটি খারাপ ক্লাস পার্টিশনের কারণে ত্রুটিগুলি যাচাই করা হবে৷

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

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

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

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

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

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

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

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

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

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

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

multiDexKeepProguard সম্পত্তি

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

আপনি 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 ফাইলগুলিতে অন্তর্ভুক্ত করা যেতে পারে। এর মানে হল যে মাল্টিডেক্স ব্যবহার করে ক্রমবর্ধমান বিল্ডগুলি সাধারণত বেশি সময় নেয় এবং সম্ভাব্যভাবে আপনার বিকাশ প্রক্রিয়াকে ধীর করে দিতে পারে।

দীর্ঘ ক্রমবর্ধমান বিল্ড সময় কমাতে, বিল্ডগুলির মধ্যে মাল্টিডেক্স আউটপুট পুনরায় ব্যবহার করতে প্রি-ডেক্সিং ব্যবহার করুন। প্রি-ডেক্সিং শুধুমাত্র Android 5.0 (API লেভেল 21) এবং উচ্চতর সংস্করণে উপলব্ধ একটি ART ফর্ম্যাটের উপর নির্ভর করে। আপনি যদি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করেন, তাহলে অ্যান্ড্রয়েড 5.0 (এপিআই লেভেল 21) বা তার বেশি চলমান ডিভাইসে আপনার অ্যাপ স্থাপন করার সময় IDE স্বয়ংক্রিয়ভাবে প্রি-ডেক্সিং ব্যবহার করে। যাইহোক, আপনি যদি কমান্ড লাইন থেকে Gradle বিল্ড চালাচ্ছেন, তাহলে প্রি-ডেক্সিং সক্ষম করতে আপনাকে minSdkVersion 21 বা তার বেশি সেট করতে হবে।

আপনার প্রোডাকশন বিল্ডের জন্য সেটিংস সংরক্ষণ করতে, আপনি পণ্যের স্বাদ ব্যবহার করে আপনার অ্যাপের দুটি সংস্করণ তৈরি করতে পারেন—একটি সংস্করণ একটি বিকাশের স্বাদের এবং একটি সংস্করণটি প্রকাশের স্বাদের সঙ্গে— 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 স্তর 20 এবং নীচের ফাইল <application> ট্যাগের নাম পরিবর্তন করে। এছাড়াও আপনি প্রতিটি ভেরিয়েন্টের জন্য একটি ভিন্ন Application সাবক্লাস তৈরি করতে পারেন তাই শুধুমাত্র API স্তর 20 এবং নিম্নতর জন্য সাবক্লাস 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);
  ...
}
,

যদি আপনার অ্যাপে এপিআই 20 বা তার চেয়ে কম minSdk থাকে এবং আপনার অ্যাপ এবং এটিতে উল্লেখ করা লাইব্রেরিগুলি 65,536 পদ্ধতির বেশি হয়, তাহলে আপনি নিম্নলিখিত বিল্ড ত্রুটির সম্মুখীন হন যা নির্দেশ করে যে আপনার অ্যাপটি 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। এই সংখ্যাটি একটি একক ডালভিক এক্সিকিউটেবল (DEX) বাইটকোড ফাইলের মধ্যে কোড দ্বারা আহ্বান করা যেতে পারে এমন মোট রেফারেন্সের সংখ্যাকে প্রতিনিধিত্ব করে। এই পৃষ্ঠাটি ব্যাখ্যা করে কিভাবে মাল্টিডেক্স নামে পরিচিত একটি অ্যাপ কনফিগারেশন সক্ষম করে এই সীমাবদ্ধতা অতিক্রম করতে হয়, যা আপনার অ্যাপকে একাধিক DEX ফাইল তৈরি করতে এবং পড়তে দেয়।

64K রেফারেন্স সীমা সম্পর্কে

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

কম্পিউটার বিজ্ঞানের পরিপ্রেক্ষিতে, কিলো, বা K শব্দটি 1024 (বা 2^10) বোঝায়। কারণ 65,536 64x1024 এর সমান, এই সীমাটিকে _64K রেফারেন্স সীমা_ হিসাবে উল্লেখ করা হয়।

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

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

গ্রোভি

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 ফাইল এবং সেগুলিতে থাকা কোডগুলিতে অ্যাক্সেস পরিচালনা করে৷ এই লাইব্রেরির বর্তমান সংস্করণগুলি দেখতে, মাল্টিডেক্স সংস্করণগুলি দেখুন।

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

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

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

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

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

64K সীমা এড়িয়ে চলুন

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

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

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

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

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

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

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

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

    গ্রোভি

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

    কোটলিন

    android {
        defaultConfig {
            ...
            minSdk = 15 
            targetSdk = 33
            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() সম্পূর্ণ হওয়ার আগে প্রতিফলন বা JNI এর মাধ্যমে MultiDex.install() বা অন্য কোন কোড চালাবেন না। মাল্টিডেক্স ট্রেসিং সেই কলগুলি অনুসরণ করবে না, যার ফলে ClassNotFoundException বা DEX ফাইলগুলির মধ্যে একটি খারাপ ক্লাস পার্টিশনের কারণে ত্রুটিগুলি যাচাই করা হবে৷

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

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

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

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

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

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

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

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

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

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

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

multiDexKeepProguard সম্পত্তি

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

আপনি 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 ফাইলগুলিতে অন্তর্ভুক্ত করা যেতে পারে। এর মানে হল যে মাল্টিডেক্স ব্যবহার করে ক্রমবর্ধমান বিল্ডগুলি সাধারণত বেশি সময় নেয় এবং সম্ভাব্যভাবে আপনার বিকাশ প্রক্রিয়াকে ধীর করে দিতে পারে।

দীর্ঘ ক্রমবর্ধমান বিল্ড সময় কমাতে, বিল্ডগুলির মধ্যে মাল্টিডেক্স আউটপুট পুনরায় ব্যবহার করতে প্রি-ডেক্সিং ব্যবহার করুন। প্রি-ডেক্সিং শুধুমাত্র Android 5.0 (API লেভেল 21) এবং উচ্চতর সংস্করণে উপলব্ধ একটি ART ফর্ম্যাটের উপর নির্ভর করে। আপনি যদি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করেন, তাহলে অ্যান্ড্রয়েড 5.0 (এপিআই লেভেল 21) বা তার বেশি চলমান ডিভাইসে আপনার অ্যাপ স্থাপন করার সময় IDE স্বয়ংক্রিয়ভাবে প্রি-ডেক্সিং ব্যবহার করে। যাইহোক, আপনি যদি কমান্ড লাইন থেকে Gradle বিল্ড চালাচ্ছেন, তাহলে প্রি-ডেক্সিং সক্ষম করতে আপনাকে minSdkVersion 21 বা তার বেশি সেট করতে হবে।

আপনার প্রোডাকশন বিল্ডের জন্য সেটিংস সংরক্ষণ করতে, আপনি পণ্যের স্বাদ ব্যবহার করে আপনার অ্যাপের দুটি সংস্করণ তৈরি করতে পারেন—একটি সংস্করণ একটি বিকাশের স্বাদের এবং একটি সংস্করণটি প্রকাশের স্বাদের সঙ্গে— 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 স্তর 20 এবং নীচের ফাইল <application> ট্যাগের নাম পরিবর্তন করে। আপনি প্রতিটি বৈকল্পের জন্য একটি পৃথক Application সাবক্লাসও তৈরি করতে পারেন তাই কেবলমাত্র এপিআই স্তর 20 এর জন্য সাবক্লাস এবং লোয়ার 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);
  ...
}