AOT (Ahead-Of-Time) — kompilyasiya texnologiyasıdır, burada mənbə kodu və ya bayt-kodu proqramın işə salınmasından əvvəl, qurma və ya quraşdırma mərhələsində maşın təlimatlarına çevrilir. Android-də AOT kompilyasiyası ART icra mühitinin əsas innovasiyası oldu və Dalvik-i 5.0 Lollipop versiyasında əvəz etdi. Google, 2024 məlumatlarına görə, ART-də AOT kompilyasiyası istiləşmə gecikmələrini aradan qaldırır və tətbiqlərin enerji sərfiyyatını JIT yanaşması ilə müqayisədə 10–15% azaldır.
Əsas məqamlar
Ahead-Of-Time (AOT) — proqramın işə salınmasından əvvəl maşın koduna çevrildiyi kompilyasiya üsulu. "Ahead-Of-Time" termini JIT (Just-In-Time) ilə ziddiyyət təşkil edir: əgər JIT "vaxtında" kompilyasiya edirsə, AOT — "əvvəlcədən". AOT kompilyatoru girişdə mənbə kodu və ya aralıq təsviri (bayt-kodu) alır və işə salınmağa hazır olan icra olunan fayl yaradır.
AOT tarixi ənənəvi C və C++ kompilyatorlarına gedib çıxır, burada kompilyasiya həmişə işə salınmadan əvvəl həyata keçirilir. İdarə olunan dillər (Java, C#, Dart) kontekstində AOT daha gec bir innovasiyadır: uzun müddət dinamik imkanların (refleksiya, siniflərin dinamik yüklənməsi) AOT-ni çətin reallaşdırılan etdiyi düşünülürdü. Google Android üçün dex2oat yaradaraq bu problemi həll etdi — DEX bayt-kodunu yerli koda çevirən AOT kompilyatoru.
AOT kompilyatoru tam tərcümə dövrü həyata keçirir. Birinci mərhələ — pars etmə və abstrakt sintaksis ağacının (AST) qurulması. İkinci — analiz və optimallaşdırma: ölü kodun silinməsi, inline etmə, dövr optimallaşdırması. Üçüncü — hədəf arxitektura (ARM, ARM64, x86) üçün maşın kodunun yaradılması. Nəticə icra zamanı əlavə emal tələb etməyən icra olunan fayldır.
# AOT kompilyatoru dex2oat-ın əl ilə işə salınması
dex2oat --dex-file=classes.dex \
--oat-file=classes.oat \
--arch=arm64 \
--instruction-set-variant=generic
# Kompilyasiya edilmiş OAT faylının yoxlanılması
oatdump --oat-file=classes.oat --output=oat_dump.txt
Android-də AOT kompilyasiyası dex2oat (dalvik executable to optimized android translator) vasitəsi ilə həyata keçirilir. İstifadəçi tətbiqi quraşdırdıqda, sistem dex2oat-ı işə salır, APK-dan DEX fayllarını oxuyur, bayt-kodu optimallaşdırır və OAT faylı — yerli kodlu ELF binar faylı yaradır. Bu fayl /data/dalvik-cache/ bölməsində saxlanılır.
Kompilyasiya prosesi bir neçə optimallaşdırma səviyyəsini əhatə edir. Əsas səviyyə — bayt-kodun yoxlanılması və əsas optimallaşdırmalar (dead code elimination, constant folding). Orta — metodların inline edilməsi, loop unrolling, escape analizi. Maksimum — bütün tətbiqin qlobal optimallaşdırmaları, o cümlədən devirtualizasiya və yığın ölçüsünün optimallaşdırılması. Optimallaşdırma səviyyəsi kompilyasiya rejimindən asılıdır (speed, speed-profile, space).
OAT faylı ELF (Executable and Linkable Format) formatına malikdir — yerli Linux binar fayllarının istifadə etdiyi eyni format. OAT faylının daxilində tətbiqin hər metodu üçün kompilyasiya edilmiş kod, həmçinin metadata: siniflər, sahələr, metodlar və onlar arasındakı əlaqələr haqqında məlumatlar var. ART bu metadatadan siniflərin sürətli yüklənməsi və DEX-in tam pars edilmədən simvolik istinadların həlli üçün istifadə edir.
| OAT komponenti | Təyinat |
|---|---|
| ELF header | ELF formatının başlığı |
| Code section | Kompilyasiya edilmiş metodların maşın kodu |
| OAT header | ART metadata: versiya, bölmə ölçüləri |
| DEX sections | Refleksiya üçün orijinal DEX məlumatları |
| Link table | JNI və yerli kitabxanalar üçün əlaqə cədvəli |
AOT və JIT performans və elastiklik arasında müxtəlif kompromis nöqtələrini təmsil edir. AOT ilk saniyədən maksimum icra sürətini təmin edir, lakin daha çox disk sahəsi və quraşdırma vaxtı tələb edir. JIT yer və quraşdırma vaxtına qənaət edir, lakin bunun əvəzində istiləşmə gecikməsi və pik enerji sərfiyyatı ilə ödəyir.
Seçimin əsas amili — istifadə ssenarisidir. Bir dəfə işə salınıb uzun müddət işləyən tətbiqlər (oyunlar, redaktorlar, naviqatorlar) üçün AOT üstünlük təşkil edir — kompilyasiya xərcləri sabit performans hesabına ödənilir. Nadir hallarda və qısa müddətə işə salınan kiçik vasitələr üçün JIT daha sərfəli ola bilər — sürətli quraşdırma və az yer pik performansdan daha önəmlidir.
| Meyar | AOT | JIT |
|---|---|---|
| İşəsalma | Ani | İstiləşmə ilə |
| Quraşdırma | Daha uzun (kompilyasiya) | Sürətli |
| Disk sahəsi | +15–30% | Minimal |
| Enerji sərfiyyatı | Sabit | Kompilyasiyada pik |
| Adaptivlik | Aşağı | Yüksək |
Maraqlı nüans: AOT kodu həmişə JIT-dən sürətli deyil. JIT icra vaxtı profil məlumatlarına — obyektlərin dəqiq tiplərinə, çağırış tezliklərinə, real budaqlanma nümunələrinə çıxışa malikdir. Bu, AOT üçün əlçatmaz optimallaşdırmaları (məsələn, profil idarəli inline) tətbiq etməyə imkan verir. Praktikada AOT və JIT arasında kompilyasiya edilmiş kodun performans fərqi ssenaridən asılı olaraq ±5–10% təşkil edir.
AOT mobil tətbiqlər üçün üç əsas üstünlük təmin edir. Birinci — proqnozlaşdırıla bilən performans. İstifadəçi işin ilk saniyələrində "ləngimələr" görmür: tətbiq maksimal sürətlə ilk kadrdan işləyir. Bu, oyunlar, animasiyalar və hamar keçidli interfeyslər üçün kritik əhəmiyyət daşıyır.
İkinci — enerji səmərəliliyi. AOT JIT kompilyasiyasına xas olan CPU pik yüklərini yaratmır. Prosessor sabit rejimdə işləyir, bu da tətbiqin ilk 30–60 saniyəsində enerji sərfiyyatını 10–15% azaldır. Gündə 20–30 tətbiq işə salan tipik istifadəçi üçün bu, batareya iş vaxtında nəzərəçarpacaq artım verir.
AOT kompilyasiyası icra mühitini sadələşdirir. Bütün kod artıq kompilyasiya edildikdə, icra zamanı JIT kompilyatoruna, interpritatora və profilçiyə ehtiyac qalmır. Bu, icra mühitinin ölçüsünü azaldır və səhv ehtimalını aşağı salır. Tam AOT rejimində ART aktiv JIT ilə analoji mühitdən təxminən 15% az RAM tutur.
AOT-nin əsas çatışmazlığı — quraşdırma vaxtı. Android 5.0 ilə ilk cihazlarda böyük tətbiqlərin (100–200 MB) quraşdırılması AOT kompilyasiyası səbəbindən 2–5 dəqiqə çəkə bilərdi. Bu, mənfi istifadəçi təcrübəsi yaradırdı: APK endirildikdən sonra tətbiqi açmadan əvvəl gözləmək lazım idi. Google bu problemi Android 7.0-da hibrid sxemə keçərək qismən həll etdi.
İkinci çatışmazlıq — tutulan yer. OAT faylları orijinal DEX fayllarından 15–30% böyükdür. 8–16 GB daxili yaddaşa malik cihazlarda hər tətbiq sistem bölməsində əlavə yer "yeyir". Çox sayda quraşdırılmış tətbiqi olan istifadəçilər (50–100) üçün bu, sistem yeniləmələri üçün yer çatışmazlığına səbəb ola bilər.
AOT kodu kompilyasiya anında fiksasiya olunur. Əgər tətbiq Android versiyasından, cihaz modelindən və ya istifadəçi parametrlərindən asılı olaraq müxtəlif icra nümunələri istifadə edirsə, AOT uyğunlaşa bilmir. Bir ssenari üçün seçilmiş optimallaşdırmalar digəri üçün qeyri-optimal ola bilər. JIT bu baxımdan daha çevikdir: icra şərtləri dəyişdikdə hot-metodları yenidən kompilyasiya edir.
AOT kompilyasiyası təkcə Android-də deyil, həm də digər platformalarda tətbiq olunur. Flutter Dart kodunu iOS və Android üçün yerli koda kompilyasiya etmək üçün AOT-dan istifadə edir. Bu, hətta zəif cihazlarda 60 fps səviyyəsində UI performansını təmin edir. İnkişaf mərhələsində Flutter JIT (hot reload) istifadə edir, release qurması üçün isə AOT — hər iki yanaşmanın üstünlüklərini birləşdirir.
.NET ekosistemində ReadyToRun (R2R) texnologiyası yığınları əvvəlcədən yerli koda kompilyasiya etməyə imkan verir. Bu, .NET tətbiqlərinin işəsalma vaxtını 30–50% qısaldır. Go kompilyatoru ilkin olaraq AOT kompilyatorudur: Go proqramları xarici asılılıqlar olmadan bir statik binar fayla kompilyasiya olunur, bu da onları konteyner mühiti üçün ideal edir.
// Flutter: Dart kodunun yerli koda AOT kompilyasiyası
// Release qurması AOT istifadə edir
flutter build apk --release
// Nəticə: AOT ilə kompilyasiya edilmiş Dart kodu olan libapp.so
// İnkişaf JIT (hot reload) istifadə edir
flutter run
AOT-nin əlavə üstünlüyü — əks mühəndisliyin çətinləşdirilməsi. Kompilyasiya edilmiş yerli kodu dekompilyasiya etmək bayt-kodundan daha çətindir. JADX və APKTool kimi vasitələr DEX formatı ilə işləyir, lakin OAT fayllarından eyni detallaşdırma səviyyəsində mənbə kodunu bərpa edə bilmir. Bu, obfuskasiyanı (ProGuard, R8) əvəz etmir, lakin analizatorlar üçün əlavə maneə yaradır.
Android-də müasir standart — profilləşdirilmiş AOT kompilyasiyası, Android 7.0-dan başlayaraq ART-də tətbiq edilmişdir. Quraşdırma zamanı tətbiq tam kompilyasiya olunmur — bunun əvəzində sürətli bayt-kod yoxlanışı və ilk işəsalmalar üçün JIT istifadə olunur. Bu, Android 5.0–6.0-da təmiz AOT üçün xarakterik olan uzun quraşdırma problemini həll edir.
Tətbiqin 2–3 işəsalınmasından sonra ART profilçisi real istifadə haqqında məlumat toplayır və hansı metodların performans üçün ən kritik olduğunu müəyyənləşdirir. Sonra fon rejimində (adətən gecə, cihaz şarj olarkən) dex2oat bu hot-metodları yerli koda kompilyasiya edir. Fon kompilyasiyasından sonra tətbiq quraşdırma zamanı istifadəçi təcrübəsinə mənfi təsir göstərmədən tam AOT-a ekvivalent performans əldə edir.
// Kompilyasiya rejiminin proqram idarəsi (Android 9+)
fun requestProfileCompilation(context: Context) {
val pm = context.packageManager
// Profilləşdirilmiş kompilyasiyadan istifadə tövsiyə olunur
pm.setComponentEnabledSetting(
ComponentName(context, javaClass()),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
}
Hibrid kompilyasiyadan maksimum fayda əldə etmək üçün tərtibatçılar bir neçə qaydaya riayət etməlidirlər. Baza profillərindən (baseline profiles) istifadə edin — APK ilə birlikdə verilən əvvəlcədən toplanmış profillər ART-ə quraşdırmadan dərhal sonra hot-metodların AOT kompilyasiyasına başlamağa imkan verir. Baseline profiles tam performansa çatma vaxtını 2–3 işəsalmanan birinci işəsalmaya qədər qısaldır.
Tez-tez verilən suallar
AOT — proqramın istifadəçi onu işə salmazdan əvvəl maşın koduna tərcümə edilməsidir. Təsəvvür edin ki, kitab siz onu açmazdan əvvəl tamamilə Azərbaycan dilinə tərcümə olunub — siz dərhal, səhifələrin tərcüməsində gecikmələr olmadan oxuyursunuz.
AOT kodu quraşdırma zamanı kompilyasiya edir (daha uzun quraşdırma, lakin daha sürətli işəsalma). JIT kodu iş zamanı kompilyasiya edir (sürətli quraşdırma, lakin ilk saniyələrdə tətbiq daha yavaş olur). Müasir sistemlər hər iki yanaşmanı birləşdirir.
Google JIT istiləşməsi problemini — tətbiqin işinin ilk saniyələrindəki gecikmələri aradan qaldırmaq istəyirdi. ART-də AOT kompilyasiyası ani işəsalma təmin etdi və enerji sərfiyyatını azaltdı, bu da mobil cihazlar üçün kritik əhəmiyyət daşıyırdı.
APK ölçüsü dəyişmir — AOT kompilyasiyası sistem bölməsində orijinal DEX-dən 15–30% böyük olan OAT faylları yaradır. İstifadəçi bunu endirilən faylın ölçüsünün artması kimi deyil, daxili yaddaşda boş yerin azalması kimi görür.
Bu hibrid yanaşmadır, burada tətbiqin ilk işəsalmaları JIT istifadə edir, sonra sistem fonda yalnız tez-tez istifadə olunan metodları yerli koda kompilyasiya edir. Bu, JIT-in sürətli quraşdırmasını AOT-un yüksək performansı ilə birləşdirir.
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