ANR (Application Not Responding) اینڈرائیڈ میں ایک نظامی اطلاع ہے جو اس وقت ظاہر ہوتی ہے جب ایپ 5 سیکنڈ کے اندر ان پٹ کا جواب نہیں دیتی۔ گلچ (UI بلاک کیے بغیر منطقی خرابیاں) اور لیگ (مکمل رکے بغیر سستی) کے برعکس، ANR ایک سنگین ناکامی ہے جسے آپریٹنگ سسٹم ریکارڈ کرتا ہے: اینڈرائیڈ “ایپ جواب نہیں دے رہی” ڈائیلاگ دکھاتا ہے جس میں بند کرنے یا انتظار کرنے کا اختیار ہوتا ہے۔ Android Vitals Documentation کے مطابق، 0.5% سے زیادہ ANR شرح والی ایپس Google Play پر کم درجہ بندی حاصل کرتی ہیں اور سفارشات سے چھپائی جا سکتی ہیں۔ تشخیص میں /data/anr/traces.txt کا تجزیہ، StrictMode کا استعمال اور مرکزی تھریڈ کی پروفائلنگ شامل ہے۔
اہم نکات
ANR (Application Not Responding) اینڈرائیڈ میں ایک صارف تحفظ کا طریقہ کار ہے جو اس وقت فعال ہوتا ہے جب ایپ ان پٹ کا جواب دینا بند کر دیتی ہے۔ سسٹم واقعہ پروسیسنگ کے وقت کو ٹریک کرتا ہے: اگر BroadcastReceiver 10 سیکنڈ کے اندر onReceive مکمل نہیں کرتا، Service 20 سیکنڈ میں onCreate سے واپس نہیں آتی، یا ContentProvider 15 سیکنڈ میں جواب نہیں دیتا — اینڈرائیڈ ANR پیدا کرتا ہے۔
جب ANR ہوتا ہے، اینڈرائیڈ تمام ونڈوز کے اوپر ایک نظامی ڈائیلاگ دکھاتا ہے: “ایپ جواب نہیں دے رہی۔ کیا آپ اسے بند کرنا چاہتے ہیں یا انتظار کرنا چاہتے ہیں؟” صارف ایپ کو بند کر سکتا ہے یا اس کے بحال ہونے کا انتظار کر سکتا ہے۔ اگر ANR بار بار ہوتے ہیں، تو صارف ایپ کو ان انسٹال کر دیتا ہے۔ Google Play اپنے درجہ بندی الگورتھم میں ANR شرح — ANR والے سیشنز کا فیصد — پر غور کرتا ہے۔
iOS میں نظامی ڈائیلاگ کے ساتھ ANR کا کوئی ہم پلہ نہیں ہے۔ اس کے بجائے، Apple Watchdog استعمال کرتا ہے، جو 0x8badf00d خارجی کوڈ کے ساتھ عمل کو ختم کرتا ہے۔ صارف کو کوئی ڈائیلاگ نظر نہیں آتا — ایپ صرف ہوم اسکرین پر بند ہو جاتی ہے۔ یہ اینڈرائیڈ پر 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 خود بخود ANRs جمع کرتا ہے اور انہیں نشانات کے ساتھ ڈیش بورڈ میں دکھاتا ہے۔ 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 تباہ ہونے پر خودکار coroutine منسوخی کے لیے 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 سے لڑنے کا بہترین طریقہ یہ ہے کہ اوزاروں اور تعمیری فیصلوں کے ذریعے ترقی کے دوران انہیں روکا جائے۔
فعال پالیسیوں detectNetwork() اور detectDiskReads()/detectDiskWrites() کے ساتھ StrictMode ترقی کے دوران ممکنہ ANR کی نشاندہی کرتا ہے۔ Debug بلڈز میں penaltyDeath سیٹ کریں — کوئی بھی خلاف ورزی فوری کریش کا سبب بنے گی اور ڈویلپر کمٹ سے پہلے مسئلہ دیکھے گا۔
Firebase Performance اہم کارروائیوں کے عملدرآمد کے وقت کو ٹریک کرتا ہے اور دکھاتا ہے کہ کون سے منظر نامے ANR کی حد سے تجاوز کرتے ہیں۔ ہر اسکرین اور نیٹ ورک کی درخواست کے لیے حسب ضرورت نشانات ترتیب دیں۔ اگر عملدرآمد کا وقت 3 سیکنڈ سے تجاوز کر جائے — یہ ایک ممکنہ ANR ہے جسے بہتر بنانے کی ضرورت ہے۔
سست حالات کی نقل کریں: iOS یا Android Emulator پر Network Link Conditioner استعمال کرکے نیٹ ورک کی رفتار محدود کریں۔ سست میموری کی نقل کے ذریعے ڈسک پڑھنے کو سست کریں۔ ANR اکثر ایسے حالات میں ظاہر ہوتے ہیں؛ تیز ڈویلپر ڈیوائسز پر یہ نظر نہیں آتے۔
اکثر پوچھے گئے سوالات
اینڈرائیڈ مرکزی تھریڈ پر واقعہ پروسیسنگ کے وقت کو واضح طور پر ٹریک کرتا ہے اور ANR ڈائیلاگ دکھاتا ہے۔ iOS Watchdog استعمال کرتا ہے، جو 10–20 سیکنڈ سے زیادہ ہینگ ہونے پر ایپ کو زبردستی بند کر دیتا ہے۔ ANR اینڈرائیڈ فن تعمیر کی ایک خصوصیت ہے جہاں متعدد اجزاء (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% سے کم ہونی چاہیے۔
Coroutine خود تھریڈ کو بلاک نہیں کرتا۔ لیکن اگر coroutine کے اندر آپ مرکزی تھریڈ پر runBlocking چلاتے ہیں یا coroutine 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں