ANR (Application Not Responding) — proqram 5 saniyə ərzində girişə cavab vermədikdə Android tərəfindən göstərilən sistem bildirişidir. Glitch-lərdən (UI bloklamayan məntiqi səhvlər) və laq-lardan (tam dayanma olmadan yavaşlama) fərqli olaraq, ANR əməliyyat sistemi tərəfindən qeydə alınan kritik nasazlıqdır: Android «Proqram cavab vermir» dialoqunu göstərir və bağlamağı və ya gözləməyi təklif edir. Android Vitals Documentation-a görə, ANR dərəcəsi 0,5%-dən yuxarı olan proqramlar Google Play-də aşağı reytinqə malikdir və tövsiyələrdən gizlənə bilər. Diaqnostikaya /data/anr/traces.txt analizi, StrictMode istifadəsi və əsas axının profilləşdirilməsi daxildir.
Əsas məqamlar
ANR (Application Not Responding) — proqram girişə cavab verməyi dayandırdıqda işə düşən Android-də istifadəçi mühafizə mexanizmidir. Sistem hadisələrin işlənmə vaxtını izləyir: BroadcastReceiver 10 saniyə ərzində onReceive-i tamamlamazsa, Service 20 saniyə ərzində onCreate-dən qayıtmazsa, ContentProvider isə 15 saniyə ərzində cavab verməzsə — Android ANR yaradır.
ANR baş verdikdə, Android bütün pəncərələrin üzərində sistem dialoqu göstərir: «Proqram cavab vermir. Onu bağlamaq və ya gözləmək?». İstifadəçi proqramı bağlaya və ya onun bərpasını gözləyə bilər. ANR tez-tez təkrarlanırsa, istifadəçi proqramı silir. Google Play sıralama alqoritmlərində ANR dərəcəsini — ANR olan sessiyaların faizini — nəzərə alır.
iOS-da sistem dialoqu olan ANR analoqu yoxdur. Bunun əvəzinə Apple Watchdog istifadə edir, o, proqramı 0x8badf00d kodu ilə bağlayır. İstifadəçi dialoq görmür — proqram sadəcə əsas ekrana bağlanır. Bu, ANR-ni Android-də istifadəçi üçün daha nəzərə çarpan edir, lakin diaqnostika üçün sistemə daha çox məlumat verir.
ANR dörd komponent növündən biri üçün vaxt limiti izlənildikdə baş verir. Hər komponentin öz vaxt limiti var.
BroadcastReceiver əsas axında işləyir. onReceive sinxron şəbəkə sorğusu, verilənlər bazasına uzun yazma əməliyyatı və ya bloklanmanı gözləyirsə — 10 saniyədən sonra ANR yaranır. Həll yolu: fon emalı üçün goAsync() və WorkManager istifadə edin. Tipik ssenari — FCM-dən Push bildirişi almaq və Room-da sinxron yazmaq.
Service.onCreate və Service.onStartCommand 20 saniyə limitinə malikdir. Xidmət əsas axında ağır inisiallaşdırma (kitabxanaların yüklənməsi, şəbəkədən konfiqurasiyanın oxunması) işə salırsa — ANR qaçılmazdır. Fon axınında zəmanətli icra üçün IntentService (köhnəlmiş) və ya WorkManager istifadə edin.
ContentProvider.onCreate Application.onCreate çağırışından əvvəl işləyir və 15 saniyə limitinə malikdir. Provayder verilənlər bazası miqrasiyası, lüğətlərin yüklənməsi və ya şəbəkədən SDK inisiallaşdırması həyata keçirirsə — bu, proqram işə salındıqda ANR-yə səbəb olur. Həll yolu: lazy-inisiallaşdırma, ağır əməliyyatların WorkManager-ə köçürülməsi.
Android sistem jurnallarından xüsusi kitabxanalara qədər ANR analizi üçün bir neçə alət təqdim edir.
Hər ANR zamanı Android /data/anr/traces.txt faylını proqramın bütün axınlarının yığın atqısı ilə saxlayır. «Main» axınını tapın — yığındakı son metod səbəbi göstərir. Tipik nümunələr: Thread.sleep(), InputStream.read(), BinderProxy.transact(). Faylı cihazdan çıxarmaq üçün superistifadəçi hüquqları ilə adb istifadə edin.
Firebase Crashlytics avtomatik olaraq ANR-ləri toplayır və onları izləmə ilə birlikdə panelində göstərir. Android 11+ üçün ANR hesabatları əsas axının tam yığını ilə gəlir. İnteqrasiya asılılığın əlavə edilməsini və Application.onCreate-də FirebaseApp inisiallaşdırmasını tələb edir.
CPU Profiler Android Studio-da proqramın işini izləməyə və hansı metodların prosessor vaxtı apardığını görməyə imkan verir. «Record with method traces»-i aktivləşdirin və ANR-yə səbəb olan ssenarini təkrarlayın. Zaman qrafikində donma anında əsas axında hansı metodların icra olunduğu görünəcək.
Android-də ANR toplanması üçün Firebase Crashlytics inteqrasiyası nümunəsi:
class App : Application() {
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(this)
FirebaseCrashlytics.getInstance()
.setCrashlyticsCollectionEnabled(true)
StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build())
}
}
ANR-nin aradan qaldırılması, ilk növbədə, bütün uzun əməliyyatların əsas axından fon axınlarına köçürülməsidir. Hər komponent növü üçün konkret texnikaları nəzərdən keçirək.
WorkManager — Google tərəfindən fon işi üçün tövsiyə edilən həll yoludur. O, cihazın vəziyyətini nəzərə alaraq tapşırığın fon axınında icrasına zəmanət verir. Service-dən fərqli olaraq, WorkManager əsas axını bloklamır və proqramın yenidən başladılmasına davamlıdır. BroadcastReceiver üçün goAsync() istifadə edin və nəticəni PendingResult-i WorkManager-ə ötürün.
Bütün şəbəkə sorğularını, verilənlər bazası ilə işi və fayl əməliyyatlarını Dispatchers.IO ilə işə salın. Əsas axın yalnız UI-ni yeniləməlidir. Activity məhv edildikdə korutinlərin avtomatik ləğvi üçün viewModelScope istifadə edin. İstənilən kontekstdə runBlocking()-dən çəkinin — bu, cari axının sinxron bloklanmasıdır.
ContentProvider uzun inisiallaşdırma həyata keçirirsə, gecikmiş yükləmə mexanizmindən istifadə edin: dərhal məlumat qaytaran provayder yaradın, ağır inisiallaşdırmanı isə WorkManager vasitəsilə gecikmə ilə işə salın. Bu, sistemin gecikmələrə ən həssas olduğu proqram işə salınarkən ANR-nin qarşısını alır.
Android-də goAsync ilə BroadcastReceiver-dən düzgün istifadə nümunəsi:
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 ilə mübarizənin ən yaxşı yolu onların işləmə mərhələsində alətlər və memarlıq həlləri vasitəsilə qarşısını almaqdır.
StrictMode detectNetwork() və detectDiskReads()/detectDiskWrites() siyasətləri aktivləşdirilmiş şəkildə işləmə mərhələsində potensial ANR-ləri aşkarlayır. Debug quruluşunda penaltyDeath təyin edin — hər hansı pozuntu dərhal çökməyə səbəb olacaq və tərtibatçı təsdiqləmədən əvvəl problemi görəcək.
Firebase Performance əsas əməliyyatların icra müddətini izləyir və hansı ssenarilərin ANR həddini aşdığını göstərir. Hər ekran və şəbəkə sorğusu üçün fərdi izləmə konfiqurasiya edin. İcra müddəti 3 saniyədən çox olarsa — bu, optimallaşdırma tələb edən potensial ANR-dir.
Yavaş şərtləri simulyasiya edin: iOS və ya Android Emulator-da Network Link Conditioner vasitəsilə şəbəkə sürətini məhdudlaşdırın. Yavaş yaddaş emulyasiyası vasitəsilə diskdən oxumanı yavaşladın. ANR tez-tez məhz belə şəraitdə özünü göstərir, tərtibatçının sürətli cihazlarında görünməzdir.
Tez-tez verilən suallar
Android əsas axında hadisələrin işlənmə vaxtını açıq şəkildə izləyir və ANR dialoqu göstərir. iOS 10–20 saniyədən çox donma zamanı proqramı məcburi bağlayan Watchdog istifadə edir. ANR — bir neçə komponentin (BroadcastReceiver, Service) sərt vaxt limitlərinə malik olduğu Android arxitekturasının xüsusiyyətidir.
Android 11+-də ANR atqısını adb shell dumpsys dropbox --print data_app_anr vasitəsilə əldə etmək olar. Android 10 və aşağıda root olmadan /data/anr/traces.txt-ə giriş yoxdur. Firebase Crashlytics istifadə edin — Android 11+ üçün ANR hesabatlarını avtomatik toplayır.
Google Play ANR dərəcəsini 0,5%-dən az tövsiyə edir — yəni 1000 sessiyada 5 ANR-dən çox olmamalıdır. Dərəcəsi 1%-dən yuxarı olan proqram Google Play Console-da xəbərdarlıq alır və tövsiyələrdən gizlənə bilər. İdeal olaraq ANR dərəcəsi 0,1%-dən aşağı olmalıdır.
Korutin özlüyündə axını bloklamır. Lakin korutinin daxilində əsas axında runBlocking icra olunarsa və ya korutin Dispatchers.Main ilə işə salınıb uzun CPU əməliyyatı yerinə yetirirsə — bu ANR-yə səbəb olacaq. Giriş-çıxış üçün Dispatchers.IO, hesablamalar üçün Dispatchers.Default istifadə edin.
«Slow Network» profili ilə Android Emulator istifadə edin və ya əsas axında Thread.sleep(6000) çağıran test yazın. Proqramı Debug vasitəsilə işə salın və 5 saniyədən sonra ANR dialoqunu görəcəksiniz. logcat-da izləmə ilə ANR haqqında qeydin göründüyünü yoxlayın.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun