Android में ANR: यह क्या है, कारण और समाधान के तरीके

लेखक: IT Sectr प्रकाशित: 2026-07-28 पढ़ने का समय: 9 मिनट

ANR (Application Not Responding) एक सिस्टम सूचना है जो Android में तब दिखाई देती है जब ऐप 5 सेकंड के भीतर इनपुट पर प्रतिक्रिया नहीं देता है। ग्लिच (UI ब्लॉकिंग के बिना तार्किक त्रुटियाँ) और लैग (पूर्ण रुकावट के बिना धीमापन) के विपरीत, ANR एक गंभीर विफलता है जिसे ऑपरेटिंग सिस्टम द्वारा रिकॉर्ड किया जाता है: Android “ऐप प्रतिक्रिया नहीं दे रहा है” संवाद प्रदर्शित करता है जिसमें बंद करने या प्रतीक्षा करने का विकल्प होता है। Android Vitals Documentation के अनुसार, 0.5% से अधिक ANR दर वाले ऐप्स को Google Play में कम रेटिंग मिलती है और उन्हें अनुशंसाओं से छिपाया जा सकता है। निदान में /data/anr/traces.txt का विश्लेषण, StrictMode का उपयोग और मुख्य थ्रेड की प्रोफाइलिंग शामिल है।

मुख्य बातें

  • ANR — Android में एक सिस्टम सूचना जब मुख्य थ्रेड 5 सेकंड से अधिक समय तक ब्लॉक रहता है, जिससे “ऐप प्रतिक्रिया नहीं दे रहा है” संवाद प्रकट होता है
  • मुख्य कारण — मुख्य थ्रेड ब्लॉकिंग (BroadcastReceiver, Service), थ्रेड्स के बीच डेडलॉक, ContentProvider में लंबा संचालन
  • निदान — /data/anr/traces.txt का विश्लेषण, Android Studio Profiler, Firebase Performance Monitoring
  • समाधान — कार्यों को WorkManager में स्थानांतरित करना, Dispatchers.IO के साथ Kotlin Coroutines का उपयोग, प्रारंभिक पहचान के लिए StrictMode
  • रोकथाम — BroadcastReceiver का समय 10 सेकंड, Service का 20 सेकंड, ContentProvider का 15 सेकंड तक सीमित करना

Android में ANR क्या है

ANR (Application Not Responding) Android में एक उपयोगकर्ता सुरक्षा तंत्र है जो तब सक्रिय होता है जब ऐप इनपुट पर प्रतिक्रिया देना बंद कर देता है। सिस्टम ईवेंट प्रसंस्करण समय को ट्रैक करता है: यदि BroadcastReceiver 10 सेकंड के भीतर onReceive पूरा नहीं करता है, Service 20 सेकंड में onCreate से वापस नहीं आती है, या ContentProvider 15 सेकंड में प्रतिक्रिया नहीं देता है — Android ANR उत्पन्न करता है।

उपयोगकर्ता के लिए ANR कैसा दिखता है

जब ANR होता है, Android सभी विंडो के ऊपर एक सिस्टम संवाद दिखाता है: “ऐप प्रतिक्रिया नहीं दे रहा है। क्या आप इसे बंद करना चाहते हैं या प्रतीक्षा करना चाहते हैं?” उपयोगकर्ता ऐप को बंद कर सकता है या उसके ठीक होने की प्रतीक्षा कर सकता है। यदि ANR बार-बार होते हैं, तो उपयोगकर्ता ऐप को अनइंस्टॉल कर देता है। Google Play अपने रैंकिंग एल्गोरिदम में ANR दर — ANR वाले सत्रों का प्रतिशत — पर विचार करता है।

ANR और iOS हैंग में अंतर

iOS में सिस्टम संवाद के साथ ANR का कोई समकक्ष नहीं है। इसके बजाय, Apple Watchdog का उपयोग करता है, जो 0x8badf00d निकास कोड के साथ प्रक्रिया को समाप्त करता है। उपयोगकर्ता को कोई संवाद नहीं दिखता — ऐप बस होम स्क्रीन पर बंद हो जाता है। यह Android पर ANR को उपयोगकर्ता के लिए अधिक ध्यान देने योग्य बनाता है, लेकिन सिस्टम को अधिक निदान जानकारी देता है।

ANR के मुख्य कारण

ANR तब होता है जब सिस्टम चार प्रकार के घटकों में से किसी एक के लिए टाइमआउट ट्रैक करता है। प्रत्येक घटक की अपनी समय सीमा होती है।

BroadcastReceiver में ब्लॉकिंग

BroadcastReceiver मुख्य थ्रेड पर निष्पादित होता है। यदि onReceive एक सिंक्रोनस नेटवर्क अनुरोध शुरू करता है, डेटाबेस में लंबी राइट करता है, या लॉक की प्रतीक्षा करता है — 10 सेकंड के भीतर ANR होता है। समाधान: बैकग्राउंड प्रोसेसिंग के लिए goAsync() और WorkManager का उपयोग करें। एक विशिष्ट परिदृश्य FCM से Push सूचना प्राप्त करना और Room में सिंक्रोनस रूप से सहेजना है।

Service में लंबा संचालन

Service.onCreate और Service.onStartCommand की 20 सेकंड की सीमा है। यदि सेवा मुख्य थ्रेड पर भारी आरंभीकरण (लाइब्रेरी लोड करना, नेटवर्क से कॉन्फ़िगरेशन पढ़ना) शुरू करती है — ANR अपरिहार्य है। बैकग्राउंड में गारंटीकृत निष्पादन के लिए IntentService (पुराना) या WorkManager का उपयोग करें।

धीमी आरंभीकरण वाला ContentProvider

ContentProvider.onCreate Application.onCreate से पहले निष्पादित होता है और इसकी 15 सेकंड की सीमा है। यदि प्रदाता डेटाबेस माइग्रेशन करता है, शब्दकोश लोड करता है, या नेटवर्क से SDK आरंभ करता है — यह ऐप स्टार्टअप पर ANR का कारण बनता है। समाधान: आलसी आरंभीकरण, भारी संचालन को WorkManager में स्थानांतरित करना।

  • BroadcastReceiver — onReceive के लिए 10 सेकंड; बैकग्राउंड प्रोसेसिंग के लिए goAsync() का उपयोग करें
  • Service — onCreate/onStartCommand के लिए 20 सेकंड; WorkManager या CoroutineWorker का उपयोग करें
  • ContentProvider — onCreate के लिए 15 सेकंड; आरंभीकरण को विलंबित लॉन्च के साथ Application.onCreate में स्थानांतरित करें
  • UI थ्रेड — ईवेंट प्रसंस्करण के बिना 5 सेकंड; 5 सेकंड से अधिक की कोई भी ब्लॉकिंग ANR को ट्रिगर करती है

ANR का निदान कैसे करें

Android ANR विश्लेषण के लिए कई उपकरण प्रदान करता है: सिस्टम लॉग से लेकर विशेष लाइब्रेरी तक।

traces.txt का विश्लेषण

प्रत्येक ANR पर, Android सभी ऐप थ्रेड्स के स्टैक डंप के साथ /data/anr/traces.txt फ़ाइल सहेजता है। “main” थ्रेड खोजें — स्टैक में अंतिम विधि कारण इंगित करती है। विशिष्ट पैटर्न: Thread.sleep(), InputStream.read(), BinderProxy.transact()। डिवाइस से फ़ाइल निकालने के लिए, सुपरयूज़र विशेषाधिकारों के साथ adb का उपयोग करें।

ANR रिपोर्ट के साथ Firebase Crashlytics

Firebase Crashlytics स्वचालित रूप से ANR एकत्र करता है और उन्हें ट्रेस के साथ डैशबोर्ड में दिखाता है। Android 11+ के लिए, ANR रिपोर्ट मुख्य थ्रेड के पूर्ण स्टैक के साथ आती हैं। एकीकरण के लिए निर्भरता जोड़ना और Application.onCreate में FirebaseApp को आरंभ करना आवश्यक है।

थ्रेड ट्रेसिंग के साथ Android Studio Profiler

Android Studio में CPU Profiler आपको ऐप ट्रेस रिकॉर्ड करने और यह देखने की अनुमति देता है कि कौन सी विधियाँ CPU समय ले रही हैं। “Record with method traces” सक्षम करें और ANR उत्पन्न करने वाले परिदृश्य को दोहराएँ। टाइमलाइन दिखाएगी कि हैंग के समय मुख्य थ्रेड पर कौन सी विधियाँ चल रही थीं।

Android पर ANR संग्रह के लिए Firebase Crashlytics एकीकरण का उदाहरण:

kotlin
class App : Application() {
    override fun onCreate() {
        super.onCreate()
        FirebaseApp.initializeApp(this)
        FirebaseCrashlytics.getInstance()
            .setCrashlyticsCollectionEnabled(true)
        StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
            .detectAll()
            .penaltyLog()
            .build())
    }
}

ANR को ठीक करने के तरीके

ANR को ठीक करने का मुख्य अर्थ है सभी लंबे संचालन को मुख्य थ्रेड से बैकग्राउंड थ्रेड में स्थानांतरित करना। आइए प्रत्येक घटक प्रकार के लिए विशिष्ट तकनीकों पर नज़र डालें।

बैकग्राउंड कार्यों के लिए WorkManager का उपयोग

WorkManager बैकग्राउंड कार्य के लिए Google का अनुशंसित समाधान है। यह डिवाइस की स्थिति को ध्यान में रखते हुए बैकग्राउंड थ्रेड पर कार्य निष्पादन की गारंटी देता है। Service के विपरीत, WorkManager मुख्य थ्रेड को ब्लॉक नहीं करता है और ऐप पुनरारंभ के प्रति लचीला है। BroadcastReceiver के लिए, goAsync() का उपयोग करें और PendingResult को WorkManager को पास करें।

उपयुक्त डिस्पैचर के साथ Kotlin Coroutines

सभी नेटवर्क अनुरोध, डेटाबेस संचालन और फ़ाइल I/O को Dispatchers.IO के साथ चलाएँ। मुख्य थ्रेड को केवल UI अपडेट करना चाहिए। Activity नष्ट होने पर स्वचालित कोरूटीन रद्दीकरण के लिए viewModelScope का उपयोग करें। किसी भी संदर्भ में runBlocking() से बचें — यह वर्तमान थ्रेड को सिंक्रोनस रूप से ब्लॉक करता है।

ContentProvider का आलसी आरंभीकरण

यदि ContentProvider धीमा आरंभीकरण करता है, तो आलसी लोडिंग तंत्र का उपयोग करें: एक प्रदाता बनाएँ जो तुरंत डेटा लौटाता है और WorkManager के माध्यम से विलंब के साथ भारी आरंभीकरण शुरू करें। यह ऐप स्टार्टअप पर ANR को रोकता है, जब सिस्टम विलंब के प्रति सबसे अधिक संवेदनशील होता है।

Android में goAsync के साथ BroadcastReceiver के सही उपयोग का उदाहरण:

kotlin
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 की रोकथाम

ANR से लड़ने का सबसे अच्छा तरीका उपकरणों और आर्किटेक्चरल निर्णयों के माध्यम से विकास के दौरान उन्हें रोकना है।

मुख्य थ्रेड ब्लॉकिंग का पता लगाने के लिए StrictMode

StrictMode सक्षम नीतियों detectNetwork() और detectDiskReads()/detectDiskWrites() के साथ विकास के दौरान संभावित ANR की पहचान करता है। Debug बिल्ड में penaltyDeath सेट करें — कोई भी उल्लंघन तत्काल क्रैश का कारण बनेगा, और डेवलपर कमिट से पहले समस्या देखेगा।

उत्पादन मेट्रिक्स के लिए Firebase Performance Monitoring

Firebase Performance मुख्य संचालन के निष्पादन समय को ट्रैक करता है और दिखाता है कि कौन से परिदृश्य ANR सीमा से अधिक हैं। प्रत्येक स्क्रीन और नेटवर्क अनुरोध के लिए कस्टम ट्रेस सेट करें। यदि निष्पादन समय 3 सेकंड से अधिक है — यह एक संभावित ANR है जिसमें अनुकूलन की आवश्यकता है।

नेटवर्क और डिस्क विलंब के साथ परीक्षण

धीमी स्थितियों का अनुकरण करें: iOS या Android Emulator पर Network Link Conditioner का उपयोग करके नेटवर्क गति सीमित करें। धीमी मेमोरी के अनुकरण के माध्यम से डिस्क रीड को धीमा करें। ANR अक्सर ऐसी स्थितियों में ही प्रकट होते हैं, तेज़ डेवलपर डिवाइसों पर वे दिखाई नहीं देते।

  • BroadcastReceiver — 1 सेकंड से अधिक की प्रोसेसिंग के लिए हमेशा goAsync() का उपयोग करें
  • Service — इसे बैकग्राउंड डिस्पैचर के साथ WorkManager या CoroutineWorker से बदलें
  • ContentProvider — onCreate में नेटवर्क और डेटाबेस से बचें, WorkManager के साथ lazy-init का उपयोग करें
  • UI थ्रेड — Debug में penaltyDeath के साथ StrictMode, उत्पादन निगरानी के लिए Firebase Performance

अक्सर पूछे जाने वाले प्रश्न

ANR Android पर क्यों होता है लेकिन iOS पर नहीं?

Android मुख्य थ्रेड पर ईवेंट प्रसंस्करण समय को स्पष्ट रूप से ट्रैक करता है और ANR संवाद दिखाता है। iOS Watchdog का उपयोग करता है, जो 10–20 सेकंड से अधिक हैंग होने पर ऐप को बलपूर्वक बंद कर देता है। ANR Android आर्किटेक्चर की एक विशेषता है जहाँ कई घटकों (BroadcastReceiver, Service) की सख्त टाइमआउट होती है।

रूट के बिना डिवाइस पर traces.txt कैसे खोजें?

Android 11+ पर आप adb shell dumpsys dropbox --print data_app_anr के माध्यम से ANR डंप प्राप्त कर सकते हैं। Android 10 और उससे नीचे, /data/anr/traces.txt तक रूट पहुँच के बिना पहुँच नहीं है। Firebase Crashlytics का उपयोग करें — यह Android 11+ के लिए स्वचालित रूप से ANR रिपोर्ट एकत्र करता है।

कौन सी ANR दर स्वीकार्य मानी जाती है?

Google Play ANR दर 0.5% से कम अनुशंसित करता है — प्रति 1000 सत्रों में 5 से अधिक ANR नहीं। 1% से अधिक दर वाला ऐप Google Play Console में चेतावनी प्राप्त करता है और अनुशंसाओं से छिपाया जा सकता है। आदर्श रूप से, ANR दर 0.1% से कम होनी चाहिए।

क्या कोरूटीन ANR का कारण बन सकता है?

कोरूटीन स्वयं थ्रेड को ब्लॉक नहीं करता है। लेकिन यदि कोरूटीन के अंदर आप मुख्य थ्रेड पर runBlocking चलाते हैं या कोरूटीन Dispatchers.Main के साथ लॉन्च किया जाता है और लंबा CPU संचालन करता है — यह ANR का कारण बनेगा। I/O के लिए Dispatchers.IO और गणना के लिए Dispatchers.Default का उपयोग करें।

एमुलेटर में ANR का परीक्षण कैसे करें?

“Slow Network” प्रोफ़ाइल के साथ Android Emulator का उपयोग करें या एक परीक्षण लिखें जो मुख्य थ्रेड पर Thread.sleep(6000) कॉल करता है। Debug के माध्यम से ऐप लॉन्च करें और 5 सेकंड के बाद आप ANR संवाद देखेंगे। जाँच करें कि logcat में ट्रेस के साथ ANR रिकॉर्ड दिखाई दे।

सारांश

  • ANR — Android में एक सिस्टम सूचना जब मुख्य थ्रेड 5 सेकंड से अधिक ब्लॉक रहता है या घटक टाइमआउट पार हो जाते हैं
  • टाइमआउट: BroadcastReceiver — 10 से, Service — 20 से, ContentProvider — 15 से, UI — 5 से
  • निदान — /data/anr/traces.txt, Firebase Crashlytics, Android Studio में CPU Profiler
  • समाधान — WorkManager, goAsync(), Dispatchers.IO के साथ Kotlin Coroutines, ContentProvider का आलसी आरंभीकरण
  • रोकथाम — penaltyDeath के साथ StrictMode, Firebase Performance Monitoring, नेटवर्क विलंब के साथ परीक्षण
  • Google Play ANR दर < 0.5% अनुशंसित करता है; दर > 1% होने पर ऐप दृश्यता प्रतिबंधों का सामना करता है
  • सिफारिश: उत्पादन में ANR संग्रह के लिए Firebase Crashlytics और Performance सेट करें और सीमा 0.3% से अधिक होने पर अलर्ट सेट करें

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें