R8-এর সাহায্যে Unreal Engine কোড সঙ্কুচিত ও অপ্টিমাইজ করুন

যদিও Unreal Engine-এ আপনার গেমের মূল লজিক C++ বা ব্লুপ্রিন্টে লেখা, Android প্যাকেজিং Java এবং Kotlin বাইটকোড (classes.dex) কম্পাইল করে যাতে GameActivity লাইফসাইকেল ইভেন্ট, Google Play পরিষেবা, বিলিং, অডিও এবং অ্যানালিটিক্স প্লাগ-ইন ম্যানেজ করা যায়।

Android Gradle প্লাগ-ইন (AGP)-এ ডিফল্ট কোড শ্রিঙ্কার ও অপ্টিমাইজার, R8, অব্যবহৃত ক্লাস ও পদ্ধতি সরিয়ে দেয় এবং বাইটকোড অপ্টিমাইজ করে। এটি শুধু আপনার প্যাকেজ ডাউনলোডের সাইজই কমায় না, বরং মেমরি-ম্যাপ করা (mmap) DEX পৃষ্ঠা এবং বেসলাইন জাভা প্রসেস ওভারহেডের রানটাইম মেমরি ফুটপ্রিন্টও কমায়, যার ফলে ফিজিক্যাল মেমরির উপর চাপ এবং লো মেমরি কিলার (LMK) টার্মিনেশন কমে যায়। এছাড়াও, Google Play আপনার গেমের DEX অপ্টিমাইজেশন লেভেল মনিটর করে Android Vitals-এ DEX কোড অপ্টিমাইজেশন মেট্রিকের মাধ্যমে।

ডিফল্ট অ্যাকশন এবং Unreal Engine ভার্সন সংক্রান্ত সহায়তা

UE 4.22.0 থেকে শুরু করে, Unreal Engine-এর UEDeployAndroid.cs ডিফল্ট হিসেবে minifyEnabled true-কে জেনারেট করা Android রিলিজ বিল্ড কনফিগারেশনে (buildAdditions.gradle) ইনজেক্ট করে। UE 4.25 বান্ডেল করা টুলচেনকে AGP 4.0.0-এ আপগ্রেড করেছে, তাই UE 4.25 এবং তার পরবর্তী ভার্সনের সব রিলিজ (শিপিং এবং ডিস্ট্রিবিউশন) বিল্ডে অতিরিক্ত সেট-আপ ছাড়াই R8 ডিফল্ট হিসেবে চালু করা আছে (true)।

Unreal Engine ভার্সন বান্ডেল করা AGP ডিফল্ট রিলিজ করুন ডিফল্ট ডিবাগ করুন আচরণ
UE 4.21 এবং তার আগের ভার্সন পুরনো Gradle বা Ant বন্ধ করা হয়েছে (false) বন্ধ করা হয়েছে (false) ইঞ্জিন কোনও minifyEnabled কনফিগারেশন ইনজেক্ট করেনি।
UE 4.22 থেকে 4.24 ৩.৪-এর আগের ভার্সন চালু করা আছে (ProGuard) বন্ধ করা হয়েছে (false) রিলিজ বিল্ডে (ProGuard রান করে) ডিফল্ট হিসেবে minifyEnabled true চালু করা আছে।
UE 4.25 থেকে 5.3 4.0.0 চালু করা হয়েছে (R8) বন্ধ করা হয়েছে (false) AGP 4.0 অ্যাডপশন রিলিজ বিল্ডে ডিফল্ট হিসেবে R8 রান করে।
UE 5.4 থেকে 5.7 ৭.৪.২ চালু করা হয়েছে (R8) বন্ধ করা হয়েছে (false) AGP 7.x পুরনো useProguard বিকল্প সরিয়ে দেয়; R8 এক্সক্লুসিভভাবে রান করে।
UE 5.8 (5.8.3+) 8.13.0 চালু করা হয়েছে (R8) বন্ধ করা হয়েছে (false) ডিফল্ট হিসেবে AGP 8.x এবং আধুনিক R8 অপ্টিমাইজেশন পাইপলাইন ব্যবহার করে।

রিলিজ ও ডিবাগ বিল্ডের মধ্যে পার্থক্য

UnrealBuildTool (UEDeployAndroid.cs) তৈরি করা buildAdditions.gradle ফাইলকে রিলিজ ও ডিবাগ বিল্ডের জন্য আলাদাভাবে কনফিগার করে:

buildTypes {
    release {
        signingConfig signingConfigs.release
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        debuggable true
        signingConfig signingConfigs.debug
    }
}
  • রিলিজ (শিপিং বা ডিস্ট্রিবিউশন): ডিফল্ট হিসেবে minifyEnabled true সেট করে এবং proguard-rules.pro প্রয়োগ করে, R8 কোড সঙ্কোচন এবং অবফাসকেশন রান করে।
  • ডিবাগ (ডেভেলপমেন্ট): debuggable true চালু করে এবং minifyEnabled বাদ দেয় (false-এ ডিফল্ট করে) যাতে দ্রুত বিল্ড ইটারেশন ও সিম্বল ডিবাগিং বজায় রাখা যায়।

Unreal প্লাগ-ইন ল্যাঙ্গুয়েজ (UPL) ব্যবহার করে 'রাখুন' নিয়ম যোগ করুন

UE 4.25 এবং তার পরবর্তী ভার্সনে রিলিজ বিল্ডে R8 অটোমেটিক রান করে, তাই আপনাকে শুধুমাত্র C++ JNI (JNIEnv->FindClass, GetMethodID) বা ম্যানিফেস্টের মাধ্যমে অ্যাক্সেস করা জাভা ক্লাসগুলি প্রিজার্ভ করতে হবে। Java কল সাইট ছাড়া ক্লাসগুলিকে অব্যবহৃত হিসেবে বিবেচনা করা হয় এবং R8 দ্বারা স্ট্রিপ করা হয়, যার ফলে ডেভেলপমেন্ট বিল্ডে কাজ করে এমন ফিচারগুলি শিপিং বিল্ডে ClassNotFoundException বা NoSuchMethodError-এর সাথে ব্যর্থ হতে পারে।

প্যাকেজিংয়ের সময় proguard-rules.pro-এ কাস্টম রাখার নিয়ম মার্জ করতে Unreal প্লাগ-ইন ল্যাঙ্গুয়েজ (UPL) XML ফাইলে <proguardAdditions> ট্যাগ ব্যবহার করুন। আপনার প্রোজেক্ট বা প্লাগ-ইন *_UPL.xml ফাইলে নিম্নলিখিত ব্লক যোগ করুন:

<root xmlns:android="http://schemas.android.com/apk/res/android">
    <proguardAdditions>
        <insert>
            -keep class com.epicgames.unreal.** { *; }
            -keep class com.example.plugin.** { public *; }
            -dontwarn com.example.plugin.**
        </insert>
    </proguardAdditions>
</root>

সাধারণ সমস্যার সমাধান করুন

Unreal Engine-এ R8 ব্যবহার করার সময় প্যাকেজিং ও রানটাইম সংক্রান্ত সাধারণ সমস্যার সমাধান কীভাবে করবেন, এই বিভাগে তা বর্ণনা করা হয়েছে।

ডিবাগ করার জন্য সাময়িকভাবে R8 বন্ধ করুন

শুধুমাত্র রিলিজের সময় ক্র্যাশ হওয়ার কারণ R8-এর প্রয়োজনীয় ক্লাস বাদ দেওয়া কিনা তা আলাদা করে দেখতে, আপনার UPL ফাইলের <gradleProperties>-এর নিচে DISABLE_MINIFY=1 যোগ করুন। উপস্থিত থাকলে, UEDeployAndroid.cs minifyEnabled false জেনারেট করে:

<gradleProperties>
    <insert>
        DISABLE_MINIFY=1
    </insert>
</gradleProperties>

প্যাকেজিং সংক্রান্ত Missing classes detected while running R8টি সমস্যা

UE 5.4 এবং তার পরবর্তী ভার্সনে (AGP 7.4.2+), R8 কঠোরভাবে মিসিং-ক্লাস চেক এনফোর্স করে। এই সমস্যার কারণে প্যাকেজিং ব্যর্থ হলে, আপনার ইন্টারমিডিয়েট বিল্ড ডিরেক্টরিতে (Intermediate/Android/.../gradle/app/build/outputs/mapping/release/missing_rules.txt-এর অধীনে) missing_rules.txt পরীক্ষা করুন এবং আপনার UPL ফাইলের <proguardAdditions>-এ অনুপস্থিত লাইব্রেরি ডিপেন্ডেন্সি বা প্রয়োজনীয় নিয়ম যোগ করুন।

থার্ড-পার্টি SDK-এর সাথে R8 ফুল মোডের কম্প্যাটিবিলিটি

UE 5.8 এবং তার পরবর্তী ভার্সনে (AGP 8.13.0+), আরও বেশি অপ্টিমাইজেশন করার জন্য R8 ফুল মোড ডিফল্ট হিসেবে চালু করা থাকে। রিফ্লেকশন সংক্রান্ত সমস্যার কারণে রানটাইমে কোনও লিগ্যাসি থার্ড-পার্টি Android SDK কাজ না করলে, প্লাগ-ইনের ProGuard নিয়ম আপডেট করুন অথবা আপনার UPL ফাইলে নিম্নলিখিত প্রপার্টি যোগ করে R8-কে কম্প্যাটিবিলিটি মোডে ফিরিয়ে আনুন:

<gradleProperties>
    <insert>
        android.enableR8.fullMode=false
    </insert>
</gradleProperties>