ডিফল্ট হিসেবে, R8 পারফর্ম্যান্স ও সাইজ উন্নত করার জন্য অনেক অপ্টিমাইজেশন করে, কিন্তু অপ্টিমাইজেশন আপনার অ্যাপের জন্য সঙ্গে সঙ্গে কাজ নাও করতে পারে। আপনি যদি কোনও বড় অ্যাপে প্রথমবার 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-এ নির্দিষ্ট ক্লাসকে এক্সটেন্ড করে এমন সব নিয়ম রাখা খুবই সাধারণ ব্যাপার। সাধারণত, রিফ্লেকশন শুধুমাত্র এমন ক্লাস বা পদ্ধতিকে টার্গেট করে যা নির্দিষ্ট অ্যাবস্ট্রাক্ট ক্লাসকে এক্সটেন্ড করে, নির্দিষ্ট ইন্টারফেস প্রয়োগ করে অথবা নির্দিষ্ট রানটাইম অ্যানোটেশন সহ ক্লাসে প্রয়োগ করে। এগুলি সবই কিপ নিয়মকে সংজ্ঞায়িত করার জন্য কাজ করে, যাতে আপনার চূড়ান্ত, সম্পূর্ণ অপ্টিমাইজ করা অ্যাপে প্যাকেজ-ব্যাপী কিপ নিয়মের প্রয়োজন না হয়।
আপনার কোডবেসে রিফ্লেকশন থাকলে, আপনি প্যাকেজ-ওয়াইড কিপ রুলকে Jetpack Keep-এর সাথে পরিবর্তন করতে পারবেন। জেনারেট করা নিয়মগুলি শর্তসাপেক্ষ: R8 রিফ্লেক্টিভ কলের টার্গেট তখনই রাখে যখন এটি কল করার কোডও রাখে। কোনও প্যাকেজ মাইগ্রেট করতে, Jetpack Keep lint checks ব্যবহার করে এর রিফ্লেক্টিভ কল খুঁজে বের করুন ও অ্যানোটেট করুন এবং তারপর প্যাকেজ-ওয়াইড নিয়ম সরিয়ে দিন।