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

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

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

बैटरी लाइफ़, उपयोगकर्ता अनुभव का एक अहम पहलू है. इसमें वेक लॉक की अहम भूमिका होती है. क्या आपके ऐप्लिकेशन में वेक लॉक का ज़्यादा इस्तेमाल हो रहा है? इस ब्लॉग पोस्ट में, हम वेक लॉक के बारे में जानेंगे. साथ ही, इनका इस्तेमाल करने के सबसे सही तरीकों के बारे में भी जानेंगे. इसके अलावा, हम यह भी जानेंगे कि 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 ऐप्लिकेशन और svcs टैब में, Perfetto यूज़र इंटरफ़ेस (यूआई) में "power:PowerManagement" Atrace कैटगरी चालू करें. 

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

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

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

perfetto.png


लंबे समय तक चलने वाले वेक लॉक स्लाइस की पहचान करने के लिए, “Device State” में मौजूद ट्रैक को पिन करें. जैसे, "Top app", "Screen state", "Long Wake locks", और “Jobs” ट्रैक.

हर ब्लॉक में, इवेंट का नाम, इवेंट शुरू होने का समय, और इवेंट खत्म होने का समय दिखता है. 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.

इसे लिखा है:
आगे पढ़ें