ANR

जब किसी Android ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) थ्रेड बहुत देर तक ब्लॉक रहता है, तो "ऐप्लिकेशन काम नहीं कर रहा है" (एएनआर) गड़बड़ी ट्रिगर होती है. 'Android की ज़रूरी जानकारी' सुविधा, Google Play Console में एएनआर मेट्रिक को ट्रैक करती है और उसकी रिपोर्ट देती है. इससे आपको अलग-अलग डिवाइसों पर, अपने ऐप्लिकेशन के बिना क्रैश या फ़्रीज़ हुए काम करने की क्षमता और रिस्पॉन्सिवनेस को मॉनिटर करने में मदद मिलती है.

Android की ज़रूरी जानकारी वाली मेट्रिक और थ्रेशोल्ड

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

  • एएनआर रेट: हर दिन के ऐसे सक्रिय उपयोगकर्ताओं का प्रतिशत जिन्होंने किसी भी तरह की एएनआर की गड़बड़ी का सामना किया.
  • यूज़र-पर्सीव्ड एएनआर रेट: हर दिन के ऐसे सक्रिय उपयोगकर्ताओं का प्रतिशत जिन्हें कम से कम एक बार यूज़र-पर्सीव्ड एएनआर की गड़बड़ी का पता चला. फ़िलहाल, सिर्फ़ Input dispatching timed out टाइप के एएनआर को यूज़र-पर्सीव्ड एएनआर माना जाता है.
  • मल्टिपल ANR रेट: हर दिन के ऐसे सक्रिय उपयोगकर्ताओं का प्रतिशत जिन्होंने कम से कम दो बार ANR की गड़बड़ी का सामना किया.

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

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

Google Play ने इस मेट्रिक में, ऐप्लिकेशन की खराब परफ़ॉर्मेंस के दो थ्रेशोल्ड तय किए हैं:

  • सभी डिवाइस मॉडल पर ऐप्लिकेशन की खराब परफ़ॉर्मेंस का थ्रेशोल्ड: हर दिन के सक्रिय उपयोगकर्ताओं में से कम से कम 0.47% लोगों को सभी डिवाइस मॉडल पर यूज़र-पर्सीव्ड एएनआर का सामना करना पड़ता है.
  • किसी खास डिवाइस मॉडल पर ऐप्लिकेशन की खराब परफ़ॉर्मेंस का थ्रेशोल्ड: हर दिन आपका ऐप्लिकेशन इस्तेमाल करने वाले लोगों में से कम से कम 8% लोगों को किसी खास डिवाइस मॉडल पर, यूज़र-पर्सीव्ड एएनआर वाली गड़बड़ियों का सामना करना पड़ता है.

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

जब आपका ऐप्लिकेशन बहुत ज़्यादा एएनआर दिखाता है, तो Android की ज़रूरी जानकारी आपको Play Console के ज़रिए सूचना दे सकती है.

Google Play, Android की ज़रूरी जानकारी वाला डेटा कैसे इकट्ठा करता है, इस बारे में जानने के लिए Play Console का दस्तावेज़ देखें.

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

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

उपयोगकर्ता को ANR डायलॉग दिखाया गया.
पहली इमेज. उपयोगकर्ता को ANR डायलॉग दिखाया गया

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

आपके ऐप्लिकेशन के लिए एएनआर तब ट्रिगर होता है, जब इनमें से कोई एक स्थिति होती है:

  • इनपुट डिस्पैच करने की समयसीमा खत्म हो गई है: अगर आपके ऐप्लिकेशन ने पांच सेकंड के अंदर, इनपुट इवेंट (जैसे, बटन दबाना या स्क्रीन को छूना) का जवाब नहीं दिया है.
  • सेवा को लागू करना: अगर आपके ऐप्लिकेशन की ओर से बताई गई कोई सेवा, कुछ सेकंड में Service.onCreate और Service.onStartCommand या Service.onBind को लागू नहीं कर पाती है.
  • Service.startForeground को कॉल नहीं किया गया: अगर आपका ऐप्लिकेशन फ़ोरग्राउंड में नई सेवा शुरू करने के लिए Context.startForegroundService का इस्तेमाल करता है, लेकिन सेवा पांच सेकंड के अंदर startForeground को कॉल नहीं करती है.
  • ब्रॉडकास्ट ऑफ़ इंटेंट: अगर कोई BroadcastReceiver तय समय में पूरा नहीं होता है. अगर ऐप्लिकेशन में फ़ोरग्राउंड में कोई गतिविधि हो रही है, तो टाइम आउट 10 सेकंड का होता है.
  • JobScheduler इंटरैक्शन: अगर JobService कुछ सेकंड के अंदर JobService.onStartJob या JobService.onStopJob से वापस नहीं आता है या अगर उपयोगकर्ता की ओर से शुरू किया गया कोई जॉब शुरू होता है और आपका ऐप्लिकेशन JobService.onStartJob को कॉल करने के कुछ सेकंड के अंदर JobService.setNotification को कॉल नहीं करता है. Android 13 और इससे पहले के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, एएनआर की गड़बड़ियां साइलेंट होती हैं और ऐप्लिकेशन को इनकी जानकारी नहीं दी जाती. Android 14 और इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, एएनआर की गड़बड़ियां साफ़ तौर पर दिखती हैं और ऐप्लिकेशन को इनकी जानकारी दी जाती है.

Android की ज़रूरी जानकारी के अलावा, अन्य टूल का इस्तेमाल करके भी एएनआर का पता लगाया जा सकता है. हालांकि, तीसरे पक्ष के टूल, Android 10 (एपीआई लेवल 29) और इससे पहले के वर्शन पर एएनआर की जानकारी नहीं दे सकते.

एएनआर की गड़बड़ियों का विश्लेषण करना

एएनआर की गड़बड़ियों का पता लगाते समय, कुछ सामान्य पैटर्न पर ध्यान देना चाहिए:

  • ऐप्लिकेशन, मुख्य थ्रेड पर I/O से जुड़ी धीमी कार्रवाइयां कर रहा है.
  • ऐप्लिकेशन, मुख्य थ्रेड पर लंबे समय से कैलकुलेशन कर रहा है.
  • मुख्य थ्रेड, किसी दूसरी प्रोसेस के लिए सिंक्रोनस बाइंडर कॉल कर रहा है. साथ ही, उस दूसरी प्रोसेस को पूरा होने में ज़्यादा समय लग रहा है.
  • मुख्य थ्रेड को ब्लॉक किया गया है. यह किसी दूसरे थ्रेड पर चल रहे लंबे ऑपरेशन के लिए, सिंक्रनाइज़ किए गए ब्लॉक का इंतज़ार कर रही है.
  • मुख्य थ्रेड, आपकी प्रोसेस में या बाइंडर कॉल के ज़रिए किसी दूसरी थ्रेड के साथ डेडलॉक में है. मुख्य थ्रेड, किसी लंबे ऑपरेशन के खत्म होने का इंतज़ार नहीं कर रही है, बल्कि डेडलॉक की स्थिति में है.

इन तरीकों से, एएनआर की वजह का पता लगाया जा सकता है.

HealthStats

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

डीबग

Debug की मदद से, Android ऐप्लिकेशन को डेवलप करने के दौरान उनकी जांच की जा सकती है. इसमें ऐप्लिकेशन में होने वाली रुकावटों और लैग की पहचान करने के लिए, ट्रेसिंग और ऐलोकेशन की संख्या शामिल है. Debug का इस्तेमाल करके, रनटाइम और नेटिव मेमोरी काउंटर के साथ-साथ मेमोरी मेट्रिक भी देखी जा सकती हैं. इनसे आपको किसी प्रोसेस के लिए इस्तेमाल की जाने वाली मेमोरी (मेमोरी फ़ुटप्रिंट) का पता लगाने में मदद मिल सकती है.

ApplicationExitInfo

ApplicationExitInfo, Android 11 (एपीआई लेवल 30) और इसके बाद के वर्शन पर उपलब्ध है. इससे ऐप्लिकेशन के बंद होने की वजह के बारे में जानकारी मिलती है. इसमें ANR, कम मेमोरी, ऐप्लिकेशन क्रैश होना, सीपीयू का ज़्यादा इस्तेमाल, उपयोगकर्ता की वजह से होने वाली रुकावटें, सिस्टम की वजह से होने वाली रुकावटें, और रनटाइम की अनुमति में होने वाले बदलाव शामिल हैं.

स्ट्रिक्ट मोड

StrictMode का इस्तेमाल करके, ऐप्लिकेशन डेवलप करते समय मुख्य थ्रेड पर अनचाहे I/O ऑपरेशन का पता लगाया जा सकता है. StrictMode का इस्तेमाल, ऐप्लिकेशन या गतिविधि के लेवल पर किया जा सकता है.

बैकग्राउंड में एएनआर डायलॉग चालू करना

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

सीपीयू और सिस्टम ट्रेस की प्रोफ़ाइल बनाना

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

ट्रेस फ़ाइल को पुल करना

जब Android को एएनआर की समस्या का सामना करना पड़ता है, तो वह ट्रेस की जानकारी सेव करता है. Android के पुराने वर्शन वाले डिवाइसों पर, /data/anr/traces.txt की एक ही फ़ाइल होती है. Android के नए वर्शन पर, कई /data/anr/anr_* फ़ाइलें होती हैं. रूट के तौर पर Android डीबग ब्रिज (एडीबी) का इस्तेमाल करके, किसी डिवाइस या एम्युलेटर से एएनआर ट्रेस ऐक्सेस किए जा सकते हैं:

adb root
adb shell ls /data/anr
adb pull /data/anr/<filename>

किसी फ़िज़िकल डिवाइस से गड़बड़ी की रिपोर्ट कैप्चर की जा सकती है. इसके लिए, डिवाइस पर 'गड़बड़ी की रिपोर्ट पाएं' डेवलपर विकल्प या अपनी डेवलपमेंट मशीन पर adb bugreport कमांड का इस्तेमाल करें. ज़्यादा जानकारी के लिए, गड़बड़ी की रिपोर्ट कैप्चर करना और पढ़ना लेख पढ़ें.

समस्याएं ठीक करना

समस्या का पता चलने के बाद, इस सेक्शन में दी गई सलाह का इस्तेमाल करके, आम तौर पर होने वाली समस्याओं को ठीक किया जा सकता है.

मुख्य थ्रेड पर धीमा कोड

अपने कोड में उन जगहों की पहचान करें जहां ऐप्लिकेशन का मुख्य थ्रेड, पांच सेकंड से ज़्यादा समय तक व्यस्त रहता है. अपने गेम में संदिग्ध इस्तेमाल के उदाहरण देखें और एएनआर की समस्या को फिर से पैदा करने की कोशिश करें.

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

मुख्य थ्रेड पर I/O

मुख्य थ्रेड पर I/O कार्रवाइयां करने से, मुख्य थ्रेड पर कार्रवाइयां धीमी हो जाती हैं. इससे ANR की गड़बड़ियां हो सकती हैं.

सभी ऐसेट बंडल रीड, सेव-गेम सीरियलाइज़ेशन, SharedPreferences ऐक्सेस, और नेटवर्क अनुरोधों को मुख्य Activity थ्रेड से बैकग्राउंड वर्कर थ्रेड पर ले जाएं, ताकि स्टोरेज या नेटवर्क के इंतज़ार का समय, इनपुट डिस्पैच करने की प्रोसेस को ब्लॉक न कर सके.

डेडलॉक

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

गेम में, Android के मुख्य Activity थ्रेड (लाइफ़साइकल, सरफ़ेस या इनपुट कॉलबैक को मैनेज करने वाले) और नेटिव C या C++ रेंडर, लॉजिक या ऑडियो थ्रेड के बीच अक्सर डेडलॉक और लॉक कॉन्टेंशन की समस्याएं आती हैं. नेटिव इंजन लॉक के लिए, मुख्य थ्रेड पर सिंक्रोनस वेट का इस्तेमाल करने से बचें. साथ ही, जेएनआई और इंजन थ्रेड के बीच कम्यूनिकेट करते समय, एक जैसे लॉक ऑर्डर या लॉक-फ़्री मैसेज क्यू का इस्तेमाल करें.

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

ज़्यादा जानकारी के लिए, Wikipedia पर डेडलॉक और डेडलॉक को रोकने वाले एल्गोरिदम लेख पढ़ें.

धीमे ब्रॉडकास्ट रिसीवर

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

एएनआर की गड़बड़ी इन मामलों में होती है:

  • ब्रॉडकास्ट रिसीवर ने तय समय में onReceive तरीके को लागू नहीं किया.
  • कोई ब्रॉडकास्ट रिसीवर, goAsync को कॉल करता है और PendingResult ऑब्जेक्ट पर finish को कॉल नहीं कर पाता.

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

GameActivity

GameActivity लाइब्रेरी ने C या C++ में लिखे गए गेम और ऐप्लिकेशन की केस स्टडी में, ANR की संख्या कम कर दी है. अगर अपनी मौजूदा नेटिव गतिविधि को GameActivity से बदल दिया जाए, तो यूज़र इंटरफ़ेस (यूआई) थ्रेड को ब्लॉक होने से रोका जा सकता है. साथ ही, कुछ ANR को होने से रोका जा सकता है.

अगर Unity की मदद से गेम बनाया जा रहा है, तो Unity गेम के लिए एएनआर डीबग करना, Unity गेम के सामान्य एएनआर, और Unity गेम के लिए Android क्रैश और एएनआर को सिंबॉलिकेट करना देखें.

एएनआर के बारे में ज़्यादा जानने के लिए, अपने ऐप्लिकेशन को रिस्पॉन्सिव बनाए रखना लेख पढ़ें. थ्रेड के बारे में ज़्यादा जानकारी के लिए, थ्रेड की मदद से बेहतर परफ़ॉर्मेंस लेख पढ़ें.