अटके हुए पार्शियल वेक लॉक

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

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

समस्या का पता लगाना

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

Android की ज़रूरी जानकारी

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

बैटरी सेशन की परिभाषा, प्लैटफ़ॉर्म के वर्शन पर निर्भर करती है.

  • Android 10 में एक बैटरी सेशन, सभी बैटरी रिपोर्ट को एक साथ जोड़कर देखा जाता है जो 24 घंटे के अंदर मिले हों. बैटरी रिपोर्ट दो बैटरी चार्ज के बीच का अंतराल या तो 20% से कम से लेकर 80% से ज़्यादा या किसी भी चार्ज लेवल से लेकर 100% तक.
  • Android 11 में, बैटरी सेशन की अवधि 24 घंटे तय होती है.

दिखाए गए बैटरी सेशन की संख्या, मेज़र किए गए सभी उपयोगकर्ताओं के लिए एग्रीगेट है खोलें. Google Play, 'Android की ज़रूरी जानकारी' का डेटा कैसे इकट्ठा करता है, इस बारे में जानने के लिए यह देखें यह Play Console दस्तावेज़.

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

समस्या ठीक करें

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

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

अपने कोड में उन जगहों की पहचान करके उन्हें ठीक करें जहां वेक लॉक की सुविधा चालू है, जैसे कि newWakeLock(int, String) या WakefulBroadcastReceiver सब-क्लास हैं. इससे जुड़े कुछ सुझाव यहां दिए गए हैं:

  • हमारा सुझाव है कि आप वेकलॉक में अपने पैकेज, क्लास या तरीके का नाम शामिल करें टैग का नाम देखें, ताकि आप अपने सोर्स में मौजूद जगह की पहचान आसानी से कर सकें जहां वेक लॉक बनाया गया था. यहां कुछ अतिरिक्त सुझाव दिए गए हैं:
    • नाम में व्यक्तिगत पहचान से जुड़ी कोई जानकारी (पीआईआई) शामिल न करें, जैसे कि ईमेल पता. ऐसा न करने पर, डिवाइस में _UNKNOWN लॉग हो जाएगा वेक लॉक के नाम के बजाय.
    • क्लास या तरीके का नाम प्रोग्राम के हिसाब से न पाएं, उदाहरण के लिए getName() पर कॉल किया जा रहा है, क्योंकि ProGuard इन्हें अस्पष्ट बना सकते हैं. इसके बजाय, हार्ड कोड किए गए कोड का इस्तेमाल करें स्ट्रिंग.
    • लॉक टैग को एक्टिव करने के लिए, काउंटर या यूनीक आइडेंटिफ़ायर न जोड़ें. कॉन्टेंट बनाने सिस्टम, इसके ज़रिए बनाए गए वेक लॉक को इकट्ठा नहीं कर पाएगा का इस्तेमाल किया है, क्योंकि उन सभी के पास यूनीक आइडेंटिफ़ायर होते हैं.
  • पक्का करें कि आपका कोड, हासिल किए गए सभी वेक लॉक को रिलीज़ कर रहा है. यह है ज़्यादा मुश्किल है, क्योंकि यह पक्का करना मुश्किल है कि हर बार acquire() संबंधित कॉल release(). यहां ऐसे वेक लॉक का उदाहरण दिया गया है जो किसी आइटम की पहचान न होने की वजह से रिलीज़ नहीं हो सका अपवाद:

    Kotlin

    @Throws(MyException::class)
    fun doSomethingAndRelease() {
        wakeLock.apply {
            acquire()
            doSomethingThatThrows()
            release()  // does not run if an exception is thrown
        }
    }

    Java

        void doSomethingAndRelease() throws MyException {
            wakeLock.acquire();
            doSomethingThatThrows();
            wakeLock.release();  // does not run if an exception is thrown
        }

    यहां कोड का सही वर्शन दिया गया है:

    Kotlin

    @Throws(MyException::class)
    fun doSomethingAndRelease() {
        wakeLock.apply {
            try {
                acquire()
                doSomethingThatThrows()
            } finally {
                release()
            }
        }
    }

    Java

        void doSomethingAndRelease() throws MyException {
            try {
                wakeLock.acquire();
                doSomethingThatThrows();
            } finally {
                wakeLock.release();
            }
        }
  • पक्का करें कि सक्रियता लॉक के खत्म होते ही उन्हें हटा दिया जाए की ज़रूरत नहीं है. उदाहरण के लिए, अगर बैकग्राउंड को अनुमति देने के लिए, वेक लॉक का इस्तेमाल किया जा रहा है, तो टास्क पूरा करना है, तो पक्का करें कि उस टास्क के पूरा होने के बाद रिलीज़ हो. अगर आपने वेक लॉक को उम्मीद से ज़्यादा समय तक रोका जाता है और रिलीज़ किए बिना ऐसा किया जाता है. इसका मतलब यह हो सकता है कि बैकग्राउंड में आपके टास्क को पूरा करने में उम्मीद से ज़्यादा समय लग रहा है.

कोड में आई समस्या को ठीक करने के बाद, पुष्टि करें कि आपका ऐप्लिकेशन सही तरीके से वेक रिलीज़ कर रहा है लॉक करता है:

सबसे सही तरीके

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

अगर आपको पार्शियल वेक लॉक का इस्तेमाल करना है, तो ये सुझाव अपनाएं:

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