বুদ্ধিমানের সাথে লাইব্রেরি বেছে নিন

অ্যাপ অপ্টিমাইজেশন সক্ষম করতে, আপনাকে অবশ্যই এমন লাইব্রেরি ব্যবহার করতে হবে যা অ্যান্ড্রয়েড অপ্টিমাইজেশনের সাথে সামঞ্জস্যপূর্ণ। যদি কোনও লাইব্রেরি অ্যান্ড্রয়েড অপ্টিমাইজেশনের জন্য কনফিগার করা না থাকে—উদাহরণস্বরূপ, যদি এটি সম্পর্কিত Keep নিয়মগুলিকে বান্ডেল না করে প্রতিফলন ব্যবহার করে—তাহলে এটি একটি অ্যান্ড্রয়েড অ্যাপের জন্য উপযুক্ত নাও হতে পারে। এই পৃষ্ঠাটি ব্যাখ্যা করে কেন কিছু লাইব্রেরি অ্যাপ অপ্টিমাইজেশনের জন্য বেশি উপযুক্ত এবং আপনাকে বেছে নিতে সাহায্য করার জন্য সাধারণ টিপস প্রদান করে।

লাইব্রেরি নির্বাচনের ক্ষেত্রে সাধারণ টিপস

আপনার লাইব্রেরিগুলি অ্যাপ অপ্টিমাইজেশনের সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করতে এই টিপসগুলি ব্যবহার করুন।

প্রতিফলনের চেয়ে কোডজেনকে বেশি প্রাধান্য দিন

প্রতিফলনের পরিবর্তে কোড জেনারেশন ( codegen ) ব্যবহার করে এমন লাইব্রেরি বেছে নিন। কোডজেনের সাহায্যে, অপ্টিমাইজার রানটাইমে আসলে কোন কোড ব্যবহার করা হচ্ছে এবং কোন কোডটি সরানো যেতে পারে তা আরও সহজেই নির্ধারণ করতে পারে। কোনও লাইব্রেরি কোডজেন ব্যবহার করে নাকি প্রতিফলন ব্যবহার করে তা বলা কঠিন হতে পারে, তবে কিছু লক্ষণ রয়েছে - সাহায্যের জন্য টিপস দেখুন।

কোডজেন বনাম প্রতিফলন সম্পর্কে আরও তথ্যের জন্য, লাইব্রেরি লেখকদের জন্য অপ্টিমাইজেশন দেখুন।

প্রতিফলনের ব্যবহার পরীক্ষা করুন (উন্নত)

কোনও লাইব্রেরি তার কোড পরীক্ষা করে প্রতিফলন ব্যবহার করে কিনা তা আপনি জানতে পারবেন। যদি লাইব্রেরি প্রতিফলন ব্যবহার করে, তাহলে পরীক্ষা করুন যে এটি সংশ্লিষ্ট কিপ নিয়ম প্রদান করে। একটি লাইব্রেরি সম্ভবত প্রতিফলন ব্যবহার করে যদি এটি নিম্নলিখিত কাজ করে:

  • 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)
    

অপ্টিমাইজেশনের সমস্যাগুলি পরীক্ষা করুন

নতুন লাইব্রেরি তৈরির কথা ভাবার সময়, লাইব্রেরির ইস্যু ট্র্যাকার এবং অনলাইন আলোচনাগুলি দেখে নিন যে মিনিফিকেশন বা অ্যাপ অপ্টিমাইজেশন কনফিগার করার ক্ষেত্রে কোনও সমস্যা আছে কিনা। যদি থাকে, তাহলে আপনার সেই লাইব্রেরির বিকল্পগুলি খুঁজে বের করার চেষ্টা করা উচিত। নিম্নলিখিত বিষয়গুলি মনে রাখবেন:

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

একটি নতুন লাইব্রেরি যোগ করার পরে অপ্টিমাইজেশন সক্ষম করুন

যখন আপনি একটি নতুন লাইব্রেরি যোগ করবেন, তখন পরে অপ্টিমাইজেশন সক্ষম করুন এবং ত্রুটি আছে কিনা তা পরীক্ষা করুন। যদি ত্রুটি থাকে, তাহলে সেই লাইব্রেরির বিকল্পগুলি সন্ধান করুন অথবা "keep rules" লিখুন। যদি কোনও লাইব্রেরি অপ্টিমাইজেশনের সাথে সামঞ্জস্যপূর্ণ না হয়, তাহলে সেই লাইব্রেরিতে একটি বাগ ফাইল করুন।

খারাপ কিপ নিয়ম ফিল্টার করুন (উন্নত)

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

আপনার এমন লাইব্রেরি এড়িয়ে চলা উচিত যেখানে 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()

Gson-এ R8 কীভাবে কাজ করে তা বুঝতে, Gson consumer rules দেখুন। যখন R8 এই কোডটি বিশ্লেষণ করে এবং UserList বা User কোথাও ইনস্ট্যান্টিয়েট করা দেখতে পায় না, তখন এটি ক্ষেত্রগুলির নাম পরিবর্তন করতে পারে, অথবা এমন কনস্ট্রাক্টরগুলি সরিয়ে ফেলতে পারে যা ব্যবহার করা হচ্ছে বলে মনে হয় না, যার ফলে আপনার অ্যাপটি ক্র্যাশ হয়ে যায়। আপনি যদি একইভাবে অন্য কোনও লাইব্রেরি ব্যবহার করেন, তাহলে আপনার পরীক্ষা করা উচিত যে তারা অ্যাপ অপ্টিমাইজেশনে হস্তক্ষেপ করবে না, এবং যদি তা করে, তাহলে সেগুলি এড়িয়ে চলুন।

Gson এর কনজিউমার রুলের সাথে সামঞ্জস্যপূর্ণভাবে ক্লাসগুলি সংজ্ঞায়িত করতে, নিম্নলিখিত স্নিপেটটি রেফারেন্স হিসাবে ব্যবহার করুন:

class User(@com.google.gson.annotations.SerializedName("name") val name: String)
class UserList(@com.google.gson.annotations.SerializedName("users") val users: List<User>)

মনে রাখবেন যে Room , Hilt , এবং Moshi কোডজেন সহ অ্যাপ-সংজ্ঞায়িত প্রকার তৈরি করে, কিন্তু প্রতিফলনের প্রয়োজন এড়াতে কোডজেন ব্যবহার করে।