ANR (Application Not Responding) एक सिस्टम सूचना है जो Android में तब दिखाई देती है जब ऐप 5 सेकंड के भीतर इनपुट पर प्रतिक्रिया नहीं देता है। ग्लिच (UI ब्लॉकिंग के बिना तार्किक त्रुटियाँ) और लैग (पूर्ण रुकावट के बिना धीमापन) के विपरीत, ANR एक गंभीर विफलता है जिसे ऑपरेटिंग सिस्टम द्वारा रिकॉर्ड किया जाता है: Android “ऐप प्रतिक्रिया नहीं दे रहा है” संवाद प्रदर्शित करता है जिसमें बंद करने या प्रतीक्षा करने का विकल्प होता है। Android Vitals Documentation के अनुसार, 0.5% से अधिक ANR दर वाले ऐप्स को Google Play में कम रेटिंग मिलती है और उन्हें अनुशंसाओं से छिपाया जा सकता है। निदान में /data/anr/traces.txt का विश्लेषण, StrictMode का उपयोग और मुख्य थ्रेड की प्रोफाइलिंग शामिल है।
मुख्य बातें
ANR (Application Not Responding) Android में एक उपयोगकर्ता सुरक्षा तंत्र है जो तब सक्रिय होता है जब ऐप इनपुट पर प्रतिक्रिया देना बंद कर देता है। सिस्टम ईवेंट प्रसंस्करण समय को ट्रैक करता है: यदि BroadcastReceiver 10 सेकंड के भीतर onReceive पूरा नहीं करता है, Service 20 सेकंड में onCreate से वापस नहीं आती है, या ContentProvider 15 सेकंड में प्रतिक्रिया नहीं देता है — Android ANR उत्पन्न करता है।
जब ANR होता है, Android सभी विंडो के ऊपर एक सिस्टम संवाद दिखाता है: “ऐप प्रतिक्रिया नहीं दे रहा है। क्या आप इसे बंद करना चाहते हैं या प्रतीक्षा करना चाहते हैं?” उपयोगकर्ता ऐप को बंद कर सकता है या उसके ठीक होने की प्रतीक्षा कर सकता है। यदि ANR बार-बार होते हैं, तो उपयोगकर्ता ऐप को अनइंस्टॉल कर देता है। Google Play अपने रैंकिंग एल्गोरिदम में ANR दर — ANR वाले सत्रों का प्रतिशत — पर विचार करता है।
iOS में सिस्टम संवाद के साथ ANR का कोई समकक्ष नहीं है। इसके बजाय, Apple Watchdog का उपयोग करता है, जो 0x8badf00d निकास कोड के साथ प्रक्रिया को समाप्त करता है। उपयोगकर्ता को कोई संवाद नहीं दिखता — ऐप बस होम स्क्रीन पर बंद हो जाता है। यह Android पर ANR को उपयोगकर्ता के लिए अधिक ध्यान देने योग्य बनाता है, लेकिन सिस्टम को अधिक निदान जानकारी देता है।
ANR तब होता है जब सिस्टम चार प्रकार के घटकों में से किसी एक के लिए टाइमआउट ट्रैक करता है। प्रत्येक घटक की अपनी समय सीमा होती है।
BroadcastReceiver मुख्य थ्रेड पर निष्पादित होता है। यदि onReceive एक सिंक्रोनस नेटवर्क अनुरोध शुरू करता है, डेटाबेस में लंबी राइट करता है, या लॉक की प्रतीक्षा करता है — 10 सेकंड के भीतर ANR होता है। समाधान: बैकग्राउंड प्रोसेसिंग के लिए goAsync() और WorkManager का उपयोग करें। एक विशिष्ट परिदृश्य FCM से Push सूचना प्राप्त करना और Room में सिंक्रोनस रूप से सहेजना है।
Service.onCreate और Service.onStartCommand की 20 सेकंड की सीमा है। यदि सेवा मुख्य थ्रेड पर भारी आरंभीकरण (लाइब्रेरी लोड करना, नेटवर्क से कॉन्फ़िगरेशन पढ़ना) शुरू करती है — ANR अपरिहार्य है। बैकग्राउंड में गारंटीकृत निष्पादन के लिए IntentService (पुराना) या WorkManager का उपयोग करें।
ContentProvider.onCreate Application.onCreate से पहले निष्पादित होता है और इसकी 15 सेकंड की सीमा है। यदि प्रदाता डेटाबेस माइग्रेशन करता है, शब्दकोश लोड करता है, या नेटवर्क से SDK आरंभ करता है — यह ऐप स्टार्टअप पर ANR का कारण बनता है। समाधान: आलसी आरंभीकरण, भारी संचालन को WorkManager में स्थानांतरित करना।
Android ANR विश्लेषण के लिए कई उपकरण प्रदान करता है: सिस्टम लॉग से लेकर विशेष लाइब्रेरी तक।
प्रत्येक ANR पर, Android सभी ऐप थ्रेड्स के स्टैक डंप के साथ /data/anr/traces.txt फ़ाइल सहेजता है। “main” थ्रेड खोजें — स्टैक में अंतिम विधि कारण इंगित करती है। विशिष्ट पैटर्न: Thread.sleep(), InputStream.read(), BinderProxy.transact()। डिवाइस से फ़ाइल निकालने के लिए, सुपरयूज़र विशेषाधिकारों के साथ adb का उपयोग करें।
Firebase Crashlytics स्वचालित रूप से ANR एकत्र करता है और उन्हें ट्रेस के साथ डैशबोर्ड में दिखाता है। Android 11+ के लिए, ANR रिपोर्ट मुख्य थ्रेड के पूर्ण स्टैक के साथ आती हैं। एकीकरण के लिए निर्भरता जोड़ना और Application.onCreate में FirebaseApp को आरंभ करना आवश्यक है।
Android Studio में CPU Profiler आपको ऐप ट्रेस रिकॉर्ड करने और यह देखने की अनुमति देता है कि कौन सी विधियाँ CPU समय ले रही हैं। “Record with method traces” सक्षम करें और ANR उत्पन्न करने वाले परिदृश्य को दोहराएँ। टाइमलाइन दिखाएगी कि हैंग के समय मुख्य थ्रेड पर कौन सी विधियाँ चल रही थीं।
Android पर ANR संग्रह के लिए Firebase Crashlytics एकीकरण का उदाहरण:
class App : Application() {
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(this)
FirebaseCrashlytics.getInstance()
.setCrashlyticsCollectionEnabled(true)
StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build())
}
}
ANR को ठीक करने का मुख्य अर्थ है सभी लंबे संचालन को मुख्य थ्रेड से बैकग्राउंड थ्रेड में स्थानांतरित करना। आइए प्रत्येक घटक प्रकार के लिए विशिष्ट तकनीकों पर नज़र डालें।
WorkManager बैकग्राउंड कार्य के लिए Google का अनुशंसित समाधान है। यह डिवाइस की स्थिति को ध्यान में रखते हुए बैकग्राउंड थ्रेड पर कार्य निष्पादन की गारंटी देता है। Service के विपरीत, WorkManager मुख्य थ्रेड को ब्लॉक नहीं करता है और ऐप पुनरारंभ के प्रति लचीला है। BroadcastReceiver के लिए, goAsync() का उपयोग करें और PendingResult को WorkManager को पास करें।
सभी नेटवर्क अनुरोध, डेटाबेस संचालन और फ़ाइल I/O को Dispatchers.IO के साथ चलाएँ। मुख्य थ्रेड को केवल UI अपडेट करना चाहिए। Activity नष्ट होने पर स्वचालित कोरूटीन रद्दीकरण के लिए viewModelScope का उपयोग करें। किसी भी संदर्भ में runBlocking() से बचें — यह वर्तमान थ्रेड को सिंक्रोनस रूप से ब्लॉक करता है।
यदि ContentProvider धीमा आरंभीकरण करता है, तो आलसी लोडिंग तंत्र का उपयोग करें: एक प्रदाता बनाएँ जो तुरंत डेटा लौटाता है और WorkManager के माध्यम से विलंब के साथ भारी आरंभीकरण शुरू करें। यह ऐप स्टार्टअप पर ANR को रोकता है, जब सिस्टम विलंब के प्रति सबसे अधिक संवेदनशील होता है।
Android में goAsync के साथ BroadcastReceiver के सही उपयोग का उदाहरण:
class FcmReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val pendingResult = goAsync()
WorkManager.getInstance(context!!)
.enqueue(OneTimeWorkRequest.from(NotificationWorker::class.java))
pendingResult.finish()
}
}
ANR से लड़ने का सबसे अच्छा तरीका उपकरणों और आर्किटेक्चरल निर्णयों के माध्यम से विकास के दौरान उन्हें रोकना है।
StrictMode सक्षम नीतियों detectNetwork() और detectDiskReads()/detectDiskWrites() के साथ विकास के दौरान संभावित ANR की पहचान करता है। Debug बिल्ड में penaltyDeath सेट करें — कोई भी उल्लंघन तत्काल क्रैश का कारण बनेगा, और डेवलपर कमिट से पहले समस्या देखेगा।
Firebase Performance मुख्य संचालन के निष्पादन समय को ट्रैक करता है और दिखाता है कि कौन से परिदृश्य ANR सीमा से अधिक हैं। प्रत्येक स्क्रीन और नेटवर्क अनुरोध के लिए कस्टम ट्रेस सेट करें। यदि निष्पादन समय 3 सेकंड से अधिक है — यह एक संभावित ANR है जिसमें अनुकूलन की आवश्यकता है।
धीमी स्थितियों का अनुकरण करें: iOS या Android Emulator पर Network Link Conditioner का उपयोग करके नेटवर्क गति सीमित करें। धीमी मेमोरी के अनुकरण के माध्यम से डिस्क रीड को धीमा करें। ANR अक्सर ऐसी स्थितियों में ही प्रकट होते हैं, तेज़ डेवलपर डिवाइसों पर वे दिखाई नहीं देते।
अक्सर पूछे जाने वाले प्रश्न
Android मुख्य थ्रेड पर ईवेंट प्रसंस्करण समय को स्पष्ट रूप से ट्रैक करता है और ANR संवाद दिखाता है। iOS Watchdog का उपयोग करता है, जो 10–20 सेकंड से अधिक हैंग होने पर ऐप को बलपूर्वक बंद कर देता है। ANR Android आर्किटेक्चर की एक विशेषता है जहाँ कई घटकों (BroadcastReceiver, Service) की सख्त टाइमआउट होती है।
Android 11+ पर आप adb shell dumpsys dropbox --print data_app_anr के माध्यम से ANR डंप प्राप्त कर सकते हैं। Android 10 और उससे नीचे, /data/anr/traces.txt तक रूट पहुँच के बिना पहुँच नहीं है। Firebase Crashlytics का उपयोग करें — यह Android 11+ के लिए स्वचालित रूप से ANR रिपोर्ट एकत्र करता है।
Google Play ANR दर 0.5% से कम अनुशंसित करता है — प्रति 1000 सत्रों में 5 से अधिक ANR नहीं। 1% से अधिक दर वाला ऐप Google Play Console में चेतावनी प्राप्त करता है और अनुशंसाओं से छिपाया जा सकता है। आदर्श रूप से, ANR दर 0.1% से कम होनी चाहिए।
कोरूटीन स्वयं थ्रेड को ब्लॉक नहीं करता है। लेकिन यदि कोरूटीन के अंदर आप मुख्य थ्रेड पर runBlocking चलाते हैं या कोरूटीन Dispatchers.Main के साथ लॉन्च किया जाता है और लंबा CPU संचालन करता है — यह ANR का कारण बनेगा। I/O के लिए Dispatchers.IO और गणना के लिए Dispatchers.Default का उपयोग करें।
“Slow Network” प्रोफ़ाइल के साथ Android Emulator का उपयोग करें या एक परीक्षण लिखें जो मुख्य थ्रेड पर Thread.sleep(6000) कॉल करता है। Debug के माध्यम से ऐप लॉन्च करें और 5 सेकंड के बाद आप ANR संवाद देखेंगे। जाँच करें कि logcat में ट्रेस के साथ ANR रिकॉर्ड दिखाई दे।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें