Mobil inkişafda laqlar: bu nədir, səbəbləri və aradan qaldırma üsulları

Müəllif: IT Sectr Dərc olunub: 2026-07-28 Oxuma vaxtı: 9 dəq

Laq mobil proqramda istifadəçinin hərəkəti ilə interfeysin reaksiyası arasında nəzərə çarpan gecikmədir və bu, əsas axının həddindən artıq yüklənməsi, yaddaş sızması və ya qeyri-optimal giriş-çıxış əməliyyatları səbəbindən yaranır. Məntiqi səhvlərlə əlaqəli qüsurlardan fərqli olaraq, laq performans problemidir: proqram düzgün, lakin yavaş işləyir. AppDynamics Mobile App Performance Report 2024 məlumatına görə, istifadəçilərin 62%-i proqram 3 saniyədən çox yavaş işləyərsə onu silir. Laqların diaqnozu CPU, yaddaş və şəbəkənin Android Studio Profiler və Xcode Instruments vasitəsilə profilləşdirilməsini tələb edir.

Əsas məqamlar

  • Laq — proqramın düzgün işləməsi zamanı performans problemlərindən yaranan nəzərə çarpan interfeys gecikməsi
  • Əsas səbəblər — əsas axının bloklanması, yaddaş sızmaları, tez-tez GC fasilələri, qeyri-optimal SQL sorğuları və şəbəkə çağırışları
  • Diaqnoz Android Studio-da CPU Profiler, Memory Profiler və Network Profiler, Xcode-da isə Time Profiler vasitəsilə aparılır
  • Aradan qaldırma tapşırıqların fon axınlarına çıxarılması, keşləmənin tətbiqi, adapterlərin optimallaşdırılması və məlumatların lazy-yüklənməsini əhatə edir
  • Profilaktika — StrictMode, Main Thread Checker, asinxron GCD növbələri və düzgün dispatcherlərlə Kotlin Coroutines

Mobil inkişafda laq nədir

Laq (ing. lag) mobil proqramda istifadəçinin hərəkəti (toxunma, sürüşdürmə, mətn daxil etmə) ilə interfeysin reaksiyası arasında subyektiv olaraq hiss olunan gecikmədir. Texniki olaraq laq giriş hadisəsi ilə kadrın tam render edilməsi arasındakı vaxt kimi ölçülür: rahat hədd — 100 ms-ə qədər, nəzərə çarpan — 200 ms-dən, kritik — 500 ms-dən çox.

Laq, qüsur və yavaşlama arasındakı fərq

İstifadəçi terminologiyasında „laq edir“ və „yavaşlayır“ tez-tez sinonim kimi istifadə olunur, lakin texniki olaraq laq sabit gecikmədir (məsələn, hər klikdə 300 ms), „yavaşlayır“ isə qeyri-sabit yavaşlamadır: proqram bəzən hamar işləyir, bəzən bir saniyə donur. Qüsur, laqdan fərqli olaraq, sürətlə deyil, göstərmənin düzgünlüyü ilə bağlıdır.

Laqların proqram metrikalarına təsiri

Google Play və App Store proqramların sıralanmasında performans göstəricilərini nəzərə alır. ANR dərəcəsi, jank tezliyi və başlanğıc vaxtı axtarışda görünməyə və quraşdırma konversiyasına təsir edir. Daimi laqları olan proqram ilk işə salındıqdan sonra istifadəçilərin 40%-ə qədərini itirir.

Proqramlarda laq və yavaşlamaların səbəbləri

Laqlar əsas UI axını 60 FPS (kadr başına 16.6 ms) və ya 120 FPS (8.3 ms) tezliyi ilə kadrları emal edə bilmədikdə yaranır. Gecikmələrin əsas mənbələrini nəzərdən keçirək.

Əsas axının bloklanması

UI axınında hər hansı sinxron əməliyyat — SharedPreferences-dən oxumaq, suspend olmadan Room vasitəsilə verilənlər bazası ilə işləmək, təsvirin Bitmap-ə dekodlaşdırılması — kadrın çəkilməsini bloklayır. Android-də bu kadrların atlanmasına (jank), iOS-da isə Core Animation renderinin gecikməsinə səbəb olur.

Yaddaş sızmaları və tez-tez GC fasilələri

Android-də Garbage Collector və ya iOS-da ARC yaddaşı boşaltdıqda bütün axınlar dayandırılır. Tez-tez GC fasilələri çox sayda müvəqqəti obyekt yaradıldıqda — məsələn, hər dəfə siyahı adapteri çağırıldıqda yeni ViewHolder nümunəsi yaradıldıqda baş verir. Bu özünü sıçrayışlı sürüşdürmə kimi göstərir.

Ağır layout iyerarxiyaları

İç-içə ConstraintLayout, çoxsaylı LinearLayout, üst-üstə düşən View — hər iç-içəlik measure və layout pass vaxtını artırır. Xcode göstərir ki, dərin təbəqə iyerarxiyası (10 səviyyədən çox) FPS-in 20-30% düşməsinə səbəb olur.

  • Android — həddindən artıq requestLayout, səmərəsiz ConstraintLayout zəncirləri, downscale olmadan böyük Bitmap
  • iOS — konfliktli Auto Layout constraints, ağır CALayer, rasterizasiyasız shadowPath
  • Cross-platform — UI axınında sinxron HTTP çağırışları, ağır JSON parsings, qeyri-optimal yüksək rezolyusiyalı şəkillər

Performans gecikmələrini necə diaqnoz etmək

Laqların səbəblərini aşkar etmək üçün IDE-lərə quraşdırılmış profilerlərdən və sistem monitorinqi alətlərindən istifadə olunur. Hər alət öz vəzifəsini həll edir.

Android Studio-da CPU Profiler

CPU Profiler hansı metodların prosessor vaxtını tutduğunu və hansı axınlarda icra olunduğunu göstərir. Ağır hesablamaları olan metod main thread-də icra olunursa — bu problemin köküdür. Sample Java Method aktivləşdirilmiş izləmə yazısı hər anda çağrı stackini görməyə və „isti nöqtələri“ tapmağa imkan verir.

Xcode Instruments-da Time Profiler

iOS üçün analoji alət — Time Profiler — hər millisaniyədə stack nümunələri toplayır və hər metodun CPU vaxtının neçə faizini tutduğunu göstərir. Main Thread Only bayrağı ilə kombinasiya yalnız əsas axındakı əməliyyatları filtrləyir ki, bu da birbaşa laq mənbələrini göstərir.

Network Profiler və sorğu analizi

Yavaş şəbəkə sorğuları UI axını bloklanmasa belə laq təəssüratı yaradır. Android Studio-da Network Profiler və Xcode-da Network Link Conditioner yavaş əlaqəni simulyasiya etməyə və proqramın real şəraitdə necə davrandığını müəyyən etməyə imkan verir. Tərəqqisiz chunked cavablar və böyük JSON yükləri — görünən laqların tipik mənbələridir.

Vaxt ölçmə ilə OkHttp vasitəsilə şəbəkə sorğusunun profilləşdirilməsi nümunəsi:

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("Vaxtlama", "Sorğu $duration ms çəkdi")
        return response
    }
}

Android və iOS-da laqları aradan qaldırma üsulları

Laqların aradan qaldırılması sistematik iş tələb edir: tək metodun optimallaşdırılmasından memarlıq dəyişikliklərinə qədər. Ən təsirli üsulları nəzərdən keçirək.

Coroutines və GCD vasitəsilə asinxron emal

Kotlin Coroutines şəbəkə sorğuları üçün Dispatchers.IO dispatcheri və hesablamalar üçün Dispatchers.Default ilə əsas axının UI üçün sərbəst qalmasını təmin edir. iOS-da fon tapşırıqları üçün .global(qos: .userInitiated) növbəsi və UI yeniləməsi üçün .main ilə Grand Central Dispatch standart yanaşmadır. Növbələr arasında sync-əməliyyatlardan çəkinin.

Adapterlərin və siyahıların optimallaşdırılması

Android-də RecyclerView və iOS-da UICollectionView düzgün konfiqurasiya tələb edir: onBindViewHolder-da minimal obyekt yaradılması ilə ViewHolder, dəyişiklikləri hesablamaq üçün DiffUtil, məlumatları əvvəlcədən yükləmək üçün prefetching. iOS-da əl ilə idarəetmə olmadan animasiya edilmiş yeniləmələr üçün diffable data source istifadə edin.

Məlumatların və şəkillərin keşlənməsi

Hər sürüşdürmədə eyni şəklin yüklənməsi — zəmanətli laqdır. Coil (Android) və Kingfisher (iOS) şəkilləri yaddaşda və diskdə keşləyərək təkrar sorğuda dərhal göstərilməni təmin edir. Məlumatlar üçün Flow və ya Combine əsaslı keşləmə qatı ilə Room istifadə edin.

Android-də Coil ilə şəkil keşləməsinin qurulması nümunəsi:

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

// Avtomatik keşləmə aktivləşdirilmiş yükləmə
imageView.load("https://example.com/image.jpg") {
    placeholder(R.drawable.placeholder)
    error(R.drawable.error)
}

İnkişaf mərhələsində laqların profilaktikası

Laqların qarşısını almaq onları istehsalda düzəltməkdən daha ucuzdur. Profilaktik tədbirlər alətlər və memarlıq səviyyəsində inkişaf prosesinə daxil edilir.

Android-də StrictMode

StrictMode — inkişaf mərhələsində əsas axında təsadüfi giriş-çıxış əməliyyatlarını və şəbəkə çağırışlarını aşkar edən quraşdırılmış Android alətidir. Onu Application.onCreate-də kritik pozuntular üçün penaltyDeath siyasəti ilə aktivləşdirin. Bu, proqramçının problemi commitedən əvvəl görməsinə zəmanət verməyin yeganə yoludur.

iOS-da Main Thread Checker

iOS üçün analoq — Xcode-da Runtime Sanitization-ə daxil olan Main Thread Checker. O, bütün UIKit və AppKit çağırışlarının əsas axından icra olunduğunu avtomatik yoxlayır. Debug qurma sxemində onu aktivləşdirin və CI-da sıfır xəbərdarlığa nail olun.

CI-da performans benchmarkları

CI pipeline-na başlanğıc vaxtı, sürüşdürmə FPS və yaddaş istifadəsini ölçmək üçün Macrobenchmark (Android) və XCTMetrics (iOS) icrasını əlavə edin. Həddlər təyin edin: əgər yeni commit başlanğıc vaxtını 5%-dən çox artırarsa — qurma uğursuz olur.

  • Android — Macrobenchmark, Baseline Profiles, Jetpack Benchmark Library
  • iOS — XCTMetrics, os_signpost, istifadəçi cihazlarından metrikalar toplamaq üçün MetricKit
  • Ümumi yanaşma — hər əhəmiyyətli dəyişiklikdən əvvəl və sonra profilləşdirmə, reqressiya performans testləri

Tez-tez verilən suallar

Laq aşağı FPS-dən nə ilə fərqlənir?

Laq subyektiv gecikmə hissidir və bu, hətta yüksək FPS-də də yarana bilər, əgər gecikmə render deyil, girişin emal müddəti ilə bağlıdırsa. Aşağı FPS (30 kadr/s-dən az) — laqların səbəblərindən biridir, lakin yeganə deyil.

Proqramda laqı necə ölçmək olar?

Android-də Frame Timing API (Choreographer) və iOS-da CADisplayLink istifadə edərək kadrlar arasındakı vaxtı ölçün. Google Play Vitals real şəraitdə jank dərəcəsini göstərir. Dəqiq ölçmələr üçün sürüşdürmə ssenariləri ilə Macrobenchmark tətbiq edin.

Niyə laqlar yalnız köhnə cihazlarda görünür?

Köhnə cihazlar daha az CPU nüvəsinə, daha az RAM-a və daha yavaş yaddaşa malikdir. Flaqmanda 5 ms-də icra olunan əməliyyat büdcə cihazda 50 ms çəkə bilər. Aşağı seqmentli cihazlarda performansı test edin və AOT-kompilyasiya üçün Baseline Profiles təyin edin.

Şəkillərin optimallaşdırılması laqları aradan qaldıra bilərmi?

Bəli, bu ən təsirli üsullardan biridir. Yüksək rezolyusiyalı şəkillər çox yaddaş və dekodlaşdırma üçün CPU vaxtı tutur. View ölçüsünə qədər downscale, WebP (Android) və HEIC (iOS) formatları, həmçinin Coil və ya Kingfisher vasitəsilə keşləmədən istifadə edin.

SwiftUI UIKit ilə müqayisədə laqlara necə təsir edir?

SwiftUI diffing vasitəsilə yeniləmələri avtomatik optimallaşdırır ki, bu da məlumat dəyişikliyi zamanı laq riskini azaldır. Lakin mürəkkəb iyerarxiyalar və tez-tez body yenidənqurmaları FPS düşməsinə səbəb ola bilər. UIKit performans üzərində daha çox nəzarət verir, lakin əl ilə optimallaşdırma tələb edir.

Nəticə

  • Laq — istifadəçinin hərəkəti ilə interfeysin reaksiyası arasında performans problemlərindən yaranan gecikmə, məntiqi səhvlərdən deyil
  • Əsas səbəblər — əsas axının bloklanması, yaddaş sızmaları, ağır layout iyerarxiyaları və qeyri-optimal şəbəkə sorğuları
  • Diaqnoz Android-də CPU Profiler, Memory Profiler və Network Profiler; iOS-da Time Profiler və Main Thread Checker vasitəsilə aparılır
  • Aradan qaldırma coroutines, GCD, adapter optimallaşdırması, məlumat şəkillərinin keşlənməsi və lazy-yükləməni əhatə edir
  • Profilaktika — StrictMode, Macrobenchmark, Baseline Profiles, MetricKit və reqressiya performans testləri
  • Ölçmə — Android-də Choreographer, iOS-da CADisplayLink, istehsal monitorinqi üçün Google Play Vitals
  • Tövsiyə: reqressiyaların qarşısını almaq üçün hər commitedə FPS və başlanğıc vaxtını yoxlayan CI qurun

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.

Layihəni müzakirə et

Həm də oxuyun