R8 দিয়ে অ্যাপ অপ্টিমাইজেশন সক্ষম করুন

সর্বোত্তম ব্যবহারকারীর অভিজ্ঞতার জন্য, আপনার অ্যাপটিকে যথাসম্ভব ছোট এবং দ্রুত করার জন্য অপ্টিমাইজ করা উচিত। আমাদের অ্যাপ অপ্টিমাইজার, যার নাম R8, অব্যবহৃত কোড ও রিসোর্স অপসারণ করে, রানটাইম পারফরম্যান্স অপ্টিমাইজ করার জন্য কোড পুনর্লিখন করে এবং আরও অনেক কিছুর মাধ্যমে আপনার অ্যাপকে সুবিন্যস্ত করে। আপনার ব্যবহারকারীদের জন্য এর অর্থ হলো:

  • দ্রুততর স্টার্টআপ সময়
  • মেমরি ব্যবহার হ্রাস করা হয়েছে
  • উন্নত রেন্ডারিং এবং রানটাইম পারফরম্যান্স
  • কম ANR

R8 অপ্টিমাইজেশন ওভারভিউ

R8 আপনার অ্যাপের আকার ও গতি অপ্টিমাইজ করার জন্য একটি বহু-পর্যায়ের প্রক্রিয়া ব্যবহার করে। এর প্রধান কার্যক্রমগুলো হলো নিম্নরূপ:

  • কোড সঙ্কুচিতকরণ (যা ট্রি শেকিং নামেও পরিচিত) : R8 আপনার অ্যাপ্লিকেশন এবং এর লাইব্রেরি নির্ভরতা থেকে অ্যাক্সেস-অযোগ্য কোড শনাক্ত করে এবং অপসারণ করে। আপনার অ্যাপের এন্ট্রি পয়েন্টগুলো (যেমন ম্যানিফেস্টে সংজ্ঞায়িত Activities বা Services ) বিশ্লেষণ করে, R8 রেফারেন্সকৃত কোডের একটি গ্রাফ তৈরি করে এবং যা কিছু আনরেফারেন্সড থেকে যায়, তা সরিয়ে দেয়।

  • লজিক্যাল অপটিমাইজেশন : R8 আপনার কোডের কার্যকারিতা উন্নত করতে এবং ওভারহেড কমাতে কোড পুনর্লিখন করে। এর প্রধান কৌশলগুলোর মধ্যে রয়েছে:

    • মেথড ইনলাইনিং : R8 একটি মেথড কল সাইটকে কল করা মেথডটির প্রকৃত বডি দিয়ে প্রতিস্থাপন করে। এটি ফাংশন কলের অতিরিক্ত কাজ দূর করে এবং R8-কে আরও অপ্টিমাইজেশন করার সুযোগ দেয়।

    • ক্লাস একত্রীকরণ : R8 একাধিক ক্লাস এবং ইন্টারফেসকে একত্রিত করে একটি একক ক্লাসে পরিণত করে। এর ফলে অ্যাপে ক্লাসের সংখ্যা কমে যায়, মেমরির উপর চাপ হ্রাস পায় এবং স্টার্টআপের গতি বৃদ্ধি পায়।

  • অস্পষ্টকরণ (মিনিফিকেশন নামেও পরিচিত) : DEX ফাইলের আকার কমানোর জন্য, R8 ক্লাস, ফিল্ড এবং মেথডের নাম সংক্ষিপ্ত করে (উদাহরণস্বরূপ, com.example.MyActivity হয়ে যেতে পারে aba )।

অ্যান্ড্রয়েড গ্রেডল প্লাগইন (AGP)-এর 8.12.0 সংস্করণ থেকে, R8 তার অপ্টিমাইজেশন পর্যায়গুলির অংশ হিসাবে রিসোর্সও অপ্টিমাইজ করে। আরও তথ্যের জন্য, অপ্টিমাইজ করা রিসোর্স সঙ্কুচিতকরণ (Optimized resource shrinking ) দেখুন।

অপ্টিমাইজেশন সক্ষম করুন

আপনার অ্যাপের জন্য অ্যাপ অপটিমাইজেশন চালু করতে, আপনার প্রোজেক্টের AGP ভার্সনের উপর ভিত্তি করে উপযুক্ত DSL ব্যবহার করুন। আমরা সুপারিশ করি যে, অ্যাপ অপটিমাইজেশন শুধুমাত্র আপনার অ্যাপের চূড়ান্ত সংস্করণে চালু করুন, যা আপনি প্রকাশের আগে পরীক্ষা করেন—সাধারণত আপনার রিলিজ বিল্ড—কারণ অপটিমাইজেশন আপনার প্রোজেক্টের বিল্ড টাইম বাড়িয়ে দেয় এবং এটি যেভাবে কোড পরিবর্তন করে, তার কারণে ডিবাগিং আরও কঠিন করে তুলতে পারে।

AGP সংস্করণ 9.3 এবং তার উচ্চতর সংস্করণের জন্য

AGP 9.3 এবং উচ্চতর সংস্করণের জন্য অ্যাপ অপ্টিমাইজেশন সক্রিয় করতে:

  • আপনার রিলিজ বিল্ডের অ্যাপ-লেভেল বিল্ড স্ক্রিপ্টের optimization ব্লকে enable = true সেট করুন।
  • আপনার কিপ রুলগুলো src/<variant>/keepRules সোর্স সেটের অন্তর্গত .keep সাফিক্সযুক্ত একটি ফাইলে যোগ করুন। উদাহরণস্বরূপ, src/main/keepRules/custom-rules.keep

কোটলিন

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

গ্রুভি

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

AGP 9.3-এর চেয়ে নিম্ন সংস্করণগুলির জন্য লিগ্যাসি ডিএসএল

অ্যাপ অপ্টিমাইজেশন চালু করতে, আপনার রিলিজ বিল্ডের অ্যাপ-লেভেল বিল্ড স্ক্রিপ্টে isMinifyEnabled = true (কোড অপ্টিমাইজেশনের জন্য) এবং isShrinkResources = true (রিসোর্স অপ্টিমাইজেশনের জন্য) সেট করুন। আমরা সুপারিশ করি যে আপনি সর্বদা উভয় সেটিংই চালু রাখুন।

লিগ্যাসি ডিএসএল (কোটলিন)

android {
    buildTypes {
        release {

            // Enables code optimizations.
            isMinifyEnabled = true

            // Enables resource shrinking.
            isShrinkResources = true

            proguardFiles(
                // Default file with automatically generated optimization rules.
                getDefaultProguardFile("proguard-android-optimize.txt"),

                ...
            )
            ...
        }
    }
    ...
}

লিগ্যাসি ডিএসএল (গ্রুভি)

android {
    buildTypes {
        release {

            // Enables code optimizations.
            minifyEnabled = true

            // Enables resource shrinking.
            shrinkResources = true

            // Default file with automatically generated optimization rules.
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')

            ...
        }
    }
}

R8 অপ্টিমাইজেশন উন্নত করুন

R8-এর পারফরম্যান্সগত সুবিধাগুলো সরাসরি নির্ভর করে এটি আপনার কোডবেসের কতটা অপ্টিমাইজ করতে সক্ষম তার উপর। R8 থেকে সর্বাধিক সুবিধা পেতে, সেরা অনুশীলনগুলো অনুসরণ করুন:

কিপ রুলগুলোকে আরও পরিমার্জিত করতে, R8 কনফিগারেশন অ্যানালাইজার ব্যবহার করুন।

R8 কনফিগারেশন অ্যানালাইজার আপনাকে নিম্নলিখিত কাজগুলো করতে দেয়:

  • R8 কনফিগারেশন অ্যানালাইজার রিপোর্ট থেকে প্রাপ্ত মেট্রিকগুলো পর্যবেক্ষণ করে R8 কনফিগারেশনের সার্বিক মান ট্র্যাক করুন এবং উন্নত করুন।
  • সবচেয়ে বিস্তৃত রাখার নিয়মগুলো খুঁজুন - যেগুলো সর্বাধিক অপ্টিমাইজেশনকে বাধা দেয়।
  • এবং বুঝুন কোন অপ্টিমাইজেশনগুলো সেগুলোকে পরিমার্জন করতে বাধা দেয়।

R8 কনফিগারেশন অ্যানালাইজারটি AGP ভার্সন 9.3.0-alpha05 অথবা R8 ভার্সন 9.3.7-dev থেকে পাওয়া যায়। আরও তথ্যের জন্য, Analyze R8 configuration দেখুন।

আরও ছোট অ্যাপের জন্য রিসোর্স সঙ্কুচিত করার প্রক্রিয়াকে অপ্টিমাইজ করুন।

AGP-এর 8.12.0 সংস্করণে অপটিমাইজড রিসোর্স শ্রিংকিং চালু করা হয়েছে, যার লক্ষ্য হলো রিসোর্স এবং কোড অপটিমাইজেশনকে একীভূত করে আরও ছোট ও দ্রুততর অ্যাপ তৈরি করা। অপটিমাইজড রিসোর্স শ্রিংকিং-এর আগে, অ্যান্ড্রয়েড অ্যাসেট প্যাকেজিং টুল (AAPT2) এমন কিপ রুলস তৈরি করত যা কার্যকরভাবে রিসোর্স শ্রিংকিংকে কোড থেকে আলাদাভাবে বিবেচনা করত এবং প্রায়শই অ্যাক্সেস-অযোগ্য কোড বা একে অপরকে রেফারেন্স করা রিসোর্স রেখে দিত।

অপ্টিমাইজড রিসোর্স সঙ্কুচিতকরণের মাধ্যমে, রিসোর্সগুলোকে প্রোগ্রাম কোডের একটি অংশ হিসেবে বিবেচনা করা হয়, যা রেফারেন্স গ্রাফ গঠন করে। যখন কোড বা রিসোর্সের কোনো সংগ্রহ রেফারেন্স করা হয় না, তখন তা কোনো 'কিপ রুল' দ্বারা সুরক্ষিত থাকে না এবং মুছে ফেলা যেতে পারে।

অপ্টিমাইজড রিসোর্স সংকোচন সক্ষম করুন

AGP 8.12 বা 8.13-এর জন্য নতুন অপ্টিমাইজ করা রিসোর্স সঙ্কুচিত করার পাইপলাইনটি সক্রিয় করতে, আপনার প্রোজেক্টের gradle.properties ফাইলে নিম্নলিখিতটি যোগ করুন:

আপনি যদি AGP 9.0.0 বা এর চেয়ে নতুন কোনো সংস্করণ ব্যবহার করেন, তাহলে আপনার android.r8.optimizedResourceShrinking=true সেট করার প্রয়োজন নেই। আপনার বিল্ড কনফিগারেশনে isShrinkResources = true সক্রিয় করা থাকলে অপটিমাইজড রিসোর্স শ্রিংকিং স্বয়ংক্রিয়ভাবে প্রয়োগ হয়ে যায়।

R8 অপ্টিমাইজেশন সেটিংস যাচাই এবং কনফিগার করুন

R8-কে এর সম্পূর্ণ অপ্টিমাইজেশন ক্ষমতা ব্যবহার করতে সক্ষম করার জন্য, আপনার প্রোজেক্টের gradle.properties ফাইল থেকে নিম্নলিখিত লাইনটি মুছে ফেলুন, যদি এটি বিদ্যমান থাকে:

bash android.enableR8.fullMode=false # Remove this line from your codebase.

মনে রাখবেন যে, অ্যাপ অপ্টিমাইজেশন চালু করলে স্ট্যাক ট্রেস বোঝা কঠিন হয়ে পড়ে, বিশেষ করে যদি R8 ক্লাস বা মেথডের নাম পরিবর্তন করে। আপনার সোর্স কোডের সাথে সঠিকভাবে মেলে এমন স্ট্যাক ট্রেস পেতে, "মূল স্ট্যাক ট্রেস পুনরুদ্ধার করুন" দেখুন।

যদি R8 সক্রিয় করা থাকে, তাহলে আরও ভালো স্টার্টআপ পারফরম্যান্সের জন্য আপনার স্টার্টআপ প্রোফাইলও তৈরি করা উচিত।

আপনি যদি অ্যাপ অপ্টিমাইজেশন চালু করার পর এর ফলে কোনো ত্রুটি দেখা দেয়, তবে সেগুলো সমাধানের জন্য এখানে কিছু কৌশল দেওয়া হলো:

আপনি যদি আপনার বিল্ডের গতি বাড়াতে আগ্রহী হন, তাহলে আপনার পরিবেশ অনুযায়ী R8 কীভাবে কনফিগার করবেন সে সম্পর্কে তথ্যের জন্য ‘Configure how R8 runs’ দেখুন।

AGP এবং R8 সংস্করণের আচরণগত পরিবর্তন

নিম্নলিখিত সারণিতে অ্যান্ড্রয়েড গ্রেডল প্লাগইন (AGP) এবং R8 কম্পাইলারের বিভিন্ন সংস্করণে প্রবর্তিত প্রধান বৈশিষ্ট্যগুলো তুলে ধরা হয়েছে।

এজিপি সংস্করণ প্রবর্তিত বৈশিষ্ট্যসমূহ
৯.৩ সরলীকৃত ডিএসএল: নতুন `optimization {}` ব্লকের জন্য কম কনফিগারেশনের প্রয়োজন হয়—অপ্টিমাইজড রিসোর্স সঙ্কুচিতকরণ সর্বদা সক্রিয় থাকে, ডিফল্ট অ্যান্ড্রয়েড কিপ রুলগুলো অপ্ট-আউট করা যায়।

`keepRules` সোর্স সেট: আপনি যদি নতুন DSL ব্যবহার করেন, তাহলে আপনাকে অবশ্যই আপনার কিপ রুলগুলো src/<variant>/keepRules সোর্স সেটের মধ্যে .keep সাফিক্সযুক্ত ফাইলগুলোতে রাখতে হবে। এই সোর্স সেটগুলো লিগ্যাসি DSL-এর সাথেও সামঞ্জস্যপূর্ণ।

KMP (Kotlin MultiPlatform) কনজিউমার রুলস: KMP-তে এখন আর publish = true সেট করার প্রয়োজন নেই, এবং এটি .keep এক্সটেনশন সহ src/<variant>/keepRules সোর্স সেট সমর্থন করে।

উল্লেখ্য যে, লিগ্যাসি ডিএসএল এখনও সমর্থিত।
৯.১ ডিফল্টরূপে ক্লাসগুলো পুনঃপ্যাকেজ করা হয়: R8, DEX-কে আরও কম্প্যাক্ট করার জন্য ক্লাসগুলোকে পুনঃপ্যাকেজ করে (সেগুলোকে শীর্ষ স্তরে একটি নামবিহীন প্যাকেজে স্থানান্তর করে), যার ফলে -repackageclasses অপশনটি নির্দিষ্ট করার প্রয়োজন হয় না। এটি কীভাবে কাজ করে এবং কীভাবে এটি থেকে বিরত থাকা যায়, সে সম্পর্কে তথ্যের জন্য গ্লোবাল অপশনস দেখুন।
৯.০ অপ্টিমাইজড রিসোর্স সঙ্কুচিতকরণ: ডিফল্টরূপে সক্রিয় ( android.r8.optimizedResourceShrinking ব্যবহার করে নিয়ন্ত্রিত)। অপ্টিমাইজড রিসোর্স সঙ্কুচিতকরণ কোড অপ্টিমাইজেশন পাইপলাইনের সাথে রিসোর্স সঙ্কুচিতকরণকে একীভূত করতে সাহায্য করে, যার ফলে অ্যাপগুলো আরও ছোট এবং দ্রুততর হয়। একই সাথে কোড এবং রিসোর্স রেফারেন্স উভয়কে অপ্টিমাইজ করার মাধ্যমে, এটি শুধুমাত্র অব্যবহৃত কোড থেকে রেফারেন্সকৃত রিসোর্সগুলোকে শনাক্ত করে এবং সরিয়ে দেয়। এটি পূর্ববর্তী পৃথক অপ্টিমাইজেশন প্রক্রিয়াগুলোর তুলনায় একটি উল্লেখযোগ্য উন্নতি।

এটি বিশেষত সেইসব অ্যাপের জন্য উপযোগী, যেগুলো বিভিন্ন ফর্ম ফ্যাক্টর ভার্টিক্যালের মধ্যে উল্লেখযোগ্য পরিমাণে রিসোর্স এবং কোড শেয়ার করে, যার ফলে অ্যাপের আকারে ৫০%-এর বেশি পরিমাপযোগ্য উন্নতি ঘটে। এর ফলে ফাইলের আকার কমে যায়, ইনস্টলেশন দ্রুততর হয় এবং দ্রুত স্টার্টআপ, উন্নত রেন্ডারিং ও কম ANR-এর মাধ্যমে ব্যবহারকারীর অভিজ্ঞতা আরও ভালো হয়।

লাইব্রেরি রুল ফিল্টারিং: লাইব্রেরি কনজিউমার রুলে গ্লোবাল অপশন (যেমন, -dontobfuscate ) ব্যবহারের সুবিধা বন্ধ করে দেওয়া হয়েছে, এবং অ্যাপগুলো স্বয়ংক্রিয়ভাবে এগুলো ফিল্টার করে বাদ দেবে। আরও তথ্যের জন্য, ‘গ্লোবাল অপশন যোগ করুন’ দেখুন।

কোটলিন নাল চেক: ডিফল্টরূপে অপ্টিমাইজ করা (যা -processkotlinnullchecks ব্যবহার করে নিয়ন্ত্রণ করা হয়)। এই সংস্করণে বিল্ডের গতিতেও উল্লেখযোগ্য উন্নতি আনা হয়েছে। আরও তথ্যের জন্য, অতিরিক্ত অপ্টিমাইজেশনের জন্য গ্লোবাল অপশনগুলো দেখুন।

নির্দিষ্ট প্যাকেজ অপ্টিমাইজ করুন: আপনি নির্দিষ্ট প্যাকেজ অপ্টিমাইজ করার জন্য packageScope ব্যবহার করতে পারেন। এই ফিচারটি পরীক্ষামূলক পর্যায়ে রয়েছে। আরও তথ্যের জন্য, packageScope ব্যবহার করে নির্দিষ্ট প্যাকেজ অপ্টিমাইজ করুন দেখুন।

ডিফল্টরূপে অপ্টিমাইজ করা: getDefaultProguardFile("proguard-android.txt") এর জন্য সমর্থন বন্ধ করা হয়েছে, কারণ এতে -dontoptimize অন্তর্ভুক্ত রয়েছে, যা পরিহার করা উচিত। এর পরিবর্তে, "proguard-android-optimize.txt" ব্যবহার করুন। আপনার অ্যাপে বিশ্বব্যাপী অপ্টিমাইজেশন নিষ্ক্রিয় করার প্রয়োজন হলে, একটি proguard ফাইলে ম্যানুয়ালি ফ্ল্যাগটি যোগ করুন
৮.১২ অপ্টিমাইজড রিসোর্স সঙ্কুচিতকরণ: প্রাথমিক সমর্থন যোগ করা হয়েছে ( android.r8.optimizedResourceShrinking ব্যবহার করে নিয়ন্ত্রিত)। অপ্টিমাইজড রিসোর্স সঙ্কুচিতকরণ, কোড অপ্টিমাইজেশন পাইপলাইনের সাথে রিসোর্স সঙ্কুচিতকরণকে একীভূত করতে সাহায্য করে। AGP-এর এই সংস্করণে আপনাকে এটি ম্যানুয়ালি সক্রিয় করতে হবে।

লগক্যাট রিট্রেসিং: অ্যান্ড্রয়েড স্টুডিও লগক্যাট উইন্ডোতে স্বয়ংক্রিয় রিট্রেসিংয়ের সুবিধা।
৮.৬ উন্নত রিট্রেসিং: সকল minSdk লেভেলের জন্য ডিফল্টরূপে ফাইলের নাম এবং লাইন নম্বর রিট্রেসিং অন্তর্ভুক্ত করা হয়েছে (পূর্বে সংস্করণ ৮.২-এ এর জন্য minSdk ২৬+ প্রয়োজন ছিল)।

R8 আপডেট করা হলে অবফাসকেটেড বিল্ডগুলোর স্ট্যাক ট্রেস সহজে ও স্পষ্টভাবে পড়া যায়। এই সংস্করণে লাইন নম্বর এবং সোর্স ফাইল ম্যাপ করার পদ্ধতিতে উন্নতি করা হয়েছে, যার ফলে অ্যান্ড্রয়েড স্টুডিও লগক্যাটের মতো টুলগুলোর পক্ষে ক্র্যাশের কারণ স্বয়ংক্রিয়ভাবে মূল সোর্স কোড পর্যন্ত খুঁজে বের করা সহজ হয়।
৮.০ ডিফল্টরূপে ফুল মোড: R8 ফুল মোড উল্লেখযোগ্যভাবে আরও শক্তিশালী অপ্টিমাইজেশন প্রদান করে। এটি ডিফল্টরূপে সক্রিয় থাকে। আপনি android.enableR8.fullMode=false ব্যবহার করে এটি নিষ্ক্রিয় করতে পারেন।
৭.০ ফুল মোড উপলব্ধ: android.enableR8.fullMode=true ব্যবহার করে এটিকে একটি ঐচ্ছিক ফিচার হিসেবে চালু করা হয়েছে। আপনার কোড কীভাবে রিফ্লেকশন এবং অন্যান্য ডাইনামিক ফিচার ব্যবহার করে, সে সম্পর্কে আরও কঠোর ধারণা তৈরি করার মাধ্যমে ফুল মোড আরও শক্তিশালী অপটিমাইজেশন প্রয়োগ করে। যদিও এটি অ্যাপের আকার কমায় এবং পারফরম্যান্স উন্নত করে, তবে প্রয়োজনীয় কোড যাতে বাদ না পড়ে, সেজন্য অতিরিক্ত কিপ রুলসের প্রয়োজন হতে পারে।