Runtime — mobil tətbiqin kodunun icrasını idarə edən proqram təbəqəsidir: yaddaş ayırır, istisnaları emal edir, garbage collection işə salır və metod çağırışlarını idarə edir. Runtime olmadan heç bir tətbiq işləyə bilməz — bu, kompilyasiya edilmiş kod ilə əməliyyat sistemi arasında keçid təbəqəsidir. Android Developer Documentation, 2025 məlumatlarına görə, icra mühiti platformanın performansını və uyğunluğunu müəyyən edən əsas elementdir.
Əsas məqamlar
Runtime (icra mühiti) — proqram işə salındıqdan sonra onun icrasını təmin edən infrastrukturdur. Mobil inkişaf kontekstində runtime sinif yükləyicisini, yaddaş ayırıcısını, garbage collector-u, metod idarəedicisini və istisna emalını əhatə edir. Bu keçid təbəqəsi olmadan əməliyyat sistemi Dalvik bayt-kodunu və ya Objective-C mesajlarını icra edə bilməz.
Mobil platformalar runtime-ın müxtəlif tətbiqlərindən istifadə edir. Android hibrid AOT/JIT-kompilyasiya ilə ART (Android Runtime) tətbiq edir. iOS Objective-C Runtime — message passing və SEL-identifikatorlarına əsaslanan dinamik sistemdən istifadə edir. Hər iki yanaşma bir vəzifəni həll edir: tərtibatçının kodunu konkret cihazda maksimum performansla icra etmək.
Google I/O 2024 məlumatlarına görə, Android Runtime dünya üzrə cihazlarda sutkada 10 milyarddan çox metodu emal edir. Runtime-ın performansı birbaşa tətbiqin işə düşmə sürətinə, animasiyaların hamarlığına və batareya sərfiyyatına təsir edir. Hər metod çağırışı, hər yaddaş ayrılması və hər garbage collection dövrü runtime təbəqəsindən keçir.
Runtime system beş əsas komponentdən ibarətdir: sinif yükləyicisi, yaddaş meneceri, interpretator və ya kompilyator, metod idarəedicisi və təhlükəsizlik sistemi. Hər komponent kod icrası prosesində ciddi müəyyən edilmiş funksiya yerinə yetirir.
İstifadəçi tətbiqi işə saldıqda ClassLoader DEX-faylları (Android) və ya Mach-O binar fayllarını (iOS) operativ yaddaşa yükləyir. Android-də bu mərhələ bayt-kodun yoxlanılmasını əhatə edir: runtime kodun təhlükəsiz instruksiyaları ehtiva etmədiyini, massivlərin hüdudlarından kənara çıxmadığını və tiplərə riayət edildiyini yoxlayır. Yoxlama zərərli kodun icrasının qarşısını alan kritik təhlükəsizlik addımıdır.
Memory Manager obyektlər üçün yaddaşı ayırır və azad edir. Android ART-da nəsillər üzrə toplama ilə concurrent garbage collector istifadə olunur: gənc obyektlər daha tez-tez, yaşlılar isə daha nadir yoxlanılır. Objective-C Runtime Automatic Reference Counting (ARC) tətbiq edir, burada kompilyator retain/release çağırışlarını avtomatik yerləşdirir.
Method dispatcher hansı metod implementasiyasının çağırılacağını müəyyən edir. Statik dillərdə (Kotlin, Swift) idarəetmə vtable — virtual metodlar cədvəli vasitəsilə həyata keçirilir. Dinamik dillərdə (Objective-C) mesaj implementasiyanı sinifdə və onun super-siniflərində axtaran objc_msgSend-dən keçir. Nəticə təkrarlanan çağırışları sürətləndirmək üçün method cache-də saxlanılır.
Android Runtime (ART) — Android tətbiqlərinin DEX-bayt-kodunu icra edən virtual maşındır. ART Dalvik-i Android 5.0 Lollipop-da əvəz edərək AOT-kompilyasiyanı təklif etdi: tətbiq quraşdırma zamanı bir dəfə maşın koduna kompilyasiya edilir. Bu, hər işə salınmada JIT-kompilyasiyanın əlavə xərclərini aradan qaldırdı.
Android 7.0 Nougat-dan başlayaraq ART hibrid yanaşmadan istifadə edir. Quraşdırma zamanı yalnız tez-tez istifadə olunan metodlar (hot methods) üçün JIT-kompilyasiya yerinə yetirilir, qalan kod interpretasiya edilir. Fon prosesi (profile-guided optimization) hansı metodların daha tez-tez çağırıldığını təhlil edir və onları cihazın boş olduğu vaxtlarda AOT kompilyasiya edir. Bu, quraşdırma vaxtını azaldır və eyni zamanda yüksək performans təmin edir.
ART həmçinin DEX-fayllarını ARM64 maşın kodlu ELF-binar fayllara çevirən AOT compiler (dex2oat) daxildir. Kompilyasiya üç optimallaşdırma səviyyəsi ilə aparılır: quicken (sürətli), optimize (orta) və everything (tam). Varsayılan olaraq Android kompilyasiya sürəti ilə kod performansı arasında tarazlıq yaradan optimize tətbiq edir.
class RuntimeExample {
fun measureExecutionTime() {
val start = System.nanoTime()
// ART tərəfindən kompilyasiya edilən metodun çağırışı
processData()
val end = System.nanoTime()
println("İcra vaxtı: ${end - start} ns")
}
}Yuxarıdakı nümunədə System.nanoTime() çağırışı ART runtime vasitəsilə Linux nüvəsinə idarə olunan yerli metoddur. ART Kotlin bayt-kodunu cihazın prosessoru tərəfindən icra edilən ARM64-instruksiyalarına çevirir. Bu proses tərtibatçı üçün görünməz şəkildə baş verir, lakin onun optimallaşdırılması Android Platform komandasının əsas vəzifəsidir.
Profil yönümlü optimallaşdırma metod istifadə profillərini toplayan ART mexanizmidir. profiles/
Tərtibatçı Gradle layihəsində baseline profiles aktiv edə bilər. Bunlar ART-a quraşdırmadan dərhal sonra hansı metodları AOT kompilyasiya etməyi göstərən əl ilə yazılmış annotasiyalardır. Baseline profiles fon profilləşdirməsini gözləmədən ilk işə düşməni 40% qısaldır.
Objective-C Runtime — iOS və macOS-da Objective-C kodunun icrasını təmin edən dinamik kitabxanadır. Onun özəyi message passing həyata keçirən objc_msgSend funksiyasıdır: birbaşa metod çağırışı əvəzinə obyekt selektorlu mesaj göndərir, runtime isə hansı implementasiyanın icra olunacağını müəyyən edir.
Hər Objective-C obyekti sinifə isa göstəricisini ehtiva edir, sinif isə selektorları (SEL) implementasiyalarla (IMP) əlaqələndirən dispatch table (idarəetmə cədvəli) saxlayır. Metod çağırılanda objc_msgSend zəncir boyunca hərəkət edir: sinif → super-sinif → NSObject, IMP tapılana qədər. Əgər implementasiya tapılmasa, runtime mesajı tuta və ya istisna yarada bilən forwarding mechanism-i işə salır.
Objective-C Runtime həmçinin icra zamanı mövcud selektorun IMP-sini dəyişdirən method swizzling-i dəstəkləyir. Bu, AOP-kitabxanalarında və monitorinq alətlərində istifadə olunan güclü mexanizmdir, lakin bütün tətbiqə təsiri səbəbindən ehtiyatlılıq tələb edir.
@interface RuntimeDemo : NSObject
- (void)printClassInfo;
@end
@implementation RuntimeDemo
- (void)printClassInfo {
// objc_getClass — runtime funksiyası
Class cls = objc_getClass("RuntimeDemo");
unsigned int count;
Method *methods = class_copyMethodList(cls, &count);
NSLog("Metodların sayı: %d", count);
}
@endKod Objective-C Runtime API-yə birbaşa müraciəti nümayiş etdirir: objc_getClass sinif obyektini adına görə alır, class_copyMethodList bütün metodların siyahısını çıxarır. Bu, işlək reflection-dır — icra zamanı sinifin metadatlarına girişdir. Bu yanaşma XCTest-də testlərin dinamik qeydiyyatı üçün istifadə olunur.
isa pointer — hər obyektin ilk 8 baytında saxlanan obyektin sinifinə göstəricidir. iOS 12-dən etibarən Apple optimallaşdırma üçün isa-swizzling tətbiq etdi: isa-nın kiçik bitləri obyektin vəziyyəti haqqında əlavə məlumat kodlaşdırır. Tagged pointers — 60 bitə qədər dəyərlərin (NSNumber, NSDate) heap-də obyekt ayrılmadan birbaşa göstəricidə saxlandığı başqa bir optimallaşdırmadır. Bu, yaddaş menecerinə yükü 30% azaldır.
JIT (Just-In-Time) və AOT (Ahead-Of-Time) bayt-kodu maşın koduna kompilyasiya etməyin iki yanaşmasıdır. JIT kodu tətbiqin icrası zamanı kompilyasiya edir, isti hissələri təhlil edir və onları ani optimallaşdırır. AOT bütün kodu əvvəlcədən — tətbiqin quraşdırılması zamanı və ya tərtibatçı tərəfindən kompilyasiya edir.
| Xarakteristika | JIT | AOT |
|---|---|---|
| Kompilyasiya vaxtı | İcra zamanı | Quraşdırma / build zamanı |
| APK/IPA ölçüsü | Daha kiçik (yalnız bayt-kod) | Daha böyük (maşın kodu) |
| İşə düşmə sürəti | Aşağı (kompilyasiya lazımdır) | Daha yüksək (kod icraya hazırdır) |
| Cihaza uyğun optimallaşdırma | Bəli (adaptiv) | Məhdud (generic) |
| RAM sərfiyyatı | Daha yüksək (yaddaşda kompilyator) | Daha aşağı |
ART-ın hibrid yanaşması (Android 7+) optimal hesab edilir: tətbiq nadir çağırılan metodlar üçün interpretatordan, hot-metodlar üçün JIT-dən və profile-guided optimization-dən gələn metodlar üçün AOT-dan istifadə edir. iOS isə əksinə, LLVM vasitəsilə ciddi AOT istifadə edir: Swift və Objective-C Xcode-da build mərhələsində maşın koduna kompilyasiya edilir.
Apple Developer Documentation, 2024 məlumatlarına görə, Swift runtime tətbiqin ölçüsünə təxminən 15 MB əlavə edir. Flutter öz Dart VM-dən istifadə edir, burada JIT-kompilyasiya hot reload üçün debug-rejimdə, AOT isə maksimal performans üçün release-rejimdə işləyir. React Native işə düşmə vaxtını 50% qısaldan AOT-kompilyasiyalı Hermes JavaScript mühərrikindən istifadə edir.
ARM64 Runtime — maşın kodunun cihazın prosessoru ilə qarşılıqlı əlaqədə olduğu səviyyədir. Müasir mobil cihazların əksəriyyəti ARM64 (aarch64) prosessorlarında işləyir. Runtime bayt-kodu və ya yerli çağırışları CPU-nun icra etdiyi ARM64-instruksiyalarına tərcümə edir.
Runtime tərəfindən istifadə olunan əsas ARM64 registrləri: x0–x7 (funksiya parametrləri), x8 (dolayı nəticə), x30 (qayıdış ünvanı), sp (stack pointer), fp (frame pointer). ART ARM64 Procedure Call Standard-a riayət edən kod yaradır: bütün metod çağırışları prosessor arxitekturası tərəfindən müəyyən edilmiş protokoldan keçir.
ARM64 ABI-ni başa düşmək performansın optimallaşdırılması üçün vacibdir: inline-keşləşdirmə, budaqlanma proqnozlaşdırması və kodun yaddaşda hizalanması birbaşa runtime-ın iş sürətinə təsir edir. Profilləşdirmə alətləri (Android Studio Profiler, Instruments) kodun hansı hissələrinin runtime-da daha çox vaxt keçirdiyini göstərir — məhz onların optimallaşdırılması ən böyük artımı verir.
// ART tərəfindən yaradılan ARM64 assembly nümunəsi
// İki parametrli metodun çağırışı
mov x0, x23 // self (this)
mov x1, x24 // param1
mov x2, x25 // param2
bl methodEntryPoint // runtime vasitəsilə çağırış
str x0, [sp, #8] // nəticənin saxlanmasıBu nümunədə ARM64 instruksiyaları mov arqumentləri x0–x2 registrlərinə ötürür, bl metodun giriş nöqtəsini çağırır, str isə qayıdan dəyəri saxlayır. Runtime hər metod çağırışı üçün belə instruksiyalar yaradır, ardıcıllığı devirtualization və inlining vasitəsilə optimallaşdırır.
Runtime overhead — dinamik idarəetmənin qaçılmaz xərcidir. Runtime vasitəsilə hər metod çağırışı tələb edir: dispatch table-da implementasiyanın axtarışı, tiplərin yoxlanması, IMP-nin çağırışı və nəticənin qaytarılması. Ölçmələr göstərir ki, runtime Objective-C-də çağırışa 10–50 ns, ART-da isə 5–20 ns əlavə edir.
Xərci azaltmaq üçün tərtibatçılar monomorphic inlining (ART) və method caching (Objective-C) istifadə edirlər. Kotlin/Native və Swift birbaşa ARM64-ə kompilyasiya olunur, runtime keçid təbəqəsini tamamilə aradan qaldırır, lakin dinamik imkanları — reflection, swizzling, siniflərin dinamik yüklənməsini itirir.
Tez-tez verilən suallar
SDK (Software Development Kit) — tətbiqin hazırlanması üçün alətlər dəsti (kompilyator, kitabxanalar, utilitlər). Runtime — artıq hazırlanmış tətbiqin cihazda icra edildiyi mühitdir. SDK tərtibatçıya, runtime isə istifadəçiyə lazımdır.
Xeyr — runtime əməliyyat sisteminin bir hissəsidir və istifadəçi tərəfindən əvəz edilə bilməz. ART Android Framework-ə, Objective-C Runtime isə iOS-a quraşdırılıb. Tərtibatçı dil seçə bilər (runtime olmadan Kotlin/Native) və ya Flutter-də Dart VM kimi virtual maşınlardan istifadə edə bilər.
Bəli, runtime enerji sərfiyyatına təsir edir. ART-da Garbage collection və Swift runtime CPU-dan istifadə edir, bu da yükün istehlakını artırır. concurrent GC və iOS-da tagged pointers kimi optimallaşdırmalar runtime-ın batareyaya təsirini 20–30% azaldır.
Runtime error — icra zamanı baş verən xətadır: null pointer exception, index out of bounds, sıfıra bölmə. Compile-time xətalardan fərqli olaraq onlar build zamanı aşkarlanmır. Onlar try-catch blokları və ya crash reporting (Firebase Crashlytics, Sentry) vasitəsilə tutulur.
Swift runtime Objective-C-dən yüngüldür: varsayılan olaraq dynamic dispatch-i dəstəkləmir, heap-də ayrılması olmayan value types (struct) istifadə edir və message forwarding-ə malik deyil. Swift metodları @objc dynamic ilə işarələnməyibsə, birbaşa vtable vasitəsilə çağırılır. Bu, benchmarklarda 5x-ə qədər sürət artımı verir.
Nəticələr
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