কেস স্টাডি

Grab, R8 এবং প্রোফাইল গাইডেড অপ্টিমাইজেশনের মাধ্যমে ANR-এর সংখ্যা ৩২% কমায় এবং স্টার্টআপের সময় ৩৫% উন্নত করে

পড়তে ৫ মিনিট লাগবে
৩ লেখক
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang

Grab হল দক্ষিণ-পূর্ব এশিয়ার শীর্ষস্থানীয় সুপারঅ্যাপ, যা একটি অ্যাপের মাধ্যমে আটটি দেশ জুড়ে লক্ষ লক্ষ ব্যবহারকারীকে ডেলিভারি, মোবিলিটি এবং আর্থিক পরিষেবা প্রদান করে। ১০ বছরের পুরনো কোডবেস যাতে ১০ মিলিয়নেরও বেশি কোডের লাইন এবং শত শত থার্ড-পার্টি লাইব্রেরি রয়েছে  যা হাইব্রিড Bazel এবং Gradle সেটআপ ব্যবহার করে তৈরি করা হয়েছে, Grab টিম তিনটি ক্রমবর্ধমান চ্যালেঞ্জের মুখোমুখি হয়েছে: উচ্চ অ্যাপ্লিকেশন সাড়া দিচ্ছে না (ANR) রেট, একটি অ্যাপের সাইজ যা সুপারঅ্যাপে নতুন পরিষেবা যোগ করার সাথে সাথে বাড়তে থাকে এবং স্টার্টআপের সময় যা বছরের পর বছর ধীরে ধীরে বাড়ছে।  R8 অপ্টিমাইজেশন চালু করে, নিয়ম বজায় রাখার বিষয়টি রিফাইন করে এবং বেসলাইন প্রোফাইল ও স্টার্টআপ প্রোফাইল প্রয়োগ করে, Grab তার ব্যবহারকারীর-অনুভূত ANR রেট ৩২% কমিয়েছে, অ্যাপ ডাউনলোড সাইজ ~৩০% কমিয়েছে এবং স্টার্টআপ টাইম ৩৫% উন্নত করেছে।

ব্যবহারকারীর অভিজ্ঞতা আরও মসৃণ করতে রিলিজ-পরবর্তী ANR স্পাইক দূর করা

বিল্ড প্রসেস অপ্টিমাইজ করার আগে, Grab-কে কোল্ড স্টার্টে দেরি এবং নতুন আপডেট করার ঠিক পরেই অ্যাপ কাজ করছে না (ANR) সংক্রান্ত সমস্যার সম্মুখীন হতে হয়েছিল। অ্যাপ শুরু করার সময় অনেক DEX ফাইল পড়ার ওভারহেডের কারণে মূলত এই সমস্যা হয়েছিল। 

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

ANDDM_Grab_Inline_Quote_ALT.png

"প্রতি সপ্তাহে অ্যাপ রিলিজ করার সময় আমরা ক্রমাগত ANR রেট স্পাইক লক্ষ্য করেছি," Grab-এর প্যাসেঞ্জার অ্যাপ কোর টিমের লিড সফ্টওয়্যার ইঞ্জিনিয়ার নগুয়েন ভ্যান মিন ব্যাখ্যা করেছেন। 

ANR-এর সমস্যা দূর করতে এবং স্টার্টআপের সময় উন্নত করতে, Grab, R8 অপ্টিমাইজেশন, বেসলাইন প্রোফাইল এবং স্টার্টআপ প্রোফাইল প্রয়োগ করেছে। R8 অপ্টিমাইজারের পাশাপাশি প্রোফাইল গাইডেড অপ্টিমাইজেশন, R8 থেকে অবিলম্বে ১২% কোল্ড স্টার্ট উন্নতি এবং বেসলাইন প্রোফাইল থেকে অতিরিক্ত ১৫% উন্নতি প্রদান করেছে—২৭% দ্রুত স্টার্টআপ সময় অর্জন করেছে এবং রিলিজ-পরবর্তী ANR স্পাইকগুলি কার্যকরভাবে দূর করেছে।

Grab তিনটি স্ট্র্যাটেজিক ফেজ জুড়ে এই অ্যাপ অপ্টিমাইজেশন কার্যকর করেছে: কম্প্যাট মোডে R8 অপ্টিমাইজেশন চালু করা, R8 ফুল মোডে ট্রানজিশন করা এবং তারপরে কনফিগারেশন অ্যানালাইজারের মাধ্যমে কিপ রুল রিফাইন করা এবং CI/CD গভর্নেন্স যোগ করা।

ফেজ ১: R8 অপ্টিমাইজেশন চালু করা  (২০২৫-এ শিপ করা হয়েছে)

এই প্রথম ধাপে, Grab পুরনো ডিফল্ট Proguard ফাইল থেকে সরে এসে proguard-android-optimize.txt গ্রহণ করেছে, যা R8 অপ্টিমাইজেশন চালু করে।  যেহেতু কোডবেসটি এক দশকেরও বেশি পুরনো এবং এতে ১০ মিলিয়নেরও বেশি কোডের লাইন রয়েছে, তাই অপ্টিমাইজার চালু করার জন্য লিগ্যাসি কনফিগারেশন এবং রিফ্লেকশন ব্যবহারের প্রয়োজন ছিল।

এই ফেজের প্রভাব সর্বাধিক করতে, Grab বেসলাইন প্রোফাইল ও স্টার্টআপ প্রোফাইল সহ R8 কম্প্যাটিবিলিটি মোড চালু করা অ্যাপ আপডেট রিলিজ করেছে। এই সম্মিলিত প্রচেষ্টার ফলে ব্যবহারকারীর-অনুভূত ANR রেট অবিলম্বে ২৫% কমেছে, অ্যাপ ডাউনলোড সাইজ ১৬% কমেছে এবং কোল্ড স্টার্টের সময় সামগ্রিকভাবে ২৭% উন্নত হয়েছে।

পর্যায় ২: R8 ফুল মোড ও মাইগ্রেশন (২০২৬-এ শিপ করা হয়েছে)

প্রথমবার রিলিজ করার নয় মাস পরে লঞ্চ করা এই ফেজে অ্যাপটি R8 ফুল মোডে শিফট করা হয়, যা আরও অপ্টিমাইজেশন আনলক করে। Retrofit, Firebase এবং Jetpack Compose-এর মতো স্ট্যান্ডার্ড লাইব্রেরিগুলি তাদের বিল্ট-ইন নিয়মগুলি ব্যবহার করে R8-এর সাথে নির্বিঘ্নে কাজ করলেও, বাকি বিশাল কোডবেস মাইগ্রেট করার কাজটি নির্দিষ্ট রিফ্লেকশন-হেভি কোড পাথগুলি সমাধান করার মাধ্যমে সম্পন্ন করা হয়েছে:

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

শেষ পর্যন্ত, R8 ফুল মোড ব্যাপক, যৌগিক উন্নতি প্রদান করেছে, যার মধ্যে রয়েছে অ্যাপ ডাউনলোড সাইজে অতিরিক্ত ১৪% হ্রাস, স্টার্টআপ টাইমে অতিরিক্ত ১০% উন্নতি এবং ব্যবহারকারীর-লক্ষ্য করা ANR-এ আরও ১০% হ্রাস। R8 ফুল মোডে মাইগ্রেট করার পরে, Grab-এর কোডবেস এই R8 অপ্টিমাইজেশন স্কোর অর্জন করেছে। 

  • অপ্টিমাইজেশন স্কোর: ৭২%
  • শ্রঙ্কিং স্কোর: ৭৩%
  • অস্পষ্টতা স্কোর: ৭৯.৬%

এই স্কোরগুলি R8 কনফিগারেশন এবং R8 অপ্টিমাইজেশন সর্বাধিক করার জন্য নিয়মগুলি পরিমার্জন করার প্রয়োজনীয়তা সম্পর্কে মতামত প্রদান করে। 

ফেজ ৩: রাখার-নিয়ম রিফাইন করা 

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

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

  • অপ্টিমাইজেশন স্কোর: ৭২% থেকে বেড়ে ৭৮.২% হচ্ছে
  • সঙ্কোচন স্কোর: ৭৩% থেকে ৭৯.১% পর্যন্ত বৃদ্ধি পাচ্ছে
  • অস্পষ্টতা স্কোর: ৭৯.৬% থেকে ৮১.৭% পর্যন্ত বৃদ্ধি পাচ্ছে

এই ডায়াগনস্টিক স্কোর বুস্ট করার পাশাপাশি, এই ডেডিকেটেড কিপ-রুল রিফাইনমেন্ট ফেজ অ্যাপ ডাউনলোড সাইজে অতিরিক্ত ~৩.৬% হ্রাস করছে। আরও গুরুত্বপূর্ণ বিষয় হল, এইসব মেট্রিক ট্র্যাক করার মাধ্যমে ইঞ্জিনিয়ারিং টিম অটোমেটিক প্রি-মার্জ CI গার্ডরেল প্রয়োগ করার জন্য প্রয়োজনীয় অবজেক্টিভ ডেটা পাচ্ছে। এর ফলে, নতুন কোড কঠোর কিপ-রুল স্ট্যান্ডার্ড মেনে চলছে কিনা এবং কষ্টার্জিত পারফর্ম্যান্সের উন্নতি সময়ের সাথে সুরক্ষিত থাকছে কিনা তা নিশ্চিত করা যাচ্ছে।

ফলাফল

R8 অপ্টিমাইজার রোল-আউট করার পরে পারফর্ম্যান্সের মূল উন্নতি:

অপ্টিমাইজেশন পর্যায়ANRগুলিআকারকোল্ড স্টার্ট
ফেজ ১: R8 অপ্টিমাইজার (২০২৫-এ শিপ করা হয়েছে)~২৫% হ্রাস১৬% কমানো হয়েছে~২৭% উন্নতি
ফেজ ২: R8 ফুল মোড (২০২৬-এ শিপ করা হয়েছে)১০% কমানো১৪% কমানো হয়েছে১০% উন্নতি
কিপ-রুল অপ্টিমাইজেশন-৩.৬% হ্রাস-
সামগ্রিক (ক্রমবর্ধমান)~৩২.৫% কমানো হয়েছে~৩০.৪% হ্রাস~৩৫% উন্নতি

প্রযুক্তিগত চ্যালেঞ্জ 

Grab-এর এক দশক পুরনো কোডবেস জুড়ে R8 অপ্টিমাইজার চালু করার ফলে স্কেলে মূল প্রযুক্তিগত বাধাগুলি দেখা দেয়:

  • টেস্টিং: এক দশক ধরে সঞ্চিত প্রতিফলন সম্পূর্ণ অপ্টিমাইজেশনের অধীনে এজ কেস তৈরি করেছে। লক্ষ লক্ষ LOC জুড়ে সম্পূর্ণ টেস্টিং করা অসম্ভব ছিল, তাই টিম একটি ইনক্রিমেন্টাল, উচ্চ-অগ্রাধিকার পদ্ধতি গ্রহণ করেছে— বিশেষ করে সংকীর্ণ করা রাখা নিয়মের আওতাভুক্ত কোডের উপর টেস্টিং ফোকাস করা এবং R8 অপ্টিমাইজেশন সর্বাধিক করার জন্য প্রতিফলনের জন্য প্রয়োজনীয় নির্দিষ্ট ক্লাস, পদ্ধতি বা ফিল্ডগুলিকে টার্গেট করার জন্য সেই নিয়মগুলিকে বারবার রিফাইন করা
  • বিল্ড লেটেন্সি ও হাইব্রিড আর্কিটেকচার: Grab-এর হাইব্রিড বিল্ড সিস্টেম (ডিবাগের জন্য Bazel, R8 রিলিজ বিল্ডের জন্য Gradle) মানে হল পরীক্ষামূলক R8 পরিবর্তন রিমোট CI-তে ২ ঘণ্টা পর্যন্ত সময় নেয়। মতামতের ব্যবধান পূরণ করতে, Grab তার দৈনিক QA বিল্ডগুলিকে প্রোডাকশন R8 আচরণের সাথে মেলানোর জন্য সারিবদ্ধ করেছে এবং স্ট্রীমলাইনড তদন্তের জন্য mapping.txt, configuration.txt-এর মতো মূল CI বিল্ড আর্টিফ্যাক্টগুলির সংগ্রহকে অটোমেট করেছে।
  • ধীরগতির ডিবাগিং সাইকেল: শত শত অপ্টিমাইজ করা ক্লাস জুড়ে মূল কারণ খুঁজে বের করা একটি ছোট টিমের উপর ভারী বোঝা চাপিয়ে দেয়। Grab, Gradle-এর মাধ্যমে Firebase Crashlytics-এ ম্যাপিং ফাইল আপলোড অটোমেট করে এবং Play Console-এর জন্য ডিঅবফাসকেশন ম্যাপিং বান্ডেল করে এই সমস্যার সমাধান করেছে, যা রানটাইম সমস্যার জন্য ইনস্ট্যান্ট, সঠিক সিম্বল রেজোলিউশন সক্ষম করে

R8-এর সাথে দীর্ঘমেয়াদী কোড ইমপ্যাক্ট

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

ANDDM_Grab_Inline_Metric.png

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

মনে রাখবেন: পদ্ধতি: অ্যাপ ডাউনলোড সাইজে (প্রতিনিধিত্বমূলক ডিভাইস) app-sizer-এর Kotlin/Java কন্ট্রিবিউশন, প্রোডাকশন Kotlin LOC (cloc; শুধুমাত্র প্রধান সোর্স সেট; টেস্ট, মক এবং স্যাম্পেল মডিউল বাদ দিয়ে) দ্বারা বিভক্ত।

নিয়ম ম্যানেজমেন্ট ও গার্ডরেল বজায় রাখা

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

R8-rules-score (1).png

ছবি ১: CI ড্যাশবোর্ড, Grab বিল্ডে সময়ের সাথে সাথে R8 সঙ্কোচন, অপ্টিমাইজেশন এবং অস্পষ্টকরণ স্কোর ট্র্যাক করে  যাতে রিলিজ জুড়ে রিগ্রেশন প্রোঅ্যাক্টিভভাবে শনাক্ত করা এবং প্রতিরোধ করা যায়।

উপসংহার 

বিশাল, পরিপক্ক কোডবেসের চ্যালেঞ্জের মুখোমুখি হয়ে, Grab-এর Pax App Core টিম বেসলাইন প্রোফাইল প্রয়োগ করে এবং ক্রমাগত R8 কনফিগারেশন উন্নত করে, ক্রমবর্ধমান স্টার্টআপ টাইম এবং রিলিজ-পরবর্তী পারফর্ম্যান্স স্পাইকগুলি সক্রিয়ভাবে মোকাবিলা করেছে। টিম ব্যবহারকারীর-লক্ষ্য করা ANR ~৩২.৫% কমিয়েছে, অ্যাপ ডাউনলোড সাইজ ~৩০.৩% কমিয়েছে এবং কোল্ড স্টার্ট টাইম ~৩৫% উন্নত করেছে, এর পাশাপাশি তাদের কোডবেস স্কেল কতটা দক্ষতার সাথে কাজ করে তা মৌলিকভাবে উন্নত করেছে।

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

R8 ব্যবহার শুরু করতে এবং এই সম্পর্কে আরও জানতে, - d.android.com/r8 লিঙ্কে যান।

লিখেছেন:
পড়া চালিয়ে যান