Android ڈیولپمنٹ میں ANR — یہ کیا ہے، وجوہات اور اسے ٹھیک کرنے کے طریقے

مصنف: IT Sectr اشاعت: 2026-03-28 مطالعے کا وقت: 9 منٹ

ANR (Application Not Responding) ایک Android سسٹم اطلاع ہے جو ظاہر ہوتی ہے جب ایپ صارف کے ان پٹ پر 5 سیکنڈ سے زیادہ جواب دینا بند کردے۔ Android Developers کے مطابق، بنیادی وجہ مرکزی تھریڈ پر طویل عملیات ہیں جو ٹچ پروسیسنگ اور UI رینڈرنگ کو روکتی ہیں۔ ذمہ‌دار ایپلیکیشنز بنانے کے لیے ہر Android ڈیولپر کے لیے ANR میکانزم کو سمجھنا ضروری ہے۔

اہم نکات

  • ANR — Android میں ایک سسٹم انتباہ جب ایپ 5 سیکنڈ سے زیادہ منجمد ہوجائے
  • مرکزی تھریڈ (UI تھریڈ) — واحد جگہ جہاں روکنا ANR کی طرف لے جاتا ہے
  • InputDispatcher — سسٹم جزو جو ان پٹ تاخیر کا پتہ لگاتا ہے اور ANR متحرک کرتا ہے
  • traces.txt — ڈیوائس پر منجمد ہونے کی وجہ کی تشخیص کے لیے کلیدی فائل
  • StrictMode — UI تھریڈ پر طویل عملیات کا پتہ لگانے کے لیے Android بلٹ ان ٹول

ANR کیا ہے

ANR (Application Not Responding) Android آپریٹنگ سسٹم کا ایک ڈائیلاگ باکس ہے جو ظاہر ہوتا ہے جب ایپ صارف کے ان پٹ پر جواب دینا بند کردے۔ سسٹم InputDispatcher کے ذریعے واقعہ پروسیسنگ وقت کو ٹریک کرتا ہے: اگر کوئی ٹچ یا بٹن دباؤ 5 سیکنڈ کے اندر پروسیس نہ ہو، تو Android ایپ کو بند کرنے یا انتظار کرنے کا اختیار دیتے ہوئے ڈائیلاگ دکھاتا ہے۔

ANR میکانزم منجمد ایپس سے صارف کے تجربے کی حفاظت کرتا ہے۔ Android ایک ایپ کو پورے سسٹم کو بلاک کرنے کی اجازت نہیں دیتا — ڈیسک ٹاپ OS کے برعکس، موبائل پلیٹ فارم زبردستی واقعہ پروسیسنگ وقت کو محدود کرتا ہے۔ BroadcastReceiver کی 10 سیکنڈ کی حد ہے اور foreground سروس کی 20 سیکنڈ کی حد ہے۔

ANR کوڈ میں کوئی استثنا نہیں ہے — یہ Linux عمل کی سطح پر ایک سسٹم میکانزم ہے۔ Android عمل کو SIGQUIT سگنل بھیجتا ہے، جس کے بعد سسٹم تمام تھریڈز کے کال اسٹیک کو traces.txt فائل میں محفوظ کرتا ہے۔ ڈیولپر ANR کو catch استثنا کے طور پر نہیں، بلکہ ایپ دوبارہ شروع ہونے کے بعد رپورٹ کے طور پر حاصل کرتا ہے۔ Android 11+ پر، ApplicationExitInfo API پروگراماتی طور پر عمل ختم ہونے کی وجہ حاصل کرنے کی اجازت دیتی ہے، بشمول ANR — یہ دستی traces.txt تجزیہ کے بغیر اعدادوشمار جمع کرنے کو آسان بناتا ہے۔

ANR کی بنیادی وجوہات

پانچ زمرے کی عملیات Android ایپس میں مستقل طور پر ANR کا باعث بنتی ہیں۔ ان میں سے ہر ایک مرکزی تھریڈ کو روکتا ہے، سسٹم کو ان پٹ واقعات اور اسکرین دوبارہ ڈرائنگ پر کارروائی کرنے سے روکتا ہے۔

مرکزی تھریڈ پر نیٹ ورک کی درخواستیں

UI تھریڈ پر انجام دی گئی مطابقت پذیر HTTP درخواستیں ابتدائی ڈیولپرز میں ANR کی سب سے عام وجہ ہیں۔ سرور سے ایک تیز درخواست بھی 1–3 سیکنڈ لے سکتی ہے، اور خراب کنکشن پر — 30 سیکنڈ یا اس سے زیادہ۔ Android API 11 سے مرکزی تھریڈ پر نیٹ ورک کی عملیات کو واضح طور پر منع کرتا ہے، NetworkOnMainThreadException پھینکتا ہے۔

غیر مطابقت پذیر کالز کے لیے Coroutines یا RxJava استعمال کریں۔ Dispatchers.IO ڈسپیچر والے coroutines پس منظر کے تھریڈ پر درخواست انجام دیتے ہیں اور Dispatchers.Main کے ذریعے نتیجہ مرکزی تھریڈ کو بھیجتے ہیں۔ یہ نیٹ ورک عملیات کے ذریعے UI تھریڈ روکے جانے کو مکمل طور پر ختم کرتا ہے۔

kotlin
fun fetchUserData() {
    CoroutineScope(Dispatchers.Main).launch {
        val result = withContext(Dispatchers.IO) {
            api.getUserData() // پس منظر کا عمل
        }
        updateUI(result) // مرکزی تھریڈ پر نتیجہ
    }
}

UI تھریڈ پر گہری کمپیوٹیشن

بڑے ڈیٹا ایریز کو پروسیس کرنا، JSON یا XML کو پارس کرنا، براہ راست مرکزی تھریڈ پر bitmap کے ساتھ کام کرنا — ANR کی دوسری سب سے عام وجہ۔ واقعہ لوپ میں واپس آئے بغیر UI تھریڈ کے 300 ملی سیکنڈ مسلسل کام کرنے سے بھی رینڈرنگ میں نمایاں تاخیر ہوتی ہے، اور 5 سیکنڈ کی حد ANR کے طور پر ریکارڈ کی جاتی ہے۔

WorkManager اور پس منظر کی خدمات بھاری کمپیوٹیشن کو مرکزی تھریڈ سے ہٹانے کے لیے ڈیزائن کی گئی ہیں۔ UI کو روکے بغیر ڈیٹا کو ٹکڑوں میں منتقل کرنے کے لیے AsyncTask (متروک)، ListenableFuture یا Kotlin Flow استعمال کریں۔

ہم آہنگی کے لاک اور Deadlock

Deadlock اس وقت ہوتا ہے جب دو تھریڈ لاک رکھتے ہیں اور ایک دوسرے کا انتظار کرتے ہیں۔ اگر تھریڈز میں سے ایک مرکزی تھریڈ ہے، تو سسٹم ٹھیک 5 سیکنڈ کے بعد ANR ریکارڈ کرتا ہے۔ UI تھریڈ سے بلائے گئے Thread.join()، CountDownLatch.await() اور synchronized بلاکس روکے جانے کا خطرہ رکھتے ہیں۔

مرکزی تھریڈ پر کسی بھی روکنے والی کارروائی سے گریز کریں۔ synchronized کی بجائے ConcurrentHashMap استعمال کریں؛ Thread.join() کی بجائے async/await کے ساتھ coroutines استعمال کریں۔ یہ قاعدہ Android میں کسی بھی زبان پر لاگو ہوتا ہے: Java، Kotlin یا JNI کے ذریعے C++۔

طویل عرصے تک چلنے والا BroadcastReceiver

BroadcastReceiver ڈیفالٹ طور پر مرکزی تھریڈ پر چلتا ہے۔ اگر onReceive() 10 سیکنڈ سے زیادہ مصروف ہو، تو Android ANR دکھاتا ہے۔ onReceive کے اندر ڈیٹابیس یا نیٹ ورک سے ڈیٹا لوڈ کرنا منجمد ہونے کا یقینی راستہ ہے۔

پس منظر کے تھریڈ پر سوئچ کرنے کے لیے BroadcastReceiver کے اندر goAsync() استعمال کریں، یا getBackgroundBroadcastReceiver() کے ساتھ registerReceiver استعمال کریں۔ یہ UI کو روکے بغیر واقعات پر کارروائی کرنے کی اجازت دیتا ہے۔

مرکزی تھریڈ پر ContentProvider اور SQLite

ContentProvider کو بھاری سوالات یا UI تھریڈ پر SQLite کے ساتھ براہ راست کام — ANR کی ایک کم واضح لیکن عام وجہ۔ ڈیٹابیس کی منتقلی یا ہزاروں ریکارڈز کی بلک اندراج کے دوران، عملدرآمد کا وقت 5 سیکنڈ کی حد سے تجاوز کر سکتا ہے۔

تمام ڈیٹابیس عملیات کو suspend فنکشنز کے ساتھ Room کے ذریعے پس منظر کے تھریڈز میں منتقل کریں۔ Room خود بخود چیک کرتا ہے کہ سوال مرکزی تھریڈ پر انجام نہیں دے رہا ہے اور خلاف ورزی کی صورت میں استثنا پھینکتا ہے۔

ANR کی تشخیص کیسے کریں

ANR کی تشخیص عام استثناؤں کی ڈیبگنگ سے مختلف ہے — آپ ANR کو try-catch بلاک میں نہیں پکڑ سکتے۔ معلومات کا بنیادی ذریعہ traces.txt فائل ہے، جو Android منجمد ہونے کے لمحے بناتا ہے۔

traces.txt میں ANR کے وقت تمام ایپ تھریڈز کا کال اسٹیک ہوتا ہے۔ حقیقی ڈیوائس سے فائل پڑھنے کے لیے، adb bugreport کمانڈ چلائیں، جو حالیہ تمام ANRs سمیت مکمل سسٹم رپورٹ جمع کرتی ہے۔ ایمولیٹر کے لیے، فائل /data/anr/traces.txt پر دستیاب ہے۔ کال اسٹیک دکھاتا ہے کہ روکے جانے کے وقت مرکزی تھریڈ پر کون سا طریقہ کار انجام دے رہا تھا۔

text
adb bugreport bugreport.zip
unzip -p bugreport.zip "*traces*" > traces.txt

Google Play Console جمع شدہ رپورٹس اور غلطی کی تعدد کے ساتھ ANR & Crash سیکشن فراہم کرتی ہے۔ ہر ANR کے لیے، کال اسٹیک اور ڈیوائس کے اعدادوشمار دکھائے جاتے ہیں: ماڈل، Android ورژن، علاقہ۔ یہ مخصوص ڈیوائسز یا سسٹم ورژن پر منحصر ANRs کی شناخت کرنے کی اجازت دیتا ہے۔

Android Studio 2021 سے پروفائلر میں ANR Watchdog شامل ہے۔ یہ خود بخود تھریڈ ڈمپ ریکارڈ کرتا ہے اگر مرکزی تھریڈ ایک حد کے وقت سے زیادہ جواب نہ دے۔ ٹول واقعات کی ٹائم لائن دکھاتا ہے: کون سی عملیات شروع ہوئیں، کون سے طریقے انجام دیے گئے اور روکنا کس مرحلے پر ہوا۔

ANR کو کیسے روکیں

ANR کی روک تھام ایک بنیادی اصول پر مبنی ہے: مرکزی تھریڈ کو صرف UI واقعات کو ہینڈل کرنا چاہیے۔ 16 ملی سیکنڈ (ایک فریم کا وقت) سے زیادہ لمبی کوئی بھی کارروائی پس منظر کے تھریڈ پر انجام دی جانی چاہیے۔

StrictMode — خودکار جانچ

StrictMode ترقی کے دوران ممکنہ ANRs کا پتہ لگانے کے لیے Android کا بلٹ ان ٹول ہے۔ اسے ڈسک اور نیٹ ورک عملیات کے لیے جھنڈوں کے ساتھ Application.onCreate() میں فعال کریں۔ خلاف ورزی پر، StrictMode استثنا پھینکتا ہے یا logcat میں لکھتا ہے۔

kotlin
if (BuildConfig.DEBUG) {
    StrictMode.ThreadPolicy.Builder()
        .detectDiskReads()
        .detectDiskWrites()
        .detectNetwork()
        .penaltyLog()
        .build()
        .let { StrictMode.setThreadPolicy(it) }
}

غیر مطابقت پذیر نمونے: Coroutines اور RxJava

Kotlin Coroutines — جدید Android ایپس میں غیر مطابقت پذیر کام کا معیاری طریقہ۔ بنیادی طریقہ: I/O عملیات Dispatchers.IO پر انجام دی جاتی ہیں، نتیجہ UI اپ ڈیٹس کے لیے Dispatchers.Main کو بھیجا جاتا ہے۔ Flow جیسے منظرناموں کے لیے، CPU گہرے کاموں کے لیے Dispatchers.Default استعمال کریں۔

RxJava پرانے منصوبوں میں مقبول رہتا ہے۔ subscribeOn(Schedulers.io()) اور observeOn(AndroidSchedulers.mainThread()) — ANR کو روکنے کے لیے کم از کم سیٹ۔ بنیادی اصول وہی ہے: کوئی Observable یا Flowable مرکزی تھریڈ سے ڈیٹا خارج نہیں کرنا چاہیے۔

پیداوار میں نگرانی

Firebase Crashlytics SDK ورژن 18.4.0 سے ANR نگرانی کو باکس سے باہر سپورٹ کرتا ہے۔ Android 11+ کے لیے، Crashlytics سسٹم API ApplicationExitInfo استعمال کرتا ہے، جو صحیح ختم ہونے کی وجہ فراہم کرتا ہے: ANR، Crash، یا سسٹم قتل۔ سیاق و سباق کے تجزیہ کے لیے اسکرین اور حالت کے پیرامیٹرز کے ساتھ حسب ضرور کیز کو فعال کریں۔

ANR کا پتہ لگانے کے اوزار

پانچ اوزار ANR کے ساتھ کام کرنے کے تمام مراحل کا احاطہ کرتے ہیں: ورک سٹیشن پر ڈیبگنگ سے لے کر پیداوار میں نگرانی تک۔ ہر ٹول اپنا کام حل کرتا ہے اور مختلف منظرناموں کے لیے ڈیٹا فراہم کرتا ہے۔

ٹولمقصدڈیٹا فارمیٹ
StrictModeترقی کے دوران پتہ لگاناLogcat / Exception
ANR Watchdog (Android Studio)ریئل ٹائم ٹریسنگThread dump + timeline
Google Play Consoleجمع شدہ اعدادوشمارANR rate + stack traces
Firebase Crashlyticsپیداوار کی نگرانیApplicationExitInfo
adb bugreportمکمل سسٹم رپورٹtraces.txt + logcat + dmesg

ہر ٹول کا اپنا مقام ہے: StrictMode ابتدائی مراحل میں واضح خلاف ورزیاں پکڑتا ہے، Crashlytics صارفین کے درمیان حقیقی ANR تعدد دکھاتا ہے، اور adb bugreport پیچیدہ معاملات کے لیے سب سے مکمل تصویر فراہم کرتا ہے۔ مکمل کوریج کے لیے ان کو یکجا کریں۔

Firebase Performance Monitoring

Firebase Performance UI تھریڈ کے جوابی وقت کو ٹریک کرتا ہے اور مشتبہ طور پر طویل عملیات کے لیے خود بخود ٹریس بناتا ہے۔ اگر مرکزی تھریڈ 500 ms سے زیادہ بلاک ہو، تو Performance ذمہ دار طریقہ کے نام کے ساتھ ایک حسب ضرور ٹریس ریکارڈ کرتا ہے۔ یہ صارف کی شمولیت کے بغیر اور اہم ہونے سے پہلے ANR منظرناموں کا پتہ لگانے کی اجازت دیتا ہے۔

Firebase Crashlytics کے ساتھ انضمام ایک مکمل تصویر دیتا ہے: Performance ANR سے پہلے سستی دکھاتا ہے، اور Crashlytics منجمد ہونے کو دکھاتا ہے۔ Firebase Console میں ANR کی شرح 0.1% سے زیادہ ہونے پر الرٹس ترتیب دیں، اور آپ کو صارفین کی بڑے پیمانے پر شکایات سے پہلے نئے مسائل کے بارے میں اطلاعات موصول ہوں گی۔

اکثر پوچھے گئے سوالات

ANR Crash سے کیسے مختلف ہے؟

ANR ایک منجمد ہونا ہے جہاں ایپ جواب نہیں دیتی لیکن میموری میں رہتی ہے۔ Crash عمل سے باہر نکلنے کے ساتھ مکمل غیر معمولی خاتمہ ہے۔ ANR “بچ سکتا ہے” اگر سسٹم یا صارف جواب کا انتظار کرے، جبکہ Crash ہمیشہ ایپ کو ختم کرتا ہے۔

کیا ANR کو try-catch کے ذریعے پکڑا جا سکتا ہے؟

نہیں۔ ANR Java/Kotlin کا استثنا نہیں ہے، بلکہ عمل کی سطح پر سسٹم سگنل (SIGQUIT) ہے۔ ڈیولپر اسے ایپلیکیشن کوڈ میں ہینڈل نہیں کر سکتا۔ ANR پر ردعمل ظاہر کرنے کا واحد طریقہ دوبارہ شروع ہونے کے بعد رپورٹس کا تجزیہ کرنا ہے۔

ANR کچھ ڈیوائسز پر کیوں ظاہر ہوتا ہے لیکن دوسروں پر نہیں؟

ڈیوائس کی کارکردگی، Android ورژن، CPU لوڈ اور پس منظر کے عمل کی تعداد ANR کے امکان کو متاثر کرتی ہے۔ کمزور ڈیوائسز پر، وہی کارروائی 2–3 گنا زیادہ وقت لے سکتی ہے، 5 سیکنڈ کی حد سے تجاوز کر کے۔

ANR سے پہلے BroadcastReceiver کی وقت کی حد کیا ہے؟

عام BroadcastReceiver کے لیے onReceive() میں 10 سیکنڈ۔ foreground خدمات کے لیے، حد 20 سیکنڈ ہے، اور ContentProvider کے لیے — کوئی واضح حد نہیں ہے، لیکن مرکزی تھریڈ کو 5 سیکنڈ سے زیادہ روکنا پھر بھی ANR کا سبب بنتا ہے۔

اگر ANR شاذ و نادر ہی ہوتا ہے اور دوبارہ پیدا نہیں ہوتا تو کیا کریں؟

تمام ڈیبگ بلڈز میں StrictMode کو فعال کریں، Firebase Crashlytics کے ذریعے نگرانی شامل کریں، اور جب ANR ہو تو adb bugreport استعمال کریں۔ بے قاعدہ ANRs اکثر دوڑ کے حالات یا مخصوص نیٹ ورک کی حالتوں سے متعلق ہوتے ہیں۔

خلاصہ

  • ANR — Android سسٹم میکانزم جو مرکزی تھریڈ کے 5 سیکنڈ سے زیادہ بلاک ہونے پر متحرک ہوتا ہے
  • مرکزی تھریڈ کو صرف UI ہینڈل کرنا چاہیے — باقی تمام عملیات پس منظر کے تھریڈز میں منتقل کی جاتی ہیں
  • ANR کی تشخیص traces.txt، Google Play Console اور Firebase Crashlytics کے ذریعے کی جاتی ہے
  • StrictMode حقیقی ڈیوائس پر چلائے بغیر ترقی کے دوران ممکنہ ANRs کا پتہ لگاتا ہے
  • Coroutines Dispatchers.IO کے ساتھ — جدید Android منصوبوں میں غیر مطابقت پذیر کام کا معیاری طریقہ
  • BroadcastReceiver کو 10 سیکنڈ سے زیادہ کام کرنے کے لیے goAsync() یا پس منظر رجسٹرار کی ضرورت ہے
  • پیداوار میں ANR کی نگرانی Crashlytics اور Android 11 اور اس سے اوپر کے بلٹ ان ApplicationExitInfo API کے ذریعے کی جاتی ہے

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں