ক্রমবর্ধমান অপ্টিমাইজেশান গ্রহণ

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

অপ্টিমাইজেশান সীমিত

R8 কোড অপসারণ, কোড পুনঃলিখন, এবং সম্পদ অপসারণ সহ অনেক ধরনের অপ্টিমাইজেশন করে। এখানে অপ্টিমাইজেশন প্রকারের কিছু উচ্চ-স্তরের বর্ণনা রয়েছে:

  • কোড সঙ্কুচিত (বা গাছ কাঁপানো): রেফারেন্সহীন কোড সরিয়ে দেয়
  • অস্পষ্টতা (বা শনাক্তকারী সংক্ষিপ্তকরণ): ক্লাস এবং পদ্ধতির নাম ছোট করে
  • অপ্টিমাইজেশান: কোড পুনর্লিখন করে, উদাহরণস্বরূপ ইনলাইনিং

ত্রুটির সম্ভাবনা কমাতে, আপনি শুধুমাত্র এই অপ্টিমাইজেশানগুলির কিছু সক্রিয় করে শুরু করতে পারেন৷

শুধুমাত্র গাছ কাঁপানো সক্ষম করুন

কোড সঙ্কুচিত করা, যা ট্রি কাঁপানো নামেও পরিচিত, সেই কোডগুলিকে সরিয়ে দেয় যা রেফারেন্সহীন বলে মনে হয়। আমরা শুধু গাছের ঝাঁকুনি দিয়ে শুরু করার পরামর্শ দিই, কারণ এটি সবচেয়ে সহজবোধ্য।

শুধুমাত্র গাছ কাঁপানো সক্ষম করতে, অন্যান্য ধরনের অপ্টিমাইজেশন বন্ধ করতে আপনার proguard-rules.pro ফাইলে নিম্নলিখিত যোগ করুন। অস্পষ্টতা বন্ধ করা গুরুত্বপূর্ণ কারণ এটি স্ট্যাক ট্রেসগুলিকে পড়া সহজ করে তোলে।

-dontobfuscate // Use temporarily to turn off identifier minification
-dontoptimize // Use temporarily to turn off optimization

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

কমপ্যাট মোড ব্যবহার করুন

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

কম্প্যাট মোড ব্যবহার করতে, আপনার gradle.properties ফাইলে নিম্নলিখিত সেটিং ব্যবহার করুন:

android.enableR8.fullMode = false // Use temporarily to disable full mode

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

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

স্ট্যাক ট্রেস ডিঅফসকেট করার বিষয়ে আরও তথ্যের জন্য, মূল স্ট্যাক ট্রেস পুনরুদ্ধার করুন দেখুন।

অপ্টিমাইজেশন সুযোগ সীমিত

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

প্যাকেজ-ওয়াইড রাখার নিয়ম ব্যবহার করুন

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

উদাহরণস্বরূপ, যদি আপনার অ্যাপের কিছু অংশ Gson খুব বেশি ব্যবহার করে এবং অপ্টিমাইজেশানে সমস্যা সৃষ্টি করে, তাহলে আদর্শ সমাধান হল আরও টার্গেটেড রাখার নিয়ম যোগ করা বা কোডজেন সমাধানে সরানো। কিন্তু বাকি অ্যাপ অপটিমাইজ করার জন্য অবরোধ মুক্ত করতে, আপনি একটি ডেডিকেটেড সাবপ্যাকেজে আপনার Gson প্রকারের সংজ্ঞায়িত কোড রাখতে পারেন এবং আপনার proguard-rules.pro ফাইলে এইরকম একটি নিয়ম যোগ করতে পারেন:

-keep class com.myapp.json.** { *; }

যদি আপনি ব্যবহার করছেন এমন কিছু লাইব্রেরিতে অভ্যন্তরীণ উপাদানগুলির প্রতিফলন থাকে, আপনি একইভাবে পুরো লাইব্রেরির জন্য একটি রাখার নিয়ম যোগ করতে পারেন। রাখার জন্য উপযুক্ত প্যাকেজ খুঁজে পেতে আপনাকে লাইব্রেরির কোড বা JAR/AAR পরিদর্শন করতে হবে। আবার, দীর্ঘমেয়াদী বজায় রাখার জন্য এটি সুপারিশ করা হয় না, তবে বাকি অ্যাপের অপ্টিমাইজেশন আনব্লক করতে পারে:

-keep class com.somelibrary.** { *; }

প্যাকেজ-ব্যাপী রাখার নিয়মগুলি সরান

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

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