R8 কনফিগারেশন অ্যানালাইজার ব্যবহার করুন

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

প্রতিবেদনটি তৈরি করুন

AGP 9.3.0-alpha05 এবং পরবর্তী সংস্করণ থেকে, একটি R8 বিল্ড চালানোর সময় build/outputs/mapping/release/configanalyzer.html এ রিপোর্টটি স্বয়ংক্রিয়ভাবে তৈরি হয়। আউটপুটগুলির স্বয়ংক্রিয় তৈরি বন্ধ করতে, নিম্নলিখিত Gradle প্রপার্টিটি সেট করুন:

android.experimental.r8.enableR8ConfigurationAnalyzer=false

AGP 9.2 এবং এর পূর্ববর্তী সংস্করণগুলির ক্ষেত্রে, R8 দিয়ে বিল্ড সক্রিয় করে কোনো Gradle টাস্ক চালানোর সময় com.android.tools.r8.dumpkeepradiushtmltodirectory সিস্টেম প্রপার্টিটি সেট করুন।

./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

উদাহরণস্বরূপ, /tmp/r8analysis ডিরেক্টরিতে HTML রিপোর্টটি তৈরি করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

// To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis

// To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis

প্রতিবেদনটি বুঝুন

R8 কনফিগারেশন অ্যানালাইজার আপনার অ্যাপের R8 কনফিগারেশন এবং প্রতিটি 'কিপ রুল'-এর প্রভাব সম্পর্কে ধারণা দেয়। এটি আপনাকে R8 থেকে সর্বোচ্চ অপটিমাইজেশন পেতে সাহায্য করে, যা আপনার অ্যাপের পারফরম্যান্স উন্নত করে। আপনার কোডবেসের কতটুকু R8 দ্বারা অপটিমাইজেশনের জন্য উপলব্ধ, তা বুঝতে নিম্নলিখিত স্কোরগুলো ব্যবহার করুন।

রিপোর্ট সারাংশ অংশের একটি উদাহরণ
চিত্র ১. প্রতিবেদনের সারাংশ অংশের একটি উদাহরণ।

স্কোর কমে যাওয়া

যখন R8 আপনার অ্যাপকে সঙ্কুচিত করে, তখন এটি অব্যবহৃত কোড এবং রিসোর্স শনাক্ত ও অপসারণ করে আপনার অ্যাপের সামগ্রিক আকার কমিয়ে দেয়, যা আপনার চূড়ান্ত বিল্ডকে যথাসম্ভব হালকা করে তোলে। সঙ্কুচিত করার স্কোরটি সেইসব ক্লাস, ফিল্ড এবং মেথডের শতাংশ ট্র্যাক করে, যেগুলো সঙ্কুচিত হওয়ার যোগ্য। উদাহরণস্বরূপ, ৬৬% সঙ্কুচিত করার স্কোরের অর্থ হলো, R8 আপনার কোডবেসের ৬৬% অংশে সঙ্কুচিত করার কাজটি করতে পারে।

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

R8 মেথড ইনলাইনিং এবং ক্লাস মার্জিং-এর মতো অপটিমাইজেশন করে থাকে, যার ফলে আপনার অ্যাপের স্টার্টআপ এবং মেমরি উন্নত হয়। অপটিমাইজেশন স্কোরটি সেইসব ক্লাস, ফিল্ড এবং মেথডের শতাংশ ট্র্যাক করে, যেগুলো R8 অপটিমাইজেশনের আওতাভুক্ত। উদাহরণস্বরূপ, যদি অপটিমাইজেশন স্কোর ৬৬% হয়, তার মানে হলো R8 আপনার কোডবেসের মাত্র ৬৬%-এ অপটিমাইজেশন করতে পারে।

অস্পষ্টতা স্কোর

ক্লাস, ফিল্ড এবং মেথডগুলোকে ছোট নামে রূপান্তর করে R8 অ্যাপের মেটাডেটা ফুটপ্রিন্ট কমিয়ে মেমরি সাশ্রয় করে। অবফাসকেশন স্কোর আপনার কোডবেসের মধ্যে অবফাসকেশনের জন্য উপলব্ধ কোডের শতাংশ পরিমাপ করে।

নিয়মকানুন পরিমার্জন করুন

স্কোর উন্নত করতে এবং আরও ভালো R8 অপটিমাইজেশন পেতে, আপনার 'কিপ' নিয়মগুলোকে এমনভাবে পরিমার্জন করা উচিত যাতে সেগুলো অপ্রয়োজনীয়ভাবে R8-কে আপনার অ্যাপ অপটিমাইজ করা থেকে বাধা না দেয়। আপনার কেবল সেইসব ক্লাস, মেথড বা ফিল্ড রাখা উচিত যেগুলো রিফ্লেকশন ব্যবহার করে অ্যাক্সেস করা হয়।

এটি অর্জন করতে, ‘কিপ রুল অ্যানালাইসিস’ ব্যবহার করুন।

কিপ রুল বিশ্লেষণের একটি উদাহরণ
চিত্র ২. কিপ রুল বিশ্লেষণের একটি উদাহরণ।

কোনো নিয়মের বিস্তারিত বিশ্লেষণ দেখতে, সেটিতে ক্লিক করে বিস্তারিত স্ক্রিনটি খুলুন।

কিপ রুল বিশ্লেষণের একটি উদাহরণ
চিত্র ৩. কিপ রুল বিশ্লেষণের একটি উদাহরণ।

নিয়মকানুন কীভাবে পরিমার্জন করা যায়

আপনার কিপ রুলগুলোকে আরও পরিমার্জিত করতে এবং আপনার অ্যাপের জন্য R8 অপটিমাইজেশনের সম্পূর্ণ সম্ভাবনাকে কাজে লাগাতে, নিম্নলিখিতগুলি করুন:

  1. প্রতিটি কিপ রুলের জন্য, কনফিগারেশন অ্যানালাইজারে R8 দ্বারা অপ্টিমাইজ করা যায় না এমন ক্লাস, ফিল্ড এবং মেথডের শতাংশ দেখুন। বিপুল সংখ্যক ক্লাস, ফিল্ড বা মেথডে অপ্টিমাইজেশন প্রতিরোধকারী কিপ রুলগুলো শনাক্ত করতে এটি ব্যবহার করুন। প্রতিটি কিপ রুল দ্বারা প্রতিরোধ করা অপ্টিমাইজেশন প্রোপার্টিগুলোও তালিকাভুক্ত করা থাকে।
  2. যদি আপনি এমন কোনো 'কিপ রুল' দেখেন যা বিপুল সংখ্যক ক্লাসের অপটিমাইজেশনকে বাধা দিচ্ছে, তাহলে আপনার অবশ্যই যাচাই করে দেখা উচিত যে ওই 'কিপ রুল'-এর কারণে কোন কোন ক্লাস, ফিল্ড এবং মেথডের অপটিমাইজেশন বাধাগ্রস্ত হচ্ছে। এর মাধ্যমে আপনি দেখতে পারবেন যে, এই রুলটি এমন কোনো আইটেম রেখে দিচ্ছে কি না যা রিফ্লেকশন ব্যবহার করে ডাইনামিকভাবে কল করা হয় না।
  3. সঠিক কিপ অপশন বেছে এবং সর্বোত্তম অনুশীলন অনুসরণ করে শুধুমাত্র প্রয়োজনীয় ক্লাস, ফিল্ড বা মেথডগুলোকে টার্গেট করার মাধ্যমে কিপ রুল দ্বারা বাধাগ্রস্ত অপটিমাইজেশন হ্রাস করুন।
  4. কিপ রুল দ্বারা প্রভাবিত ক্লাস, ফিল্ড এবং মেথডগুলো তদন্ত ও পরীক্ষা করে কিপ রুলগুলো পরিমার্জন করুন।

লাইব্রেরিগুলির অপ্টিমাইজেশন পরিদর্শন করুন

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

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

লাইব্রেরি অপ্টিমাইজ করার উপায়

  • যদি কোনো লাইব্রেরিতে অতিরিক্ত ব্যাপক কোনো নিয়ম অন্তর্ভুক্ত থাকে, তাহলে আমরা আপনাকে আপনার রিপোর্টের ডেটা সহ লাইব্রেরিটির রক্ষণাবেক্ষণকারীর সাথে যোগাযোগ করার পরামর্শ দিই, যাতে আপনি দেখাতে পারেন যে তাদের বর্তমান নিয়মগুলো আপনার অ্যাপের অপটিমাইজেশন স্কোরকে কীভাবে প্রভাবিত করে। যদি এটি একটি বাহ্যিক লাইব্রেরি হয়, তবে সমস্যা জানানোর আগে লাইব্রেরিটিতে বিদ্যমান বাগগুলো খুঁজে দেখুন।
  • প্রয়োজনে, আপনি একটি নির্দিষ্ট লাইব্রেরি থেকে নিয়মগুলো ফিল্টার করে সম্ভাব্য উন্নতি পরীক্ষা করতে পারেন। আপনি লাইব্রেরির নিয়মগুলো আপনার প্রোজেক্টে ইম্পোর্ট করে, সাধারণ নিয়মগুলো বাদ দিয়ে, এবং আকার ও পারফরম্যান্সে সম্ভাব্য লাভ পরিমাপ করতে কনফিগারেশন অ্যানালাইজারটি পুনরায় চালাতে পারেন।

অন্তর্ভুক্ত নিয়মাবলী

এমনটা হতে পারে যে, একাধিক 'কিপ' রুল একে অপরের সাথে ওভারল্যাপ করছে এবং রুলগুলোর মধ্যে কোনো একটি প্রয়োজনের চেয়ে বেশি অপটিমাইজেশনকে বাধা দিচ্ছে। যদি আপনার কোডবেসে দুটি 'কিপ' রুল থাকে।

# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }

# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass

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

রিপোর্ট সারাংশ অংশের একটি উদাহরণ
চিত্র ৪. প্রতিবেদনে অন্তর্ভুক্ত নিয়মাবলীর একটি উদাহরণ।

অন্তর্ভুক্ত নিয়মগুলি অপ্টিমাইজ করুন

  1. R8 কনফিগারেশন অ্যানালাইজার ব্যবহার করে অন্তর্ভুক্ত কিপ রুলগুলো খুঁজুন।
  2. আপনার কোডবেসের সেই নির্দিষ্ট ক্লাস, ফিল্ড বা মেথডগুলো শনাক্ত করুন যেগুলো রিফ্লেকশনের ওপর নির্ভরশীল এবং কিপ রুল ব্যবহার করে সেগুলোকে রাখা প্রয়োজন। এই বিষয়টি জানা থাকলে তা আপনাকে কিপ রুলগুলোকে আরও পরিমার্জিত করতে সাহায্য করবে।
  3. কনফিগারেশন অ্যানালাইজার ব্যবহার করে, একই ক্লাস, ফিল্ড বা মেথডকে টার্গেট করা প্রতিটি রুলের প্রভাব তুলনা করুন। প্রতিটি কিপ রুল দ্বারা প্রতিরোধ করা অপটিমাইজেশন শতাংশ ব্যবহার করে আপনি শনাক্ত করতে পারেন কোনটি বৃহত্তর এবং কোনটি সংকীর্ণ কিপ রুল।
    1. যদি সংকীর্ণ নিয়মটি সুনির্দিষ্টভাবে লেখা হয়—অর্থাৎ শুধু সেই নির্দিষ্ট মেম্বার বা ক্লাসগুলোই রাখা হয় যেগুলো রিফ্লেক্টিভলি অ্যাক্সেস করা হয়—তাহলে বৃহত্তর ‘কিপ’ নিয়মটি সরিয়ে দিন। এর ফলে আপনার প্যাকেজের বাকি অংশের জন্য R8 অপটিমাইজেশনগুলো নিরাপদে আনলক হয়ে যাবে।
    2. যদি ব্রড রুলটি সঠিক ক্লাসগুলোকে টার্গেট করে, তাহলে ব্রড রুলটি রাখুন এবং ন্যারো রুলটি মুছে ফেলুন। ন্যারো রুলটি কেবলই একটি অপ্রয়োজনীয় জঞ্জাল। ব্রড রুলটিকে এমনভাবে পরিমার্জন করুন যাতে এটি শুধুমাত্র আপনার চিহ্নিত করা ক্লাস, ফিল্ড বা মেথডগুলোকেই টার্গেট করে।

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

অপ্রয়োজনীয় নিয়মগুলো সরিয়ে ফেলুন

কনফিগারেশন অ্যানালাইজার ব্যবহার করে, আপনি আপনার কোডবেসকে পদ্ধতিগতভাবে নিরীক্ষা করতে পারেন এবং কনফিগারেশনকে অগোছালো করে তোলে এমন অপ্রচলিত 'কিপ রুল'গুলো শনাক্ত ও ছাঁটাই করতে পারেন। R8 কনফিগারেশন অ্যানালাইজার বিশেষভাবে অপ্রয়োজনীয় রুলের দুটি প্রধান উৎসকে হাইলাইট করে:

  • অব্যবহৃত নিয়ম : যে নিয়মগুলো আপনার বর্তমান বিল্ডে কোনো ক্লাস, মেথড বা ফিল্ডের সাথে মেলে না। কোড রিফ্যাক্টরিং, ডিপেন্ডেন্সি অপসারণ, বা অপ্রাসঙ্গিক হয়ে যাওয়া কপি-পেস্ট কনফিগারেশনের পরেও এগুলো প্রায়শই থেকে যায়, যা অপ্রয়োজনীয় কনফিগারেশন জটিলতা বাড়ায়।
  • অভিন্ন নিয়ম : অভিন্ন কিপ রুল বলতে এমন নিয়মকে বোঝায় যা একই ক্লাস, ফিল্ড এবং মেথডকে লক্ষ্য করে অথবা একই বা একাধিক কিপ রুল ফাইলে কিপ রুলের সদৃশ ঘোষণা থাকে।

উভয় ধরণের নিয়মই আপনার কনফিগারেশনে জঞ্জাল তৈরি করে, যা এর রক্ষণাবেক্ষণ এবং ডিবাগিংকে আরও কঠিন করে তোলে। এগুলো শনাক্ত করার মাধ্যমে আপনি আপনার কনফিগারেশনকে পরিচ্ছন্ন করতে পারেন।