ক্যাশড অ্যাপস ফ্রিজার

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

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

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

অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) এবং এর পরবর্তী সংস্করণগুলোতে, ক্যাশড অ্যাপস ফ্রিজারটিতে নিম্নলিখিত শক্তিশালী বৈশিষ্ট্যগুলো অন্তর্ভুক্ত রয়েছে:

  • ক্যাশড অবস্থায় থাকা অ্যাপ প্রসেসগুলো ক্যাশড অবস্থায় প্রবেশ করার ১০ সেকেন্ড পর স্থির হয়ে যায়।
  • সিস্টেমটি কোনো লাইফসাইকেল ইভেন্টের সময় একটি ফ্রিজ হয়ে যাওয়া অ্যাপ প্রসেসকে তাৎক্ষণিকভাবে আনফ্রিজ করে। এই ইভেন্টগুলোর মধ্যে রয়েছে একটি ইন্টেন্ট গ্রহণ করা, একটি জব সার্ভিস চালু করা, অথবা ব্যবহারকারীর কোনো অ্যাক্টিভিটি পুনরায় শুরু করা।

ActivityManagerService অ্যাপের সমস্ত প্রসেস পরিচালনা করে এবং অ্যাপের জীবনচক্র সংক্রান্ত সিদ্ধান্ত গ্রহণ করে। CachedAppOptimizer অ্যাপ প্রসেসকে স্থির বা ফ্রিজ করার জন্য দায়ী।

যখন কোনো অ্যাপ প্রসেস ফ্রিজ হয়ে যায়, তখন এর সমস্ত থ্রেড স্থগিত হয়ে যায় এবং আনফ্রিজ না হওয়া পর্যন্ত সিপিইউ-এর কোনো কাজ করতে পারে না। এর ফলে, অ্যাপটি গার্বেজ কালেকশন (GC) করতে পারে না এবং মেমরি ট্রিম ইভেন্টে সাড়া দিতে পারে না। আরও তথ্যের জন্য, ComponentCallbacks2.onTrimMemory(int) দেখুন। এই বিষয়টি সমাধানের জন্য, অ্যান্ড্রয়েড ১৪ থেকে শুরু করে:

  • যেসব অ্যাপের একটি দৃশ্যমান Activity ইনস্ট্যান্স থাকে, সেগুলো ব্যাকগ্রাউন্ডে যাওয়ার সাথে সাথেই TRIM_MEMORY_UI_HIDDEN ইভেন্টের নোটিফিকেশন পায়। যেসব অ্যাপ UI ছাড়া লাইফসাইকেলে থাকে, যেমন ফোরগ্রাউন্ড সার্ভিসযুক্ত অ্যাপ, সেগুলো TRIM_MEMORY_BACKGROUND পেতে পারে। অন্যান্য ট্রিম ইভেন্টগুলো ডেলিভার করা হয় না, কারণ যখন অ্যাপগুলো সেই ইভেন্টগুলোর জন্য যোগ্য হয়, তখন সেগুলোকে ফ্রিজড বা স্থির থাকার কথা।
  • ক্যাশড অবস্থায় প্রবেশ করার কিছুক্ষণ পরেই, সম্ভাব্য ফ্রিজ হয়ে যাওয়ার প্রস্তুতির অংশ হিসেবে সিস্টেমটি অ্যাপ রানটাইমকে একটি GC (গার্বেজ কালেকশন) সম্পাদন করার জন্য অনুরোধ করতে পারে।
  • যখন কোনো অ্যাপ প্রসেস ফ্রিজ হয়ে যায়, তখন অতিরিক্ত মেমরি কম্প্যাকশন ধাপ সংঘটিত হতে পারে, যেমন ডার্টি পেজগুলোকে ব্যাকিং স্টোরেজে লেখা এবং অ্যানোনিমাস পেজগুলোকে ZRAM-এ সোয়াপ করা।
  • যদি কোনো নির্দিষ্ট অ্যাপের সমস্ত প্রসেস ফ্রিজ হয়ে যায়, তাহলে সিস্টেম অ্যাপটি দ্বারা পরিচালিত যেকোনো সক্রিয় TCP সকেট বন্ধ করে দেয়। এর ফলে সকেটের সার্ভার প্রান্ত থেকে এমন TCP কিপঅ্যালাইভ পিং পাঠানো যায় না, যা ডিভাইসের মডেমকে জাগিয়ে তুলতে পারে।

ক্যাশ করা অ্যাপ প্রসেসগুলো আনফ্রিজ করা হয় যখন তাদের প্রসেস স্টেট 'ক্যাশড' অবস্থা থেকে আরও গুরুত্বপূর্ণ কোনো অবস্থায় উন্নীত হয়। অ্যান্ড্রয়েড ১৪ এবং তার পরবর্তী সংস্করণগুলোতে আনফ্রিজ ইভেন্টের সংখ্যা কমাতে, অ্যাপটি ক্যাশড অবস্থায় থাকাকালীন সিস্টেম 'কন্টেক্সট-রেজিস্টার্ড' ব্রডকাস্টগুলোকে কিউতে রাখে। কন্টেক্সট-রেজিস্টার্ড ব্রডকাস্ট হলো এমন রিসিভার যা একটি অ্যাপ Context.registerReceiver ' কল করে ডাইনামিকভাবে রেজিস্টার করে। অ্যাপটি আনফ্রিজ হওয়ার পরেই সিস্টেম এই কিউতে থাকা ব্রডকাস্টগুলো ডেলিভার করে। এর বিপরীতে, সিস্টেম 'ম্যানিফেস্ট-ডিক্লেয়ার্ড' ব্রডকাস্টগুলোকে কিউতে রাখে না। 'ম্যানিফেস্ট-ডিক্লেয়ার্ড' ব্রডকাস্ট হলো এমন রিসিভার যা AndroidManifest.xml এ <receiver> এলিমেন্ট ব্যবহার করে স্ট্যাটিক্যালি ডিক্লেয়ার করা হয়। 'ম্যানিফেস্ট-ডিক্লেয়ার্ড' ব্রডকাস্টগুলো ডেলিভার করার জন্য সিস্টেম তাৎক্ষণিকভাবে ক্যাশ করা অ্যাপটিকে আনফ্রিজ করে।

সিস্টেমের স্বাস্থ্যগত প্রভাব

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

র‍্যামে আরও বেশি অ্যাপ ক্যাশ করে রাখলে কোল্ড স্টার্টের সময় ৩০% পর্যন্ত কমে যায়, এবং এই হ্রাসের পরিমাণ ডিভাইসের মোট র‍্যামের উপর নির্ভর করে। একই সাথে, ক্যাশ করা অ্যাপগুলোর সিপিইউ ব্যবহারও কমে যায়, যার ফলে উল্লেখযোগ্য পরিমাণে ব্যাটারি সাশ্রয় হয়।

ফ্রিজার ছাড়

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

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

অ্যাপস ফ্রিজার বাস্তবায়ন করুন

ক্যাশড অ্যাপস ফ্রিজারটি কার্নেল সিগ্রুপ ভি২ ফ্রিজার ব্যবহার করে। সামঞ্জস্যপূর্ণ কার্নেলসহ ডিভাইসগুলো এটি সক্রিয় করতে পারে। ডেভেলপার অপশন ‘Suspend execution for cached apps’ সক্রিয় করুন অথবা ডিভাইস কনফিগ ফ্ল্যাগ ‘ activity_manager_native_boot use_freezer ‘ true সেট করুন। উদাহরণস্বরূপ:

adb shell device_config put activity_manager_native_boot use_freezer true && adb reboot

যখন আপনি use_freezer ফ্ল্যাগটিকে false সেট করেন অথবা ডেভেলপার অপশনটি নিষ্ক্রিয় করেন, তখন ফ্রিজারটি নিষ্ক্রিয় হয়ে যায়। উদাহরণস্বরূপ:

adb shell device_config put activity_manager_native_boot use_freezer false && adb reboot

সফটওয়্যার রিলিজ বা আপডেটে ডিভাইসের কনফিগারেশন পরিবর্তন করে আপনি এই সেটিংটি চালু বা বন্ধ করতে পারেন।

MAX_CACHED_PROCESSES ওভাররাইড করতে, উদাহরণস্বরূপ, পরীক্ষার জন্য এর মান 1024-এ সেট করতে:

adb shell device_config put activity_manager max_cached_processes 1024
adb shell device_config set_sync_disabled_for_tests persistent

MAX_CACHED_PROCESSES ওভাররাইডটি পূর্বাবস্থায় ফিরিয়ে আনতে:

adb shell device_config delete activity_manager max_cached_processes
adb shell device_config set_sync_disabled_for_tests none

অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬) এবং এর পরবর্তী সংস্করণ থেকে, রিমোট প্রসেস কখন ফ্রোজেন বা আনফ্রোজেন হচ্ছে তা পর্যবেক্ষণ করার জন্য অ্যান্ড্রয়েড IBinder.FrozenStateChangeCallback এবং IBinder.addFrozenStateChangeCallback এর মতো অফিসিয়াল পাবলিক এপিআই সরবরাহ করে। যেসব কম্পোনেন্ট ক্যাশড হতে পারে এমন অ্যাপের সাথে ইন্টারঅ্যাক্ট করে, তারা রিমোট প্রসেসের ফ্রোজেন অবস্থা ট্র্যাক করতে এই এপিআইগুলো ব্যবহার করতে পারে।

ডিভাইস এবং কার্নেলের প্রয়োজনীয়তা

ক্যাশড অ্যাপস ফ্রিজারের জন্য কার্নেল সিগ্রুপ ভি২ (cgroup v2) সাপোর্ট প্রয়োজন। এছাড়াও, IBinder.FrozenStateChangeCallback ব্যবহার করে ফ্রিজ স্টেট পরিবর্তনের নোটিফিকেশনের জন্য কার্নেল বাইন্ডার ড্রাইভার সাপোর্ট প্রয়োজন, যা অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) এবং তার পরবর্তী সংস্করণ থেকে অ্যান্ড্রয়েড কমন কার্নেল (ACK) এবং জেনেরিক কার্নেল ইমেজ (GKI)-এ স্ট্যান্ডার্ড হিসেবে অন্তর্ভুক্ত।

নিম্নলিখিতভাবে সাধারণ adb কমান্ড ব্যবহার করে আপনি যাচাই করতে পারেন যে কোনো ডিভাইস এই সক্ষমতাগুলো সমর্থন করে কিনা:

  • ডিভাইসটিতে ফ্রিজারটি সক্রিয় আছে কিনা তা পরীক্ষা করুন (ইউজার বা ডিবাগ বিল্ডের জন্য) :

    adb shell device_config get activity_manager_native_boot use_freezer

    অথবা যাচাই করুন যে সিস্টেম দ্বারা প্রসেসগুলো সক্রিয়ভাবে স্থগিত করা হচ্ছে:

    adb shell dumpsys activity | grep -A 20 "Apps frozen:"
  • cgroup v2 ফ্রিজার কন্ট্রোলার সাপোর্ট পরীক্ষা করুন (যেকোনো ডিভাইসের জন্য) :

    যাচাই করুন যে freezer উপলব্ধ cgroup v2 কন্ট্রোলারগুলির মধ্যে তালিকাভুক্ত আছে:

    adb shell cat /sys/fs/cgroup/cgroup.controllers

    বিকল্পভাবে, একটি রুটেড ডিভাইস বা ইউজারডিবাগ বিল্ডে, যাচাই করুন যে সিগ্রুপ v2 ফ্রিজার নোডটি একটি চাইল্ড সিগ্রুপে মাউন্ট করা আছে:

    adb root && adb shell ls /sys/fs/cgroup/uid_0/cgroup.freeze

    এই ফাইলটি বিদ্যমান থাকলে, কার্নেল cgroup v2 ফ্রিজারকে সমর্থন করে।

  • ফ্রিজ অবস্থা পরিবর্তনের নোটিফিকেশন সমর্থনের বিষয়টি পরীক্ষা করুন (যেকোনো ডিভাইসের জন্য) :

    অ্যান্ড্রয়েড ১৪ বা তার পরবর্তী সংস্করণে চালিত এবং সামঞ্জস্যপূর্ণ জেনেরিক কার্নেল ইমেজ (GKI) বাইন্ডার ড্রাইভারযুক্ত ডিভাইসগুলিতে, IBinder.addFrozenStateChangeCallback সফলভাবে কলব্যাকগুলি রেজিস্টার করে। যদি অন্তর্নিহিত কার্নেল বাইন্ডার ড্রাইভার ফ্রিজ নোটিফিকেশন সমর্থন না করে, তবে এই মেথডটি UnsupportedOperationException থ্রো করে।

কাস্টম বৈশিষ্ট্যগুলি পরিচালনা করুন

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

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

সাধারণ ব্যর্থতার ধরণগুলি

যখন অ্যাপ প্রসেসগুলো স্থবির হয়ে যায়, তখন ত্রুটিপূর্ণ আন্তঃ-প্রসেস যোগাযোগ (IPC) বা টাস্ক শিডিউলিংয়ের কারণে অ্যাপটি বন্ধ হয়ে যেতে পারে বা অপ্রত্যাশিত আচরণ করতে পারে।

হিমায়িত প্রক্রিয়াগুলিতে সিঙ্ক্রোনাস বাইন্ডার লেনদেন

যখন কোনো ক্লায়েন্ট অ্যাপ প্রসেস একটি ফ্রোজেন (frozen) সার্ভার অ্যাপ প্রসেসে একটি সিনক্রোনাস বাইন্ডার ট্রানজ্যাকশন পাঠায়, তখন সিস্টেম অবিলম্বে সার্ভার অ্যাপ প্রসেসটিকে টার্মিনেট করে দেয়। এর ফলে ফ্রোজেন সার্ভার থেকে প্রতিক্রিয়ার জন্য অপেক্ষা করার সময় ক্লায়েন্ট থ্রেডটি অনির্দিষ্টকালের জন্য ব্লক হয়ে যায় না। এরপর ক্লায়েন্ট থ্রেডটি RemoteException গ্রহণ করে এবং যেকোনো রেজিস্টার্ড লিসেনার ট্রিগার হয়। আরও তথ্যের জন্য, IBinder.linkToDeath দেখুন।

মূল কারণ : এই ব্যর্থতা সাধারণত ক্লায়েন্ট অ্যাপের কোনো বাগের কারণে ঘটে থাকে। যখন কোনো ক্লায়েন্ট একটি সার্ভিসের সাথে বাইন্ড করে, তখন সার্ভার প্রসেসটি ক্লায়েন্টের সাথে বাইন্ড হয়ে যায় এবং ক্লায়েন্টের আগে ক্যাশড স্টেটে প্রবেশ করতে বাধা পায়। আরও তথ্যের জন্য, Context.bindService দেখুন। তবে, ক্লায়েন্ট যখন Context.unbindService কল করে, তখন সার্ভার প্রসেসটি ক্যাশড এবং ফ্রোজেন হয়ে যেতে পারে। আনবাইন্ডিংয়ের পরেও যদি ক্লায়েন্ট ক্যাশড IBinder রেফারেন্সটি ব্যবহার করতে থাকে, তবে এটি একটি ফ্রোজেন প্রসেসের সাথে যোগাযোগের ঝুঁকি তৈরি করে।

এই সমস্যা এড়াতে, নিশ্চিত করুন যে ক্লায়েন্ট অ্যাপগুলো Context.unbindService কল করার সাথে সাথেই IBinder রেফারেন্সগুলো বাতিল করে দেয়।

ক্লায়েন্ট প্রসেসগুলিতে রিমোট কলব্যাকগুলি পরিচালনা করুন

যেসব সার্ভিস এবং সিস্টেম কম্পোনেন্ট ক্লায়েন্ট প্রসেসগুলোর জন্য দীর্ঘস্থায়ী বাইন্ডার কলব্যাক বজায় রাখে, তারা ক্লায়েন্টের ফ্রোজেন স্টেট ট্র্যাক করার মাধ্যমে সিনক্রোনাস ফেইলর এবং অ্যাসিঙ্ক্রোনাস বাফার ওভারফ্লো প্রতিরোধ করতে পারে:

  • একটি স্টেট চেঞ্জ লিসেনার রেজিস্টার করুন : ক্লায়েন্ট প্রসেস যখন ফ্রিজারে প্রবেশ করে বা ফ্রিজার থেকে বের হয়, তখন নোটিফিকেশন পাওয়ার জন্য আগত ক্লায়েন্ট বাইন্ডার টোকেনগুলিতে IBinder.addFrozenStateChangeCallback ব্যবহার করুন।
  • ফ্রোজেন থাকা অবস্থায় ডিসপ্যাচ স্থগিত করুন : যখন কোনো ক্লায়েন্ট STATE_FROZEN প্রবেশ করে, তখন সেই ক্লায়েন্টের কাছে কলব্যাক বা স্টেট আপডেট ডিসপ্যাচ করা স্থগিত করুন।
  • আনফ্রিজ হওয়ার পর পুনরায় শুরু করুন এবং ডেলিভারি দিন : যখন ক্লায়েন্ট STATE_UNFROZEN অবস্থায় রূপান্তরিত হয়, তখন কলব্যাক ডিসপ্যাচিং পুনরায় শুরু করুন এবং প্রয়োজনীয় ব্যাচড বা একত্রিত আপডেটগুলি ডেলিভারি দিন।
  • RemoteCallbackList ব্যবহার করুন : RemoteCallbackList ব্যবহারকারী সিস্টেম সার্ভিসগুলো ম্যানুয়াল ট্র্যাকিং লজিক রক্ষণাবেক্ষণ না করেই স্বয়ংক্রিয়ভাবে কলব্যাক ডিসপ্যাচিং পজ ও রিজুম করার জন্য ফ্রোজেন ক্যালি পলিসি কনফিগার করতে পারে। আরও তথ্যের জন্য, সিস্টেম সার্ভিসগুলোর জন্য বাইন্ডার ফ্রিজার সুপারিশসমূহ দেখুন।

অ্যাসিঙ্ক্রোনাস বাইন্ডার ট্রানজ্যাকশন বাফার ওভারফ্লো

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

এই বাফার ওভারফ্লো প্রতিরোধ করতে, ক্যাশড বা ফ্রোজেন থাকতে পারে এমন প্রসেসগুলিতে অতিরিক্ত অ্যাসিঙ্ক্রোনাস বাইন্ডার ট্রানজ্যাকশন পাঠানো থেকে বিরত থাকুন।

আনফ্রিজ করার পর নির্ধারিত কাজগুলোর পুনরাবৃত্তিমূলক সম্পাদন।

যদি কোনো অ্যাপ পুনরাবৃত্তিমূলক কাজ সম্পাদন করে, তাহলে প্রসেসটি ফ্রিজ থাকা অবস্থায় সেই কাজগুলো স্থগিত হয়ে যায়। আরও তথ্যের জন্য, ScheduledThreadPoolExecutor.scheduleAtFixedRate অথবা Timer.scheduleAtFixedRate দেখুন। যখন প্রসেসটি আনফ্রিজ হয়, তখন জমে থাকা বাদ পড়া এক্সিকিউশনগুলো কার্যত কোনো বিলম্ব ছাড়াই দ্রুত একের পর এক চলতে পারে।

অ্যাপটি আনফ্রিজ হওয়ার সময় যাতে হঠাৎ করে অনেক বেশি টাস্ক চালু না হয়ে যায়, সেজন্য ব্যাকগ্রাউন্ড টাস্কের ক্ষেত্রে scheduleAtFixedRate এর পরিবর্তে scheduleWithFixedDelay ব্যবহার করুন। এছাড়া আপনি WorkManager ও ব্যবহার করতে পারেন।

অ্যাপস ফ্রিজার পরীক্ষা ও সমস্যা সমাধান করুন

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

কার্যকলাপ ব্যবস্থাপক কমান্ড

আপনি adb shell am কমান্ড ব্যবহার করে কোনো নির্দিষ্ট প্রসেসের জন্য ফ্রিজিং এবং কম্প্যাকশন ম্যানুয়ালি নিয়ন্ত্রণ করতে পারেন:

  • একটি প্রক্রিয়াকে জোর করে থামিয়ে দিন:

    adb shell am freeze <process>
  • একটি প্রক্রিয়াকে জোর করে আনফ্রিজ করা:

    adb shell am unfreeze <process>
  • কোনো প্রসেসের উপর সম্পূর্ণ মেমরি কম্প্যাকশন জোর করে প্রয়োগ করা:

    adb shell am compact full <process>

লগক্যাট পরীক্ষা

প্রতিবার কোনো প্রসেস ফ্রিজারে প্রবেশ করলে বা ফ্রিজার থেকে বেরিয়ে গেলে, ফ্রোজেন এবং আনফ্রোজেন এন্ট্রিগুলো দেখতে লগক্যাট দেখুন:

adb logcat | grep -i "\(freezing\|froze\)"

আনফ্রিজ কারণ লগ আউটপুটে UnfreezeReason প্রোটোকল বাফার enum থেকে গণনাকৃত মানসমূহ পাওয়া যায়।

ডাম্পসি পরিদর্শন

dumpsys activity ব্যবহার করে হিমায়িত প্রসেসগুলির তালিকা পরীক্ষা করুন:

adb shell dumpsys activity | grep -A 20 "Apps frozen:"

/sys/fs/cgroup/uid_0/cgroup.freeze ফাইলটির উপস্থিতি যাচাই করুন।

অ্যাপ্লিকেশন প্রস্থান তথ্য

পূর্ববর্তী কোনো প্রসেস বন্ধ হওয়ার কারণ জানতে, ActivityManager.getHistoricalProcessExitReasons দেখুন। যদি কোনো অ্যাপ প্রসেস ফ্রিজার-সম্পর্কিত কোনো সমস্যার কারণে বন্ধ হয়ে যায়, যেমন ফ্রোজেন থাকা অবস্থায় একটি সিনক্রোনাস বাইন্ডার ট্রানজ্যাকশন গ্রহণ করা, তাহলে বন্ধ হওয়ার কারণটি ApplicationExitInfo.REASON_FREEZER এ সেট করা হয়।

পারফেট্টো ট্রেসিং

Perfetto ট্রেসে system_server প্রসেসের অধীনে Freezer নামের একটি ট্র্যাকে ফ্রিজার-সম্পর্কিত ইভেন্টগুলি নির্গত হয়:

  • Freeze এবং Unfreeze স্লাইসগুলো নির্দেশ করে কখন একটি প্রসেস তার অবস্থা পরিবর্তন করে।
  • updateAppFreezeStateLSP ইভেন্টগুলো দেখায় কখন সিস্টেম সার্ভার কোনো প্রসেসকে ফ্রিজ বা আনফ্রিজ করার সিদ্ধান্ত নিতে তার অ্যাট্রিবিউটগুলো পুনরায় পরীক্ষা করে।

আপনি এই ইভেন্টগুলি সরাসরি পারফেটটো UI-তে পরিদর্শন করতে পারেন অথবা পারফেটটোএসকিউএল (PerfettoSQL) ব্যবহার করে বিশ্লেষণ করতে পারেন:

INCLUDE PERFETTO MODULE slices.with_context;
SELECT *
FROM process_slice
WHERE process_name = "system_server"
AND track_name = "Freezer"
AND (name LIKE "Freeze %" OR name LIKE "Unfreeze %");

PerfettoSQL স্ট্যান্ডার্ড লাইব্রেরিতে, ফ্রিজার ইভেন্টগুলো android_freezer_events টেবিলেও সংক্ষিপ্ত আকারে তালিকাভুক্ত করা হয়।