ऐप्लिकेशन का हाइबरनेशन मोड

अगर आपका ऐप्लिकेशन Android 11 (एपीआई लेवल 30) या उसके बाद के वर्शन को टारगेट करता है और उपयोगकर्ता कुछ महीनों तक आपके ऐप्लिकेशन से इंटरैक्ट नहीं करता, तो सिस्टम आपके ऐप्लिकेशन को हाइबरनेट मोड में डाल देता है. यह सिस्टम, परफ़ॉर्मेंस के बजाय स्टोरेज के लिए ऑप्टिमाइज़ करता है. साथ ही, यह सिस्टम उपयोगकर्ता के डेटा की सुरक्षा करता है. सिस्टम का यह व्यवहार, उसी तरह का होता है जैसा तब होता है, जब उपयोगकर्ता सिस्टम सेटिंग से आपके ऐप्लिकेशन को मैन्युअल तरीके से बंद करता है.

हाइबरनेशन मोड के असर

टेबल 1 में दिखाए गए मुताबिक, हाइबरनेट मोड के असर आपके ऐप्लिकेशन के टारगेट SDK वर्शन के साथ-साथ, उस डिवाइस पर भी निर्भर करते हैं जिस पर आपका ऐप्लिकेशन चल रहा है:

टेबल 1. हाइबरनेशन मोड के आपके ऐप्लिकेशन पर होने वाले असर
टारगेट किया जा रहा SDK टूल का वर्शन डिवाइस की विशेषताएं हाइबरनेशन मोड के असर
Android 12 या इसके बाद का वर्शन डिवाइस पर Android 12 या इसके बाद का वर्शन हो

आपके ऐप्लिकेशन की रनटाइम अनुमतियां रीसेट हो जाती हैं. इस कार्रवाई का वही असर होता है जो उपयोगकर्ता के सिस्टम सेटिंग में जाकर, अनुमति देखकर और आपके ऐप्लिकेशन के ऐक्सेस लेवल को अस्वीकार करें पर सेट करने पर होता है.

आपका ऐप्लिकेशन, बैकग्राउंड में नौकरियां या सूचनाएं नहीं चला सकता.

आपके ऐप्लिकेशन को पुश नोटिफ़िकेशन नहीं मिल सकते. इनमें, Firebase Cloud Messaging से भेजे गए सबसे ज़रूरी मैसेज भी शामिल हैं.

आपके ऐप्लिकेशन के कैश मेमोरी में मौजूद सभी फ़ाइलें हटा दी जाती हैं.

Android 11 Android 11 पर काम करता हो आपके ऐप्लिकेशन की रनटाइम अनुमतियां रीसेट हो जाती हैं.
Android 11 Android 6.0 (एपीआई लेवल 23) से लेकर Android 10 (एपीआई लेवल 29) तक के वर्शन पर काम करता हो और Google Play services की मदद से काम करता हो

आपके ऐप्लिकेशन की रनटाइम अनुमतियां रीसेट हो जाती हैं.

यह बदलाव दिसंबर 2021 से लागू होगा. अनुमतियों को अपने-आप रीसेट करने की सुविधा को अरबों और डिवाइसों के लिए उपलब्ध कराने के बारे में ज़्यादा जानने के लिए, इस ब्लॉग पोस्ट को पढ़ें.

जब कोई ऐप्लिकेशन हाइबरनेशन मोड से बाहर आता है, तब सिस्टम का व्यवहार

जब उपयोगकर्ता अगली बार आपके ऐप्लिकेशन का इस्तेमाल करता है, तो आपका ऐप्लिकेशन हाइबरनेट मोड से बाहर निकल जाता है. इसके बाद, वह फिर से जॉब, सूचनाएं, और सूचनाएं बना सकता है.

हालांकि, सिस्टम आपके ऐप्लिकेशन के लिए ये काम नहीं करता:

  1. अपने ऐप्लिकेशन की रनटाइम अनुमतियां फिर से दें.

    उपयोगकर्ता को आपके ऐप्लिकेशन के लिए, इन अनुमतियों को फिर से देना होगा.

  2. ऐप्लिकेशन के हाइबरनेट मोड में जाने से पहले शेड्यूल की गई सभी जॉब, सूचनाएं, और सूचनाएं फिर से शेड्यूल करें.

    इस वर्कफ़्लो को आसानी से इस्तेमाल करने के लिए, WorkManager का इस्तेमाल करें. ACTION_BOOT_COMPLETED ब्रॉडकास्ट रिसीवर में, फिर से शेड्यूल करने का लॉजिक भी जोड़ा जा सकता है. यह लॉजिक, ऐप्लिकेशन के हाइबरनेट मोड से बाहर आने और डिवाइस के बूट होने के बाद ट्रिगर होता है.

ऐप्लिकेशन का उपयोग

यहां दिए गए सेक्शन में, ऐप्लिकेशन के इस्तेमाल के उदाहरणों के साथ-साथ, उन कार्रवाइयों के उदाहरण भी दिए गए हैं जिन्हें सिस्टम, ऐप्लिकेशन के इस्तेमाल के तौर पर नहीं मानता.

ऐप्लिकेशन के इस्तेमाल के उदाहरण

जब आपके ऐप्लिकेशन में कोई गतिविधि फिर से शुरू की जाती है, तो सिस्टम इस इवेंट को उपयोगकर्ता इंटरैक्शन मानता है. इसलिए, सिस्टम आपके ऐप्लिकेशन को हाइबरनेट मोड में जाने से पहले, थोड़ा और समय देता है.

Android 11 और उसके बाद के वर्शन पर, इन गतिविधियों को भी उपयोगकर्ता के इंटरैक्शन माना जाता है:

  • उपयोगकर्ता, विजेट से इंटरैक्ट करता है.
  • उपयोगकर्ता, सूचना को खारिज करने के अलावा, उससे इंटरैक्ट करता है.

ध्यान दें कि ऐप्लिकेशन को हाइबरनेट मोड में इस्तेमाल करने के लिए, उपयोगकर्ता के इंटरैक्शन की ज़रूरत नहीं होती. जब तक पैकेज के किसी कॉम्पोनेंट को ट्रिगर किया जाता है, तब तक इसे ऐप्लिकेशन के इस्तेमाल के तौर पर माना जाता है. इसके कुछ उदाहरण यहां दिए गए हैं:

  • ऐसे ऐप्लिकेशन जिनमें सेवा या कॉन्टेंट देने वाली कंपनी, डिवाइस पर मौजूद किसी दूसरे ऐप्लिकेशन या ऑपरेटिंग सिस्टम से जुड़ी हो. उदाहरण के लिए, इनपुट के तरीके के संपादक (आईएमई) या पासवर्ड मैनेजर.
  • पैकेज में मौजूद ब्रॉडकास्ट रिसीवर, किसी बाहरी पैकेज से अश्लील कॉन्टेंट का ब्रॉडकास्ट पा रहे हैं.

ऐसे उदाहरण जो इस कैटगरी में नहीं आते

अगर आपका ऐप्लिकेशन सिर्फ़ नीचे दी गई सूची में बताए गए व्यवहार दिखाता है, तो कुछ महीनों के बाद आपका ऐप्लिकेशन हाइबरनेट (नींद में) हो जाता है:

सिस्टम को हाइबरनेट मोड में जाने से रोकने के लिए छूट

Android, इस्तेमाल के कुछ उदाहरणों में ऐप्लिकेशन के हाइबरनेशन मोड से सिस्टम-लेवल पर छूट देता है. अगर आपका ऐप्लिकेशन इनमें से किसी कैटगरी में आता है, तो उस पर ऐप्लिकेशन के इस्तेमाल से जुड़े मानकों का पालन करना ज़रूरी नहीं है. साथ ही, उसे हाइबरनेट नहीं किया जाएगा.

लॉन्चर पर नहीं दिखाए जाने वाले ऐप्लिकेशन
ऐसा कोई भी ऐप्लिकेशन जिसका लॉन्चर पर कोई ऐक्टिव शॉर्टकट टाइल न हो.
वर्क प्रोफ़ाइल के ऐप्लिकेशन
कोई भी ऐप्लिकेशन, जिसे उपयोगकर्ता वर्क प्रोफ़ाइल पर इंस्टॉल करता है. ध्यान दें कि अगर वही ऐप्लिकेशन निजी प्रोफ़ाइल पर भी मौजूद है, तो सिर्फ़ वर्क प्रोफ़ाइल के ऐप्लिकेशन पर पाबंदी नहीं लगेगी.
डिवाइस नीति नियंत्रक
ऐसे ऐप्लिकेशन जो डिवाइसों पर स्थानीय डिवाइस नीतियों और सिस्टम ऐप्लिकेशन को कंट्रोल करते हैं.
मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन
मोबाइल और इंटरनेट सेवा देने वाली कंपनियां, डिवाइसों पर पहले से कौनसे ऐप्लिकेशन लोड करती हैं और उन्हें सेवा देने के लिए ज़रूरी क्यों समझती हैं. उदाहरण के लिए, वॉइसमेल या ग्राहक सेवा ऐप्लिकेशन.
तीसरे पक्ष के इंस्टॉलर ऐप्लिकेशन
तीसरे पक्ष के ऐप्लिकेशन स्टोर, ताकि ज़रूरत पड़ने पर, उनमें इंस्टॉल किए गए ऐप्लिकेशन अपने-आप अपडेट हो सकें.

उपयोगकर्ताओं को हाइबरनेशन मोड से छूट

अगर आपको लगता है कि आपके ऐप्लिकेशन के मुख्य इस्तेमाल के उदाहरण पर, ऐप्लिकेशन के हाइबरनेट होने का असर पड़ेगा, तो उपयोगकर्ता से ऐप्लिकेशन को हाइबरनेट होने से रोकने का अनुरोध किया जा सकता है. यह छूट उन स्थितियों में काम की होती है जब उपयोगकर्ता को उम्मीद होती है कि आपका ऐप्लिकेशन मुख्य रूप से बैकग्राउंड में काम करे. भले ही, वह आपके ऐप्लिकेशन के साथ इंटरैक्ट न कर रहा हो. जैसे, जब आपका ऐप्लिकेशन इनमें से कोई काम करता है:

  • परिवार के सदस्यों की जगह की जानकारी समय-समय पर शेयर करके, उन्हें सुरक्षित रखें.
  • किसी डिवाइस और आपके ऐप्लिकेशन के सर्वर के बीच डेटा सिंक करें.
  • टीवी जैसे स्मार्ट डिवाइसों से इंटरैक्ट करना.
  • स्मार्टवॉच जैसे साथी डिवाइसों से जोड़ें.

छूट का अनुरोध करने के लिए, नीचे दिए गए सेक्शन में दिया गया तरीका अपनाएं.

देखें कि उपयोगकर्ता ने आपके ऐप्लिकेशन के लिए, हाइबरनेट मोड को पहले से बंद कर दिया है या नहीं

यह देखने के लिए कि उपयोगकर्ता ने आपके ऐप्लिकेशन के लिए, पहले ही हाइबरनेट मोड को बंद कर दिया है या नहीं, getUnusedAppRestrictionsStatus() एपीआई का इस्तेमाल करें.

अपने ऐप्लिकेशन में इस एपीआई का इस्तेमाल करने के तरीके के बारे में ज़्यादा जानने के लिए, इस पेज पर एपीआई कोड का उदाहरण देखें.

उपयोगकर्ता से अपने ऐप्लिकेशन के लिए, हाइबरनेट मोड को बंद करने के लिए कहना

अगर उपयोगकर्ता ने आपके ऐप्लिकेशन के लिए, हाइबरनेट मोड को पहले से बंद नहीं किया है, तो आपके पास उपयोगकर्ता को अनुरोध भेजने का विकल्प है. ऐसा करने के लिए, यह तरीका अपनाएं:

  1. ऐसा यूज़र इंटरफ़ेस (यूआई) दिखाएं जिससे उपयोगकर्ता को यह जानकारी मिल सके कि उन्हें आपके ऐप्लिकेशन के लिए, स्लीप मोड को बंद क्यों करना है.
  2. एपीआई कोड के उदाहरण में दिखाए गए तरीके से, createManageUnusedAppRestrictionsIntent() एपीआई को कॉल करें. यह एपीआई एक इंटेंट बनाता है, जो सेटिंग में ऐप्लिकेशन की जानकारी स्क्रीन को लोड करता है. यहां से, उपयोगकर्ता आपके ऐप्लिकेशन के लिए हाइबरनेट मोड को बंद कर सकता है.

    यह ज़रूरी है कि इस इंटेंट को भेजते समय, startActivity() के बजाय startActivityForResult() को कॉल करें.

    जैसा कि टेबल 2 में दिखाया गया है, विकल्प की जगह और नाम, उस डिवाइस की विशेषताओं पर निर्भर करता है जिस पर आपका ऐप्लिकेशन इंस्टॉल है:

    टेबल 2. आपके ऐप्लिकेशन के लिए, हाइबरनेशन मोड को बंद करने का विकल्प
    डिवाइस की विशेषताएं वह पेज जहां विकल्प दिखता है बंद करने के लिए विकल्प का नाम
    डिवाइस पर Android 13 या इसके बाद का वर्शन हो ऐप्लिकेशन की जानकारी इस्तेमाल न होने पर, ऐप्लिकेशन गतिविधि रोकें
    Android 12 पर काम करता हो ऐप्लिकेशन की जानकारी अनुमतियां हटाना और स्टोरेज खाली करना
    Android 11 पर काम करता हो ऐप्लिकेशन की जानकारी > अनुमतियां अगर ऐप्लिकेशन इस्तेमाल नहीं किया गया है, तो अनुमतियां हटाएं
    Android 6.0 से लेकर Android 10 तक के वर्शन पर काम करता हो और Google Play services के साथ काम करता हो Play ऐप्लिकेशन > मेन्यू > Play Protect > इस्तेमाल न किए गए ऐप्लिकेशन के लिए अनुमतियां अगर ऐप्लिकेशन इस्तेमाल नहीं किया गया है, तो अनुमतियां हटाएं

एपीआई कोड का उदाहरण

इस कोड के उदाहरण में, यह पता करने का तरीका बताया गया है कि आपके ऐप्लिकेशन के लिए, हाइबरनेट मोड चालू है या नहीं. साथ ही, उपयोगकर्ताओं से अपने ऐप्लिकेशन के लिए हाइबरनेट मोड बंद करने के लिए कहने का सही तरीका भी बताया गया है.

Kotlin

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

लेगसी प्लैटफ़ॉर्म एपीआई

ऑपरेटिंग सिस्टम में, हाइबरनेट मोड की सुविधा के साथ इंटरैक्ट करने के लिए एक एपीआई भी शामिल होता है. हालांकि, यह एपीआई सिर्फ़ Android 11 या इसके बाद के वर्शन वाले डिवाइसों पर काम करता है. यह एपीआई, Android के पुराने वर्शन पर बैकपोर्ट की गई, हाइबरनेट करने की सुविधाओं को मैनेज नहीं करता. इसलिए, हमारा सुझाव है कि एपीआई का इस्तेमाल न करें.

अगर आपको काम करने के लिए, कुछ समय के लिए एपीआई का इस्तेमाल जारी रखना है, तो यहां दी गई सूची में इसका इस्तेमाल करने का तरीका बताया गया है:

  • यह देखने के लिए कि आपके ऐप्लिकेशन के लिए, हाइबरनेट मोड बंद है या नहीं: isAutoRevokeWhitelisted()
  • उपयोगकर्ता को हाइबरनेट मोड की सेटिंग वाले पेज पर भेजने के लिए: ACTION_APPLICATION_DETAILS_SETTINGS का इस्तेमाल करके इंटेंट बनाएं

हाइबरनेट मोड को मैन्युअल तरीके से चालू करना

यह जांचने के लिए कि सिस्टम आपके ऐप्लिकेशन को हाइबरनेट करने के बाद, आपका ऐप्लिकेशन कैसा व्यवहार करता है, यह तरीका अपनाएं:

  1. (सिर्फ़ Android 12 और उसके बाद के वर्शन के लिए) अपने डिवाइस पर, डिवाइस के बंद होने की सुविधा चालू करें:

    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. (सिर्फ़ Android 12 और उसके बाद के वर्शन के लिए) इनमें से किसी एक तरीके का इस्तेमाल करके, पुष्टि करें कि ऐप्लिकेशन हाइबरनेट मोड में है:

    • देखें कि जांच के लिए इस्तेमाल किए जा रहे डिवाइस पर अब एक सूचना दिख रही है. इससे पता चलता है कि इस्तेमाल न किए गए ऐप्लिकेशन, हाइबरनेट मोड में हैं.
    • यह कमांड चलाएं:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. सिस्टम को ऐप्लिकेशन को हाइबरनेट मोड में डालने से पहले, इंतज़ार करने के लिए डिफ़ॉल्ट समय को वापस लाएं:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold