অ্যাপ হাইবারনেশন, অ্যাপ হাইবারনেশন, অ্যাপ হাইবারনেশন, অ্যাপ হাইবারনেশন

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

শীতনিদ্রার প্রভাব

সারণি ১-এ যেমন দেখানো হয়েছে, হাইবারনেশনের প্রভাব আপনার অ্যাপের টার্গেট SDK ভার্সন এবং যে ডিভাইসে আপনার অ্যাপটি চলছে, তার উপর নির্ভর করে:

সারণি ১. আপনার অ্যাপের উপর হাইবারনেশনের প্রভাব
টার্গেট SDK সংস্করণ ডিভাইসের বৈশিষ্ট্য শীতনিদ্রার প্রভাব
অ্যান্ড্রয়েড ১২ বা তার উচ্চতর অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণে চালিত

আপনার অ্যাপের রানটাইম পারমিশন রিসেট করা হয়েছে। এই পদক্ষেপটির প্রভাব ঠিক তেমনই, যেন ব্যবহারকারী সিস্টেম সেটিংসে কোনো পারমিশন দেখে আপনার অ্যাপের অ্যাক্সেস লেভেল ' ডিনাই' -তে পরিবর্তন করেছেন।

আপনার অ্যাপ ব্যাকগ্রাউন্ড থেকে কোনো কাজ বা অ্যালার্ট চালাতে পারে না।

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

আপনার অ্যাপের ক্যাশে থাকা সমস্ত ফাইল মুছে ফেলা হয়।

অ্যান্ড্রয়েড ১১ অ্যান্ড্রয়েড ১১ দ্বারা চালিত আপনার অ্যাপের রানটাইম অনুমতিগুলো রিসেট করা হয়েছে।
অ্যান্ড্রয়েড ১১ এটি অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) থেকে অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) পর্যন্ত চলে এবং গুগল প্লে সার্ভিসেস দ্বারা চালিত।

আপনার অ্যাপের রানটাইম অনুমতিগুলো রিসেট করা হয়েছে।

এই বৈশিষ্ট্যটি ডিসেম্বর ২০২১ থেকে কার্যকর হবে। আরও শত শত কোটি ডিভাইসে পারমিশন অটো-রিসেট সুবিধাটি কীভাবে উপলব্ধ করা যায় , সে সম্পর্কে আরও জানতে এই ব্লগ পোস্টটি পড়ুন।

অ্যাপ হাইবারনেশন থেকে বেরিয়ে এলে সিস্টেমের আচরণ

পরবর্তীতে যখন ব্যবহারকারী আপনার অ্যাপটি ব্যবহার করেন, তখন আপনার অ্যাপটি হাইবারনেশন থেকে বেরিয়ে আসে এবং এটি আবার জব, অ্যালার্ট ও নোটিফিকেশন তৈরি করতে পারে।

তবে, সিস্টেমটি আপনার অ্যাপের জন্য নিম্নলিখিত কাজগুলো করে না:

  1. আপনার অ্যাপের রানটাইম পারমিশনগুলো পুনরায় প্রদান করুন।

    ব্যবহারকারীকে আপনার অ্যাপের জন্য এই অনুমতিগুলো পুনরায় প্রদান করতে হবে।

  2. আপনার অ্যাপ হাইবারনেশনে যাওয়ার আগে নির্ধারিত করা যেকোনো কাজ, সতর্কতা এবং বিজ্ঞপ্তি পুনরায় নির্ধারণ করুন।

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

অ্যাপ ব্যবহার

নিম্নলিখিত বিভাগগুলিতে অ্যাপ ব্যবহারের উদাহরণের পাশাপাশি এমন কিছু কাজের উদাহরণও দেওয়া হয়েছে, যেগুলোকে সিস্টেম অ্যাপ ব্যবহার হিসেবে গণ্য করে না।

অ্যাপ ব্যবহারের উদাহরণ

যখন আপনার অ্যাপের কোনো কার্যকলাপ পুনরায় শুরু করা হয়, তখন সিস্টেম এই ঘটনাটিকে একটি ব্যবহারকারী মিথস্ক্রিয়া হিসেবে বিবেচনা করে। তাই, আপনার অ্যাপ হাইবারনেশনে যাওয়ার আগে সিস্টেম সময়কাল বাড়িয়ে দেয়।

অ্যান্ড্রয়েড ১১ এবং এর পরবর্তী সংস্করণগুলোতে, নিম্নলিখিত আচরণগুলোও ব্যবহারকারীর মিথস্ক্রিয়া হিসেবে বিবেচিত হয়:

  • ব্যবহারকারী একটি উইজেটের সাথে মিথস্ক্রিয়া করে।
  • ব্যবহারকারী নোটিফিকেশনটি খারিজ করা ছাড়া সেটির সাথে ইন্টারঅ্যাক্ট করেন।

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

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

অ-উদাহরণ

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

হাইবারনেশন থেকে সিস্টেমের অব্যাহতি

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

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

হাইবারনেশন থেকে ব্যবহারকারীর অব্যাহতি

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

  • পরিবারের সদস্যদের অবস্থান নিয়মিতভাবে জানানোর মাধ্যমে পরিবারের নিরাপত্তা নিশ্চিত করুন।
  • ডিভাইস এবং আপনার অ্যাপের সার্ভারের মধ্যে ডেটা সিঙ্ক করুন।
  • টিভির মতো স্মার্ট ডিভাইসের সাথে যোগাযোগ করুন।
  • ঘড়ির মতো সহযোগী ডিভাইসের সাথে যুক্ত করুন।

ছাড়ের জন্য অনুরোধ করতে, নিম্নলিখিত বিভাগগুলিতে দেওয়া ধাপগুলি সম্পূর্ণ করুন।

ব্যবহারকারী আপনার অ্যাপের জন্য হাইবারনেশন আগে থেকেই নিষ্ক্রিয় করেছেন কিনা তা যাচাই করুন।

ব্যবহারকারী আপনার অ্যাপের জন্য হাইবারনেশন আগে থেকেই নিষ্ক্রিয় করেছেন কিনা তা পরীক্ষা করতে, getUnusedAppRestrictionsStatus() API-টি ব্যবহার করুন।

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

ব্যবহারকারীকে আপনার অ্যাপের জন্য হাইবারনেশন নিষ্ক্রিয় করতে বলুন।

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

  1. এমন একটি ইউজার ইন্টারফেস (UI) প্রদর্শন করুন যা ব্যবহারকারীকে ব্যাখ্যা করে যে আপনার অ্যাপের জন্য হাইবারনেশন কেন নিষ্ক্রিয় করতে হবে।
  2. এপিআই কোড উদাহরণে দেখানো অনুযায়ী createManageUnusedAppRestrictionsIntent() এপিআইটি কল করুন। এই এপিআইটি একটি ইন্টেন্ট তৈরি করে যা সেটিংস-এ থাকা অ্যাপের তথ্য স্ক্রিনটি লোড করে। এখান থেকে ব্যবহারকারী আপনার অ্যাপের জন্য হাইবারনেশন বন্ধ করতে পারবেন।

    এই ইন্টেন্টটি পাঠানোর সময় startActivityForResult() startActivity() কল করা গুরুত্বপূর্ণ।

    সারণি ২-এ যেমন দেখানো হয়েছে, অপশনটির অবস্থান ও নাম নির্ভর করে সেই ডিভাইসের বৈশিষ্ট্যের ওপর, যেটিতে আপনার অ্যাপটি ইনস্টল করা আছে:

    সারণি ২. যে বিকল্পটি আপনার অ্যাপের জন্য হাইবারনেশন নিষ্ক্রিয় করে
    ডিভাইসের বৈশিষ্ট্য যে পৃষ্ঠায় বিকল্পটি দেখা যায় বন্ধ করার বিকল্পটির নাম
    অ্যান্ড্রয়েড ১৩ বা তার উচ্চতর সংস্করণে চালিত অ্যাপের তথ্য অব্যবহৃত থাকলে অ্যাপের কার্যকলাপ থামিয়ে দিন।
    অ্যান্ড্রয়েড ১২ দ্বারা চালিত অ্যাপের তথ্য অনুমতিগুলি সরিয়ে জায়গা খালি করুন
    অ্যান্ড্রয়েড ১১ দ্বারা চালিত অ্যাপের তথ্য > অনুমতি অ্যাপটি ব্যবহার না করা হলে অনুমতিগুলো সরিয়ে দিন।
    অ্যান্ড্রয়েড ৬.০ থেকে অ্যান্ড্রয়েড ১০ পর্যন্ত চলে এবং এটি গুগল প্লে পরিষেবা দ্বারা চালিত। প্লে অ্যাপ > মেনু > প্লে প্রোটেক্ট > অব্যবহৃত অ্যাপের জন্য অনুমতি অ্যাপটি ব্যবহার না করা হলে অনুমতিগুলো সরিয়ে দিন।

এপিআই কোডের উদাহরণ

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

কোটলিন

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

লিগ্যাসি প্ল্যাটফর্ম এপিআই

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

সামঞ্জস্য রক্ষার উদ্দেশ্যে যদি আপনাকে সাময়িকভাবে এপিআই (API) ব্যবহার চালিয়ে যেতে হয়, তাহলে এটি কীভাবে ব্যবহার করতে হবে তা নিচের তালিকায় দেখানো হলো:

  • আপনার অ্যাপের জন্য হাইবারনেশন নিষ্ক্রিয় আছে কিনা তা পরীক্ষা করতে: isAutoRevokeWhitelisted()
  • ব্যবহারকারীকে হাইবারনেশন সেটিংস পৃষ্ঠায় পাঠাতে: ACTION_APPLICATION_DETAILS_SETTINGS ব্যবহার করে একটি Intent তৈরি করুন।

ম্যানুয়ালি হাইবারনেশন আচরণ চালু করুন

সিস্টেম আপনার অ্যাপকে হাইবারনেশন অবস্থায় রাখার পর অ্যাপটি কীভাবে আচরণ করে তা পরীক্ষা করতে, নিম্নলিখিত ধাপগুলি সম্পন্ন করুন:

  1. (শুধুমাত্র অ্যান্ড্রয়েড ১২ এবং তার পরবর্তী সংস্করণের জন্য) আপনার ডিভাইসে হাইবারনেশন বৈশিষ্ট্যটি সক্রিয় করুন:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. সিস্টেম হাইবারনেশনে যাওয়ার জন্য ডিফল্টভাবে কতক্ষণ অপেক্ষা করবে, সেই সময়টি সেট করুন। এর ফলে, পরীক্ষা করার পর আপনি সিস্টেমটিকে আগের অবস্থায় ফিরিয়ে আনতে পারবেন।

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. সিস্টেমের অপেক্ষার সময় কমিয়ে দিন। নিম্নলিখিত উদাহরণে, সিস্টেমটিকে এমনভাবে পরিবর্তন করা হয়েছে যাতে আপনি অ্যাপটির সাথে ইন্টারঅ্যাকশন বন্ধ করার মাত্র এক সেকেন্ড পরেই এটি হাইবারনেশনে চলে যায়:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. নিম্নলিখিত কমান্ডটি চালিয়ে আপনার টেস্ট ডিভাইসে যেকোনো বুট-টাইম ব্রডকাস্ট শেষ হওয়ার জন্য অপেক্ষা করুন:

    adb shell am wait-for-broadcast-idle
    

    সম্প্রচার শেষ হলে, এই কমান্ডটি এই বার্তাটি ফেরত দেয়: All broadcast queues are idle!

  5. অ্যাপ হাইবারনেশন প্রক্রিয়াটি ম্যানুয়ালি চালু করুন:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (শুধুমাত্র অ্যান্ড্রয়েড ১২ এবং তার পরবর্তী সংস্করণের জন্য) নিম্নলিখিত পদ্ধতিগুলোর মধ্যে যেকোনো একটি ব্যবহার করে অ্যাপটি হাইবারনেট করা আছে কিনা তা নিশ্চিত করুন:

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

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. আপনার অ্যাপকে হাইবারনেশনে রাখার আগে সিস্টেম যে ডিফল্ট সময়টুকু অপেক্ষা করে, তা পুনরুদ্ধার করুন:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold