AOT — bu nima, Ahead-Of-Time kompilyatsiyasi va qanday ishlaydi

Muallif: IT Sectr Nashr etilgan: 2026-04-16 O'qish vaqti: 9 daq

AOT (Ahead-Of-Time) — kompilyatsiya texnologiyasi bo'lib, unda manba kodi yoki bayt-kodi dastur ishga tushirilishidan oldin, qurish yoki o'rnatish bosqichida mashina ko'rsatmalariga aylantiriladi. Androidda AOT kompilyatsiyasi ART bajarish muhitining asosiy innovatsiyasiga aylandi va Dalvikni 5.0 Lollipop versiyasida almashtirdi. Google, 2024 ma'lumotlariga ko'ra, ARTda AOT kompilyatsiyasi isitish kechikishlarini bartaraf qiladi va ilovalarning energiya sarfini JIT yondashuviga nisbatan 10–15% kamaytiradi.

Asosiy ma'lumotlar

  • AOT — Ahead-Of-Time kompilyatsiyasi: kodni dastur ishga tushirilishidan oldin mashina tiliga aylantirish.
  • Androidda AOT dex2oat vositasi bilan APK o'rnatilishi vaqtida yoki fon rejimida bajariladi.
  • AOTning asosiy afzalligi — isitish fazasisiz bir zumda ishga tushirish.
  • Kamchiligi — o'rnatish vaqtining oshishi va diskda qo'shimcha 15–30% hajm.
  • Zamonaviy tizimlar gibrid yondashuvdan foydalanadi: birinchi ishga tushirishlar uchun JIT, hot-metodlar uchun AOT.

AOT kompilyatsiyasi nima?

Ahead-Of-Time (AOT) — dastur ishga tushirilishidan oldin mashina kodiga aylantiriladigan kompilyatsiya usuli. "Ahead-Of-Time" atamasi JIT (Just-In-Time) ga qarama-qarshi: agar JIT "o'z vaqtida" kompilyatsiya qilsa, AOT — "oldindan". AOT kompilyatori kirishda manba kodi yoki oraliq tasvirni (bayt-kodni) oladi va ishga tushirishga tayyor bajariladigan fayl yaratadi.

AOT tarixi an'anaviy C va C++ kompilyatorlariga borib taqaladi, bu erda kompilyatsiya har doim ishga tushirishdan oldin amalga oshiriladi. Boshqariladigan tillar (Java, C#, Dart) kontekstida AOT keyingi innovatsiyadir: uzoq vaqt davomida dinamik imkoniyatlar (refleksiya, sinflarning dinamik yuklanishi) AOTni amalga oshirishni qiyinlashtiradi deb hisoblangan. Google Android uchun dex2oat yaratib, bu muammoni hal qildi — DEX bayt-kodini mahalliy kodga aylantiruvchi AOT kompilyatori.

AOTning ishlash prinsipi

AOT kompilyatori to'liq tarjima siklini bajaradi. Birinchi bosqich — pars qilish va abstrakt sintaksis daraxtini (AST) qurish. Ikkinchi — tahlil va optimallashtirish: o'lik kodni olib tashlash, inlining, sikllarni optimallashtirish. Uchinchi — maqsadli arxitektura (ARM, ARM64, x86) uchun mashina kodini yaratish. Natija bajarish vaqtida qo'shimcha ishlov berishni talab qilmaydigan bajariladigan fayldir.

bash
# AOT kompilyatori dex2oatni qo'lda ishga tushirish
dex2oat --dex-file=classes.dex \
        --oat-file=classes.oat \
        --arch=arm64 \
        --instruction-set-variant=generic

# Kompilyatsiya qilingan OAT faylini tekshirish
oatdump --oat-file=classes.oat --output=oat_dump.txt

Androidda AOT: dex2oat va OAT fayllari

Androidda AOT kompilyatsiyasi dex2oat (dalvik executable to optimized android translator) vositasi orqali amalga oshiriladi. Foydalanuvchi ilovani o'rnatganda, tizim dex2oatni ishga tushiradi, APKdan DEX fayllarini o'qiydi, bayt-kodni optimallashtiradi va OAT fayli — mahalliy kodli ELF binar faylini yaratadi. Bu fayl /data/dalvik-cache/ bo'limida saqlanadi.

Kompilyatsiya jarayoni bir necha optimallashtirish darajasini o'z ichiga oladi. Asosiy daraja — bayt-kodni tekshirish va asosiy optimallashtirishlar (dead code elimination, constant folding). O'rta — metodlarni inlining qilish, loop unrolling, escape tahlili. Maksimal — butun ilovaning global optimallashtirishlari, jumladan devirtualizatsiya va stek hajmini optimallashtirish. Optimallashtirish darajasi kompilyatsiya rejimiga bog'liq (speed, speed-profile, space).

OAT faylining tuzilishi

OAT fayli ELF (Executable and Linkable Format) formatiga ega — mahalliy Linux binar fayllari ishlatadigan bir xil format. OAT faylining ichida ilovaning har bir metodi uchun kompilyatsiya qilingan kod, shuningdek, metama'lumotlar: sinflar, maydonlar, metodlar va ular orasidagi bog'lanishlar haqida ma'lumotlar mavjud. ART bu metama'lumotlardan sinflarni tez yuklash va DEXni to'liq pars qilmasdan simvolik havolalarni hal qilish uchun foydalanadi.

OAT komponentiVazifasi
ELF headerELF formatining sarlavhasi
Code sectionKompilyatsiya qilingan metodlarning mashina kodi
OAT headerART metama'lumotlari: versiya, bo'lim o'lchamlari
DEX sectionsRefleksiya uchun asl DEX ma'lumotlari
Link tableJNI va mahalliy kutubxonalar uchun bog'lanish jadvali

AOT vs JIT: qiyosiy tahlil

AOT va JIT samaradorlik va moslashuvchanlik o'rtasidagi turli kelishuv nuqtalarni ifodalaydi. AOT birinchi soniyadan maksimal bajarish tezligini ta'minlaydi, lekin ko'proq disk maydoni va o'rnatish vaqtini talab qiladi. JIT joy va o'rnatish vaqtini tejaydi, lekin buning evaziga isitish kechikishi va yuqori energiya sarfi bilan to'laydi.

Tanlovning asosiy omili — foydalanish stsenariysi. Bir marta ishga tushirilib uzoq vaqt ishlaydigan ilovalar (o'yinlar, muharrirlar, navigatorlar) uchun AOT afzal — kompilyatsiya xarajatlari barqaror samaradorlik bilan qoplanadi. Kamdan-kam va qisqa muddatga ishga tushiriladigan kichik vositalar uchun JIT foydaliroq bo'lishi mumkin — tez o'rnatish va kam joy egallash eng yuqori samaradorlikdan muhimroq.

MezonAOTJIT
Ishga tushirishBir zumdaIsitish bilan
O'rnatishUzunroq (kompilyatsiya)Tez
Disk maydoni+15–30%Minimal
Energiya sarfiBarqarorKompilyatsiyada yuqori
MoslashuvchanlikPastYuqori

Kod samaradorligi

Qiziqarli nuance: AOT kodi har doim JITdan tezroq emas. JIT bajarish vaqti profil ma'lumotlariga — obyektlarning aniq turlariga, chaqiruv chastotalariga, real tarmoqlanish naqshlariga kirish imkoniyatiga ega. Bu AOT uchun mavjud bo'lmagan optimallashtirishlarni (masalan, profil boshqariladigan inlining) qo'llash imkonini beradi. Amalda AOT va JIT o'rtasidagi kompilyatsiya qilingan kodning samaradorlik farqi stsenariyga qarab ±5–10% ni tashkil qiladi.

AOT kompilyatsiyasining afzalliklari

AOT mobil ilovalar uchun uchta asosiy afzallikni ta'minlaydi. Birinchisi — bashorat qilinadigan samaradorlik. Foydalanuvchi ishning birinchi soniyalarida "qotish"larni ko'rmaydi: ilova maksimal tezlikda birinchi kadrdan ishlaydi. Bu o'yinlar, animatsiyalar va silliq o'tishli interfeyslar uchun muhim ahamiyatga ega.

Ikkinchisi — energiya samaradorligi. AOT JIT kompilyatsiyasiga xos bo'lgan CPU yuqori yuklamalarini yaratmaydi. Protsessor barqaror rejimda ishlaydi, bu esa ilovaning dastlabki 30–60 soniyasida energiya sarfini 10–15% kamaytiradi. Kuniga 20–30 ilovani ishga tushiradigan odatdagi foydalanuvchi uchun bu batareya ishlash vaqtida sezilarli o'sishni beradi.

Bajarish muhitini soddalashtirish

AOT kompilyatsiyasi bajarish muhitini soddalashtiradi. Barcha kod allaqachon kompilyatsiya qilinganda, bajarish vaqtida JIT kompilyatori, interpretator va profilchiga ehtiyoj qolmaydi. Bu bajarish muhitining hajmini kamaytiradi va xatolik ehtimolini pasaytiradi. To'liq AOT rejimida ART faol JIT bilan analogik muhitdan taxminan 15% kam RAM egallaydi.

AOT kompilyatsiyasining kamchiliklari

AOTning asosiy kamchiligi — o'rnatish vaqti. Android 5.0 bilan dastlabki qurilmalarda katta ilovalarning (100–200 MB) o'rnatilishi AOT kompilyatsiyasi sababli 2–5 daqiqa davom etishi mumkin edi. Bu salbiy foydalanuvchi tajribasini yaratardi: APK yuklab olingandan so'ng ilovani ochishdan oldin kutish kerak edi. Google bu muammoni Android 7.0 da gibrid sxemaga o'tib qisman hal qildi.

Ikkinchi kamchilik — egallangan joy. OAT fayllari asl DEX fayllaridan 15–30% kattaroq. 8–16 GB ichki xotiraga ega qurilmalarda har bir ilova tizim bo'limida qo'shimcha joy "yeydi". Ko'p sonli o'rnatilgan ilovalari (50–100) bo'lgan foydalanuvchilar uchun bu tizim yangilanishlari uchun joy yetishmasligiga olib kelishi mumkin.

Moslashuvchanlikning yo'qligi

AOT kodi kompilyatsiya vaqtida fiksatsiya qilinadi. Agar ilova Android versiyasiga, qurilma modeliga yoki foydalanuvchi sozlamalariga qarab turli bajarish naqshlaridan foydalansa, AOT moslasha olmaydi. Bir stsenariy uchun tanlangan optimallashtirishlar boshqasi uchun optimal bo'lmasligi mumkin. JIT bu jihatdan moslashuvchanroq: bajarish shartlari o'zgarganda hot-metodlarni qayta kompilyatsiya qiladi.

Androiddan tashqarida AOT: Flutter, .NET, Go

AOT kompilyatsiyasi faqat Androidda emas, balki boshqa platformalarda ham qo'llaniladi. Flutter Dart kodini iOS va Android uchun mahalliy kodga kompilyatsiya qilish uchun AOTdan foydalanadi. Bu hatto kuchsiz qurilmalarda 60 fps darajasida UI samaradorligini ta'minlaydi. Rivojlanish bosqichida Flutter JIT (hot reload) ishlatadi, release qurilishi uchun esa AOT — ikkala yondashuvning afzalliklarini birlashtiradi.

.NET ekotizimida ReadyToRun (R2R) texnologiyasi yig'ilmalarni oldindan mahalliy kodga kompilyatsiya qilish imkonini beradi. Bu .NET ilovalarining ishga tushirish vaqtini 30–50% qisqartiradi. Go kompilyatori dastlab AOT kompilyatoridir: Go dasturlari tashqi bog'liqliklarsiz bitta statik binar faylga kompilyatsiya qilinadi, bu ularni konteyner muhiti uchun ideal qiladi.

dart
// Flutter: Dart kodini mahalliy kodga AOT kompilyatsiyasi
// Release qurilishi AOTdan foydalanadi
flutter build apk --release

// Natija: AOT bilan kompilyatsiya qilingan Dart kodi bilan libapp.so
// Rivojlanish JIT (hot reload) dan foydalanadi
flutter run

AOT va xavfsizlik

AOTning qo'shimcha afzalligi — teskari muhandislikni qiyinlashtirish. Kompilyatsiya qilingan mahalliy kodni dekompilyatsiya qilish bayt-kodga qaraganda qiyinroq. JADX va APKTool kabi vositalar DEX formati bilan ishlaydi, lekin OAT fayllaridan bir xil detallashtirish darajasida manba kodini tiklay olmaydi. Bu obfuskatsiyani (ProGuard, R8) almashtirmaydi, lekin analizatorlar uchun qo'shimcha to'siq yaratadi.

Gibrid strategiya: profillangan kompilyatsiya

Androiddagi zamonaviy standart — profillangan AOT kompilyatsiyasi, Android 7.0 dan boshlab ARTda amalga oshirilgan. O'rnatish vaqtida ilova to'liq kompilyatsiya qilinmaydi — buning o'rniga tez bayt-kod tekshiruvi va birinchi ishga tushirishlar uchun JIT ishlatiladi. Bu Android 5.0–6.0 da toza AOTga xos bo'lgan uzoq o'rnatish muammosini hal qiladi.

Ilovaning 2–3 ishga tushirilishidan so'ng ART profilchisi real foydalanish haqida ma'lumot to'playdi va qaysi metodlar samaradorlik uchun eng muhimligini aniqlaydi. Keyin fonda (odatda kechasi, qurilma zaryadlanayotganda) dex2oat bu hot-metodlarni mahalliy kodga kompilyatsiya qiladi. Fon kompilyatsiyasidan so'ng ilova o'rnatish vaqtida foydalanuvchi tajribasiga salbiy ta'sir ko'rsatmasdan to'liq AOTga ekvivalent samaradorlikka erishadi.

kotlin
// Kompilyatsiya rejimini dasturiy boshqarish (Android 9+)
fun requestProfileCompilation(context: Context) {
    val pm = context.packageManager
    // Profillangan kompilyatsiyadan foydalanish tavsiya etiladi
    pm.setComponentEnabledSetting(
        ComponentName(context, javaClass()),
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP
    )
}

Gibrid rejim uchun optimallashtirish

Gibrid kompilyatsiyadan maksimal foyda olish uchun dasturchilar bir necha qoidalarga rioya qilishlari kerak. Bazaviy profillardan (baseline profiles) foydalaning — APK bilan birga yetkazib beriladigan oldindan to'plangan profillar ARTga o'rnatishdan so'ng darhol hot-metodlarning AOT kompilyatsiyasini boshlashga imkon beradi. Baseline profiles to'liq samaradorlikka erishish vaqtini 2–3 ishga tushirishdan birinchi ishga tushirishgacha qisqartiradi.

Tez-tez beriladigan savollar

AOT kompilyatsiyasi oddiy so'zlar bilan nima?

AOT — dasturni foydalanuvchi uni ishga tushirishdan oldin mashina kodiga tarjima qilish. Tasavvur qiling, kitob siz uni ochishdan oldin to'liq o'zbek tiliga tarjima qilingan — siz darhol, sahifalarni tarjima qilishda kechikishlarsiz o'qiysiz.

AOT JITdan qanday farq qiladi?

AOT kodni o'rnatish vaqtida kompilyatsiya qiladi (uzunroq o'rnatish, lekin tezroq ishga tushirish). JIT kodni ish vaqtida kompilyatsiya qiladi (tez o'rnatish, lekin birinchi soniyalarda ilova sekinroq). Zamonaviy tizimlar ikkala yondashuvni birlashtiradi.

Nima uchun Android Dalvikdan ART AOTga o'tdi?

Google JIT isitish muammosini — ilova ishining birinchi soniyalaridagi kechikishlarni bartaraf qilishni xohladi. ARTda AOT kompilyatsiyasi bir zumda ishga tushirishni ta'minladi va energiya sarfini kamaytirdi, bu mobil qurilmalar uchun muhim edi.

AOT ilova hajmiga qanday ta'sir qiladi?

APK hajmi o'zgarmaydi — AOT kompilyatsiyasi tizim bo'limida asl DEXdan 15–30% kattaroq OAT fayllarini yaratadi. Foydalanuvchi buni yuklab olinadigan fayl hajmining oshishi emas, balki ichki xotiraning bo'sh joyining kamayishi sifatida ko'radi.

Profillangan AOT nima?

Bu gibrid yondashuv bo'lib, unda ilovaning birinchi ishga tushirishlari JITdan foydalanadi, keyin tizim fonda faqat tez-tez ishlatiladigan metodlarni mahalliy kodga kompilyatsiya qiladi. Bu JITning tez o'rnatilishini AOTning yuqori samaradorligi bilan birlashtiradi.

Xulosa

  • AOT (Ahead-Of-Time) — bayt-kodni dastur ishga tushirilishidan oldin, o'rnatish bosqichida mashina kodiga kompilyatsiya qilish.
  • Androidda AOT dex2oat vositasi orqali amalga oshiriladi, ELF binar fayllari (OAT fayllari) yaratadi.
  • AOTning asosiy afzalliklari: bir zumda ishga tushirish, barqaror samaradorlik va kam energiya sarfi.
  • Asosiy kamchiliklari: uzoq o'rnatish vaqti va qo'shimcha disk maydoni 15–30%.
  • AOT faqat Androidda emas, balki Flutter (Dart), .NET (R2R) va Goda ham qo'llaniladi.
  • Zamonaviy ART profillangan AOT dan foydalanadi: birinchi ishga tushirishlar uchun JIT, hot-metodlarning fon kompilyatsiyasi.
  • Baseline profiles asosiy metodlarning AOT kompilyatsiyasini ilova o'rnatilgandan so'ng darhol boshlashga imkon beradi.

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