Mobil ishlab chiqishda laglar: bu nima, sabablari va bartaraf etish usullari

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

Lag mobil ilovada foydalanuvchi harakati va interfeys reaksiyasi o'rtasidagi sezilarli kechikish bo'lib, u asosiy oqimning haddan tashqari yuklanishi, xotira oqishi yoki nooptimal kiritish-chiqarish amallari tufayli yuzaga keladi. Mantiqiy xatolar bilan bog'liq nuqsonlardan farqli o'laroq, lag ishlash muammosidir: ilova to'g'ri, lekin sekin ishlaydi. AppDynamics Mobile App Performance Report 2024 ma'lumotlariga ko'ra, foydalanuvchilarning 62% i ilova 3 soniyadan ko'proq sekinlashsa, uni o'chiradi. Laglarni tashxislash CPU, xotira va tarmoqni Android Studio Profiler va Xcode Instruments yordamida profillashni talab qiladi.

Asosiy fikrlar

  • Lag — ilovaning to'g'ri ishlashi paytida ishlash muammolaridan kelib chiqqan sezilarli interfeys kechikishi
  • Asosiy sabablar — asosiy oqimning bloklanishi, xotira oqishlari, tez-tez GC tanaffuslari, nooptimal SQL so'rovlari va tarmoq chaqiruvlari
  • Tashxis Android Studio-da CPU Profiler, Memory Profiler va Network Profiler, Xcode-da Time Profiler orqali amalga oshiriladi
  • Bartaraf etish vazifalarni fon oqimlariga o'tkazish, keshlashni joriy qilish, adapterlarni optimallashtirish va ma'lumotlarni lazy-yuklashni o'z ichiga oladi
  • Profilaktika — StrictMode, Main Thread Checker, asinxron GCD navbatlari va to'g'ri dispetcherlar bilan Kotlin Coroutines

Mobil ishlab chiqishda lag nima

Lag (ing. lag) mobil ilovada foydalanuvchi harakati (teginish, surish, matn kiritish) va interfeys reaksiyasi o'rtasidagi subyektiv seziladigan kechikishdir. Texnik jihatdan lag kirish hodisasi va kadrni to'liq renderlash o'rtasidagi vaqt sifatida o'lchanadi: qulay chegara — 100 ms gacha, sezilarli — 200 ms dan, kritik — 500 ms dan ortiq.

Lag, nuqson va sekinlashish o'rtasidagi farq

Foydalanuvchi terminologiyasida „lag qiladi“ va „sekinlashadi“ ko'pincha sinonim sifatida ishlatiladi, ammo texnik jihatdan lag — bu qat'iy kechikish (masalan, har bir bosishda 300 ms), „sekinlashadi“ esa — doimiy bo'lmagan sekinlashish: ilova ba'zan silliq ishlaydi, ba'zan bir soniyaga muzlaydi. Nuqson, lagdan farqli o'laroq, tezlik bilan emas, balki ko'rsatishning to'g'riligi bilan bog'liq.

Laglarning ilova ko'rsatkichlariga ta'siri

Google Play va App Store ilovalarni tartiblashda ishlash ko'rsatkichlarini hisobga oladi. ANR darajasi, jank chastotasi va ishga tushirish vaqti qidiruvda ko'rinishga va o'rnatish konversiyasiga ta'sir qiladi. Doimiy laglari bo'lgan ilova birinchi ishga tushirilgandan so'ng foydalanuvchilarning 40% gacha yo'qotadi.

Ilovalarda lag va sekinlashish sabablari

Laglari asosiy UI oqimi 60 FPS (kadr uchun 16.6 ms) yoki 120 FPS (8.3 ms) chastotada kadrlarni qayta ishlay olmaganda yuzaga keladi. Kechikishlarning asosiy manbalarini ko'rib chiqamiz.

Asosiy oqimning bloklanishi

UI oqimidagi har qanday sinxron amal — SharedPreferences dan o'qish, suspendsiz Room orqali ma'lumotlar bazasi bilan ishlash, tasvirni Bitmap-ga dekodlash — kadr chizilishini bloklaydi. Android-da bu kadrlarning tushib qolishiga (jank), iOS-da esa Core Animation renderining kechikishiga olib keladi.

Xotira oqishlari va tez-tez GC tanaffuslari

Android-da Garbage Collector yoki iOS-da ARC xotirani bo'shatganda, barcha oqimlar to'xtatiladi. Tez-tez GC tanaffuslari ko'p sonli vaqtinchalik ob'ektlar yaratilganda — masalan, har safar ro'yxat adapteri chaqirilganda yangi ViewHolder namunasi yaratilganda yuzaga keladi. Bu o'zini silkinishli aylantirish sifatida namoyon qiladi.

Og'ir layout iyerarxiyalari

Ichma-ich ConstraintLayout, ko'p sonli LinearLayout, bir-birining ustiga chiqqan View — har bir ichki joylashuv measure va layout pass vaqtini oshiradi. Xcode chuqur qatlam iyerarxiyasi (10 darajadan ortiq) FPS ning 20-30% ga tushishiga sabab bo'lishini ko'rsatadi.

  • Android — ortiqcha requestLayout, samarasiz ConstraintLayout zanjirlari, downscalesiz katta Bitmap
  • iOS — ziddiyatli Auto Layout constraints, og'ir CALayer, rasterizatsiyasiz shadowPath
  • Cross-platform — UI oqimida sinxron HTTP chaqiruvlari, og'ir JSON parsings, nooptimal yuqori aniqlikdagi tasvirlar

Ishlash kechikishlarini qanday tashxislash

Laglar sabablarini aniqlash uchun IDE-larga o'rnatilgan profiller va tizim monitoring vositalaridan foydalaniladi. Har bir vosita o'z vazifasini hal qiladi.

Android Studio-da CPU Profiler

CPU Profiler qaysi metodlar protsessor vaqtini egallashini va qaysi oqimlarda bajarilishini ko'rsatadi. Agar og'ir hisoblashlarga ega metod main thread-da bajarilsa — bu muammoning ildizidir. Sample Java Method yoqilgan holda kuzatuv yozuvi har bir daqiqada chaqiruv stekini ko'rish va „issiq nuqtalarni“ topish imkonini beradi.

Xcode Instruments-da Time Profiler

iOS uchun analog vosita — Time Profiler — har millisekundda stek namunalarini to'playdi va har bir metod CPU vaqtining necha foizini egallashini ko'rsatadi. Main Thread Only bayrog'i bilan kombinatsiya faqat asosiy oqimdagi operatsiyalarni filtrlash imkonini beradi, bu to'g'ridan-to'g'ri lag manbalarini ko'rsatadi.

Network Profiler va so'rov tahlili

Sekin tarmoq so'rovlari UI oqimi bloklanmagan bo'lsa ham lag taassurotini yaratadi. Android Studio-da Network Profiler va Xcode-da Network Link Conditioner sekin ulanishni simulyatsiya qilish va ilovaning real sharoitda qanday ishlashini aniqlash imkonini beradi. Taraqqiyotsiz chunked javoblar va katta JSON yuklari — ko'rinadigan laglarning odatiy manbalari.

OkHttp bilan tarmoq so'rovini vaqtni o'lchash bilan profillash namunasi:

kotlin
class TimingInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val start = System.nanoTime()
        val response = chain.proceed(chain.request())
        val duration = (System.nanoTime() - start) / 1_000_000
        Log.d("Vaqtni belgilash", "So'rov $duration ms davom etdi")
        return response
    }
}

Android va iOS-da laglarni bartaraf etish usullari

Laglarni bartaraf etish tizimli ishni talab qiladi: bitta metodni optimallashtirishdan arxitektura o'zgarishlarigacha. Eng samarali texnikalarni ko'rib chiqamiz.

Coroutines va GCD orqali asinxron qayta ishlash

Kotlin Coroutines tarmoq so'rovlari uchun Dispatchers.IO dispetcheri va hisob-kitoblar uchun Dispatchers.Default bilan asosiy oqimning UI uchun bo'sh qolishini ta'minlaydi. iOS-da fon vazifalari uchun .global(qos: .userInitiated) navbati va UI yangilash uchun .main bilan Grand Central Dispatch standart yondashuvdir. Navbatlar o'rtasida sync amallardan saqlaning.

Adapterlar va ro'yxatlarni optimallashtirish

Android-da RecyclerView va iOS-da UICollectionView to'g'ri sozlashni talab qiladi: onBindViewHolder-da minimal ob'ekt yaratish bilan ViewHolder, o'zgarishlarni hisoblash uchun DiffUtil, ma'lumotlarni oldindan yuklash uchun prefetching. iOS-da qo'lda boshqaruvsiz animatsiyali yangilanishlar uchun diffable data source dan foydalaning.

Ma'lumotlar va tasvirlarni keshlash

Har bir aylantirishda bir xil tasvirni yuklash — kafolatlangan lag. Coil (Android) va Kingfisher (iOS) tasvirlarni xotirada va diskda keshlab, takroriy so'rovda darhol ko'rsatishni ta'minlaydi. Ma'lumotlar uchun Flow yoki Combine asosidagi keshlash qatlami bilan Room dan foydalaning.

Android-da Coil bilan tasvir keshlashni sozlash namunasi:

kotlin
val imageLoader = ImageLoader(context) {
    memoryCachePolicy(CachePolicy.ENABLED)
    diskCachePolicy(CachePolicy.ENABLED)
    crossfade(true)
    size(512, 512)
}

// Avtomatik keshlash yoqilgan holda yuklash
imageView.load("https://example.com/image.jpg") {
    placeholder(R.drawable.placeholder)
    error(R.drawable.error)
}

Ishlab chiqish bosqichida laglarning oldini olish

Laglarning oldini olish ularni ishlab chiqarishda tuzatishdan arzonroqdir. Profilaktik choralar vositalar va arxitektura darajasida ishlab chiqish jarayoniga kiritiladi.

Android-da StrictMode

StrictMode — ishlab chiqish bosqichida asosiy oqimda tasodifiy kiritish-chiqarish operatsiyalari va tarmoq chaqiruvlarini aniqlaydigan o'rnatilgan Android vositasidir. Uni Application.onCreate-da tanqidiy buzilishlar uchun penaltyDeath siyosati bilan yoqing. Bu dasturchining muammoni commitdan oldin ko'rishini kafolatlashning yagona usuli.

iOS-da Main Thread Checker

iOS uchun analog — Xcode-da Runtime Sanitization tarkibiga kiruvchi Main Thread Checker. U barcha UIKit va AppKit chaqiruvlarining asosiy oqimdan bajarilishini avtomatik tekshiradi. Uni Debug yig'ish sxemasida yoqing va CI-da nol ogohlantirishlarga erishing.

CI da ishlash benchmarklari

CI quvuriga ishga tushirish vaqti, aylantirish FPS va xotira foydalanishini o'lchash uchun Macrobenchmark (Android) va XCTMetrics (iOS) ishga tushirishni qo'shing. Chegaralarni belgilang: agar yangi commit ishga tushirish vaqtini 5% dan ko'proq oshirsa — qurilish muvaffaqiyatsiz bo'ladi.

  • Android — Macrobenchmark, Baseline Profiles, Jetpack Benchmark Library
  • iOS — XCTMetrics, os_signpost, foydalanuvchi qurilmalaridan metrikalarni yig'ish uchun MetricKit
  • Umumiy yondashuv — har bir muhim o'zgarishdan oldin va keyin profillash, regressiya ishlash testlari

Ko'p so'raladigan savollar

Lag past FPS dan qanday farq qiladi?

Lag subyektiv kechikish hissi bo'lib, u yuqori FPS da ham paydo bo'lishi mumkin, agar kechikish render emas, balki kiritishning qayta ishlash vaqti bilan bog'liq bo'lsa. Past FPS (30 kadr/s dan kam) — laglarning sabablaridan biri, ammo yagona emas.

Ilovada lagni qanday o'lchash mumkin?

Android-da Frame Timing API (Choreographer) va iOS-da CADisplayLink yordamida kadrlar orasidagi vaqtni o'lchang. Google Play Vitals real sharoitda jank darajasini ko'rsatadi. Aniq o'lchovlar uchun aylantirish stsenariylari bilan Macrobenchmark dan foydalaning.

Nega laglar faqat eski qurilmalarda paydo bo'ladi?

Eski qurilmalar kamroq CPU yadrolariga, kamroq RAM va sekinroq xotiraga ega. Flagmanda 5 ms da bajariladigan operatsiya byudjet qurilmada 50 ms davom etishi mumkin. Quyi segment qurilmalarida ishlashni sinab ko'ring va AOT kompilyatsiyasi uchun Baseline Profiles o'rnating.

Tasvirlarni optimallashtirish laglarni bartaraf eta oladimi?

Ha, bu eng samarali usullardan biridir. Yuqori aniqlikdagi tasvirlar ko'p xotira va dekodlash uchun CPU vaqtini oladi. View o'lchamiga downscale, WebP (Android) va HEIC (iOS) formatlari, shuningdek Coil yoki Kingfisher orqali keshlashdan foydalaning.

SwiftUI UIKit bilan solishtirganda laglarga qanday ta'sir qiladi?

SwiftUI yangilanishlarni diffing orqali avtomatik optimallashtiradi, bu ma'lumot o'zgarishida lag xavfini kamaytiradi. Biroq murakkab iyerarxiyalar va tez-tez body qayta qurilishi FPS tushishiga olib kelishi mumkin. UIKit ishlash ustida ko'proq nazorat beradi, ammo qo'lda optimallashtirishni talab qiladi.

Xulosa

  • Lag — foydalanuvchi harakati va interfeys reaksiyasi o'rtasidagi ishlash muammolaridan kelib chiqqan kechikish, mantiqiy xatolardan emas
  • Asosiy sabablar — asosiy oqimning bloklanishi, xotira oqishlari, og'ir layout iyerarxiyalari va nooptimal tarmoq so'rovlari
  • Tashxis Android-da CPU Profiler, Memory Profiler va Network Profiler; iOS-da Time Profiler va Main Thread Checker orqali amalga oshiriladi
  • Bartaraf etish coroutines, GCD, adapter optimallashtirish, ma'lumot tasvirlarini keshlash va lazy-yuklashni o'z ichiga oladi
  • Profilaktika — StrictMode, Macrobenchmark, Baseline Profiles, MetricKit va regressiya ishlash testlari
  • O'lchash — Android-da Choreographer, iOS-da CADisplayLink, ishlab chiqarish monitoringi uchun Google Play Vitals
  • Tavsiya: regressiyalarning oldini olish uchun har bir commitda FPS va ishga tushirish vaqtini tekshiradigan CI sozlang

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