মেমরি ব্যবহার অপ্টিমাইজ করুন

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

অতিরিক্ত মেমরি ব্যবহারের ফলে অ্যাপ এবং সিস্টেমের আচরণে নিম্নলিখিত সমস্যাগুলো দেখা দিতে পারে:

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

টিভি ডিভাইসে মেমরি সংক্রান্ত বিবেচ্য বিষয়

টিভি ডিভাইসগুলিতে সাধারণত ফোন বা ট্যাবলেটের তুলনায় অনেক কম মেমরি থাকে। উদাহরণস্বরূপ, টিভিতে আমরা যে কনফিগারেশন দেখতে পাই তা হলো ১ জিবি র‍্যাম এবং ১০৮০পি ভিডিও রেজোলিউশন । একই সাথে, বেশিরভাগ টিভি অ্যাপের ফিচারগুলো একই রকম; তাই সেগুলোর বাস্তবায়ন এবং চ্যালেঞ্জগুলোও একই ধরনের। এই দুটি পরিস্থিতি এমন কিছু সমস্যা তৈরি করে যা অন্য ধরনের ডিভাইস এবং অ্যাপে দেখা যায় না:

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

টিভি ডিভাইসগুলি বুঝুন

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

টিভি ডিভাইসগুলোর ক্ষেত্রে এই বৈশিষ্ট্যগুলো বিবেচনা করুন:

  • ডিভাইস মেমরি : ডিভাইসটিতে ইনস্টল করা র‍্যান্ডম অ্যাক্সেস মেমরি (RAM)-এর পরিমাণ।
  • ডিভাইস UI রেজোলিউশন : যে রেজোলিউশনটি ডিভাইসটি OS এবং অ্যাপ্লিকেশন UI রেন্ডার করতে ব্যবহার করে; এটি সাধারণত ডিভাইসের ভিডিও রেজোলিউশনের চেয়ে কম হয়।
  • ভিডিও রেজোলিউশন : যে সর্বোচ্চ রেজোলিউশনে ডিভাইসটি ভিডিও চালাতে পারে।

এর ফলে বিভিন্ন ধরনের ডিভাইসকে শ্রেণিবদ্ধ করা যায় এবং সেগুলোতে মেমরি কীভাবে ব্যবহার করা উচিত, তা নির্ধারণ করা সম্ভব হয়।

টিভি ডিভাইসের সারাংশ

ডিভাইস মেমরি ডিভাইসের ভিডিও রেজোলিউশন ডিভাইস UI রেজোলিউশন isLowRAMDevice()
১ জিবি ১০৮০পি ৭২০পি হ্যাঁ
১.৫ জিবি ২১৬০পি ১০৮০পি হ্যাঁ
≥১.৫ জিবি ১০৮০পি ৭২০পি বা ১০৮০পি না*
≥২ জিবি ২১৬০পি ১০৮০পি না*

কম র‍্যামের টিভি ডিভাইস

এই ডিভাইসগুলো মেমোরির সীমাবদ্ধতার মধ্যে রয়েছে এবং ActivityManager.isLowRAMDevice() true হিসেবে রিপোর্ট করবে। কম র‍্যামের টিভি ডিভাইসে চালিত অ্যাপ্লিকেশনগুলোকে অতিরিক্ত মেমোরি নিয়ন্ত্রণের ব্যবস্থা গ্রহণ করতে হবে।

নিম্নলিখিত বৈশিষ্ট্যসম্পন্ন ডিভাইসগুলোকে আমরা এই বিভাগের অন্তর্ভুক্ত বলে মনে করি:

  • ১ জিবি ডিভাইস : ১ জিবি র‍্যাম, ৭২০পি/এইচডি (১২৮০x৭২০) ইউআই রেজোলিউশন, ১০৮০পি/ফুলএইচডি (১৯২০x১০৮০) ভিডিও রেজোলিউশন
  • ১.৫ জিবি ডিভাইস : ১.৫ জিবি র‍্যাম, ১০৮০পি/ফুলএইচডি (১৯২০x১০৮০) ইউআই রেজোলিউশন, ২১৬০পি/আল্ট্রাএইচডি/৪কে (৩৮৪০x২১৬০) ভিডিও রেজোলিউশন
  • অন্যান্য পরিস্থিতি যেখানে অতিরিক্ত মেমরি সীমাবদ্ধতার কারণে OEM ActivityManager.isLowRAMDevice() ফ্ল্যাগটি নির্ধারণ করেছে।

নিয়মিত টিভি ডিভাইস

এই ডিভাইসগুলো তেমন উল্লেখযোগ্য মেমোরি চাপের পরিস্থিতিতে ভোগে না। আমরা এই ডিভাইসগুলোকে নিম্নলিখিত বৈশিষ্ট্যসম্পন্ন বলে মনে করি:

  • ≥১.৫ জিবি র‍্যাম, ৭২০পি বা ১০৮০পি ইউআই এবং ১০৮০পি ভিডিও রেজোলিউশন
  • ≥২ জিবি র‍্যাম, ১০৮০পি ইউআই এবং ১০৮০পি বা ২১৬০পি ভিডিও রেজোলিউশন

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

কম র‍্যামের টিভি ডিভাইসগুলিতে মেমরি টার্গেট

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

মেমরি প্রোফাইলার

‘মেমরি কীভাবে গণনা করা হয়’ বিভাগে আপনি রিপোর্ট করা মেমরির পরিসংখ্যানের একটি বিশদ ব্যাখ্যা পাবেন। টিভি অ্যাপের জন্য থ্রেশহোল্ড নির্ধারণের ক্ষেত্রে , আমরা তিনটি মেমরি ক্যাটাগরির উপর মনোযোগ দেব:

  • অ্যানোনিমাস + সোয়াপ : অ্যান্ড্রয়েড স্টুডিওতে জাভা + নেটিভ + স্ট্যাক মেমরি অ্যালোকেশন দ্বারা গঠিত।
  • গ্রাফিক্স : প্রোফাইলার টুলে সরাসরি রিপোর্ট করা হয়। সাধারণত গ্রাফিক্স টেক্সচার দ্বারা গঠিত।
  • ফাইল : অ্যান্ড্রয়েড স্টুডিওতে "কোড" + "অন্যান্য" বিভাগ হিসেবে রিপোর্ট করা হয়েছে।

এই সংজ্ঞাগুলো অনুসারে, নিম্নলিখিত সারণিটি নির্দেশ করে যে প্রতিটি ধরণের মেমরি গ্রুপের জন্য সর্বোচ্চ কত মান ব্যবহার করা উচিত:

স্মৃতির ধরণ উদ্দেশ্য ব্যবহারের লক্ষ্যমাত্রা (১ জিবি)
অ্যানোনিমাস + সোয়াপ (জাভা + নেটিভ + স্ট্যাক) মেমরি বরাদ্দ, মিডিয়া বাফার, ভেরিয়েবল এবং অন্যান্য মেমরি-নিবিড় কাজের জন্য ব্যবহৃত হয়। ১৬০ এমবি-র কম
গ্রাফিক্স টেক্সচার এবং ডিসপ্লে সম্পর্কিত বাফারগুলির জন্য জিপিইউ দ্বারা ব্যবহৃত হয় ৩০-৪০ এমবি
ফাইল মেমরিতে থাকা কোড পেজ এবং ফাইলের জন্য ব্যবহৃত হয়। ৬০-৮০ এমবি

সর্বোচ্চ মোট মেমরি (অ্যানন+সোয়াপ + গ্রাফিক্স + ফাইল) নিম্নলিখিত পরিমাণ অতিক্রম করবে না :

  • ১ জিবি কম র‍্যামের ডিভাইসগুলোর জন্য মোট ২৮০ এমবি মেমরি ব্যবহৃত হয় ( অ্যানন+সোয়াপ + গ্রাফিক্স + ফাইল )।

এটি অতিক্রম না করার জন্য দৃঢ়ভাবে সুপারিশ করা হচ্ছে:

  • ( Anon+Swap + Graphics )-এ ২০০ মেগাবাইট মেমরি ব্যবহৃত হচ্ছে।

ফাইল মেমরি

ফাইল-সমর্থিত মেমরির ক্ষেত্রে সাধারণ নির্দেশিকা হিসেবে মনে রাখবেন যে:

  • সাধারণত অপারেটিং সিস্টেমের মেমরি ম্যানেজমেন্ট ফাইল মেমরি ভালোভাবে পরিচালনা করে।
  • এই মুহূর্তে আমরা এটিকে স্মৃতিশক্তির উপর চাপের একটি প্রধান কারণ হিসেবে পাইনি।

তবে, সাধারণভাবে ফাইল মেমরি নিয়ে কাজ করার সময়:

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

নির্দিষ্ট টিভি সুপারিশ

এই বিভাগে টিভি ডিভাইসে মেমরি ব্যবহার অপ্টিমাইজ করার জন্য নির্দিষ্ট সুপারিশ প্রদান করা হয়েছে।

গ্রাফিক্স মেমরি

উপযুক্ত ইমেজ ফরম্যাট এবং রেজোলিউশন ব্যবহার করুন।

  • ডিভাইসের UI রেজোলিউশনের চেয়ে বেশি রেজোলিউশনের ছবি লোড করবেন না। উদাহরণস্বরূপ, 720p UI যুক্ত ডিভাইসে 1080p ছবিকে 720p-তে ডাউনসাইজ করতে হবে।
  • সম্ভব হলে হার্ডওয়্যার-সমর্থিত বিটম্যাপ ব্যবহার করুন
    • Glide-এর মতো লাইব্রেরিতে, Downsampler.ALLOW_HARDWARE_CONFIG ফিচারটি সক্রিয় করুন, যা ডিফল্টরূপে নিষ্ক্রিয় থাকে। এটি সক্রিয় করলে বিটম্যাপের প্রতিলিপি তৈরি হওয়া এড়ানো যায়, যা অন্যথায় গ্রাফিক্স মেমরি এবং অ্যানোনিমাস মেমরি উভয় স্থানেই থাকতো।
  • মধ্যবর্তী রেন্ডার এবং পুনঃরেন্ডার পরিহার করুন
  • সম্ভব হলে প্লেসহোল্ডার ইমেজ লোড করা এড়িয়ে চলুন , প্লেসহোল্ডার টেক্সচারের জন্য @android:color/ বা @color ব্যবহার করুন।
  • ডিভাইসে একাধিক ছবি একত্রিত করা এড়িয়ে চলুন, যখন কাজটি অফলাইনে করা সম্ভব। ডাউনলোড করা ছবি থেকে কম্পোজিশন করার পরিবর্তে স্বতন্ত্র ছবি লোড করাকে অগ্রাধিকার দিন।
  • বিটম্যাপ আরও ভালোভাবে ব্যবহার করার জন্য 'বিটম্যাপ পরিচালনা' নির্দেশিকাটি অনুসরণ করুন।

অ্যানন+সোয়াপ মেমরি

অ্যান্ড্রয়েড স্টুডিও মেমরি প্রোফাইলার অনুযায়ী, Anon+Swap হলো Native + Java + Stack অ্যালোকেশনের সমন্বয়ে গঠিত। ডিভাইসটি মেমরি-সীমাবদ্ধ কিনা তা পরীক্ষা করতে ActivityManager.isLowMemoryDevice() ব্যবহার করুন এবং এই নির্দেশিকাগুলো অনুসরণ করে পরিস্থিতি অনুযায়ী ব্যবস্থা নিন।

  • মিডিয়া:
    • ডিভাইসের র‍্যাম এবং ভিডিও প্লেব্যাক রেজোলিউশনের উপর নির্ভর করে মিডিয়া বাফারের জন্য একটি পরিবর্তনশীল আকার নির্দিষ্ট করুন । এটি ১ মিনিটের ভিডিও প্লেব্যাকের জন্য যথেষ্ট হওয়া উচিত।
      1. ১ জিবি / ১০৮০পি এর জন্য ৪০-৬০ এমবি
      2. ১.৫ জিবি / ১০৮০পি এর জন্য ৬০-৮০ এমবি
      3. ১.৫ জিবি / ২১৬০পি এর জন্য ৮০-১০০ এমবি
      4. ২ জিবি / ২১৬০পি এর জন্য ১০০-১২০ এমবি
    • এপিসোড পরিবর্তন করার সময় মিডিয়া মেমোরির বরাদ্দ মুক্ত করুন, যাতে মোট অ্যানোনিমাস মেমোরির পরিমাণ বৃদ্ধি না পায়।
    • আপনার অ্যাপ বন্ধ হওয়ার সাথে সাথে মিডিয়া রিসোর্সগুলো তাৎক্ষণিকভাবে রিলিজ ও বন্ধ করুন : অডিও এবং ভিডিও রিসোর্সগুলো পরিচালনা করতে অ্যাক্টিভিটি লাইফসাইকেল কলব্যাক ব্যবহার করুন। আপনি যদি অডিও অ্যাপ না হন, তবে আপনার অ্যাক্টিভিটিতে onStop() কল হলে প্লেব্যাক বন্ধ করুন , আপনার চলমান সমস্ত কাজ সেভ করুন এবং রিসোর্সগুলো রিলিজ করার জন্য সেট করুন। পরবর্তীতে আপনার প্রয়োজন হতে পারে এমন কাজ শিডিউল করতে, জবস অ্যান্ড অ্যালার্মস (Jobs and Alarms) বিভাগটি দেখুন।
    • ভিডিও সিকিং করার সময় বাফারের মেমরির দিকে মনোযোগ দিন : ডেভেলপাররা প্রায়শই ব্যবহারকারীর জন্য ভিডিও প্রস্তুত রাখতে সিকিং করার সময় অতিরিক্ত ১৫-৬০ সেকেন্ডের ফিউচার কন্টেন্ট বরাদ্দ করে, কিন্তু এটি অতিরিক্ত মেমরি ওভারহেড তৈরি করে। সাধারণত, ব্যবহারকারী নতুন ভিডিও পজিশন নির্বাচন না করা পর্যন্ত ৫ সেকেন্ডের বেশি ফিউচার বাফার নেবেন না। যদি সিকিং করার সময় আপনার অতিরিক্ত সময় প্রি-বাফার করার একান্ত প্রয়োজন হয়, তবে নিশ্চিত করুন:
      • সিকিং বাফারটি আগে থেকেই বরাদ্দ করুন এবং পুনরায় ব্যবহার করুন।
      • বাফার সাইজ ১৫-২৫ মেগাবাইটের বেশি হওয়া উচিত নয় (ডিভাইসের মেমরির উপর নির্ভর করে)।
  • বরাদ্দ:
    • অ্যানোনিমাস মেমরিতে যাতে ছবির প্রতিলিপি তৈরি না হয়, তা নিশ্চিত করতে গ্রাফিক্স মেমরি নির্দেশিকা ব্যবহার করুন।
      • ছবিগুলো প্রায়শই মেমোরির সবচেয়ে বড় অংশ ব্যবহার করে, তাই এগুলোর পুনরাবৃত্তি ডিভাইসের উপর অনেক চাপ সৃষ্টি করতে পারে। ইমেজ গ্রিডভিউতে ঘন ঘন নেভিগেশনের সময় এটি বিশেষভাবে সত্য।
    • স্ক্রিন স্থানান্তরের সময় অ্যালোকেশনগুলোর রেফারেন্স বাদ দিয়ে সেগুলোকে মুক্ত করুন : নিশ্চিত করুন যেন বিটম্যাপ এবং অবজেক্টের কোনো রেফারেন্স পিছনে থেকে না যায়।
  • গ্রন্থাগার:
    • নতুন লাইব্রেরি যোগ করার সময় সেগুলোর মেমরি অ্যালোকেশন প্রোফাইল করুন , কারণ সেগুলো অতিরিক্ত লাইব্রেরিও লোড করতে পারে, যেগুলোও অ্যালোকেশন করতে এবং বাইন্ডিং তৈরি করতে পারে।
  • নেটওয়ার্কিং:
    • অ্যাপ চালু হওয়ার সময় ব্লকিং নেটওয়ার্ক কল করবেন না , কারণ এগুলো অ্যাপ্লিকেশন চালু হওয়ার সময়কে ধীর করে দেয় এবং লঞ্চের সময় অতিরিক্ত মেমরি ওভারহেড তৈরি করে, যখন অ্যাপ লোডের কারণে মেমরি বিশেষভাবে সীমিত থাকে। প্রথমে একটি লোডিং বা স্প্ল্যাশ স্ক্রিন দেখান এবং UI প্রস্তুত হয়ে গেলে নেটওয়ার্ক রিকোয়েস্টগুলো করুন।

বাঁধাই

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

সাধারণ বাঁধাই এবং সর্বোত্তম অনুশীলন:

  • প্লে ইন্টিগ্রিটি এপিআই : ডিভাইসের অখণ্ডতা যাচাই করতে ব্যবহৃত হয়।
    • লোডিং স্ক্রিনের পরে এবং মিডিয়া প্লেব্যাকের আগে ডিভাইসের অখণ্ডতা পরীক্ষা করুন।
    • কন্টেন্ট প্লে করার আগে PlayIntegrity StandardIntegrityManager এর রেফারেন্সগুলো রিলিজ করুন।
  • প্লে বিলিং লাইব্রেরি : গুগল প্লে ব্যবহার করে সাবস্ক্রিপশন এবং কেনাকাটা পরিচালনা করার জন্য ব্যবহৃত হয়।
    • লোডিং স্ক্রিনের পরে লাইব্রেরিটি চালু করুন এবং যেকোনো মিডিয়া চালানোর আগে বিলিং সংক্রান্ত সমস্ত কাজ সম্পন্ন করুন।
    • লাইব্রেরির ব্যবহার শেষ হলে এবং ভিডিও বা মিডিয়া চালানোর আগে সর্বদা BillingClient.endConnection() ব্যবহার করুন।
    • যদি বিলিং সংক্রান্ত কোনো কাজ পুনরায় করার প্রয়োজন হয়, তবে সার্ভিসটি সংযোগ বিচ্ছিন্ন হয়েছে কিনা তা পরীক্ষা করতে BillingClient.isReady() এবং BillingClient.getConnectionState() ব্যবহার করুন এবং কাজ শেষ হলে আবার BillingClient.endConnection() কল করুন।
  • জিএমএস ফন্টসপ্রোভাইডার
    • কম র‍্যামের ডিভাইসে ফন্ট প্রোভাইডার ব্যবহার করার পরিবর্তে স্বতন্ত্র ফন্ট ব্যবহার করা শ্রেয়, কারণ ফন্ট ডাউনলোড করা ব্যয়বহুল এবং এই কাজটি করার জন্য ফন্টসপ্রোভাইডার বিভিন্ন সার্ভিস যুক্ত করে।
  • গুগল অ্যাসিস্ট্যান্ট লাইব্রেরি: এটি কখনও কখনও সার্চ এবং ইন-অ্যাপ সার্চের জন্য ব্যবহৃত হয়, সম্ভব হলে এই লাইব্রেরিটি প্রতিস্থাপন করুন।
    • লিনব্যাক অ্যাপের জন্য : জিবোর্ড টেক্সট টু স্পিচ অথবা androidx.leanback লাইব্রেরি ব্যবহার করুন।
      • সার্চ বাস্তবায়নের জন্য সার্চ নির্দেশিকা অনুসরণ করুন।
      • দ্রষ্টব্য: লিনব্যাক এখন আর ব্যবহার করা হয় না এবং অ্যাপগুলোর টিভি কম্পোজ ব্যবহার করা উচিত।
    • কম্পোজ অ্যাপগুলির জন্য :
      • ভয়েস সার্চ চালু করতে জিবোর্ড টেক্সট টু স্পিচ ব্যবহার করুন।
    • আপনার অ্যাপের মিডিয়া কন্টেন্টকে সহজে খুঁজে পাওয়ার উপযোগী করতে 'ওয়াচ নেক্সট' ফিচারটি প্রয়োগ করুন।

ফোরগ্রাউন্ড সার্ভিসেস

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

অ্যান্ড্রয়েড টিভি এবং গুগল টিভিতে, ব্যবহারকারী অ্যাপটি ছেড়ে যাওয়ার পরেই কেবল ফোরগ্রাউন্ড সার্ভিসগুলো চালু থাকার অনুমতি পায়:

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

চাকরি এবং অ্যালার্ম

WorkManager হলো ব্যাকগ্রাউন্ডে পুনরাবৃত্তিমূলক কাজ শিডিউল করার জন্য সর্বাধুনিক অ্যান্ড্রয়েড এপিআই। WorkManager নতুন JobScheduler (SDK 23+) ব্যবহার করবে যখন এটি উপলব্ধ থাকবে, এবং এটি উপলব্ধ না থাকলে পুরোনো AlarmManager ব্যবহার করবে। TV-তে শিডিউল করা কাজগুলো সম্পাদনের সর্বোত্তম পদ্ধতির জন্য এই সুপারিশগুলো অনুসরণ করুন:

  • SDK 23+ সংস্করণে AlarmManager API ব্যবহার করা থেকে বিরত থাকুন , বিশেষ করে AlarmManager.set() , AlarmManager.setExact() এবং এই জাতীয় মেথডগুলো, কারণ এগুলো সিস্টেমকে জবগুলো চালানোর সঠিক সময় নির্ধারণ করতে দেয় না (উদাহরণস্বরূপ, যখন ডিভাইসটি নিষ্ক্রিয় থাকে)।
  • কম র‍্যামের ডিভাইসে, একান্ত প্রয়োজন না হলে কোনো কাজ চালানো থেকে বিরত থাকুন। যদি প্রয়োজন হয়, তবে শুধুমাত্র প্লেব্যাকের পরে সুপারিশগুলো আপডেট করার জন্য WorkManager WorkRequest ব্যবহার করুন, এবং অ্যাপটি খোলা থাকা অবস্থাতেই তা করার চেষ্টা করুন।
  • সিস্টেমকে উপযুক্ত সময়ে আপনার কাজগুলো চালানোর অনুমতি দিতে WorkManager Constraints সংজ্ঞায়িত করুন:

কোটলিন

Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresStorageNotLow(true)
    .setRequiresDeviceIdle(true)
    .build()

জাভা

Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresStorageNotLow(true)
    .setRequiresDeviceIdle(true)
    .build()
  • যদি আপনাকে নিয়মিতভাবে কোনো কাজ চালাতেই হয় (উদাহরণস্বরূপ, অন্য কোনো ডিভাইসে আপনার অ্যাপে ব্যবহারকারীর কন্টেন্ট দেখার কার্যকলাপের উপর ভিত্তি করে ওয়াচ নেক্সট আপডেট করার জন্য), তাহলে কাজটি ৩০ মেগাবাইটের নিচে রেখে মেমরি ব্যবহার কম রাখুন।

সাধারণ স্মৃতি সংক্রান্ত বিবেচনা

নিম্নলিখিত নির্দেশিকাগুলো অ্যান্ড্রয়েড অ্যাপ ডেভেলপমেন্ট সম্পর্কে সাধারণ তথ্য প্রদান করে:

  • অবজেক্ট অ্যালোকেশন কমান, অবজেক্টের পুনঃব্যবহার অপ্টিমাইজ করুন এবং যেকোনো অব্যবহৃত অবজেক্ট দ্রুত ডি-অ্যালোকেট করুন।
    • অবজেক্টের, বিশেষ করে বিটম্যাপের, রেফারেন্স ধরে রাখবেন না
    • System.gc() এবং সরাসরি মেমরি রিলিজ কল ব্যবহার করা থেকে বিরত থাকুন, কারণ এগুলো সিস্টেমের মেমরি হ্যান্ডলিং প্রক্রিয়ায় হস্তক্ষেপ করে। উদাহরণস্বরূপ, zRAM ব্যবহারকারী ডিভাইসগুলোতে, মেমরির কম্প্রেশন এবং ডিকম্প্রেশনের কারণে gc() এর একটি জোরপূর্বক কল সাময়িকভাবে মেমরি ব্যবহার বাড়িয়ে দিতে পারে।
    • ভিউগুলোকে পুনঃব্যবহার করতে এবং তালিকার উপাদানগুলো পুনরায় তৈরি না করতে, বর্তমানে অপ্রচলিত Leanback UI টুলকিটের Compose-এর ক্যাটালগ ব্রাউজার বা RecyclerView এর মতো LazyList ব্যবহার করুন।
    • বাহ্যিক কন্টেন্ট প্রোভাইডার থেকে পড়া এমন উপাদানগুলোকে স্থানীয়ভাবে ক্যাশ করুন যেগুলোর পরিবর্তন হওয়ার সম্ভাবনা কম এবং এমন আপডেটিং ব্যবধান নির্ধারণ করুন যা অতিরিক্ত বাহ্যিক মেমরি বরাদ্দ করা প্রতিরোধ করে।
  • সম্ভাব্য মেমরি লিক পরীক্ষা করুন।
    • সাধারণ মেমোরি লিকের ঘটনাগুলো, যেমন—অ্যানোনিমাস থ্রেডের ভেতরের রেফারেন্স, ভিডিও বাফারের এমন পুনঃবরাদ্দ যা কখনো মুক্ত হয় না, এবং এই ধরনের অন্যান্য পরিস্থিতি সম্পর্কে সতর্ক থাকুন
    • মেমরি লিক ডিবাগ করতে হিপ ডাম্প ব্যবহার করুন।
  • কোল্ড স্টার্টে আপনার অ্যাপ চালানোর সময় প্রয়োজনীয় জাস্ট-ইন-টাইম কম্পাইলেশনের পরিমাণ কমাতে বেসলাইন প্রোফাইল তৈরি করুন।

সরাসরি স্মৃতি পুনরুদ্ধার বোঝা

যখন কোনো অ্যান্ড্রয়েড টিভি অ্যাপ্লিকেশন মেমরির জন্য অনুরোধ করে এবং সিস্টেম চাপের মধ্যে থাকে, তখন অ্যান্ড্রয়েডের ভিত্তি হিসেবে কাজ করা লিনাক্স কার্নেলকে সরাসরি মেমরি রিক্লেইম ব্যবহার করতে হতে পারে।

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

এর ফলে ব্যবহারকারীর অভিজ্ঞতায় লক্ষণীয় বিরতি বা ঝাঁকুনি দেখা দিতে পারে, কারণ পর্যাপ্ত মেমরি উপলব্ধ না হওয়া পর্যন্ত সিস্টেম থ্রেড বরাদ্দ করা থামিয়ে দেয়। এই অর্থে, থ্রেড বরাদ্দ করা শুধু malloc() এর মতো অ্যাপ্লিকেশন কোড কলের মধ্যেই সীমাবদ্ধ নয়; উদাহরণস্বরূপ, কোড পেজগুলোতেও মেমরি বরাদ্দ করার প্রয়োজন হয়।

সরঞ্জামগুলির সারাংশ