আমাদের অ্যাপগুলোতে নতুন ফিচার যুক্ত হওয়ার সাথে সাথে এবং সেগুলো আরও জটিল হয়ে ওঠার ফলে, চূড়ান্ত ফাইলের আকার উল্লেখযোগ্যভাবে বেড়ে যাওয়াটা খুবই সাধারণ একটি ব্যাপার। এটি একটি গুরুতর সমস্যা, কারণ কোনো অ্যাপ খুব বড় হলে অনেক ব্যবহারকারী ইনস্টল বোতামে ক্লিক করার আগে দুবার ভাবেন, অথবা আরও খারাপভাবে বললে, ডাউনলোডটি মাঝপথে ছেড়ে দেন। এছাড়াও, একটি বড় অ্যাপ ফোনে বেশি স্টোরেজ স্পেস দখল করে এবং শেষ পর্যন্ত সিস্টেমের রেসপন্সিভনেসকে প্রভাবিত করতে পারে।
আপনার প্রজেক্টকে একটি বিশাল ডিজিটাল বস্তুতে পরিণত হওয়া থেকে বাঁচাতে, কোড পরিষ্করণ থেকে শুরু করে ইমেজ অপটিমাইজেশন পর্যন্ত বিভিন্ন কৌশল রয়েছে। এই আর্টিকেলে, আমরা R8 এবং ProGuard-এর মতো টুল ব্যবহারের পদ্ধতি এবং অ্যাপ বান্ডেলের জাদু নিয়ে বিস্তারিত আলোচনা করব, যা আপনার অ্যাপকে যথাসম্ভব হালকা ও দ্রুত করে তুলবে এবং নিশ্চিত করবে যে এটি কম ক্ষমতার ডিভাইসেও ত্রুটিহীনভাবে চলে।
আপনার অ্যাপে কোন বিষয়গুলো সত্যিই গুরুত্বপূর্ণ তা বোঝা
শুরু করার আগে, আমাদের জানতে হবে ডেটার সিংহভাগ কোথায় রয়েছে। একটি অ্যাপ্লিকেশনের আকার সাধারণত চারটি প্রধান অংশে বিভক্ত থাকে। প্রথমত, রয়েছে জাভা বা কোটলিন বাইটকোড এবং এর লাইব্রেরিগুলো, যা সাধারণত ৩০% থেকে ৪০% জায়গা নেয়। এরপর রয়েছে লেআউট এবং অ্যানিমেশনের মতো রিসোর্স , যেগুলোর আকারও প্রায় একই রকম। এছাড়াও রয়েছে বিভিন্ন আর্কিটেকচারের জন্য কম্পাইল করা নেটিভ লাইব্রেরি (C/C++) (১৫-২৫%), এবং সবশেষে, অ্যাসেট বা র ফাইল (৫-১৫%)।
অনুমান এড়ানোর জন্য, অ্যান্ড্রয়েড স্টুডিও-এর APK অ্যানালাইজার ব্যবহার করাই সবচেয়ে ভালো (Build > Analyze APK-তে গিয়ে)। এই টুলটি আপনাকে DEX ক্লাস, রিসোর্স ফোল্ডার এবং নেটিভ লাইব্রেরিগুলোর সঠিক আকার দেখতে দেয়, যার ফলে আপনি বর্তমান সংস্করণগুলোকে পূর্ববর্তী সংস্করণগুলোর সাথে তুলনা করে ফাইলের আকার বৃদ্ধির কারণ নির্দিষ্টভাবে চিহ্নিত করতে পারেন। এই বিষয়টি আরও গভীরভাবে বোঝার জন্য, অ্যান্ড্রয়েডের ফাইল হায়ারার্কি এবং ফাইলগুলো কীভাবে সাজানো থাকে তা বোঝা সহায়ক ।
কোড পরিষ্করণ: ProGuard থেকে R8-এ উত্তরণ
কোড রিডাকশন নিঃসন্দেহে বাইট কমানোর সবচেয়ে কার্যকর উপায়। এখানেই প্রোগার্ড এবং এর আধুনিক উত্তরসূরি, আর৮ (R8)-এর ভূমিকা আসে। প্রোগার্ড বহু বছর ধরে একটি স্ট্যান্ডার্ড ছিল, যা অব্যবহৃত ক্লাস, ফিল্ড এবং মেথড অপসারণ , বাইটকোড অপ্টিমাইজ করা এবং নামগুলোকে সংক্ষিপ্ত করার জন্য দুর্বোধ্য করে তুলত (যাতে আপনার কোড হ্যাক করার চেষ্টাকারী কারও পক্ষে তা পড়া কঠিন হয়)।
বর্তমানে, R8 হলো ডিফল্ট কম্পাইলার এবং এটি ProGuard-এর সমস্ত কাজই করে, তবে আরও অনেক ভালোভাবে এবং দ্রুত। R8 আরও শক্তিশালী ট্রি শেকিং প্রয়োগ করে , একই ধরনের ফাংশনযুক্ত ক্লাসগুলোকে একীভূত করে এবং এনুমারেশনগুলোকে ইন্টিজারে রূপান্তর করে অপ্টিমাইজ করে। এছাড়াও, এটি ডিসুগারিং-এর মাধ্যমে অ্যান্ড্রয়েডের পুরোনো সংস্করণগুলোতে আধুনিক জাভা ৮-এর ফাংশন ব্যবহার করার সুযোগ দেয়।
build.gradle-এ প্রযুক্তিগত কনফিগারেশন
রিলিজ সংস্করণে এই অপ্টিমাইজেশনগুলি সক্রিয় করতে, আপনাকে বিল্ড ফাইলটি কনফিগার করতে হবে। minifyEnabled as true এবং নিয়ম ফাইলগুলো লিঙ্ক করা। এটি ব্যবহার করা অপরিহার্য। proguard-android-optimize.txt অপ্টিমাইজেশনগুলোর পূর্ণ সুবিধা নিতে। একটি সাধারণ কনফিগারেশনের উদাহরণে অন্তর্ভুক্ত থাকবে অ্যাপ্লিকেশন ক্লাস বজায় রাখুন অথবা যাদের উল্লেখ করা হয়েছে @Keep R8 যাতে ভুলবশত সেগুলো মুছে না ফেলে, তা প্রতিরোধ করতে।
বাহ্যিক লাইব্রেরিগুলির জন্য নিয়ম ব্যবস্থাপনা
কখনও কখনও, R8 অতিরিক্ত কার্যকর হয়ে ওঠে এবং রিফ্লেকশনের মাধ্যমে ব্যবহৃত কোড মুছে ফেলে, যার ফলে এই ধরনের ত্রুটি দেখা দেয়, যেমন ClassNotFoundExceptionএই কারণেই বইয়ের দোকানগুলো পছন্দ করে Retrofit, OkHttp, বা Gson-এর জন্য নির্দিষ্ট নিয়ম প্রয়োজন।উদাহরণস্বরূপ, Gson-এর ক্ষেত্রে ডেটা মডেলে ফিল্ডের নামগুলো সংরক্ষণ করা অত্যন্ত জরুরি, যাতে JSON ডিসিরিয়ালাইজেশন ব্যর্থ না হয়। অবফাসকেশনের পরেও যদি কোনো ত্রুটি দেখা দেয়, তাহলে ফাইলটি ম্যাপিং.txt স্ট্যাক ট্রেস অনুবাদ করতে এবং ব্যর্থতাটি কোথায় ঘটেছে তা জানতে এটি আপনার সেরা সহায়ক।
বুদ্ধিমান সম্পদ অপ্টিমাইজেশন
সম্পদ প্রায়শই এমন জায়গায় সবচেয়ে বেশি অপচয় হয়। একটি সহজ কিন্তু শক্তিশালী কৌশল হলো সক্রিয় করা। সঙ্কুচিত সম্পদ build.gradle ফাইলে। এটি কোডে কোনো রেফারেন্স নেই এমন ফাইলগুলো মুছে ফেলে, যদিও এটা জানা গুরুত্বপূর্ণ যে আপনি যদি ব্যবহার করে ডাইনামিকভাবে কোনো রিসোর্স কল করেন getIdentifierআপনাকে এটি একটি ফাইলে ঘোষণা করতে হবে। keep.xml যাতে এটি হারিয়ে না যায়।
ছবি ও গ্রাফিক্স: কমই বেশি
PNG ফরম্যাটের কারণে অনেক অপ্রয়োজনীয় মেগাবাইট জায়গা দখল হয়। বর্তমান পরামর্শ হলো সবকিছু WebP ফরম্যাটে স্থানান্তর করা , যা গুণমান বজায় রেখে অনেক উন্নত কম্প্রেশন প্রদান করে। আপনি সরাসরি অ্যান্ড্রয়েড স্টুডিওতে ছবির উপর রাইট-ক্লিক করে এই রূপান্তরটি করতে পারেন। আইকন এবং সাধারণ আকারের জন্য ভেক্টর ড্রয়েবল (Vector Drawables) আদর্শ ; একটিমাত্র XML ফাইল বিভিন্ন ঘনত্বের পাঁচটি সংস্করণের কাজ করে, যা রক্ষণাবেক্ষণ সহজ করে এবং ফাইলের আকার কমায়।
ভাষা ও ঘনত্ব হ্রাস করা
অনেক এক্সটার্নাল লাইব্রেরির সাথে ৫০টি ভাষায় অনুবাদ থাকে, যেগুলো সম্ভবত আপনার অ্যাপ সাপোর্ট করে না। এই সমস্যাটি সমাধান করতে, প্রপার্টিটি ব্যবহার করুন। defaultConfig-এ resConfigsশুধুমাত্র সেই ভাষাগুলো উল্লেখ করা যা আপনি প্রকৃতপক্ষে ব্যবহার করেন (উদাহরণস্বরূপ, "es", "en"একইভাবে, আপনার লক্ষ্য দর্শক আধুনিক ডিভাইস ব্যবহার করেন জেনে থাকলে, রিসোর্স কমিয়ে আপনি অন্তর্ভুক্ত স্ক্রিন ডেনসিটি সীমিত করতে পারেন। ldpi বা mdpi যেটা এখন আর কেউ ব্যবহার করে না।
উন্নত বিতরণ কৌশল
আপনি যদি APK ফাইলের সাইজ নিশ্চিতভাবে কমাতে চান, তবে আপনার ইউনিভার্সাল APK ব্যবহার বন্ধ করে অ্যান্ড্রয়েড অ্যাপ বান্ডেল (.aab) ব্যবহার শুরু করা উচিত । সম্ভাব্য সবকিছু সহ একটি বিশাল ফাইল পাঠানোর পরিবর্তে, গুগল প্লে প্রতিটি ডিভাইসের জন্য একটি অপ্টিমাইজড APK তৈরি করে। এইভাবে, ARM64 ফোন এবং xxhdpi স্ক্রিনযুক্ত একজন ব্যবহারকারী শুধুমাত্র তার হার্ডওয়্যারের জন্য প্রয়োজনীয় ফাইলগুলোই ডাউনলোড করেন , যা ডাউনলোডের সাইজ ৪০% পর্যন্ত কমিয়ে দেয়।
ডাইনামিক ফাংশন মডিউল এবং ইনস্ট্যান্ট অ্যাপস
শুরু থেকেই সব কোড উপলব্ধ থাকার প্রয়োজন নেই। ডাইনামিক ফিচার মডিউল ব্যবহার করে আপনি অ্যাপের বিভিন্ন অংশ (যেমন একটি উন্নত ফটো এডিটর বা অফলাইন মোড) আলাদা করতে পারেন, যাতে ব্যবহারকারী যখন সেই ফিচারটি ব্যবহার করেন, কেবল তখনই তা ডাউনলোড হয়। অন্যদিকে, ইনস্ট্যান্ট অ্যাপস ব্যবহারকারীদের ইউআরএল বা গুগল প্লে বাটনের মাধ্যমে একটি অত্যন্ত হালকা বেস মডিউল লোড করে অ্যাপটি ইনস্টল না করেই ব্যবহার করার সুযোগ দেয়।
নির্ভরশীলতার নিরীক্ষা এবং চূড়ান্ত বিবরণ
কখনও কখনও সমস্যাটা আপনার কোডে নয়, বরং আপনি বাইরে থেকে যা নিয়ে আসছেন তাতে। Guava বা Jackson-এর মতো লাইব্রেরিগুলো বেশ বড় হতে পারে; এগুলোর পরিবর্তে kotlinx.serialization বা Gson-এর মতো হালকা বিকল্প ব্যবহার করার কথা ভাবতে পারেন । এছাড়াও, আপনার অ্যাসেটসে বড় TTF ফাইল যুক্ত করার পরিবর্তে Google Fonts থেকে ডাউনলোডযোগ্য ফন্ট ব্যবহার করার পরামর্শ দেওয়া হয়, যা একটি ফন্টের একাধিক সংস্করণ ব্যবহার করলে আপনার বেশ কয়েক মেগাবাইট জায়গা বাঁচাতে পারে।
অপ্টিমাইজেশন চক্রটি সম্পূর্ণ করতে, মনে রাখবেন যে অ্যান্ড্রয়েড গো একটি ক্রমবর্ধমান বাজার। আপনি যদি চান আপনার অ্যাপটি ১ জিবির কম র্যামযুক্ত ডিভাইসেও ভালোভাবে কাজ করুক, তবে এর সাইজ ৪০ এমবি-র নিচে রাখার চেষ্টা করুন। অ্যান্ড্রয়েড লিন্ট ব্যবহার করে অনাথ রিসোর্স শনাক্ত করা এবং একটি ধারাবাহিক পরিষ্করণ রুটিন বজায় রাখলে, ডিভাইসের ক্ষমতা নির্বিশেষে আপনার অ্যাপটি কার্যকর হবে, দ্রুত ইনস্টল হবে এবং ব্যবহারকারীকে একটি সাবলীল অভিজ্ঞতা দেবে।