Android-da ANR: bu nima, sabablari va bartaraf etish usullari

Muallif: IT Sectr Nashr etilgan: 2026-07-28 O'qish vaqti: 9 daq

ANR (Application Not Responding) — bu ilova 5 soniya davomida kiritishga javob bermaganda paydo bo‘ladigan Android tizim bildirishnomasidir. Glitch-lardan (UI-ni bloklamaydigan mantiqiy xatolar) va lag-lardan (to‘liq to‘xtamasdan sekinlashish) farqli o‘laroq, ANR operatsion tizim tomonidan qayd etiladigan kritik nosozlikdir: Android «Ilova javob bermayapti» dialog oynasini yopish yoki kutish taklifi bilan ko‘rsatadi. Android Vitals Documentation-ga ko‘ra, ANR darajasi 0,5% dan yuqori bo‘lgan ilovalar Google Play-da past reytingga ega va tavsiyalardan yashirilishi mumkin. Diagnostika /data/anr/traces.txt tahlili, StrictMode-dan foydalanish va asosiy oqimni profillashni o‘z ichiga oladi.

Asosiy ma’lumotlar

  • ANR — asosiy oqim 5 soniyadan ko‘proq bloklanganda Android tizim bildirishnomasi, «Ilova javob bermayapti» dialogiga olib keladi
  • Asosiy sabablar — asosiy oqim bloklanishi (BroadcastReceiver, Service), oqimlar orasidagi deadlock, ContentProvider-dagi uzoq operatsiya
  • Diagnostika — /data/anr/traces.txt tahlili, Android Studio Profiler, Firebase Performance Monitoring
  • Bartaraf etish — vazifalarni WorkManager-ga o‘tkazish, Dispatchers.IO bilan Kotlin Coroutines ishlatish, erta aniqlash uchun StrictMode
  • Profilaktika — BroadcastReceiver vaqtini 10 soniya, Service-ni 20 soniya, ContentProvider-ni 15 soniya bilan chegaralash

Android-da ANR nima

ANR (Application Not Responding) — ilova kiritishga javob berishni to‘xtatganda ishga tushadigan Android-da foydalanuvchini himoya qilish mexanizmidir. Tizim hodisalarni qayta ishlash vaqtini kuzatadi: agar BroadcastReceiver 10 soniya ichida onReceive-ni tugatmasa, Service 20 soniya ichida onCreate-dan qaytmasa va ContentProvider 15 soniya ichida javob bermasa — Android ANR yaratadi.

ANR foydalanuvchiga qanday ko‘rinadi

ANR yuz berganda, Android barcha oynalar ustida tizim dialogini ko‘rsatadi: «Ilova javob bermayapti. Uni yopish yoki kutish?». Foydalanuvchi ilovani yopishi yoki uning tiklanishini kutishi mumkin. Agar ANR tez-tez takrorlansa, foydalanuvchi ilovani o‘chiradi. Google Play reyting algoritmlarida ANR darajasini — ANR bilan sessiyalar foizini — hisobga oladi.

ANR va iOS-dagi muzlash o‘rtasidagi farq

iOS-da tizim dialogiga ega ANR analogi yo‘q. Buning o‘rniga Apple Watchdog-dan foydalanadi, u ilovani 0x8badf00d kodi bilan tugatadi. Foydalanuvchi dialog ko‘rmaydi — ilova oddiygina asosiy ekranga yopiladi. Bu ANR-ni Android-da foydalanuvchi uchun sezilarliroq qiladi, ammo diagnostika uchun tizimga ko‘proq ma’lumot beradi.

ANR ning asosiy sabablari

ANR tizim to‘rtta komponent turidan biri uchun vaqt chegarasini kuzatganda yuz beradi. Har bir komponentning o‘z vaqt chegarasi bor.

BroadcastReceiver-da bloklanish

BroadcastReceiver asosiy oqimda bajariladi. Agar onReceive sinxron tarmoq so‘rovi, ma’lumotlar bazasiga uzoq yozish operatsiyasi yoki blokirovkani kutsa — 10 soniyadan keyin ANR paydo bo‘ladi. Yechim: fon ishlovi uchun goAsync() va WorkManager-dan foydalaning. Odatdagi stsenariy — FCM dan Push bildirishnomasini olish va Room-da sinxron saqlash.

Service-da uzoq operatsiya

Service.onCreate va Service.onStartCommand 20 soniya chegarasiga ega. Agar xizmat asosiy oqimda og‘ir ishga tushirishni (kutubxonalarni yuklash, tarmoqdan konfiguratsiyani o‘qish) boshlasa — ANR muqarrar. Fon oqimida kafolatlangan bajarish uchun IntentService (eskirgan) yoki WorkManager-dan foydalaning.

Uzoq ishga tushirish bilan ContentProvider

ContentProvider.onCreate Application.onCreate chaqiruvidan oldin bajariladi va 15 soniya chegarasiga ega. Agar provayder ma’lumotlar bazasi migratsiyasi, lug‘atlarni yuklash yoki tarmoqdan SDK ishga tushirishni amalga oshirsa — bu ilova ishga tushirilganda ANRga sabab bo‘ladi. Yechim: lazy-ishga tushirish, og‘ir operatsiyalarni WorkManager-ga o‘tkazish.

  • BroadcastReceiver — onReceive uchun 10 soniya; fon ishlovi uchun goAsync() dan foydalaning
  • Service — onCreate/onStartCommand uchun 20 soniya; WorkManager yoki CoroutineWorker dan foydalaning
  • ContentProvider — onCreate uchun 15 soniya; ishga tushirishni kechiktirilgan boshlash bilan Application.onCreate ga o‘tkazing
  • UI oqimi — hodisalarni qayta ishlashsiz 5 soniya; 5 soniyadan ortiq har qanday bloklash ANRga sabab bo‘ladi

ANRni qanday diagnostika qilish kerak

Android tizim jurnallaridan maxsus kutubxonalargacha ANR tahlili uchun bir nechta vositalarni taqdim etadi.

traces.txt tahlili

Har bir ANRda Android /data/anr/traces.txt faylini ilovaning barcha oqimlari steklari bilan saqlaydi. «Main» oqimini toping — stekdagi oxirgi usul sababni ko‘rsatadi. Odatdagi namunalar: Thread.sleep(), InputStream.read(), BinderProxy.transact(). Faylni qurilmadan olish uchun superfoydalanuvchi huquqlari bilan adb dan foydalaning.

ANR hisobotlari bilan Firebase Crashlytics

Firebase Crashlytics avtomatik ravishda ANRlarni to‘playdi va ularni kuzatish bilan birga asboblar panelida ko‘rsatadi. Android 11+ uchun ANR hisobotlari asosiy oqimning to‘liq steklari bilan keladi. Integratsiya bog‘liqlikni qo‘shish va Application.onCreate da FirebaseApp ishga tushirishni talab qiladi.

Android Studio Profiler oqim kuzatuvi bilan

CPU Profiler Android Studio da ilova ishini kuzatishni yozib olish va qaysi usullar protsessor vaqtini olishini ko‘rish imkonini beradi. «Record with method traces»-ni yoqing va ANRga sabab bo‘lgan stsenariyni takrorlang. Vaqt shkalasida muzlash paytida asosiy oqimda qaysi usullar bajarilgani ko‘rinadi.

Android da ANR yig‘ish uchun Firebase Crashlytics integratsiyasi namunasi:

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

ANRni bartaraf etish usullari

ANRni bartaraf etish, birinchi navbatda, barcha uzoq operatsiyalarni asosiy oqimdan fon oqimlariga o‘tkazishdir. Har bir komponent turi uchun aniq texnikalarni ko‘rib chiqamiz.

Fon vazifalari uchun WorkManager dan foydalanish

WorkManager — Google tomonidan fon ishi uchun tavsiya etilgan yechim. U qurilma holatini hisobga olgan holda vazifaning fon oqimida bajarilishini kafolatlaydi. Service-dan farqli o‘laroq, WorkManager asosiy oqimni bloklamaydi va ilovani qayta ishga tushirishga chidamli. BroadcastReceiver uchun goAsync() dan foydalaning va natijani PendingResult-ni WorkManager-ga o‘tkazing.

To‘g‘ri dispetcherlar bilan Kotlin Coroutines

Barcha tarmoq so‘rovlarini, ma’lumotlar bazasi bilan ishlashni va fayl operatsiyalarini Dispatchers.IO bilan ishga tushiring. Asosiy oqim faqat UI-ni yangilashi kerak. Activity yo‘q qilinganda koroutinlarni avtomatik bekor qilish uchun viewModelScope-dan foydalaning. Har qanday kontekstda runBlocking() dan saqlaning — bu joriy oqimning sinxron bloklanishi.

ContentProvider ni Lazy-ishga tushirish

Agar ContentProvider uzoq ishga tushirishni amalga oshirsa, kechiktirilgan yuklash mexanizmidan foydalaning: darhol ma’lumot qaytaradigan provayder yarating va og‘ir ishga tushirishni WorkManager orqali kechikish bilan ishga tushiring. Bu tizim kechikishlarga eng sezgir bo‘lgan ilova ishga tushirilganda ANRning oldini oladi.

Android da goAsync bilan BroadcastReceiver dan to‘g‘ri foydalanish namunasi:

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()
    }
}

Ishlab chiqishda ANR profilaktikasi

ANR bilan kurashishning eng yaxshi usuli vositalar va arxitektura yechimlari orqali ularni ishlab chiqish bosqichida oldini olishdir.

Asosiy oqim bloklanishlarini aniqlash uchun StrictMode

StrictMode detectNetwork() va detectDiskReads()/detectDiskWrites() siyosatlari yoqilgan holda ishlab chiqish bosqichida potentsial ANRlarni aniqlaydi. Debug yig‘ilishida penaltyDeath-ni o‘rnating — har qanday buzilish darhol ishdan chiqishga olib keladi va dasturchi muammoni tasdiqlashdan oldin ko‘radi.

Ishlab chiqarish ko‘rsatkichlari uchun Firebase Performance Monitoring

Firebase Performance asosiy operatsiyalarning bajarilish vaqtini kuzatadi va qaysi stsenariylar ANR chegarasidan oshishini ko‘rsatadi. Har bir ekran va tarmoq so‘rovi uchun maxsus kuzatuvlarni sozlang. Bajarilish vaqti 3 soniyadan oshsa — bu optimallashtirishni talab qiladigan potentsial ANRdir.

Tarmoq va disk kechikishlari bilan sinov

Sekin shartlarni simulyatsiya qiling: iOS yoki Android Emulator-da Network Link Conditioner orqali tarmoq tezligini cheklang. Sekin xotira emulyatsiyasi orqali diskdan o‘qishni sekinlashtiring. ANR ko‘pincha aynan shunday sharoitlarda namoyon bo‘ladi, dasturchining tez qurilmalarida ko‘rinmaydi.

  • BroadcastReceiver — 1 soniyadan ortiq ishlov uchun har doim goAsync() dan foydalaning
  • Service — fon dispetcheri bilan WorkManager yoki CoroutineWorker bilan almashtiring
  • ContentProvider — onCreate da tarmoq va ma’lumotlar bazasidan saqlaning, WorkManager bilan lazy-init dan foydalaning
  • UI oqimi — Debug da penaltyDeath bilan StrictMode, ishlab chiqarish monitoringi uchun Firebase Performance

Tez-tez beriladigan savollar

Nega ANR Android-da paydo bo‘ladi, lekin iOS-da yo‘q?

Android asosiy oqimda hodisalarni qayta ishlash vaqtini aniq kuzatadi va ANR dialogini ko‘rsatadi. iOS 10–20 soniyadan ortiq muzlashda ilovani majburiy yopadigan Watchdog-dan foydalanadi. ANR — bir nechta komponentlar (BroadcastReceiver, Service) qattiq vaqt chegaralariga ega bo‘lgan Android arxitekturasining xususiyatidir.

Rootsiz qurilmada traces.txt ni qanday topish mumkin?

Android 11+ da ANR dumpini adb shell dumpsys dropbox --print data_app_anr orqali olish mumkin. Android 10 va undan pastda rootsiz /data/anr/traces.txt ga kirish yo‘q. Firebase Crashlytics dan foydalaning — Android 11+ uchun ANR hisobotlarini avtomatik to‘playdi.

Qaysi ANR darajasi maqbul hisoblanadi?

Google Play ANR darajasini 0,5% dan kam tavsiya qiladi — ya‘ni 1000 sessiyada 5 ANR dan ko‘p emas. Darajasi 1% dan yuqori bo‘lgan ilova Google Play Console da ogohlantirish oladi va tavsiyalardan yashirilishi mumkin. Ideal holda ANR darajasi 0,1% dan past bo‘lishi kerak.

Koroutin ANRga sabab bo‘lishi mumkinmi?

Koroutin o‘z-o‘zidan oqimni bloklamaydi. Ammo koroutin ichida asosiy oqimda runBlocking bajarilsa yoki koroutin Dispatchers.Main bilan ishga tushirilgan va uzoq CPU operatsiyasini bajarsa — bu ANRga sabab bo‘ladi. Kirish-chiqish uchun Dispatchers.IO va hisob-kitoblar uchun Dispatchers.Default dan foydalaning.

Emulatorda ANRni qanday sinab ko‘rish mumkin?

«Slow Network» profili bilan Android Emulator dan foydalaning yoki asosiy oqimda Thread.sleep(6000) ni chaqiradigan test yozing. Ilovani Debug orqali ishga tushiring va 5 soniyadan keyin ANR dialogini ko‘rasiz. logcat da kuzatuv bilan ANR haqida yozuv paydo bo‘lganligini tekshiring.

Xulosa

  • ANR — asosiy oqim 5 soniyadan ko‘proq bloklanganda yoki komponent vaqt chegaralari oshib ketganda Android tizim bildirishnomasi
  • Vaqt chegaralari: BroadcastReceiver — 10 s, Service — 20 s, ContentProvider — 15 s, UI — 5 s
  • Diagnostika — /data/anr/traces.txt, Firebase Crashlytics, Android Studio da CPU Profiler
  • Bartaraf etish — WorkManager, goAsync(), Dispatchers.IO bilan Kotlin Coroutines, ContentProvider lazy-ishga tushirish
  • Profilaktika — penaltyDeath bilan StrictMode, Firebase Performance Monitoring, tarmoq kechikishlari bilan sinov
  • Google Play ANR darajasini < 0,5% tavsiya qiladi; daraja > 1% bo‘lganda ilova ko‘rinish cheklovlariga duch keladi
  • Tavsiya: ishlab chiqarishda ANR yig‘ish uchun Firebase Crashlytics va Performance ni sozlang va 0,3% chegarasi oshib ketganda ogohlantirishlar o‘rnating

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing