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

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

7 मिनट में पढ़ें
ऐलिस युआन की प्रोफ़ाइल देखें
Alice Yuan डेवलपर रिलेशंस इंजीनियर, Android

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

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

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

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

warning.png

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

मोबाइल डिवाइसों के लिए, Android vitals मेट्रिक उन वेक लॉक पर लागू होती है जिन्हें स्क्रीन बंद होने पर हासिल किया गया हो. साथ ही, ऐप्लिकेशन बैकग्राउंड में चल रहा हो या फ़ोरग्राउंड सेवा चला रहा हो. 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 (SDK 35 में जोड़ा गया) एक प्रोग्रामैटिक एपीआई है. इसकी मदद से डेवलपर, फ़ील्ड में सिस्टम ट्रेस इकट्ठा कर सकते हैं. इसके लिए, उन्हें शुरू और खत्म होने वाले ट्रिगर का इस्तेमाल करना होगा. इससे, प्रोफ़ाइल कलेक्शन के लिए स्टार्ट और एंड ट्रिगर पॉइंट पर ज़्यादा कंट्रोल मिलता है. साथ ही, डिवाइस की परफ़ॉर्मेंस पर असर पड़ने से रोकने के लिए, सिस्टम-लेवल पर अनुरोध संख्या सीमित करना लागू होता है.

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

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

नतीजा

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

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

लेखक:
पढ़ना जारी रखें