ক্যাশে করা এবং হিমায়িত অ্যাপগুলি পরিচালনা করুন

প্রসেসগুলির মধ্যে যোগাযোগের জন্য বাইন্ডার ব্যবহার করার সময়, রিমোট প্রসেসটি ক্যাশে বা হিমায়িত অবস্থায় থাকলে বিশেষ যত্ন নিন। ক্যাশে বা হিমায়িত অ্যাপগুলিতে কল করার ফলে সেগুলি ক্র্যাশ হতে পারে বা অপ্রয়োজনীয়ভাবে রিসোর্স ব্যবহার করতে পারে।

ক্যাশে এবং হিমায়িত অ্যাপের অবস্থা

মেমরি এবং সিপিইউর মতো সিস্টেম রিসোর্স পরিচালনা করার জন্য অ্যান্ড্রয়েড বিভিন্ন রাজ্যে অ্যাপ রক্ষণাবেক্ষণ করে।

ক্যাশে অবস্থা

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

যখন একটি অ্যাপ প্রক্রিয়া থেকে অন্যটিতে বাইন্ডিং করা হয়, যেমন bindService ব্যবহার করে, তখন সার্ভার প্রক্রিয়ার প্রক্রিয়া অবস্থা কমপক্ষে ক্লায়েন্ট প্রক্রিয়ার মতো গুরুত্বপূর্ণ হয়ে ওঠে (যদি Context#BIND_WAIVE_PRIORITY নির্দিষ্ট করা থাকে তবে তা বাদে)। উদাহরণস্বরূপ, যদি ক্লায়েন্ট ক্যাশেড অবস্থায় না থাকে, তাহলে সার্ভারও নয়।

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

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

অ্যাপগুলি কখন ক্যাশেড অবস্থায় প্রবেশ করে বা প্রস্থান করে তা ট্র্যাক করতে, ActivityManager.addOnUidImportanceListener ব্যবহার করুন:

// in ActivityManager or Context
activityManager.addOnUidImportanceListener(
    new UidImportanceListener() { ... },
    IMPORTANCE_CACHED);

হিমায়িত অবস্থা

রিসোর্স সংরক্ষণের জন্য সিস্টেমটি একটি ক্যাশেড অ্যাপ ফ্রিজ করতে পারে। যখন একটি অ্যাপ ফ্রিজ করা হয়, তখন এটি শূন্য CPU সময় পায় এবং কোনও কাজ করতে পারে না। আরও বিস্তারিত জানার জন্য, ক্যাশেড অ্যাপস ফ্রিজার দেখুন।

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

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

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

অ্যাপগুলি কখন হিমায়িত বা আনফ্রোজেন করা হয়েছে তা ট্র্যাক করতে, IBinder.addFrozenStateChangeCallback ব্যবহার করুন:

// The binder token of the remote process
IBinder binder = service.getBinder();

// Keep track of frozen state
AtomicBoolean remoteFrozen = new AtomicBoolean(false);

// Update remoteFrozen when the remote process freezes or unfreezes
binder.addFrozenStateChangeCallback(
    myExecutor,
    new IBinder.FrozenStateChangeCallback() {
        @Override
        public void onFrozenStateChanged(boolean isFrozen) {
            remoteFrozen.set(isFrozen);
        }
    });

// When dispatching callbacks to the remote process, pause dispatch if frozen:
if (!remoteFrozen.get()) {
    // dispatch callback to remote process
}

রিমোটকলব্যাকলিস্ট ব্যবহার করুন

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

RemoteCallbackList তৈরি করার সময়, আপনি একটি ফ্রিজ করা কলি নীতি নির্দিষ্ট করতে পারেন:

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

নিচের উদাহরণে দেখানো হয়েছে কিভাবে একটি RemoteCallbackList ইনস্ট্যান্স তৈরি এবং ব্যবহার করতে হয় যা কলব্যাকগুলিকে ফ্রোজেন অ্যাপে ফেলে দেয়:

RemoteCallbackList<IMyCallbackInterface> callbacks =
        new RemoteCallbackList.Builder<IMyCallbackInterface>(
                        RemoteCallbackList.FROZEN_CALLEE_POLICY_DROP)
                .setExecutor(myExecutor)
                .build();

// Registering a callback:
callbacks.register(callback);

// Broadcasting to all registered callbacks:
callbacks.broadcast((callback) -> callback.onSomeEvent(eventData));

যদি আপনি FROZEN_CALLEE_POLICY_DROP ব্যবহার করেন, তাহলে সিস্টেমটি callback.onSomeEvent() শুধুমাত্র তখনই চালু করবে যদি কলব্যাক হোস্টিং প্রক্রিয়াটি হিমায়িত না থাকে।

সিস্টেম পরিষেবা এবং অ্যাপ ইন্টারঅ্যাকশন

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

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

সিস্টেম পরিষেবা থেকে অ্যাপের অবস্থা ট্র্যাক করুন

system_server অথবা নেটিভ ডেমন হিসেবে চলমান সিস্টেম পরিষেবাগুলি অ্যাপ প্রক্রিয়াগুলির গুরুত্ব এবং হিমায়িত অবস্থা ট্র্যাক করতে পূর্বে বর্ণিত API গুলি ব্যবহার করতে পারে:

  • ActivityManager.addOnUidImportanceListener : সিস্টেম সার্ভিসেস UID এর গুরুত্ব পরিবর্তন ট্র্যাক করার জন্য একজন শ্রোতাকে নিবন্ধন করতে পারে। কোনও অ্যাপ থেকে বাইন্ডার কল বা কলব্যাক গ্রহণ করার সময়, পরিষেবাটি UID পেতে এবং শ্রোতা দ্বারা ট্র্যাক করা গুরুত্বের অবস্থার সাথে এটির সম্পর্ক স্থাপন করতে Binder.getCallingUid() ব্যবহার করতে পারে। এটি সিস্টেম সার্ভিসেসকে জানতে দেয় যে কলিং অ্যাপটি ক্যাশে অবস্থায় আছে কিনা।

  • IBinder.addFrozenStateChangeCallback : যখন কোনও সিস্টেম পরিষেবা কোনও অ্যাপ থেকে কোনও বাইন্ডার অবজেক্ট গ্রহণ করে (উদাহরণস্বরূপ, কলব্যাকের জন্য নিবন্ধনের অংশ হিসাবে), তখন সেই নির্দিষ্ট IBinder ইনস্ট্যান্সে একটি FrozenStateChangeCallback নিবন্ধন করা উচিত। যখন সেই বাইন্ডার হোস্ট করা অ্যাপ প্রক্রিয়াটি হিমায়িত বা আনফ্রোজেন হয়ে যায় তখন এটি সরাসরি সিস্টেম পরিষেবাকে অবহিত করে।

সিস্টেম পরিষেবার জন্য সুপারিশ

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

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

সিস্টেম পরিষেবাগুলি প্রায়শই রিমোট কলব্যাক পরিচালনা করতে এবং স্বয়ংক্রিয়ভাবে মৃত প্রক্রিয়াগুলি পরিচালনা করতে RemoteCallbackList ব্যবহার করে। ফ্রোজেন অ্যাপগুলি পরিচালনা করতে, Use RemoteCallbackList -এ বর্ণিত একটি ফ্রোজেন কলি নীতি প্রয়োগ করে RemoteCallbackList এর বিদ্যমান ব্যবহার প্রসারিত করুন।