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

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

প্রতিফলনের চেয়ে কোডজেন পছন্দ করুন

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

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

লাইব্রেরি নির্বাচন করার সময় সাধারণ টিপস

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

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

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

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

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

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

নিয়ম সংযোজন হয়

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

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

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

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

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

আপনার এমন লাইব্রেরিগুলি এড়ানো উচিত যাতে এমন নিয়ম থাকে যেগুলি এমন কোড বজায় রাখে যা সত্যিই সরানো উচিত। কিন্তু আপনি যদি সেগুলি ব্যবহার করতে চান তবে আপনি নিম্নলিখিত কোডে দেখানো নিয়মগুলি ফিল্টার করতে পারেন:

// 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 সাধারণত ব্যবহার করা হয়, যা রানটাইমে সহজেই ক্র্যাশ হতে পারে। লক্ষ্য করুন যে আপনি যখন ইউজার অবজেক্টের একটি তালিকা পেতে Gson ব্যবহার করেন, আপনি কনস্ট্রাক্টরকে কল করবেন না বা fromJson() ফাংশনে একটি ফ্যাক্টরি পাস করবেন না। নিচের কোনটি ছাড়াই অ্যাপ-সংজ্ঞায়িত ক্লাস নির্মাণ বা ব্যবহার করা একটি চিহ্ন যে একটি লাইব্রেরি ওপেন-এন্ডেড প্রতিফলন ব্যবহার করতে পারে:

  • অ্যাপ ক্লাস একটি লাইব্রেরি, বা স্ট্যান্ডার্ড ইন্টারফেস বা ক্লাস বাস্তবায়ন করছে
  • কোড জেনারেশন প্লাগইন যেমন কেএসপি
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 instantiated দেখতে পায় না, তখন এটি ক্ষেত্রগুলির নাম পরিবর্তন করতে পারে, বা কনস্ট্রাক্টরগুলিকে অপসারণ করতে পারে যা ব্যবহার করা হচ্ছে বলে মনে হয় না, যার ফলে আপনার অ্যাপ ক্র্যাশ হয়ে যায়। আপনি যদি একইভাবে অন্য কোনো লাইব্রেরি ব্যবহার করেন, তাহলে আপনার পরীক্ষা করা উচিত যে তারা অ্যাপ অপ্টিমাইজেশানে হস্তক্ষেপ করবে না, এবং যদি তারা করে তবে সেগুলি এড়িয়ে চলুন।

মনে রাখবেন যে রুম এবং হিল্ট উভয়ই অ্যাপের সংজ্ঞায়িত প্রকারগুলি তৈরি করে, কিন্তু প্রতিফলনের প্রয়োজন এড়াতে কোডজেন ব্যবহার করে।