যদি আপনার অ্যাপে এপিআই 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 বা তার নিচে সেট করা থাকে, তাহলে আপনাকে অবশ্যই মাল্টিডেক্স লাইব্রেরি ব্যবহার করতে হবে এবং আপনার অ্যাপ প্রকল্পে নিম্নলিখিত পরিবর্তনগুলি করতে হবে:
মাল্টিডেক্স সক্ষম করতে মডিউল-স্তরের
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") }
- আপনি
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 বা তার নিচে সেট করা থাকে, তাহলে আপনাকে অবশ্যই মাল্টিডেক্স লাইব্রেরি ব্যবহার করতে হবে এবং আপনার অ্যাপ প্রকল্পে নিম্নলিখিত পরিবর্তনগুলি করতে হবে:
মাল্টিডেক্স সক্ষম করতে মডিউল-স্তরের
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") }
- আপনি
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 বা তার নিচে সেট করা থাকে, তাহলে আপনাকে অবশ্যই মাল্টিডেক্স লাইব্রেরি ব্যবহার করতে হবে এবং আপনার অ্যাপ প্রকল্পে নিম্নলিখিত পরিবর্তনগুলি করতে হবে:
মাল্টিডেক্স সক্ষম করতে মডিউল-স্তরের
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") }
- আপনি
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 This এই পৃষ্ঠাটি ব্যাখ্যা করে যে কীভাবে মাল্টিডেক্স নামে পরিচিত একটি অ্যাপ্লিকেশন কনফিগারেশন সক্ষম করে এই সীমাবদ্ধতাটি পেরিয়ে যায়, যা আপনার অ্যাপ্লিকেশনটিকে একাধিক ডেক্স ফাইল তৈরি এবং পড়তে দেয়।
প্রায় 64 কে রেফারেন্স সীমা
অ্যান্ড্রয়েড অ্যাপ (APK) ফাইলগুলিতে ডালভিক এক্সিকিউটেবল (DEX) ফাইলের আকারে এক্সিকিউটেবল বাইটকোড ফাইল থাকে, যেটিতে আপনার অ্যাপ চালানোর জন্য ব্যবহৃত সংকলিত কোড থাকে। ডালভিক এক্সিকিউটেবল স্পেসিফিকেশন আপনার নিজস্ব কোডে অ্যান্ড্রয়েড ফ্রেমওয়ার্ক পদ্ধতি, গ্রন্থাগার পদ্ধতি এবং পদ্ধতি সহ একক ডেক্স ফাইলের মধ্যে 65,536 - এর মধ্যে উল্লেখ করা যেতে পারে এমন মোট পদ্ধতির সংখ্যা সীমাবদ্ধ করে।
কম্পিউটার বিজ্ঞানের প্রসঙ্গে, কিলো বা কে শব্দটি 1024 (বা 2^10) বোঝায়। যেহেতু 65,536 64x1024 এর সমান, এই সীমাটি _64 কে রেফারেন্স সীমা_ হিসাবে উল্লেখ করা হয়।অ্যান্ড্রয়েড 5.0 এর আগে মাল্টিডেক্স সমর্থন
অ্যান্ড্রয়েড 5.0 এর পূর্বে প্ল্যাটফর্মের সংস্করণগুলি (এপিআই স্তর 21) অ্যাপ্লিকেশন কোড কার্যকর করার জন্য ডালভিক রানটাইম ব্যবহার করে। ডিফল্টরূপে, ডালভিক অ্যাপসকে একটি একক 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") }
এই লাইব্রেরিটি আপনার অ্যাপ্লিকেশনটির প্রাথমিক ডেক্স ফাইলের অংশ হয়ে যায় এবং তারপরে অতিরিক্ত ডেক্স ফাইল এবং সেগুলি থাকা কোডগুলিতে অ্যাক্সেস পরিচালনা করে। এই লাইব্রেরির জন্য বর্তমান সংস্করণগুলি দেখতে, মাল্টিডেক্স সংস্করণগুলি দেখুন।
আরও তথ্যের জন্য, মাল্টিডেক্সের জন্য কীভাবে আপনার অ্যাপটি কনফিগার করবেন সে সম্পর্কে বিভাগটি দেখুন।অ্যান্ড্রয়েড 5.0 এবং উচ্চতর জন্য মাল্টিডেক্স সমর্থন
অ্যান্ড্রয়েড 5.0 (এপিআই স্তর 21) এবং উচ্চতর আর্ট নামে একটি রানটাইম ব্যবহার করে যা স্থানীয়ভাবে এপিকে ফাইলগুলি থেকে একাধিক ডেক্স ফাইল লোড করা সমর্থন করে। আর্ট অ্যাপ ইনস্টল টাইমে প্রাক-সংকলন সম্পাদন করে, classes N .dex
অতএব, যদি আপনার minSdkVersion
21 বা তার বেশি হয় তবে মাল্টিডেক্স ডিফল্টরূপে সক্ষম করা হয় এবং আপনার মাল্টিডেক্স লাইব্রেরির প্রয়োজন হয় না।
অ্যান্ড্রয়েড 5.0 রানটাইম সম্পর্কিত আরও তথ্যের জন্য, অ্যান্ড্রয়েড রানটাইম (আর্ট) এবং ডালভিক পড়ুন।
দ্রষ্টব্য: অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে আপনার অ্যাপটি চালানোর সময়, আপনি যে লক্ষ্য ডিভাইসগুলিতে স্থাপন করেছেন তার জন্য বিল্ডটি অনুকূলিত হয়। এর মধ্যে যখন টার্গেট ডিভাইসগুলি অ্যান্ড্রয়েড 5.0 এবং উচ্চতর চলছে তখন মাল্টিডেক্স সক্ষম করা অন্তর্ভুক্ত। যেহেতু এই অপ্টিমাইজেশনটি কেবলমাত্র অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে আপনার অ্যাপটি স্থাপন করার সময় প্রয়োগ করা হয়, তাই আপনাকে এখনও 64 কে সীমা এড়াতে মাল্টিডেক্সের জন্য আপনার রিলিজ বিল্ডটি কনফিগার করতে হবে।
64 কে সীমা এড়িয়ে চলুন
K৪ কে বা আরও বেশি পদ্ধতির রেফারেন্সের ব্যবহার সক্ষম করতে আপনার অ্যাপ্লিকেশনটি কনফিগার করার আগে, আপনার অ্যাপ্লিকেশন কোড দ্বারা সংজ্ঞায়িত পদ্ধতিগুলি বা অন্তর্ভুক্ত লাইব্রেরি সহ আপনার অ্যাপ্লিকেশন কোড দ্বারা ডাকা মোট রেফারেন্সের সংখ্যা হ্রাস করার পদক্ষেপ গ্রহণ করুন।
নিম্নলিখিত কৌশলগুলি আপনাকে ডেক্স রেফারেন্স সীমাটি এড়াতে সহায়তা করতে পারে:
- আপনার অ্যাপ্লিকেশনটির প্রত্যক্ষ এবং ট্রানজিটিভ নির্ভরতা পর্যালোচনা করুন
- আপনার অ্যাপ্লিকেশনটিতে অন্তর্ভুক্ত কোনও বৃহত লাইব্রেরির নির্ভরতার মান অ্যাপটিতে যুক্ত হওয়া কোডের পরিমাণকে ছাড়িয়ে যায় কিনা তা বিবেচনা করুন। একটি সাধারণ তবে সমস্যাযুক্ত প্যাটার্নটি হ'ল একটি খুব বড় গ্রন্থাগার অন্তর্ভুক্ত করা কারণ কয়েকটি ইউটিলিটি পদ্ধতি কার্যকর ছিল। আপনার অ্যাপ্লিকেশন কোড নির্ভরতা হ্রাস করা প্রায়শই আপনাকে ডেক্স রেফারেন্স সীমা এড়াতে সহায়তা করতে পারে।
- আর 8 সহ অব্যবহৃত কোড সরান
- আপনার রিলিজ বিল্ডগুলির জন্য আর 8 চালানোর জন্য কোড সঙ্কুচিত সক্ষম করুন । আপনি আপনার এপিকেএসের সাথে অব্যবহৃত কোড শিপিং করছেন না তা নিশ্চিত করতে সঙ্কুচিত করতে সক্ষম করুন। যদি কোড সঙ্কুচিত হওয়া সঠিকভাবে কনফিগার করা থাকে তবে এটি আপনার নির্ভরতা থেকে অব্যবহৃত কোড এবং সংস্থানগুলিও সরিয়ে ফেলতে পারে।
এই কৌশলগুলি ব্যবহার করা আপনাকে আপনার এপিকে সামগ্রিক আকার হ্রাস করতে এবং আপনার অ্যাপ্লিকেশনটিতে মাল্টিডেক্সের প্রয়োজনীয়তা এড়াতে সহায়তা করতে পারে।
মাল্টিডেক্সের জন্য আপনার অ্যাপ্লিকেশনটি কনফিগার করুন
দ্রষ্টব্য: যদি আপনারminSdkVersion
21 বা ততোধিক সেট করা থাকে তবে মাল্টিডেক্স ডিফল্টরূপে সক্ষম করা হয় এবং আপনার মাল্টিডেক্স লাইব্রেরির প্রয়োজন হয় না। যদি আপনার minSdkVersion
20 বা তার চেয়ে কম সেট করা থাকে তবে আপনাকে অবশ্যই মাল্টিডেক্স লাইব্রেরি ব্যবহার করতে হবে এবং আপনার অ্যাপ্লিকেশন প্রকল্পে নিম্নলিখিত পরিবর্তনগুলি করতে হবে:
মাল্টিডেক্স সক্ষম করতে মডিউল-স্তরের
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") }
- আপনি
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
প্রসারিত করতে পরিবর্তন করুন:কোটলিন
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); } }
সতর্কতা: মাল্টিডেক্স.ইনস্টল () বা JNI এর মাধ্যমে
MultiDex.install()
সম্পূর্ণ হওয়ার আগেMultiDex.install()
বা অন্য কোনও কোড কার্যকর করবেন না। মাল্টিডেক্স ট্রেসিং সেই কলগুলি অনুসরণ করবে না, ডেক্স ফাইলগুলির মধ্যে খারাপ শ্রেণি বিভাজনের কারণেClassNotFoundException
বা ত্রুটিগুলি যাচাই করবে।
এখন আপনি যখন আপনার অ্যাপ্লিকেশনটি তৈরি করেন, অ্যান্ড্রয়েড বিল্ড সরঞ্জামগুলি একটি প্রাথমিক ডেক্স ফাইল ( classes.dex
) তৈরি করে এবং ডেক্স ফাইলগুলি ( classes2.dex
, classes3.dex
, এবং আরও কিছু) সমর্থন করে। বিল্ড সিস্টেমটি তখন আপনার এপিকে সমস্ত ডেক্স ফাইল প্যাকেজ করে।
রানটাইমে, কেবলমাত্র প্রধান classes.dex
অনুসন্ধানের পরিবর্তে, ডেক্স ফাইলে, মাল্টিডেক্স এপিআইগুলি আপনার পদ্ধতির জন্য উপলব্ধ সমস্ত ডেক্স ফাইল অনুসন্ধান করতে একটি বিশেষ শ্রেণীর লোডার ব্যবহার করে।
মাল্টিডেক্স লাইব্রেরির সীমাবদ্ধতা
মাল্টিডেক্স লাইব্রেরিতে কিছু জ্ঞাত সীমাবদ্ধতা রয়েছে। আপনি যখন আপনার অ্যাপ্লিকেশন বিল্ড কনফিগারেশনে গ্রন্থাগারটি অন্তর্ভুক্ত করেন, নিম্নলিখিতগুলি বিবেচনা করুন:
- কোনও ডিভাইসের ডেটা পার্টিশনে স্টার্টআপের সময় ডেক্স ফাইলগুলি ইনস্টল করা জটিল এবং মাধ্যমিক ডেক্স ফাইলগুলি বড় হলে প্রয়োগের ফলে (এএনআর) ত্রুটিগুলি প্রতিক্রিয়া না দেওয়ার ফলস্বরূপ হতে পারে। এই সমস্যাটি এড়াতে, ডেক্স ফাইলগুলির আকার হ্রাস করতে এবং কোডের অব্যবহৃত অংশগুলি অপসারণ করতে কোড সঙ্কুচিত সক্ষম করুন ।
- অ্যান্ড্রয়েড 5.0 (এপিআই স্তর 21) এর পূর্বে সংস্করণগুলিতে চালানোর সময়, মাল্টিডেক্স ব্যবহার করা লিনিয়ারালোক সীমা ( ইস্যু 37008143 ) এর চারপাশে কাজ করার জন্য যথেষ্ট নয়। এই সীমাটি অ্যান্ড্রয়েড 4.0 (এপিআই স্তর 14) এ বৃদ্ধি করা হয়েছিল, তবে এটি সমস্যাটি পুরোপুরি সমাধান করেনি।
অ্যান্ড্রয়েড 4.0 এর চেয়ে কম সংস্করণগুলিতে, আপনি ডেক্স সূচক সীমাতে পৌঁছানোর আগে লিনিয়ারালোক সীমাতে পৌঁছতে পারেন। সুতরাং আপনি যদি 14 এর চেয়ে কম এপিআই স্তরকে লক্ষ্য করে থাকেন তবে প্ল্যাটফর্মের সেই সংস্করণগুলিতে পুরোপুরি পরীক্ষা করুন, কারণ আপনার অ্যাপ্লিকেশনটিতে স্টার্টআপে সমস্যা থাকতে পারে বা যখন শ্রেণীর নির্দিষ্ট গোষ্ঠীগুলি লোড করা হয়।
কোড সঙ্কুচিত হওয়া এই সমস্যাগুলি হ্রাস বা সম্ভবত অপসারণ করতে পারে।
প্রাথমিক ডেক্স ফাইলে প্রয়োজনীয় ক্লাসগুলি ঘোষণা করুন
একটি মাল্টিডেক্স অ্যাপের জন্য প্রতিটি ডেক্স ফাইল তৈরি করার সময়, প্রাথমিক ডেক্স ফাইলে কোন শ্রেণীর প্রয়োজন হয় তা নির্ধারণের জন্য বিল্ড সরঞ্জামগুলি জটিল সিদ্ধান্ত গ্রহণ করে যাতে আপনার অ্যাপ্লিকেশনটি সফলভাবে শুরু করতে পারে। যদি স্টার্টআপের সময় প্রয়োজনীয় কোনও শ্রেণি প্রাথমিক ডেক্স ফাইলে সরবরাহ না করা হয়, তবে আপনার অ্যাপ্লিকেশনটি ত্রুটি java.lang.NoClassDefFoundError
দিয়ে ক্র্যাশ করে।
বিল্ড সরঞ্জামগুলি আপনার অ্যাপ্লিকেশন কোড থেকে সরাসরি অ্যাক্সেস করা কোডের জন্য কোড পাথগুলি স্বীকৃতি দেয়। যাইহোক, কোড পাথগুলি কম দৃশ্যমান হলে এই সমস্যাটি ঘটতে পারে, যেমন আপনি যখন ব্যবহার করেন এমন একটি লাইব্রেরিতে জটিল নির্ভরতা থাকে। উদাহরণস্বরূপ, কোডটি যদি নেটিভ কোড থেকে জাভা পদ্ধতিগুলির অন্তঃসত্ত্বা বা অনুরোধ ব্যবহার করে, তবে সেই ক্লাসগুলি প্রাথমিক ডেক্স ফাইলে প্রয়োজনীয় হিসাবে স্বীকৃত হতে পারে না।
আপনি যদি java.lang.NoClassDefFoundError
পান তবে আপনার বিল্ড টাইপের multiDexKeepProguard
সম্পত্তি দিয়ে তাদের ঘোষণা করে প্রাথমিক ডেক্স ফাইলে প্রয়োজনীয় অতিরিক্ত ক্লাসগুলি ম্যানুয়ালি নির্দিষ্ট করতে হবে। যদি কোনও শ্রেণি multiDexKeepProguard
ফাইলে মিলে যায় তবে সেই শ্রেণিটি প্রাথমিক ডেক্স ফাইলে যুক্ত করা হয়।
মাল্টিডেক্স্কিপপ্রোগুয়ার্ড সম্পত্তি
multiDexKeepProguard
ফাইলটি প্রোগুয়ার্ডের মতো একই ফর্ম্যাটটি ব্যবহার করে এবং পুরো প্রোগুয়ার্ড ব্যাকরণকে সমর্থন করে। আপনার অ্যাপ্লিকেশনটিতে কী রাখা হয়েছে তা কীভাবে কাস্টমাইজ করবেন সে সম্পর্কে আরও তথ্যের জন্য, কোন কোডটি রাখা উচিত তা কাস্টমাইজ করুন ।
আপনি multiDexKeepProguard
যে ফাইলটি নির্দিষ্ট করেছেন তাতে কোনও বৈধ প্রোগুয়ার্ড সিনট্যাক্সে -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") ... } } }
উন্নয়ন বিল্ডগুলিতে মাল্টিডেক্স অপ্টিমাইজ করুন
একটি মাল্টিডেক্স কনফিগারেশনের জন্য বিল্ড প্রসেসিংয়ের সময় উল্লেখযোগ্যভাবে বৃদ্ধি করা দরকার কারণ বিল্ড সিস্টেমটি অবশ্যই প্রাথমিক ডেক্স ফাইলে কোন ক্লাসগুলি অন্তর্ভুক্ত করা উচিত এবং কোন ক্লাসগুলি মাধ্যমিক ডেক্স ফাইলগুলিতে অন্তর্ভুক্ত করা যেতে পারে সে সম্পর্কে জটিল সিদ্ধান্ত নিতে হবে। এর অর্থ হ'ল মাল্টিডেক্স ব্যবহার করে ইনক্রিমেন্টাল বিল্ডগুলি সাধারণত বেশি সময় নেয় এবং আপনার বিকাশের প্রক্রিয়াটি সম্ভাব্যভাবে ধীর করতে পারে।
দীর্ঘতর ইনক্রিমেন্টাল বিল্ড টাইমস হ্রাস করতে, বিল্ডগুলির মধ্যে মাল্টিডেক্স আউটপুট পুনরায় ব্যবহার করতে প্রাক-ডেক্সিং ব্যবহার করুন। প্রাক-ডেক্সিং কেবলমাত্র অ্যান্ড্রয়েড 5.0 (এপিআই স্তর 21) এবং উচ্চতর উপলভ্য একটি আর্ট ফর্ম্যাটের উপর নির্ভর করে। আপনি যদি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করছেন, আইডিই স্বয়ংক্রিয়ভাবে অ্যান্ড্রয়েড 5.0 (এপিআই স্তর 21) বা উচ্চতর চালিত কোনও ডিভাইসে আপনার অ্যাপটি স্থাপন করার সময় স্বয়ংক্রিয়ভাবে প্রি-ডেক্সিং ব্যবহার করে। তবে, আপনি যদি কমান্ড লাইন থেকে গ্রেডল বিল্ডগুলি চালাচ্ছেন তবে প্রাক-ডেক্সিং সক্ষম করতে আপনাকে 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") }
অ্যান্ড্রয়েড স্টুডিও বা কমান্ড লাইন থেকে বিল্ডিং গতি উন্নত করতে সহায়তা করার জন্য আরও কৌশলগুলি শিখতে, আপনার বিল্ড গতিটি অনুকূলিত করুন । বিল্ড ভেরিয়েন্টগুলি ব্যবহার সম্পর্কে আরও তথ্যের জন্য, বিল্ড ভেরিয়েন্টগুলি কনফিগার করুন ।
টিপ: আপনার যদি বিভিন্ন মাল্টিডেক্স প্রয়োজনের জন্য বিভিন্ন বিল্ড ভেরিয়েন্ট থাকে তবে আপনি প্রতিটি বৈকল্পিকের জন্য একটি আলাদা ম্যানিফেস্ট ফাইল সরবরাহ করতে পারেন তাই কেবলমাত্র এপিআই স্তর 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); ... }