অ্যাপ অপ্টিমাইজেশন সক্ষম করতে, আপনাকে অবশ্যই এমন লাইব্রেরি ব্যবহার করতে হবে যা অ্যান্ড্রয়েড অপ্টিমাইজেশনের সাথে সামঞ্জস্যপূর্ণ। যদি কোনও লাইব্রেরি অ্যান্ড্রয়েড অপ্টিমাইজেশনের জন্য কনফিগার করা না থাকে—উদাহরণস্বরূপ, যদি এটি সম্পর্কিত Keep নিয়মগুলিকে বান্ডেল না করে প্রতিফলন ব্যবহার করে—তাহলে এটি একটি অ্যান্ড্রয়েড অ্যাপের জন্য উপযুক্ত নাও হতে পারে। এই পৃষ্ঠাটি ব্যাখ্যা করে কেন কিছু লাইব্রেরি অ্যাপ অপ্টিমাইজেশনের জন্য বেশি উপযুক্ত এবং আপনাকে বেছে নিতে সাহায্য করার জন্য সাধারণ টিপস প্রদান করে।
প্রতিফলনের চেয়ে কোডজেনকে বেশি প্রাধান্য দিন
সাধারণত, আপনার এমন লাইব্রেরি নির্বাচন করা উচিত যা প্রতিফলনের পরিবর্তে কোড জেনারেশন ( codegen ) ব্যবহার করে। কোডজেনের সাহায্যে, অপ্টিমাইজার আরও সহজেই নির্ধারণ করতে পারে যে রানটাইমে আসলে কোন কোড ব্যবহার করা হচ্ছে এবং কোন কোডটি সরানো যেতে পারে। কোনও লাইব্রেরি কোডজেন ব্যবহার করে নাকি প্রতিফলন ব্যবহার করে তা বলা কঠিন হতে পারে, তবে কিছু লক্ষণ রয়েছে - সাহায্যের জন্য টিপস দেখুন।
কোডজেন বনাম প্রতিফলন সম্পর্কে আরও তথ্যের জন্য, লাইব্রেরি লেখকদের জন্য অপ্টিমাইজেশন দেখুন।
লাইব্রেরি নির্বাচনের ক্ষেত্রে সাধারণ টিপস
আপনার লাইব্রেরিগুলি অ্যাপ অপ্টিমাইজেশনের সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করতে এই টিপসগুলি ব্যবহার করুন।
অপ্টিমাইজেশনের সমস্যাগুলি পরীক্ষা করুন
নতুন লাইব্রেরি তৈরির কথা ভাবার সময়, লাইব্রেরির ইস্যু ট্র্যাকার এবং অনলাইন আলোচনাগুলি দেখে নিন যে মিনিফিকেশন বা অ্যাপ অপ্টিমাইজেশন কনফিগার করার ক্ষেত্রে কোনও সমস্যা আছে কিনা। যদি থাকে, তাহলে আপনার সেই লাইব্রেরির বিকল্পগুলি খুঁজে বের করার চেষ্টা করা উচিত। নিম্নলিখিত বিষয়গুলি মনে রাখবেন:
- অ্যান্ড্রয়েডএক্স লাইব্রেরি এবং হিল্টের মতো লাইব্রেরিগুলি অ্যাপ অপ্টিমাইজেশনের সাথে ভালোভাবে কাজ করে কারণ তারা প্রতিফলনের পরিবর্তে কোডজেন ব্যবহার করে। যখন তারা প্রতিফলন ব্যবহার করে, তখন তারা কেবলমাত্র প্রয়োজনীয় কোডটি রাখার জন্য ন্যূনতম কিপ নিয়ম প্রদান করে।
- সিরিয়ালাইজেশন লাইব্রেরিগুলি প্রায়শই বয়লারপ্লেট কোড এড়াতে প্রতিফলন ব্যবহার করে যখন বস্তুগুলি তাত্ক্ষণিক বা সিরিয়ালাইজ করা হয়। প্রতিফলন-ভিত্তিক পদ্ধতির (যেমন JSON-এর জন্য Gson) পরিবর্তে, এই সমস্যাগুলি এড়াতে কোডজেন ব্যবহার করে এমন লাইব্রেরিগুলি সন্ধান করুন, উদাহরণস্বরূপ Kotlin সিরিয়ালাইজেশন ব্যবহার করে।
- যেসব লাইব্রেরিতে প্যাকেজ-ওয়াইড কিপ রুলস থাকে, সেগুলো সম্ভব হলে এড়িয়ে চলা উচিত। প্যাকেজ-ওয়াইড কিপ রুলস ত্রুটি সমাধানে সাহায্য করতে পারে, কিন্তু ব্রড কিপ রুলসগুলিকে শেষ পর্যন্ত পরিমার্জিত করা উচিত যাতে শুধুমাত্র প্রয়োজনীয় কোডটিই রাখা যায়। আরও তথ্যের জন্য, অ্যাডপ্ট অপ্টিমাইজেশন ইনক্রিমেন্টাললি দেখুন।
- লাইব্রেরিগুলিতে আপনার প্রকল্পের ডকুমেন্টেশন থেকে কিপ রুলস কপি করে ফাইলে পেস্ট করার প্রয়োজন নেই, বিশেষ করে প্যাকেজ-ব্যাপী কিপ রুলস নয়। এই নিয়মগুলি দীর্ঘমেয়াদে অ্যাপ ডেভেলপারের উপর রক্ষণাবেক্ষণের বোঝা হয়ে ওঠে এবং সময়ের সাথে সাথে অপ্টিমাইজ করা এবং পরিবর্তন করা কঠিন।
একটি নতুন লাইব্রেরি যোগ করার পরে অপ্টিমাইজেশন সক্ষম করুন
যখন আপনি একটি নতুন লাইব্রেরি যোগ করবেন, তখন পরে অপ্টিমাইজেশন সক্ষম করুন এবং ত্রুটি আছে কিনা তা পরীক্ষা করুন। যদি ত্রুটি থাকে, তাহলে সেই লাইব্রেরির বিকল্পগুলি সন্ধান করুন অথবা "keep rules" লিখুন। যদি কোনও লাইব্রেরি অপ্টিমাইজেশনের সাথে সামঞ্জস্যপূর্ণ না হয়, তাহলে সেই লাইব্রেরিতে একটি বাগ ফাইল করুন।
নিয়মগুলি যোগযোগ্য
মনে রাখবেন যে keep নিয়মগুলি সংযোজনমূলক। এর অর্থ হল লাইব্রেরি নির্ভরতাতে অন্তর্ভুক্ত কিছু নিয়ম সরানো যাবে না এবং আপনার অ্যাপের অন্যান্য অংশের সংকলনের উপর প্রভাব ফেলতে পারে। উদাহরণস্বরূপ, যদি কোনও লাইব্রেরিতে কোড অপ্টিমাইজেশন অক্ষম করার জন্য একটি নিয়ম অন্তর্ভুক্ত থাকে, তবে সেই নিয়মটি আপনার সম্পূর্ণ প্রকল্পের জন্য অপ্টিমাইজেশন অক্ষম করে।
প্রতিফলনের ব্যবহার পরীক্ষা করুন (উন্নত)
কোনও লাইব্রেরি তার কোড পরীক্ষা করে প্রতিফলন ব্যবহার করে কিনা তা আপনি বলতে পারবেন। যদি লাইব্রেরি প্রতিফলন ব্যবহার করে, তাহলে পরীক্ষা করুন যে এটি সম্পর্কিত রাখা নিয়ম প্রদান করে। একটি লাইব্রেরি সম্ভবত প্রতিফলন ব্যবহার করছে যদি এটি নিম্নলিখিত কাজ করে:
-
kotlin.reflectবাjava.lang.reflectপ্যাকেজ থেকে ক্লাস বা পদ্ধতি ব্যবহার করে -
Class.forNameঅথবাclassLoader.getClassফাংশন ব্যবহার করে। - রানটাইমে অ্যানোটেশনগুলি পড়ে, উদাহরণস্বরূপ, যদি এটি
val value = myClass.getAnnotation()অথবাval value = myMethod.getAnnotation()ব্যবহার করে একটি অ্যানোটেশন মান সংরক্ষণ করে এবং তারপরvalueসহ কিছু করে। পদ্ধতির নামটি স্ট্রিং হিসেবে ব্যবহার করে পদ্ধতিগুলিকে কল করে, উদাহরণস্বরূপ:
// Calls the private `processData` API with reflection myObject.javaClass.getMethod("processData", DataType::class.java) ?.invoke(myObject, data)
খারাপ কিপ নিয়ম ফিল্টার করুন (উন্নত)
আপনার এমন লাইব্রেরি এড়িয়ে চলা উচিত যেখানে Keep নিয়ম থাকে এবং এমন কোড ধরে রাখে যা সত্যিই অপসারণ করা উচিত। কিন্তু যদি আপনাকে অবশ্যই সেগুলি ব্যবহার করতে হয়, তাহলে আপনি নিম্নলিখিত কোডে দেখানো নিয়মগুলি ফিল্টার করে বের করতে পারেন:
// If you're using AGP 8.4 and higher
buildTypes {
release {
optimization.keepRules {
it.ignoreFrom("com.somelibrary:somelibrary")
}
}
}
// If you're using AGP 7.3-8.3
buildTypes {
release {
optimization.keepRules {
it.ignoreExternalDependencies("com.somelibrary:somelibrary")
}
}
}
কেস স্টাডি: কেন Gson অপ্টিমাইজেশনের সাথে বিরতি নেয়
Gson হল একটি সিরিয়ালাইজেশন লাইব্রেরি যা প্রায়শই অ্যাপ অপ্টিমাইজেশনের সাথে সমস্যা তৈরি করে কারণ এটি প্রচুর পরিমাণে প্রতিফলন ব্যবহার করে। নিম্নলিখিত কোড স্নিপেটটি দেখায় যে Gson সাধারণত কীভাবে ব্যবহৃত হয়, যা রানটাইমে সহজেই ক্র্যাশের কারণ হতে পারে। লক্ষ্য করুন যে যখন আপনি User অবজেক্টের তালিকা পেতে Gson ব্যবহার করেন, তখন আপনি কনস্ট্রাক্টরকে কল করেন না বা fromJson() ফাংশনে একটি ফ্যাক্টরি পাস করেন না। নিম্নলিখিতগুলির কোনওটি ছাড়াই অ্যাপ-সংজ্ঞায়িত ক্লাস তৈরি বা ব্যবহার করা একটি লক্ষণ যে একটি লাইব্রেরি ওপেন-এন্ডেড প্রতিফলন ব্যবহার করছে:
- অ্যাপ ক্লাস একটি লাইব্রেরি, অথবা স্ট্যান্ডার্ড ইন্টারফেস বা ক্লাস বাস্তবায়ন করছে
- KSP এর মতো কোড জেনারেশন প্লাগইন
class User(val name: String)
class UserList(val users: List<User>)
// This code runs in debug mode, but crashes when optimizations are enabled
Gson().fromJson("""[{"name":"myname"}]""", User::class.java).toString()
যখন R8 এই কোডটি বিশ্লেষণ করে এবং UserList বা User কোথাও ইনস্ট্যান্টিয়েট করা দেখতে পায় না, তখন এটি ক্ষেত্রগুলির নাম পরিবর্তন করতে পারে, অথবা এমন কনস্ট্রাক্টরগুলি সরিয়ে ফেলতে পারে যা ব্যবহার করা হচ্ছে বলে মনে হয় না, যার ফলে আপনার অ্যাপটি ক্র্যাশ হয়ে যায়। আপনি যদি একইভাবে অন্য কোনও লাইব্রেরি ব্যবহার করেন, তাহলে আপনার পরীক্ষা করা উচিত যে তারা অ্যাপ অপ্টিমাইজেশনে হস্তক্ষেপ করবে না, এবং যদি তা করে, তাহলে সেগুলি এড়িয়ে চলুন।
মনে রাখবেন যে Room এবং Hilt উভয়ই অ্যাপ-নির্দিষ্ট প্রকার তৈরি করে, কিন্তু প্রতিফলনের প্রয়োজন এড়াতে কোডজেন ব্যবহার করে।