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

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

अगर अन्य एपीआई से वेक लॉक हासिल किया जाता है, तो आपको मैन्युअल तरीके से वेक लॉक हासिल करने से बचना चाहिए.

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

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

AlarmManager

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

वेक लॉक के नाम

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

सुझाव

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

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

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

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

वेक लॉक के नाम

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

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

सुझाव

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

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

ब्लूटूथ

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

सुझाव

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

डिवाइस के सेंसर

डिवाइस के सेंसर डेटा को ट्रैक करने के कई तरीके हैं. जैसे, कदमों की संख्या, एक्सलरोमीटर या जाइरोस्कोप डेटा.

Wear OS पर, Wear Health Services का इस्तेमाल करके, डिवाइस का डेटा पाएं. जैसे, ऊंचाई, धड़कन की दर, और तय की गई दूरी.

अगर डेटा अन्य ऐप्लिकेशन इकट्ठा करते हैं, तो डेटा वापस पाने के लिए Health Connect के साथ WorkManager का इस्तेमाल किया जा सकता है.

अगर आपको कदमों की संख्या या तय की गई दूरी में हुए बदलाव को ट्रैक करना है, तो डेटा वापस पाने के लिए, मोबाइल पर Recording API के साथ WorkManager का इस्तेमाल किया जा सकता है.

कुछ स्थितियों में, SensorManager का इस्तेमाल करके, डिवाइस के सेंसर की कस्टम ट्रैकिंग की ज़रूरत पड़ सकती है. SensorManager ऐप्लिकेशन की ओर से वेक लॉक हासिल नहीं करता है. हालांकि, अगर सेंसर वेक अप सेंसर है, तो ऐसा किया जा सकता है. वेक अप सेंसर की पहचान isWakeUpSensor एपीआई का इस्तेमाल करके की जा सकती है.

सुझाव

सेंसर का इस्तेमाल करके, ज़्यादा सैंपलिंग रेट पर रिकॉर्ड करने से बैटरी तेज़ी से खत्म हो सकती है. बैटरी की खपत और वेक लॉक के इस्तेमाल को कम करने के लिए यहां दिए गए सुझावों को अपनाएं:

  • अगर आपको कदमों की संख्या या तय की गई दूरी को ट्रैक करना है, तो बैटरी की कम खपत में डेटा रिकॉर्ड करने के लिए, Recording API का इस्तेमाल करें.
  • Wear OS पर पैसिव सेंसर ट्रैकिंग के लिए, Wear Health Services का इस्तेमाल करें, ताकि बैटरी के इस्तेमाल को ऑप्टिमाइज़ किया जा सके.
  • सेंसर की फ़्रीक्वेंसी को 200 हर्ट्ज़ से कम करें.
  • SensorManager के साथ सेंसर रजिस्टर करते समय, 30 सेकंड से ज़्यादा का maxReportLatencyUs तय करें. इससे सेंसर बैचिंग लॉजिक का इस्तेमाल किया जा सकेगा और ऐप्लिकेशन को मिलने वाले इंटरप्ट की संख्या कम की जा सकेगी.
  • सेंसर ट्रैकिंग की पूरी अवधि के लिए, वेक लॉक को लंबे समय तक चालू रखने से बचें. इसके बजाय, हर 30 सेकंड में सेंसर डेटा को पोल करने के लिए, AlarmManager का इस्तेमाल करके अलार्म शेड्यूल करें.

Firebase Cloud Message (FCM)

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

वेक लॉक के नाम

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 या इसके बाद के वर्शन पर काम करने वाले और WorkManager 2.10.0+ का इस्तेमाल करने वाले डिवाइसों पर, वेक लॉक का नाम यह होगा:

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

सुझाव

_UNKNOWN

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

सुझाव

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