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

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

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

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

AlarmManager

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

वेक लॉक के नाम

AlarmManager, *alarm* नाम वाले वेक लॉक बनाता है. (तारे, वेक लॉक के नाम का हिस्सा हैं. ये वाइल्ड कार्ड नहीं हैं.)

सुझाव

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

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

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

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

वेक लॉक के नाम

मीडिया एपीआई, अलग-अलग नामों से वेक लॉक हासिल करते हैं. इन नामों की शुरुआत Audio से होती है:

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

सुझाव

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

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

Firebase Cloud Message (FCM)

GCM, ऐप्लिकेशन को Firebase क्लाउड मैसेज (FCM) ब्रॉडकास्ट करते समय वेक लॉक हासिल करता है. 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 नाम का वेक लॉक मिलता है, तो यह पता लगाने की कोशिश करें कि वह कौन-सा वेक लॉक है. इसके बाद, उसे कोई दूसरा नाम दें.