যদিও আপনার টার্গেট করা সব ডিভাইসের জন্য একটিই APK তৈরি করা ভালো, তবে যখনই সম্ভব, একাধিক অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABIs) কাজ করে এমন ফাইলের কারণে খুব বড় APK তৈরি হতে পারে। আপনার APK-র সাইজ কমানোর একটি উপায় হল, নির্দিষ্ট ABI-এর জন্য ফাইল সহ একাধিক APK তৈরি করা।
Gradle আলাদা APK তৈরি করতে পারে যাতে প্রতিটি ABI-এর জন্য নির্দিষ্ট কোড এবং রিসোর্স থাকে। এই পৃষ্ঠায় একাধিক APK তৈরি করার জন্য আপনার বিল্ড কীভাবে কনফিগার করবেন তা বর্ণনা করা হয়েছে। ABI-এর উপর ভিত্তি করে নয় এমন আপনার অ্যাপের বিভিন্ন ভার্সন তৈরি করতে হলে, পরিবর্তে বিল্ড ভ্যারিয়েন্ট ব্যবহার করুন।
একাধিক APK-এর জন্য আপনার বিল্ড কনফিগার করুন
একাধিক APK-র জন্য আপনার বিল্ড কনফিগার করতে, আপনার মডিউল-লেভেল build.gradle ফাইলে একটি splits ব্লক যোগ করুন। splits ব্লকের মধ্যে, একটি abi
ব্লক প্রদান করুন যা নির্দিষ্ট করে যে আপনি কীভাবে Gradle-কে প্রতি-ABI APK তৈরি করতে চান।
ABI-এর জন্য একাধিক APK কনফিগার করা
বিভিন্ন ABI-এর জন্য আলাদা APK তৈরি করতে, আপনার splits ব্লকের মধ্যে একটি abi ব্লক যোগ করুন। আপনার abi ব্লকে, আপনার বেছে নেওয়া ABI-এর তালিকা প্রদান করুন।
প্রতি ABI-তে একাধিক APK কনফিগার করতে নিম্নলিখিত Gradle DSL বিকল্প ব্যবহার করা হয়:
- Groovy-এর জন্য
enableঅথবা Kotlin স্ক্রিপ্টের জন্যisEnable - আপনি এই এলিমেন্ট
true-এ সেট করলে, আপনার উল্লেখ করা ABI-এর উপর ভিত্তি করে Gradle একাধিক APK তৈরি করে। ডিফল্ট ভ্যালু হলfalse। exclude- কমা দিয়ে আলাদা করা ABI-এর তালিকা উল্লেখ করে যার জন্য আপনি চান না যে Gradle
আলাদা APK তৈরি করুক। আপনি যদি বেশিরভাগ ABI-এর জন্য APK জেনারেট করতে চান, কিন্তু আপনার অ্যাপে কাজ করে না এমন কিছু ABI বাদ দিতে চান, তাহলে
excludeব্যবহার করুন। reset()ABI-এর ডিফল্ট তালিকা মুছে দেয়। আপনি যে ABI যোগ করতে চান তা নির্দিষ্ট করতে শুধুমাত্র
includeএলিমেন্টের সাথে ব্যবহার করুন।নিম্নলিখিত স্নিপেটটি তালিকাটি সাফ করার জন্য
reset()কল করে এবং তারপরেincludeব্যবহার করে ABI-এর তালিকাটি শুধুমাত্রx86এবংx86_64-এ সেট করে:reset() // Clears the default list from all ABIs to no ABIs. include "x86", "x86_64" // Specifies the two ABIs we want to generate APKs for.includeআপনি Gradle-এর মাধ্যমে যে ABI-এর জন্য APK তৈরি করতে চান, তার কমা দিয়ে আলাদা করা তালিকা উল্লেখ করে। ABI-এর সঠিক তালিকা নির্দিষ্ট করতে শুধুমাত্র
reset()-এর সাথে ব্যবহার করুন।- Groovy-এর জন্য
universalApkঅথবা Kotlin স্ক্রিপ্টের জন্যisUniversalApk trueহলে, Gradle প্রতিটি ABI APK-এর পাশাপাশি একটি ইউনিভার্সাল APK তৈরি করে। ইউনিভার্সাল APK-তে একটি APK-এর মধ্যে সব ABI-এর জন্য কোড ও রিসোর্স থাকে। ডিফল্ট ভ্যালু হলfalse।
নিম্নলিখিত উদাহরণে প্রতিটি ABI-এর জন্য আলাদা APK তৈরি করা হয়: x86 এবং x86_64।
এটি করার জন্য reset() ব্যবহার করে ABI-এর খালি তালিকা দিয়ে শুরু করতে হবে, তারপরে
include ব্যবহার করে ABI-এর তালিকা দিতে হবে, যার প্রত্যেকটি একটি করে APK পাবে।
গ্ৰুভি
android { ... splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. enable true // By default all ABIs are included, so use reset() and include to specify that you only // want APKs for x86 and x86_64. // Resets the list of ABIs for Gradle to create APKs for to none. reset() // Specifies a list of ABIs for Gradle to create APKs for. include "x86", "x86_64" // Specifies that you don't want to also generate a universal APK that includes all ABIs. universalApk false } } }
Kotlin
android { ... splits { // Configures multiple APKs based on ABI. abi { // Enables building multiple APKs per ABI. isEnable = true // By default all ABIs are included, so use reset() and include to specify that you only // want APKs for x86 and x86_64. // Resets the list of ABIs for Gradle to create APKs for to none. reset() // Specifies a list of ABIs for Gradle to create APKs for. include("x86", "x86_64") // Specifies that you don't want to also generate a universal APK that includes all ABIs. isUniversalApk = false } } }
কাজ করে এমন ABI-এর তালিকা দেখতে, কাজ করে এমন ABI দেখুন।
নেটিভ/C++ কোড ছাড়া প্রোজেক্ট
নেটিভ/C++ কোড ছাড়া প্রোজেক্টের জন্য, বিল্ড ভেরিয়েন্ট প্যানেলে দুটি কলাম আছে: মডিউল এবং অ্যাক্টিভ বিল্ড ভেরিয়েন্ট, যেমনটি চিত্র ১-এ দেখানো হয়েছে।
মডিউলের জন্য অ্যাক্টিভ বিল্ড ভেরিয়েন্ট ভ্যালু বিল্ড ভেরিয়েন্ট নির্ধারণ করে যা এডিটরে ডিপ্লয় করা হয় এবং দেখা যায়। ভেরিয়েন্টের মধ্যে পরিবর্তন করতে, কোনও মডিউলের জন্য অ্যাক্টিভ বিল্ড ভেরিয়েন্ট সেলে ক্লিক করুন এবং তালিকা ফিল্ড থেকে আপনার বেছে নেওয়া ভেরিয়েন্ট বেছে নিন।
নেটিভ/C++ কোড সহ প্রোজেক্ট
নেটিভ/C++ কোড সহ প্রোজেক্টের জন্য, বিল্ড ভেরিয়েন্ট প্যানেলে তিনটি কলাম আছে: মডিউল, অ্যাক্টিভ বিল্ড ভেরিয়েন্ট এবং অ্যাক্টিভ ABI, যেমন ছবি ২-এ দেখানো হয়েছে।
মডিউলের জন্য অ্যাক্টিভ বিল্ড ভেরিয়েন্ট ভ্যালু বিল্ড ভেরিয়েন্ট নির্ধারণ করে যা ডিপ্লয় করা হয় এবং এডিটরে দেখা যায়। নেটিভ মডিউলের ক্ষেত্রে, অ্যাক্টিভ ABI ভ্যালু এডিটরের ব্যবহার করা ABI নির্ধারণ করে, তবে যা ডেপ্লয় করা হয়েছে তার উপর কোনও প্রভাব ফেলে না।
বিল্ডের ধরন বা ABI পরিবর্তন করতে:
- অ্যাক্টিভ বিল্ড ভেরিয়েন্ট বা অ্যাক্টিভ ABI কলামের সেলে ক্লিক করুন।
- তালিকা ফিল্ড থেকে আপনার বেছে নেওয়া ভেরিয়েন্ট বা ABI বেছে নিন। নতুন সিঙ্ক অটোমেটিক রান করে।
অ্যাপ বা লাইব্রেরি মডিউলের জন্য যেকোনও কলাম পরিবর্তন করলে, সেই পরিবর্তন সব নির্ভরশীল সারিতে প্রযোজ্য হয়।
ভার্সনিং কনফিগার করুন
সাধারণত, Gradle একাধিক APK তৈরি করলে, প্রতিটি APK-তে একই ভার্সন সংক্রান্ত তথ্য থাকে, যেমন মডিউল-লেভেল build.gradle বা
build.gradle.kts ফাইলে উল্লেখ করা থাকে। যেহেতু Google Play Store একই অ্যাপের জন্য একাধিক APK-কে অনুমতি দেয় না, যেগুলির সবকটিতে একই ভার্সন সংক্রান্ত তথ্য থাকে, তাই আপনাকে নিশ্চিত করতে হবে যে Play Store-এ আপলোড করার আগে প্রতিটি APK-তে একটি অনন্য versionCode আছে।
প্রতিটি APK-এর জন্য versionCode ওভাররাইড করতে আপনি মডিউল-লেভেল build.gradle ফাইল কনফিগার করতে পারবেন। আপনি একাধিক APK কনফিগার করেন এমন প্রতিটি ABI-এর জন্য একটি অনন্য সংখ্যাসূচক মান নির্ধারণ করে এমন একটি ম্যাপিং তৈরি করে, আপনি আউটপুট সংস্করণ কোডটিকে এমন একটি মান দিয়ে ওভাররাইড করতে পারেন যা defaultConfig বা productFlavors ব্লকের মধ্যে সংজ্ঞায়িত সংস্করণ কোডটিকে ABI-তে নির্ধারিত সংখ্যাসূচক মানের সাথে একত্রিত করে।
নিচের উদাহরণে, x86 ABI-এর জন্য APK-এর versionCode হল ২০০৪
এবং x86_64 ABI-এর versionCode হল ৩০০৪।
ভার্সন কোড বড় সংখ্যায় অ্যাসাইন করলে, যেমন ১০০০, পরে আপনার অ্যাপ আপডেট করার প্রয়োজন হলে
অনন্য ভার্সন কোড অ্যাসাইন করতে পারবেন। যেমন, পরবর্তী আপডেটে
defaultConfig.versionCode ৫-এ ইটারেট করলে, Gradle x86 APK-তে ২০০৫-এর
versionCode এবং x86_64 APK-তে ৩০০৫ অ্যাসাইন করে।
গ্ৰুভি
android { ... defaultConfig { ... versionCode 4 } splits { ... } } // Map for the version code that gives each ABI a value. ext.abiCodes = ['armeabi-v7a':1, x86:2, x86_64:3] import com.android.build.OutputFile // For each APK output variant, override versionCode with a combination of // ext.abiCodes * 1000 + variant.versionCode. In this example, variant.versionCode // is equal to defaultConfig.versionCode. If you configure product flavors that // define their own versionCode, variant.versionCode uses that value instead. android.applicationVariants.all { variant -> // Assigns a different version code for each output APK // other than the universal APK. variant.outputs.each { output -> // Stores the value of ext.abiCodes that is associated with the ABI for this variant. def baseAbiVersionCode = // Determines the ABI for this variant and returns the mapped value. project.ext.abiCodes.get(output.getFilter(OutputFile.ABI)) // Because abiCodes.get() returns null for ABIs that are not mapped by ext.abiCodes, // the following code doesn't override the version code for universal APKs. // However, because you want universal APKs to have the lowest version code, // this outcome is desirable. if (baseAbiVersionCode != null) { // Assigns the new version code to versionCodeOverride, which changes the // version code for only the output APK, not for the variant itself. Skipping // this step causes Gradle to use the value of variant.versionCode for the APK. output.versionCodeOverride = baseAbiVersionCode * 1000 + variant.versionCode } } }
Kotlin
android { ... defaultConfig { ... versionCode = 4 } splits { ... } } // Map for the version code that gives each ABI a value. val abiCodes = mapOf("armeabi-v7a" to 1, "x86" to 2, "x86_64" to 3) import com.android.build.api.variant.FilterConfiguration.FilterType.* // For each APK output variant, override versionCode with a combination of // abiCodes * 1000 + variant.versionCode. In this example, variant.versionCode // is equal to defaultConfig.versionCode. If you configure product flavors that // define their own versionCode, variant.versionCode uses that value instead. androidComponents { onVariants { variant -> // Assigns a different version code for each output APK // other than the universal APK. variant.outputs.forEach { output -> val name = output.filters.find { it.filterType == ABI }?.identifier // Stores the value of abiCodes that is associated with the ABI for this variant. val baseAbiCode = abiCodes[name] // Because abiCodes.get() returns null for ABIs that are not mapped by ext.abiCodes, // the following code doesn't override the version code for universal APKs. // However, because you want universal APKs to have the lowest version code, // this outcome is desirable. if (baseAbiCode != null) { // Assigns the new version code to output.versionCode, which changes the version code // for only the output APK, not for the variant itself. output.versionCode.set(baseAbiCode * 1000 + (output.versionCode.get() ?: 0)) } } } }
বিকল্প ভার্সন কোড স্কিমের আরও উদাহরণের জন্য, ভার্সন কোড অ্যাসাইন করা দেখুন।
একাধিক APK তৈরি করা
একাধিক APK তৈরি করতে আপনার মডিউল-লেভেল build.gradle বা build.gradle.kts ফাইল কনফিগার করার পরে,
প্রোজেক্ট প্যানে বর্তমানে বেছে নেওয়া মডিউলের জন্য সব APK তৈরি করতে, তৈরি করুন > APK তৈরি করুন বিকল্পে ক্লিক করুন। Gradle প্রোজেক্টের build/outputs/apk/ ডিরেক্টরিতে
প্রতিটি ABI-এর জন্য APK তৈরি করে।
আপনি একাধিক APK-এর জন্য কনফিগার করেন এমন প্রতিটি ABI-এর জন্য Gradle একটি APK তৈরি করে।
যেমন, নিম্নলিখিত build.gradle স্নিপেট x86 এবং x86_64 ABI-এর জন্য একাধিক APK তৈরি করার সুবিধা দেয়:
গ্ৰুভি
... splits { abi { enable true reset() include "x86", "x86_64" } }
Kotlin
... splits { abi { isEnable = true reset() include("x86", "x86_64") } }
উদাহরণ কনফিগারেশন থেকে আউটপুটে নিম্নলিখিত ৪টি APK অন্তর্ভুক্ত থাকে:
app-X86-release.apk:x86ABI-এর জন্য কোড ও রিসোর্স রয়েছে।app-X86_64-release.apk:x86_64ABI-এর জন্য কোড ও রিসোর্স রয়েছে।
ABI-এর উপর ভিত্তি করে একাধিক APK তৈরি করার সময়, Gradle শুধুমাত্র এমন একটি APK তৈরি করে
যেটিতে সব ABI-এর জন্য কোড ও রিসোর্স অন্তর্ভুক্ত থাকে, যদি আপনি আপনার build.gradle ফাইলে (Groovy-এর জন্য)
splits.abi ব্লকে universalApk true নির্দিষ্ট করেন অথবা
আপনার build.gradle.kts ফাইলে (Kotlin স্ক্রিপ্টের জন্য) splits.abi ব্লকে
isUniversalApk = true নির্দিষ্ট করেন।
APK ফাইলের নামের ফর্ম্যাট
একাধিক APK তৈরি করার সময়, Gradle নিম্নলিখিত স্কিম ব্যবহার করে APK ফাইলের নাম তৈরি করে:
modulename-ABI-buildvariant.apk
স্কিমের কম্পোনেন্টগুলি হল:
modulename- তৈরি করা হচ্ছে এমন মডিউলের নাম নির্দিষ্ট করে।
ABI- ABI-এর জন্য একাধিক APK চালু করা থাকলে, APK-এর জন্য ABI নির্দিষ্ট করে, যেমন
x86। buildvariant- তৈরি করা হচ্ছে এমন বিল্ড ভেরিয়েন্ট নির্দিষ্ট করে, যেমন
debug।