Mobil İnkişafda Performans: bu nədir, hansı metrikalar və necə yaxşılaşdırmaq olar

Müəllif: IT Sectr Dərc olunub: 2026-03-25 Oxuma vaxtı: 12 dəq

Yavaş tətbiq — istifadəçilərin proqramları silməsinin əsas səbəbidir. Başlatma zamanı və ya siyahını sürüşdürərkən milisaniyələrin gecikməsi retention-u onlarla faiz azaldır. Performans təkcə sürət deyil, həm də sabitlikdir: ANR, çökmə və yaddaş sızmasının olmaması. Bu məqalə yaddaş idarəetməsindən (GC, ARC) alətlərlə profilləməyə qədər performansın bütün aspektlərini əhatə edir. Ətraflı — rəsmi Android Performance bələdçisində.

Əsas Məqamlar

  • ANR və Çökmə — istifadəçi təcrübəsinin əsas düşmənləri; fon ipləri ilə qarşısı alınır
  • Yaddaş Sızması və Retain Cycle OOM çökmələrinə səbəb olur; zəif istinadlar və utilitalarla həll edilir
  • GC (Android) və ARC (iOS) — yaddaş idarəetmə modelləri; onların işini başa düşmək vacibdir
  • Profilləmə (Instruments, Android Profiler, LeakCanary) — məcburi inkişaf mərhələsidir
  • Soyuq Başlatma — ən vacib başlatma metrikası; Application.onCreate optimallaşdırması və tənbəl başlatma
  • Tətbiq Ölçüsü — ölçünü azaltmaq üçün App Bundle, R8, VectorDrawable və WebP istifadə edin

Tətbiq niyə yavaşdır?

Tətbiq performansı birbaşa jank (istifadəçi hərəkəti ilə UI cavabı arasında nəzərə çarpan gecikmə) ilə bağlıdır. Əsas səbəblər: Əsas ipin bloklanması (UI ipində ağır əməliyyatlar), tez-tez layout yenidən çəkilməsi (overdraw), yaddaş sızmaları (tez-tez GC), optimal olmayan alqoritmlər (böyük verilərdə O(n²)). Frame Rate (FPS) — saniyədə kadr sayı. Rahat təcrübə üçün sabit 60 FPS (Android) və ya 120 FPS (iPhone Pro, iPad Pro) lazımdır. VSync — renderi ekran yeniləmə tezliyi ilə sinxronlaşdırır.

Jank tək kadrın render edilməsi 16.6 ms (60 FPS üçün) və ya 8.3 ms (120 FPS üçün) keçdikdə baş verir. GPU profilləməsi (Android-də Profile GPU Rendering, iOS-da Core Animation) render mərhələlərindən hansının ən çox vaxt apardığını göstərir. Əsas mərhələlər: Layout (elementlərin yerləşdirilməsi), Draw (çəkmə), Display (kadr buferinə ötürmə). Ən çox rast gəlinən problem XML-də layout şişməsidir, xüsusilə mürəkkəb iç-içə ConstraintLayout istifadə edərkən.

Time-to-Interactive (TTI) — tətbiqin tam qarşılıqlı əlaqəyə hazır olması üçün lazım olan vaxt. TTI Soyuq Başlatma, məlumat yükləmə və kitabxana başlatmanı əhatə edir. Google TTI-ni 5 saniyədən az, Apple — əsas ekranlar üçün 2 saniyədən az tövsiyə edir. Tənbəl Yükləmə — məzmun və kitabxanaların gecikmiş yüklənməsi texnikası, TTI-ni yaxşılaşdırmaq üçün vacibdir. IT Sectr-də bütün layihələrdə standart olaraq tənbəl başlatmadan istifadə edirik.

ANR və Çökmə

ANR və çökmə mobil tətbiq performansının əsas düşmənləridir. ANR (Application Not Responding) — əsas ip 5 saniyədən çox bloklanarsa Android-də görünən dialoq qutusu. Səbəblər: UI ipində sinxron şəbəkə sorğuları, coroutine olmadan verilənlər bazası ilə iş, downsampling olmadan böyük bitmap dekod, Əsas ipdə deadlock. ANR çağrı yığını /data/anr/traces.txt-də saxlanılır və dəqiq bloklama yerini təyin etməyə imkan verir.

Çökmə — gözlənilməz tətbiq sonlanması. Android-də — Exception (Java/Kotlin) və ya Signal (yerli kod). iOS-da — NSException və ya siqnal (EXC_BAD_ACCESS — azad edilmiş yaddaşa giriş). Çökmə Hesabatı Alətləri: Firebase Crashlytics, Sentry, BugSnag. Bunlar stacktrace, cihaz məlumatları və bərpa addımlarını toplayır. Stack Overflow — sonsuz rekursiya səbəbindən çağrı yığını daşması. OutOfMemoryError — yığın (heap) dolduqda.

StrictMode — ip təhlükəsizliyi pozuntularını aşkar etmək üçün Android aləti. Qaydalar təyin etməyə imkan verir: ThreadPolicy (əsas ipdə disk/şəbəkə qadağan), VmPolicy (Activity, SQLite, CloseGuard sızmalarını aşkar et). StrictMode yalnız debug qurmalarında aktiv edilməlidir — buraxılışda işləməməlidir. iOS-da ekvivalenti Main Thread Checker (Xcode)-dır, avtomatik olaraq əsas ipdə olmayan UIKit çağrılarını aşkar edir.

Yaddaş İdarəetməsi (GC, ARC, Retain Cycle)

Yaddaş Sızması

Yaddaş sızması (Memory Leak) — tətbiq artıq istifadə etməsə belə, obyektin yaddaşda qalması vəziyyətidir. Bu, birbaşa tətbiq performansını azaldır. Android-də GC (Garbage Collection) obyektə güclü istinad varsa onu toplaya bilməz. Tipik səbəblər: Activity-ə statik istinadlar, təmizlənməmiş callback/observerlər, xarici sinfə örtük istinadı olan daxili siniflər, təmizlənməmiş mesajları olan Handler. LeakCanary — avtomatik sızma aşkarlanması üçün kitabxana.

Retain Cycle (Saxlama Dövrü)

ARC (Automatic Reference Counting) — iOS-da yaddaş idarəetmə modeli. Hər obyektin istinad sayğacı (retain count) var. Sayğac sıfıra çatdıqda yaddaş azad edilir. Retain Cycle iki obyekt bir-birinə güclü istinadlar saxladıqda baş verir (A → B və B → A). ARC sayğacları heç vaxt sıfırlamayacaq. Həll: zəif (weak) və ya sahibsiz (unowned) istinadlar. Weak obyekt azad edildikdə avtomatik olaraq nil olur. Unowned nil olmur, ancaq obyektin canlı olduğunu təmin edir.

GC vs ARC

GC (Garbage Collection) Android-də (Java/Kotlin) işləyir. GC əlçatmaz obyektləri tapmaq və azad etmək üçün dövri olaraq icranı dayandırır (Stop-the-World fasiləsi). GC Tətikləyicisi: yığın (heap) müəyyən faizə çatdıqda. ARC iOS-da (Swift/Objective-C) işləyir və fasilələri yoxdur — sayğaclar hər təyinatda atomik olaraq yenilənir. ARC daha proqnozlaşdırıla biləndir, ancaq yüksək təyinat tezliyində həddindən artıq retain/release əməliyyatları toplaya bilər.

Zəif İstinad (Weak Reference) və Güclü İstinad (Strong Reference) — istinad növü GC/ARC-nin obyekti azad edə biləcəyini müəyyən edir. Strong Reference — bu istinad mövcud olduğu müddətcə obyekt toplanmayacaq. Weak Reference — GC/ARC obyekti toplaya bilər; zəif istinad nil olur (Swift/Java WeakReference-da). Unowned Reference (Swift) — azad edildikdə nil olmur; obyekt öldükdən sonra ona giriş çökməyə səbəb olur. Android-də zəif istinadlar üçün java.lang.ref.WeakReference istifadə olunur.

LeakCanary ilə Android-də sızma aşkarlanması nümunəsi:

kotlin
// Утечка: анонимный класс держит ссылку на Activity
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        val handler = object : Handler(Looper.getMainLooper()) {
            override fun handleMessage(msg: Message) {
                // Используем `this@MainActivity`, сохраняя ссылку на Activity
                Log.d("TAG", "Handler received message")
            }
        }
        handler.sendEmptyMessageDelayed(0, 60000)
    }
}

// Исправление: статический Handler + WeakReference
class SafeHandler(activity: MainActivity) : Handler() {
    private val weakActivity =
        WeakReference(activity)

    override fun handleMessage(msg: Message) {
        weakActivity.get() ?: return
        Log.d("TAG", "Handler received message")
    }
}

Profilləmə (Instruments, Android Profiler)

Profilləmə tətbiq performansının (CPU, yaddaş, şəbəkə, enerji istehlakı) ölçülməsi prosesidir. Profilləmə olmadan kor optimallaşdırma faydasızdır — kodun hansı hissəsinin həqiqətən yavaş olduğunu bilməyəcəksiniz.

Alət Platforma Ölçür Nə vaxt istifadə etməli
Instruments (Time Profiler)iOSCPU, funksiya çağrıları, icra vaxtıAlqoritm optimallaşdırması, darboğaz axtarışı
Instruments (Allocations)iOSYaddaş, obyekt sayı, retain countsSızma və həddindən artıq yaddaş istehlakı axtarışı
Instruments (Leaks)iOSRetain cycles, yaddaş sızmalarıBuraxılışdan əvvəl müntəzəm yoxlama
Android Profiler (CPU)AndroidCPU istifadəsi, ip fəaliyyəti, tracesƏsas ip bloklamalarının axtarışı
Android Profiler (Memory)AndroidYığın dumpı, ayırma izləməSızma axtarışı, obyekt analizi
Android Profiler (Network)AndroidTrafik, sürət, sorğu vaxtlarıŞəbəkə çağrılarının optimallaşdırması
LeakCanaryAndroidAvtomatik yaddaş sızması aşkarlanmasıBütün inkişaf mərhələlərində
StrictModeAndroidƏsas ipdə disk/şəbəkə, sızmalarDebug qurması
Traceview / SystraceAndroidMetod izləmə, sistem hadisələriDərin gecikmə analizi

Instruments (Xcode) — iOS üçün ən güclü alət. Time Profiler hansı funksiyaların ən çox CPU istehlak etdiyini göstərir. Allocations obyekt yaradılması və azad edilməsini izləyir. Leaks avtomatik olaraq retain cycle-ları tapır. Profilləmə addımları: (1) Instruments-ı başladın; (2) şablon seçin (CPU üçün Time Profiler); (3) problemli ssenarini işə salın; (4) çağrı yığınını analiz edin — ən geniş sütun ən "isti" funksiyadır.

Android Profiler Android Studio-ya daxildir (View → Tool Windows → Profiler). CPU Profiler hər ipin yükünü göstərir. Memory Profiler — yığın dumpı və ayırma izləmə. Network Profiler — vaxtlarla bütün HTTP sorğuları. Energy Profiler — enerji istehlakı: WakeLock, Location, Network. Ətraflı izləmə üçün Systrace (Android 10+) və ya Perfetto — mikrosaniyə dəqiqliyi ilə sistem izləmə istifadə olunur.

Tətbiqin Başladılması (Soyuq/İlıq/İsti Başlatma)

Tətbiqin başladılması performansın əsas göstəricilərindən biridir. Üç növə bölünür: Soyuq Başlatma — tətbiq sıfırdan başlayır: proses yaradılır, Application.onCreate (Android) / AppDelegate.applicationDidFinishLaunching (iOS), sinif yükləmə, kitabxana başlatma. İlıq Başlatma — proses mövcuddur, lakin Activity/ViewController məhv edilib (məsələn, ekranı çevirdikdə və ya yaddaşdan qayıdarkən). İsti Başlatma — Activity/ViewController yaddaşdadır, tətbiq sadəcə göstərilir (başqa tətbiqdən keçid).

Soyuq Başlatma ən vacib metrikadır. Android-də daxildir: (1) launch Activity — XML yükləmə, View başlatma; (2) ilk kadr — ilk renderə qədər vaxt. Google tövsiyə edir: launch Activity < 200 ms, ilk kadr < 500 ms, TTI < 5 saniyə. Soyuq Başlatma optimallaşdırması: Application.onCreate-u azaldın (tənbəl başlatma üçün coroutine), SplashScreen API (Android 12+) istifadə edin, kitabxana başlatmanı təxirə salın (WorkManager, DI), lazımsız ContentProviders-ləri silin.

iOS-da Soyuq Başlatma daxildir: Mach-O binar faylının yüklənməsi, dyld (dinamik birləşdirici), Objective-C runtime başlatması, tətbiq delegate-i, ilk controller. Chrome Custom Tabs (Android) və Universal Links (iOS) — tam Soyuq Başlatma olmadan tətbiqdə xarici məzmunu tez açmaq texnologiyaları. Soyuq Başlatmanı real orta səviyyəli cihazlarda sınamaq tövsiyə olunur.

Ölçü Optimallaşdırması

Tətbiq ölçüsü quraşdırma və yeniləmələr üçün performans faktorudur. Dönüşümə təsir edir: hər 10 MB dönüşümü 1% azaldır. Google Play tövsiyə edir APK ölçüsü 150 MB-dan az; App Store — 200 MB-dan az (mobil şəbəkələr — 100 MB). Əsas optimallaşdırma metodları: şəkil sıxılması (PNG əvəzinə WebP 25-35% qənaət), vektorlaşdırma (Android-də VectorDrawable, iOS-da SF Symbols), istifadə olunmayan kodun silinməsi (R8/ProGuard), istifadə olunmayan resursların silinməsi (lint → unused resources).

App Bundle (Android) — Google Play-in hər cihaz üçün optimallaşdırılmış APK yaratdığı nəşr formatı. App Bundle yükləmə ölçüsünü 20-40% azaldır. Dynamic Delivery — tələb əsasında yüklənən modullar (on-demand feature modules). iOS-da ekvivalenti On-Demand Resources (ODR)-dur: ilk başlatmadan sonra yüklənən resurslar (oyun səviyyələri, videolar).

Tənbəl Yükləmə — modulların və kitabxanaların başlatma zamanı deyil, ehtiyac olduqda yükləndiyi texnika. Split APK (Android) və App Slicing (iOS) — tətbiqin arxitektura yuvalarına bölünməsi: arm64-v8a, x86_64. Tətbiq Ölçüsü Optimallaşdırması — davamlı proses: APK tərkibini analiz edin (Android Studio-da Analyze APK), təkrarlanan ikonları silin, çoxsaylı PNG sıxlıqları əvəzinə SVG istifadə edin. IT Sectr-də hər MR üçün CI/CD-də qurma ölçüsü yoxlamasını daxil edirik.

Tez-tez Verilən Suallar

ANR nədir və ondan necə qaçınmaq olar?

ANR (Application Not Responding) — əsas ip 5 saniyədən çox bloklanarsa Android-də görünən dialoq qutusu. ANR-dən qaçmaq üçün bütün ağır əməliyyatları (şəbəkə, verilənlər bazası, fayl emalı) fon iplərinə köçürün. iOS-da ekvivalenti frozen UI-dır, tətbiq toxunuşlara cavab verməyi dayandırdıqda.

Yaddaş Sızması və Retain Cycle nədir?

Yaddaş Sızması — obyektə istinadlar mövcud olduğu üçün onun azad edilə bilməməsi. Retain Cycle — iOS/Objective-C-də iki obyektin bir-birinə istinad etdiyi (A → B → A) və ARC-nin heç birini azad edə bilmədiyi vəziyyət. Həll: weak/unowned istinadlar və vaxtında callback təmizləmə.

Profilləmə üçün hansı alətlərdən istifadə etməli?

iOS üçün: Instruments (Time Profiler, Allocations, Leaks). Android üçün: Android Profiler (CPU, Memory, Network), LeakCanary (yaddaş sızmaları), StrictMode (ip pozuntuları). İnkişaf və inteqrasiya zamanı profilləməni birləşdirmək tövsiyə olunur.

Soyuq Başlatma İlıq Başlatma və İsti Başlatmadan nə ilə fərqlənir?

Soyuq Başlatma — tətbiq sıfırdan başlayır: proses yaradılır, siniflər yüklənir, Application.onCreate işləyir. İlıq Başlatma — proses mövcuddur, lakin Activity/ViewController yenidən yaradılır. İsti Başlatma — Activity/ViewController artıq yaddaşdadır, sadəcə göstərilir. Soyuq Başlatma ən yavaşıdır (1-5 saniyə) və istifadəçi təcrübəsi üçün vacibdir.

Mobil tətbiqin ölçüsünü necə azaltmaq olar?

Əsas metodlar: istifadə olunmayan resursları və kodu silin (R8/ProGuard istifadə edin), şəkilləri vektorlaşdırın (VectorDrawable, SF Symbols), PNG/WebP sıxın (Android), APK əvəzinə App Bundle istifadə edin, lazımsız kitabxanaları silin, modullar üçün Tənbəl Yükləmə istifadə edin. Ölçü optimallaşdırması APK-nı 40-60% azalda bilər.

Xülasə

  • ANR və Çökmə — əsas sabitlik problemləri; fon ipləri və çökmə hesabatçıları ilə həll edilir
  • Yaddaş Sızması və Retain Cycle — OOM-nin əsas səbəbləri; zəif istinadlar və LeakCanary ilə həll edilir
  • GC (Stop-the-World fasilələri) vs ARC (fasiləsiz, lakin retain cycle-lar) — fərqli yaddaş modelləri
  • Profilləmə — məcburi mərhələ: Instruments (iOS), Android Profiler, LeakCanary, StrictMode
  • Soyuq Başlatma — əsas metrika; Application.onCreate optimallaşdırması və tənbəl başlatma
  • App Bundle və WebP/VectorDrawable — ölçünü 20-60% azaltmaq üçün əsas alətlər
  • Performans davamlı prosesdir, birdəfəlik fəaliyyət deyil; metrikaları CI/CD-yə inteqrasiya edin

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