प्रॉडक्ट से जुड़ी खबरें

Android की ज़रूरी जानकारी में मौजूद वेक लॉक मेट्रिक का इस्तेमाल करके, अपने ऐप्लिकेशन की बैटरी ऑप्टिमाइज़ करना

सात मिनट में पढ़ें
Alice Yuan
डेवलपर रिलेशन इंजीनियर, Android

बैटरी लाइफ़, उपयोगकर्ता अनुभव का एक अहम पहलू है. वेक लॉक इसमें अहम भूमिका निभाते हैं. क्या आपने इनका बहुत ज़्यादा इस्तेमाल किया है? इस ब्लॉग पोस्ट में हम जानेंगे कि वेक लॉक क्या होते हैं, इनका इस्तेमाल करने के कुछ सबसे सही तरीके क्या हैं, और Play Console की मेट्रिक की मदद से अपने ऐप्लिकेशन के व्यवहार को कैसे बेहतर तरीके से समझा जा सकता है.

Android की ज़रूरी जानकारी में पार्शियल वेक लॉक का ज़्यादा इस्तेमाल

Play Console अब बैटरी खत्म होने की समस्या पर नज़र रखता है. इसमें, परफ़ॉर्मेंस के मुख्य इंडिकेटर के तौर पर, पार्शियल वेक लॉक का ज़रूरत से ज़्यादा इस्तेमाल पर फ़ोकस किया जाता है.

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

warning.png

Android की ज़रूरी जानकारी देने वाले पेज पर, वेक लॉक के ज़्यादा इस्तेमाल से जुड़ी चेतावनी.

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

  • वेक लॉक, 24 घंटे की अवधि में कम से कम दो घंटे तक चालू रहते हैं.
  • इससे आपके ऐप्लिकेशन के 5% से ज़्यादा सेशन पर असर पड़ता है. यह औसत 28 दिनों के हिसाब से निकाला जाता है.

ऑडियो, जगह की जानकारी, और JobScheduler के उपयोगकर्ता की ओर से शुरू किए गए एपीआई से बनाए गए वेक लॉक को, वेक लॉक के समय की गिनती में शामिल नहीं किया जाता.

वेक लॉक के बारे में जानकारी

वेक लॉक एक ऐसा तरीका है जिसकी मदद से कोई ऐप्लिकेशन, डिवाइस के सीपीयू को चालू रख सकता है. भले ही, उपयोगकर्ता डिवाइस का इस्तेमाल न कर रहा हो. 

पार्शियल वेक लॉक, स्क्रीन बंद होने पर भी सीपीयू को चालू रखता है. इससे सीपीयू, कम बैटरी खर्च करने वाले "सस्पेंड" मोड में नहीं जाता. फ़ुल वेक लॉक, स्क्रीन और सीपीयू, दोनों को चालू रखता है.

पार्शियल वेक लॉक पाने के दो तरीके हैं:

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

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

वेक लॉक इस्तेमाल करने के सबसे सही तरीके

वेक लॉक के ज़्यादा इस्तेमाल की वजह से होने वाली गड़बड़ियों को ठीक करने का तरीका जानने से पहले, पक्का करें कि आपने वेक लॉक से जुड़े सबसे सही तरीके अपनाए हों. 

इन चार अहम सवालों पर ध्यान दें.


1. क्या आपने वेक लॉक के अन्य विकल्पों के बारे में सोचा है?

मैन्युअल तौर पर कुछ समय के लिए वेक लॉक चालू करने से पहले, फ़ैसले लेने से जुड़ा यह फ़्लोचार्ट देखें:

wakelock.png

वेक लॉक को मैन्युअल तरीके से कब हासिल करना है, यह तय करने के लिए फ़्लोचार्ट

  1. क्या स्क्रीन को चालू रखना ज़रूरी है?
  2. क्या ऐप्लिकेशन, फ़ोरग्राउंड सेवा चला रहा है?
    • नहीं: आपको वेक लॉक को मैन्युअल तरीके से हासिल करने की ज़रूरत नहीं है.
  3. क्या डिवाइस के निलंबित होने से, उपयोगकर्ता अनुभव पर बुरा असर पड़ता है?
    • नहीं: उदाहरण के लिए, डिवाइस के चालू होने के बाद सूचना को अपडेट करने के लिए, वेक लॉक की ज़रूरत नहीं होती.
    • हां: अगर डिवाइस को निलंबित होने से रोकना ज़रूरी है, जैसे कि किसी बाहरी डिवाइस के साथ लगातार कम्यूनिकेट करना, तो आगे बढ़ें.
  4. क्या कोई एपीआई पहले से ही आपके डिवाइस को चालू रखता है?
  5. अगर आपने इन सभी सवालों के जवाब दे दिए हैं और आपको कोई दूसरा विकल्प नहीं मिला है, तो आपको वेक लॉक को मैन्युअल तरीके से हासिल करना चाहिए.

2. क्या आपने वेक लॉक का नाम सही तरीके से दिया है?

वेक लॉक को मैन्युअल तरीके से हासिल करते समय, डीबग करने के लिए सही नाम देना ज़रूरी है:

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

3. क्या वेक लॉक हमेशा रिलीज़ किया जाता है?

अगर वेक लॉक को मैन्युअल तरीके से हासिल किया जा रहा है, तो पक्का करें कि वेक लॉक रिलीज़ हमेशा काम करे. वेक लॉक को रिलीज़ न करने पर, बैटरी बहुत तेज़ी से खत्म हो सकती है. 

उदाहरण के लिए, अगर processingWork() के दौरान कोई ऐसा अपवाद मिलता है जिसे हैंडल नहीं किया गया है, तो हो सकता है कि release() कॉल कभी न हो. इसके बजाय, try-finally ब्लॉक का इस्तेमाल किया जा सकता है. इससे यह पक्का किया जा सकता है कि वेक लॉक रिलीज़ हो गया है. भले ही, कोई अपवाद हुआ हो.

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

fun processingWork() {
    wakeLock.apply {
        try {
            acquire(60 * 10 * 1000) // timeout after 10 minutes
            doTheWork()
        } finally {
            release()
        }
    }
}

4. क्या डिवाइस के अपने-आप चालू होने की फ़्रीक्वेंसी कम की जा सकती है?

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

  • WorkManager: PeriodicWorkRequest में बार-बार होने वाले इंटरवल को बढ़ाएं.
  • SensorManager: लिसनर को रजिस्टर करते समय, maxReportLatencyMs को तय करके बैचिंग का फ़ायदा पाएं.
  • कई तरह से जांची गई सही जगह की जानकारी देने वाला एपीआई:
    • सबसे हाल ही में कैश की गई जगह की जानकारी के लिए, getLastLocation का इस्तेमाल करके, जगह की जानकारी पाने की फ़्रीक्वेंसी कम करें.
    • बैटरी की खपत कम करने वाले अपडेट के तरीके के लिए, setPriority(PRIORITY_PASSIVE) का इस्तेमाल करें.
    • इसके अलावा, setMinUpdateIntervalMillis का इस्तेमाल करके, अपडेट करने का कम से कम इंटरवल सेट किया जा सकता है. इससे, लोकेशन बैचिंग मैकेनिज़्म का फ़ायदा लिया जा सकता है.

ज़्यादा जानकारी के लिए, वेक लॉक से जुड़े सबसे सही तरीकों के बारे में जानकारी देने वाला दस्तावेज़ देखें.

वेक लॉक के ज़्यादा इस्तेमाल की समस्या को ठीक करना

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

Play Console में शुरुआती पहचान

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

breakdowns2.png

Android की ज़रूरी जानकारी देने वाले डैशबोर्ड में, पार्शियल वेक लॉक के ज़्यादा इस्तेमाल की जानकारी देने वाले सेक्शन को नीचे की ओर स्क्रोल किया गया है, ताकि वेक लॉक के ज़्यादा इस्तेमाल वाले टैग देखे जा सकें.

वर्कर्स/जॉब के ज़रिए रखे गए ज़्यादा वेक लॉक को डीबग करना

इस वेक लॉक के नाम से, वर्कर के पास मौजूद वेक लॉक की पहचान की जा सकती है:

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

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

Android Studio में बैकग्राउंड टास्क की जांच करने वाला टूल

taskinspector.png


बैकग्राउंड टास्क की जांच करने वाले टूल का स्क्रीन कैप्चर. इसमें “WeatherSyncWorker” नाम के वर्कर की पहचान की गई है. यह वर्कर, बार-बार कोशिश करने के बाद भी काम नहीं कर सका.

WorkManager से जुड़ी समस्याओं को स्थानीय तौर पर डीबग करने के लिए, इस टूल का इस्तेमाल किसी एम्युलेटर या कनेक्ट किए गए डिवाइस (एपीआई लेवल 26+) पर करें. यह टूल, वर्कर और उनकी स्थितियों (पूरा हो गया, चल रहा है, लाइन में लगा है) की सूची दिखाता है. इससे आपको वर्कर की जानकारी देखने और वर्कर चेन को समझने में मदद मिलती है. 

उदाहरण के लिए, इससे यह पता चल सकता है कि सिस्टम की सीमाओं की वजह से, कोई वर्कर बार-बार फ़ेल हो रहा है या फिर से कोशिश कर रहा है. 

ज़्यादा जानकारी के लिए, बैकग्राउंड टास्क इंस्पेक्टर का दस्तावेज़ देखें.

WorkManager getStopReason

अगर वर्कर बहुत ज़्यादा वेक लॉक का इस्तेमाल कर रहे हैं, तो फ़ील्ड में उनकी डीबगिंग के लिए, WorkManager 2.9.0 या इसके बाद के वर्शन पर WorkInfo.getStopReason() का इस्तेमाल करें. इसके अलावा, JobScheduler के लिए, SDK 31 या इसके बाद के वर्शन पर उपलब्ध JobParameters.getStopReason() का इस्तेमाल करें. 

इस एपीआई की मदद से, यह जानकारी लॉग की जा सकती है कि वर्कर ने काम क्यों बंद कर दिया. जैसे, STOP_REASON_TIMEOUT, STOP_REASON_QUOTA. इससे उन समस्याओं का पता लगाने में मदद मिलती है जिनकी वजह से बार-बार टाइम आउट हो रहा है. जैसे, रनटाइम की अवधि खत्म हो गई है.

backgroundScope.launch {
    WorkManager.getInstance(context)
        .getWorkInfoByIdFlow(workRequest.id)
        .collect { workInfo ->
            logStopReason(workRequest.id, workInfo?.stopReason)
        }
}

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

ज़्यादा वेक लॉक की अन्य समस्याओं को डीबग करना

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

सिस्टम ट्रेस इकट्ठा करना

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

सिस्टम ट्रेस को कई तरीकों से कैप्चर किया जा सकता है: 

powermgmt.png

Android ऐप्लिकेशन और सेवाओं वाले टैब में जाकर, Perfetto के यूज़र इंटरफ़ेस (यूआई) में "power:PowerManagement" Atrace कैटगरी चालू करें. 

चुने गए तरीके से कोई फ़र्क़ नहीं पड़ता. डिवाइस की स्थिति को ट्रैक करने की सुविधा चालू करने के लिए, यह पक्का करना ज़रूरी है कि आपने "power:PowerManagement" Atrace कैटगरी को इकट्ठा किया हो. 

Perfetto के यूज़र इंटरफ़ेस (यूआई) की जांच और एसक्यूएल विश्लेषण

सिस्टम ट्रेस को Perfetto यूज़र इंटरफ़ेस (यूआई) में खोला और देखा जा सकता है. ट्रेस खोलने पर, आपको टाइमलाइन पर अलग-अलग प्रोसेस का विज़ुअलाइज़ेशन दिखेगा. इस गाइड में, हम “डिवाइस की स्थिति” में मौजूद ट्रैक पर फ़ोकस करेंगे.

perfetto.png


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

हर ब्लॉक में इवेंट का नाम, इवेंट के शुरू होने का समय, और इवेंट के खत्म होने का समय दिखता है. Perfetto में, इसे स्लाइस कहा जाता है.

एक से ज़्यादा ट्रेस का विश्लेषण करने के लिए, Perfetto के एसक्यूएल विश्लेषण का इस्तेमाल किया जा सकता है. एसक्यूएल क्वेरी से, अवधि के हिसाब से क्रम में लगाए गए सभी वेक लॉक का पता लगाया जा सकता है. इससे, ज़्यादा बैटरी इस्तेमाल करने वाले ऐप्लिकेशन की पहचान करने में मदद मिलती है.

यहां एक उदाहरण क्वेरी दी गई है. इसमें सिस्टम ट्रेस में मौजूद सभी वेक लॉक टैग को कुल अवधि के हिसाब से क्रम में लगाया गया है:

SELECT slice.name as name, track.name as track_name,SUM(dur / 100000) as total_dur_ms
FROM slice
JOIN track ON slice.track_id = track.id
WHERE track.name = 'WakeLocks'GROUP BY slice.name, track.name
ORDER BY total_dur_ms DESC

फ़ील्ड में ट्रेस इकट्ठा करने के लिए, ProfilingManager का इस्तेमाल करना

जिन समस्याओं को दोहराना मुश्किल होता है उनके लिए, ProfilingManager (एसडीके 35 में जोड़ा गया) एक प्रोग्रामैटिक एपीआई है. इसकी मदद से डेवलपर, फ़ील्ड में सिस्टम ट्रेस इकट्ठा कर सकते हैं. इसके लिए, उन्हें शुरू और खत्म होने वाले ट्रिगर सेट करने होते हैं. इससे प्रोफ़ाइल कलेक्शन के लिए, शुरू और खत्म होने वाले ट्रिगर पॉइंट पर ज़्यादा कंट्रोल मिलता है. साथ ही, डिवाइस की परफ़ॉर्मेंस पर असर पड़ने से रोकने के लिए, सिस्टम-लेवल पर अनुरोध संख्या सीमित करना लागू किया जाता है.

फ़ील्ड सिस्टम ट्रेस कलेक्शन को लागू करने के तरीके के बारे में ज़्यादा जानने के लिए, ProfilingManager का दस्तावेज़ देखें. इसमें, प्रोग्राम के हिसाब से ट्रेस कैप्चर करने, प्रोफ़ाइलिंग डेटा का विश्लेषण करने, और स्थानीय डीबग कमांड का इस्तेमाल करने के तरीके के बारे में बताया गया है.

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

नतीजा

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

वेक लॉक को समझकर और सही तरीके से लागू करके, अपने ऐप्लिकेशन की बैटरी परफ़ॉर्मेंस को बेहतर बनाया जा सकता है. Google Play पर अपने ऐप्लिकेशन की सफलता को पक्का करने के लिए, वैकल्पिक एपीआई का फ़ायदा उठाना, वेक लॉक के सबसे सही तरीकों का पालन करना, और Background Task Inspector, सिस्टम ट्रेस, और ProfilingManager जैसे असरदार डिबगिंग टूल का इस्तेमाल करना ज़रूरी है.

लेखक:

पढ़ना जारी रखें