Unity-তে আপনার গেমের মূল লজিক C#-এ (IL2CPP-এর মাধ্যমে কম্পাইল করা) লেখা হলেও,
Android বিল্ডে যথেষ্ট পরিমাণে Java এবং Kotlin বাইটকোড (classes.dex) থাকে, যা
UnityPlayerActivity লাইফসাইকেল ইভেন্ট, Google Play পরিষেবা, বিলিং, বিজ্ঞাপন এবং সোশ্যাল SDK ম্যানেজ করে।
Android Gradle প্লাগ-ইন (AGP)-এ ডিফল্ট কোড শ্রিঙ্কার ও অপ্টিমাইজার R8 চালু করলে,
অব্যবহৃত ক্লাস ও পদ্ধতি সরিয়ে দেয় এবং বাইটকোড অপ্টিমাইজ করে। এটি
শুধু আপনার অ্যাপ ডাউনলোডের সাইজই কমায় না, তার সাথে মেমরি-ম্যাপ করা (mmap) DEX পৃষ্ঠা ও বেসলাইন Java প্রসেস
ওভারহেডের রানটাইম মেমরি ফুটপ্রিন্টও কমায়, যার ফলে ফিজিক্যাল মেমরির উপর চাপ ও লো মেমরি কিলার (LMK)
টার্মিনেশন কমে যায়। এছাড়াও, Google Play আপনার গেমের DEX অপ্টিমাইজেশন লেভেল মনিটর করে
Android Vitals-এ DEX কোড অপ্টিমাইজেশন মেট্রিকের মাধ্যমে।
ডিফল্ট অ্যাকশন ও Unity ভার্সন সংক্রান্ত সহায়তা
Unity-তে, নতুন প্রোজেক্ট তৈরি করার সময় রিলিজ ও ডিবাগ বিল্ড, উভয়ের জন্যই কোড ছোট করার সুবিধা ডিফল্ট হিসেবে বন্ধ করা থাকে (false)।
Unity প্রথমবার Unity 2020.1.0f1-এ ঐচ্ছিক টগল হিসেবে R8 নিয়ে আসে। Unity 2022.2.0f1 (এবং Unity 2021.3.41f1 LTS-এ ব্যাকপোর্ট করা হয়েছে) থেকে শুরু করে, Unity তার বান্ডেল করা টুলচেন AGP 7.1.2+ ভার্সনে আপগ্রেড করেছে, পুরনো ProGuard সহায়তা সরিয়ে দিয়েছে এবং মিনিফিকেশন চালু থাকলে একচেটিয়াভাবে R8 রান করে।
| Unity ভার্সন | বান্ডেল করা AGP | ডিফল্ট রিলিজ করুন | R8 সাপোর্ট ও প্রয়োজনীয় কনফিগারেশন |
|---|---|---|---|
| 2019.4 LTS এবং তার আগের ভার্সন | ৩.৪-এর আগের ভার্সন | বন্ধ করা হয়েছে (false) |
কাজ করে না (শুধুমাত্র লিগ্যাসি ProGuard)। |
| 2020.1.0f1 থেকে 2021.3.40f1 | ৩.৪ থেকে ৪.০ | বন্ধ করা হয়েছে (false) |
ঐচ্ছিক (ডিফল্ট হিসেবে ProGuard-এ সেট করা থাকে)। ছোট করুন > রিলিজ এবং R8 ব্যবহার করুন, দুটিই চালু করুন। |
| 2021.3.41f1 এবং তার পরবর্তী ভার্সন (2021 LTS) | ৭.১+ | বন্ধ করা হয়েছে (false) |
শুধুমাত্র R8। R8 অটোমেটিক রান করতে মিনিফাই করুন > রিলিজ করুন বিকল্প চালু করুন। |
| 2022.2.0f1 থেকে Unity 6+ | 7.1 থেকে 8.x | বন্ধ করা হয়েছে (false) |
শুধুমাত্র R8। R8 অটোমেটিক রান করতে মিনিফাই করুন > রিলিজ করুন বিকল্প চালু করুন। |
প্লেয়ার সেটিংসে R8 চালু করুন
রিলিজ বিল্ডের জন্য R8 কোড শ্রিঙ্কিং ও অপ্টিমাইজেশন চালু করতে:
- Unity Editor-এ, এডিট করুন > প্রোজেক্ট সেটিংস খুলুন এবং প্লেয়ার বেছে নিন।
- Android ট্যাব বেছে নিন এবং প্রকাশনা সেটিংস > বিল্ড বিকল্প বড় করুন।
- মিনিফাই বিভাগের মধ্যে, আপনার Unity ভার্সনের জন্য বিকল্প কনফিগার করুন:
- Unity 2021.3.41f1+ এবং 2022.2.0f1+: রিলিজ বেছে নিন।
minifyReleaseWithR8Gradle টাস্ক চলাকালীন Unity অটোমেটিক R8 রান করে। - Unity 2020.1.0f1 থেকে 2021.3.40f1: রিলিজ এবং R8 ব্যবহার করুন দুটি বিকল্পই বেছে নিন।
- Unity 2021.3.41f1+ এবং 2022.2.0f1+: রিলিজ বেছে নিন।
আপনি যদি C# এডিটর স্ক্রিপ্ট ব্যবহার করে বিল্ড অটোমেট করেন, তাহলে PlayerSettings.Android-এর মাধ্যমে
এইসব প্রপার্টি কনফিগার করুন:
using UnityEditor;
public static class AndroidBuildConfig
{
public static void EnableR8ForRelease()
{
PlayerSettings.Android.minifyRelease = true;
// Required only in Unity 2020.1.0f1 to 2021.3.40f1 and 2022.1 or earlier
// (In Unity 2021.3.41f1+ and 2022.2+, R8 is always used when minification is enabled)
#if !UNITY_2022_2_OR_NEWER
PlayerSettings.Android.minifyWithR8 = true;
#endif
}
}
JNI এবং রিফ্লেকশনের জন্য 'কিপ' নিয়ম যোগ করুন
AndroidJavaClass বা AndroidJavaObject ব্যবহার করে C# স্ক্রিপ্ট থেকে ডায়নামিকভাবে কল করা জাভা ক্লাস ও মেথডের
কোনও স্ট্যাটিক জাভা কল সাইট
নেই। স্পষ্টভাবে রাখার নিয়ম না থাকলে, R8 এইসব ক্লাসকে অব্যবহৃত হিসেবে বিবেচনা করতে পারে এবং
সেগুলি স্ট্রিপ বা রিনেম করতে পারে।
আপনার কাস্টম Java ব্রিজ সংরক্ষণ করতে:
- প্রোজেক্ট সেটিংস > প্লেয়ার > Android > প্রকাশনা সেটিংস > বিল্ড বিকল্পে গিয়ে, কাস্টম Proguard ফাইল চালু করুন।
- জেনারেট করা
Assets/Plugins/Android/proguard-user.txtফাইল খুলুন। - JNI-এর মাধ্যমে অ্যাক্সেস করা ক্লাস বা থার্ড-পার্টি প্লাগ-ইনের জন্য প্রয়োজনীয় ক্লাসের জন্য
-keepটি নিয়ম যোগ করুন:
# Keep custom Java classes invoked from C# using JNI bridges
-keep class com.example.yourgame.** { *; }
# Keep callback interfaces passed between C# and Java
-keep interface com.example.yourgame.IPluginCallback { *; }
সাধারণ সমস্যার সমাধান করুন
Unity-তে R8 ব্যবহার করার সময় সাধারণ বিল্ড ও রানটাইম সংক্রান্ত সমস্যা কীভাবে সমাধান করবেন তা এই বিভাগে বর্ণনা করা হয়েছে।
Missing classes detected while running R8টি বিল্ড সংক্রান্ত সমস্যা
AGP 7.0 এবং তার পরবর্তী ভার্সন (2021.3.41f1+ এবং 2022.2+) ব্যবহার করা Unity ভার্সনে, R8
মিসিং-ক্লাস সংক্রান্ত কঠোর চেক এনফোর্স করে। এই সমস্যার কারণে বিল্ড ব্যর্থ হলে, আপনার বিল্ড আউটপুট ডিরেক্টরিতে (Library/Bee/Android/Prj/.../build/outputs/mapping/release/missing_rules.txt বা
Temp/gradleOut/...-এর অধীনে) জেনারেট করা missing_rules.txt ফাইলটি
পরীক্ষা করুন এবং proguard-user.txt-এ প্রয়োজনীয় ডিপেন্ডেন্সি বা নিয়ম
যোগ করুন। কিপ রুল লেখার ব্যাপারে আরও তথ্যের জন্য, কোন কোড রাখতে হবে তা কাস্টমাইজ করুন দেখুন।
থার্ড-পার্টি প্লাগ-ইনের সাথে R8 ফুল মোড কম্প্যাটিবিলিটি
AGP 8.0 এবং তার পরবর্তী ভার্সনে (Unity 6+), আরও বেশি অপ্টিমাইজ করার জন্য R8 ফুল মোড ডিফল্ট হিসেবে চালু করা থাকে। রিফ্লেকশন সংক্রান্ত সমস্যার কারণে রানটাইমে কোনও লিগ্যাসি Android প্লাগ-ইন কাজ না করলে, প্লাগ-ইনের ProGuard নিয়ম আপডেট করুন অথবা R8-কে কম্প্যাটিবিলিটি মোডে ফিরিয়ে আনুন:
- প্রকাশনা সেটিংস > বিল্ড বিকল্পে গিয়ে কাস্টম Gradle প্রপার্টি টেমপ্লেট চালু করুন।
Assets/Plugins/Android/gradleTemplate.propertiesখুলে নিম্নলিখিত প্রপার্টি যোগ করুন:
android.enableR8.fullMode=false