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

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

पढ़ने में 7 मिनट लगेंगे
Alice Yuan
डेवलपर रिलेशंस इंजीनियर

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

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

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

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

warning.png

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

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

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

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

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

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

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

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

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

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

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

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

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


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

मैन्युअल तरीके से पार्शियल वेक लॉक हासिल करने से पहले, फ़्लोचार्ट में दिया गया तरीका अपनाएं:

wakelock.png

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

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

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

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

  • नाम में, व्यक्तिगत पहचान से जुड़ी कोई भी जानकारी (पीआईआई) शामिल न करें. जैसे, ईमेल पते. अगर पीआईआई का पता चलता है, तो वेक लॉक को _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: PeriodicWorkRequests में, समय-समय पर होने वाले इंटरवल को बढ़ाएं.
  • SensorManager: लिसनर को रजिस्टर करते समय, maxReportLatencyMs तय करके बैचिंग का फ़ायदा लें.
  • कई तरह से जांची गई सही जगह की जानकारी देने वाला एपीआई:
    • हाल ही में कैश की गई जगह की जानकारी के लिए, getLastLocation का इस्तेमाल करके, जगह की जानकारी पाने की फ़्रीक्वेंसी कम करें.
    • बैटरी का कम इस्तेमाल करने वाले अपडेट के तरीके के लिए, setPriority(PRIORITY_PASSIVE) का इस्तेमाल करें.
    • इसके अलावा, setMinUpdateIntervalMillis की मदद से, कम से कम अपडेट इंटरवल सेट करके, जगह की जानकारी के बैचिंग के तरीके का फ़ायदा लिया जा सकता है.

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

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

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

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

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

breakdowns2.png

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

वर्कर/जॉब से जुड़े वेक लॉक के ज़्यादा इस्तेमाल की समस्या को डीबग करना

वर्कर से जुड़े वेक लॉक की पहचान, इस वेक लॉक के नाम से की जा सकती है:

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

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

Android Studio का Background Task Inspector

taskinspector.png


Background Task Inspector का स्क्रीनशॉट. इसमें, “WeatherSyncWorker” नाम के वर्कर की पहचान की गई है, जिसने बार-बार कोशिश की और वह काम नहीं कर पाया.

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

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

ज़्यादा जानकारी के लिए, Background Task Inspector का दस्तावेज़ देखें.

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 जैसे बेहतरीन टूल का इस्तेमाल करना ज़रूरी है.

इसे लिखा है:

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