दूसरे एपीआई के बनाए गए वेक लॉक की पहचान करना

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

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

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

AlarmManager

AlarmManager, वेक लॉक हासिल करता है और उन्हें कॉल करने वाले ऐप्लिकेशन को एट्रिब्यूट करता है. अलार्म बंद होने पर AlarmManager, वेक लॉक हासिल करता है और अलार्म ब्रॉडकास्ट का onReceive() तरीका लागू होने के बाद, लॉक को रिलीज़ करता है.

वेक लॉक के नाम

AlarmManager, *alarm* नाम से वेक लॉक बनाता है. (तारांकन चिह्न, वाइकल के ऐक्टिव होने पर स्क्रीन पर दिखने वाले लॉक के नाम का हिस्सा होते हैं, न कि वाइल्ड कार्ड.)

सुझाव

हमारा सुझाव है कि आप अलार्म के काम करने के तरीके को ऑप्टिमाइज़ करने के लिए, ये तरीके अपनाएं:

  • अलार्म शेड्यूल करने की फ़्रीक्वेंसी को ऑप्टिमाइज़ करने के लिए, AlarmManager का इस्तेमाल करें.
  • ज़रूरी होने पर ही, RTC_WAKEUP अलार्म (जो डिवाइस को जगा देते हैं) का इस्तेमाल करें.
  • अलार्म का कम से कम इस्तेमाल करें और onReceive() वाले तरीके से लंबा काम करने से बचें.

ऑडियो और मीडिया

मीडिया एपीआई, ऑडियो रिकॉर्ड करने या चलाने के दौरान वेक लॉक हासिल कर सकते हैं. वेक लॉक, कॉल करने वाले ऐप्लिकेशन को एट्रिब्यूट किए जाते हैं.

वेक लॉक के नाम

Media API, Audio से शुरू होने वाले अलग-अलग नामों के वेक लॉक हासिल करते हैं:

  • AudioBitPerfect: इसका इस्तेमाल, यूएसबी के ज़रिए ऑडियो चलाने के लिए किया जाता है.
  • AudioDirectOut: इसका इस्तेमाल, टीवी या किसी खास डिवाइस पर ऑडियो को बिना किसी डेटा के नुकसान के चलाने के लिए किया जाता है.
  • AudioDup: ब्लूटूथ या यूएसबी से कनेक्ट होने पर, सूचनाओं को चलाने के लिए इसका इस्तेमाल किया जाता है.
  • AudioIn: माइक्रोफ़ोन चालू होने पर, कैमकोर्डर मोड में ऑडियो कैप्चर करने के लिए इस्तेमाल किया जाता है.
  • AudioMix: इसका इस्तेमाल, किसी सामान्य डिवाइस पर ऑडियो चलाने के लिए किया जाता है.
  • AudioOffload: इस मोड का इस्तेमाल, लंबे समय तक सिर्फ़ संगीत चलाने के लिए किया जाता है. हालांकि, ऐसा सिर्फ़ उन ऐप्लिकेशन के लिए किया जा सकता है जिनमें यह मोड काम करता है.
  • AudioSpatial: इसका इस्तेमाल, स्पेस ऑडियो की सुविधा वाले डिवाइसों पर मल्टी-चैनल मूवी या संगीत के ऑडियो को चलाने के लिए किया जाता है.
  • AudioUnknown: इसका इस्तेमाल तब किया जाता है, जब अन्य स्थितियां लागू न हों.
  • MmapCapture: इसका इस्तेमाल, कम इंतज़ार के साथ ऑडियो कैप्चर करने के लिए किया जाता है.
  • MmapPlayback: इसका इस्तेमाल, कम इंतज़ार के साथ वीडियो चलाने के लिए किया जाता है. जैसे, गेमिंग या प्रोफ़ेशनल ऑडियो ऐप्लिकेशन के लिए.

सुझाव

हमारा सुझाव है कि आप ये तरीके अपनाएं:

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

Firebase Cloud Message (FCM)

ऐप्लिकेशन पर Firebase Cloud Message (FCM) ब्रॉडकास्ट डिलीवर करते समय, GCM एक वेक लॉक हासिल करता है. FCM ब्रॉडकास्ट onMessageReceived() का तरीका पूरा होने के बाद, वेक लॉक रिलीज़ हो जाता है.

वेक लॉक के नाम

GCM, GOOGLE_C2DM नाम से एक वेक लॉक हासिल करता है.

सुझाव

हमारा सुझाव है कि FCM के व्यवहार को ऑप्टिमाइज़ करने के लिए, ये तरीके अपनाएं:

  • FCM डिलीवरी की फ़्रीक्वेंसी को ऑप्टिमाइज़ करें.
  • ज़्यादा प्राथमिकता वाले FCM का इस्तेमाल तब तक न करें, जब तक मैसेज को तुरंत डिलीवर करने की ज़रूरत न हो.
  • onMessageReceived() से पेमेंट करने का तरीका जल्द से जल्द सेट अप करें. ज़्यादा जानकारी के लिए, Firebase से जुड़ी गाइडलाइन देखें.

JobScheduler

JobScheduler जॉब, बैकग्राउंड में टास्क पूरा करते समय वेक लॉक हासिल करते हैं. वेक लॉक, उस ऐप्लिकेशन को एट्रिब्यूट किए जाते हैं जिसने वर्कर्स बनाए हैं.

वेक लॉक के नाम

JobScheduler से मिले वेक लॉक के नाम, इस बात पर निर्भर करते हैं कि वे Android सिस्टम के किस वर्शन पर चल रहे हैं और जॉब का मकसद क्या है.

एंगल ब्रैकेट के बीच मौजूद आइटम वैरिएबल होते हैं. उदाहरण के लिए, "<package_name>" आपके ऐप्लिकेशन के पैकेज का नाम है, न कि टेक्स्ट <package name>. हालांकि, *job*, तारे के निशान के साथ कैरेक्टर क्रम *job* है; तारे के निशान का इस्तेमाल वाइल्डकार्ड के तौर पर नहीं किया जा रहा है.

Android 15 और उससे पहले के वर्शन

उपयोगकर्ता की ओर से शुरू की गई जॉब, इस पैटर्न के हिसाब से नाम वाले वेक लॉक बनाती हैं:

*job*u/@<name_space>@/<package_name>/<classname>

अन्य नौकरियों के लिए इस पैटर्न का इस्तेमाल किया जाता है:

*job*/@<name_space>@/<package_name>/<classname>
Android 16 और उसके बाद के वर्शन

उपयोगकर्ता की ओर से शुरू की गई जॉब, इस पैटर्न के हिसाब से नाम वाले वेक लॉक बनाती हैं:

*job*u/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

जल्दी किए जाने वाले टास्क के लिए, इस पैटर्न का इस्तेमाल किया जाता है:

*job*e/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

सामान्य नौकरियों के लिए इस पैटर्न का इस्तेमाल किया जाता है:

*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
उदाहरण

मान लें कि नेमस्पेस backup और ट्रैक टैग started वाला कोई ज़रूरी जॉब है. पैकेज का नाम com.example.app है और जिस क्लास ने जॉब बनाई है उसका नाम com.backup.BackupFileService है.

Android 15 या इससे पहले के वर्शन वाले डिवाइसों पर, वेक लॉक का नाम यह होगा:

*job*/@backup@/com.example.app/com.backup.BackupFileService

Android 16 या इसके बाद के वर्शन वाले डिवाइसों पर, वेक लॉक का नाम यह होगा:

*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService

सुझाव

JobScheduler टास्क के इस्तेमाल का ऑडिट करें. खास तौर पर, टास्क शेड्यूलिंग एपीआई के लिए बैटरी के इस्तेमाल को ऑप्टिमाइज़ करने के लिए, हमारे दिशा-निर्देशों का पालन करें.

जगह की जानकारी

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

वेक लॉक के नाम

जगह की जानकारी वाली सेवाएं, इन नामों का इस्तेमाल करती हैं:

  • CollectionLib-SigCollector
  • NetworkLocationLocator
  • NetworkLocationScanner
  • NlpCollectorWakeLock
  • NlpWakeLock
  • *location*

सुझाव

जगह की जानकारी के इस्तेमाल को ऑप्टिमाइज़ करना. उदाहरण के लिए, टाइम आउट सेट करना, जगह की जानकारी के अनुरोधों को एक साथ भेजना या जगह की जानकारी के अपडेट का इस्तेमाल करना.

WorkManager

WorkManager वर्कर, बैकग्राउंड में टास्क को पूरा करते समय वेक लॉक हासिल करते हैं. वेक लॉक, उस ऐप्लिकेशन को एट्रिब्यूट किए जाते हैं जिसने वर्कर्स बनाए हैं.

वेक लॉक के नाम

WorkManager से मिले वेक लॉक के नाम, इस बात पर निर्भर करते हैं कि वे Android सिस्टम के किस वर्शन पर काम कर रहे हैं.

Android 15 और उससे पहले के वर्शन

WorkManager टास्क, इस पैटर्न के हिसाब से नाम वाले वेक लॉक बनाते हैं:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Android 16 और उसके बाद के वर्शन

जल्दी पूरे होने वाले टास्क, इस पैटर्न के हिसाब से नाम वाले वेक लॉक बनाते हैं:

*job*e/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

सामान्य टास्क इस पैटर्न को फ़ॉलो करते हैं:

*job*r/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

डिफ़ॉल्ट रूप से, <trace_tag> में कर्मचारी का नाम होता है.

उदाहरण

मान लें कि BackupFileWorker नाम का एक कर्मचारी है, जो जल्दी काम करता है. पैकेज का नाम com.example.app है.

Android 15 या इससे पहले के वर्शन वाले डिवाइसों पर, वेक लॉक का नाम यह होगा:

*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

Android 16 या इसके बाद के वर्शन वाले डिवाइसों पर, वेक लॉक का नाम यह होगा:

*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

सुझाव

WorkManager वर्कर्स के इस्तेमाल का ऑडिट करें. खास तौर पर, टास्क शेड्यूलिंग एपीआई के लिए बैटरी के इस्तेमाल को ऑप्टिमाइज़ करने के लिए, हमारे दिशा-निर्देशों का पालन करें.

_UNKNOWN

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

सुझाव

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