ART: bu nima, bajarish muhiti va qanday ishlaydi

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

Android Runtime (ART) — Android 5.0 Lollipop-da Dalvik o'rniga joriy qilingan Android ilovalarini bajarish muhitidir. Asosiy yangilik — JIT-kompilyatorning isinish muammosini bartaraf etgan, ilova o'rnatilishi vaqtida DEX bayt-kodini to'g'ridan-to'g'ri AOT-kompilyatsiya qilish orqali mahalliy mashina kodiga aylantirishdir. Google, 2024 ma'lumotlariga ko'ra, ART Dalvik bilan solishtirganda ishlash unumdorligini 20–30% gacha oshiradi va DEX formati bilan to'liq teskari moslikni saqlaydi.

Asosiy ma'lumotlar

  • ART — Android 5.0 da Dalvik o'rniga kelgan AOT-kompilyatsiyali Android bajarish muhiti.
  • AOT-kompilyatsiya DEX bayt-kodini ilova o'rnatilishi vaqtida mahalliy mashina kodiga aylantiradi.
  • JIT+AOT gibrid rejimi (Android 7.0 dan) o'rnatishni tezlashtiradi va yuqori unumdorlikni saqlaydi.
  • ART da axlat yig'ish yaxshilangan: avlod kollektori tufayli pauzalar 2–3 ms gacha qisqartirilgan.
  • ART Dalvik DEX bayt-kodi bilan teskari moslikni saqlaydi va Java 8+ xususiyatlarini qo'llab-quvvatlaydi.

ART nima?

Android Runtime (ART) — DEX bayt-kodini ishga tushirishdan oldin mahalliy mashina kodiga kompilyatsiya qiladigan ilovalarni bajarish muhitidir. Ish vaqtida Just-In-Time kompilyatsiyasidan foydalanadigan Dalvik-dan farqli o'laroq, ART APK o'rnatilishi vaqtida Ahead-Of-Time (AOT) kompilyatsiyasini amalga oshiradi. Ushbu fundamental arxitektura o'zgarishi ilovalarning sezilarli darajada tezlashishiga va energiya sarfini kamayishiga olib keldi.

ART birinchi marta Android 4.4 KitKat da eksperimental variant sifatida paydo bo'ldi. Dasturchilar uni ishlab chiquvchi sozlamalarida yoqib, o'z ilovalarini sinab ko'rishlari mumkin edi. Android 5.0 Lollipop da ART standart bajarish muhitiga aylandi va Dalvik platformadan butunlay olib tashlandi. Android 7.0 Nougat chiqishiga qadar ART gibrid kompilyatsiya rejimini oldi.

Rivojlanish tarixi

Dalvik ni ART bilan almashtirish qarori kutilmagan emas edi. Yangi muhit ustida ish 2012 yilda Google JIT yondashuvining cheklovlarini anglaganida boshlangan. Asosiy maqsadlar: ilovalarni ishga tushirishni tezlashtirish, protsessor yukini kamaytirish va energiya sarfini pasaytirish. Rivojlanishga avval Dalvik optimallashtirishlari ustida ishlagan Android Runtime Group jamoasi rahbarlik qilgan.

Arxitektura o'zgarishlari

ART Dalvik bilan bir xil registr arxitekturasidan foydalanadi, lekin butunlay qayta ishlangan kompilyator bilan. Interpretator va JIT-kompilyator o'rniga ART o'rnatish vaqtida DEX fayllarini ELF binar fayllariga aylantiruvchi AOT-kompilyator dex2oat ni o'z ichiga oladi. Natijada ART dagi ilova isinish fazasisiz darhol mahalliy unumdorlik bilan ishga tushadi.

ART arxitekturasi: Dalvik-dan yangi muhitga

ART Dalvik ning asosiy prinsiplarini saqlab qoldi: alohida jarayonlar orqali ilova izolyatsiyasi, registr arxitekturasi va DEX formati qo'llab-quvvatlashi. Biroq ichki amalga oshirish butunlay qayta yozildi. Dalvik interpretatori o'rniga ART uchta bajarish rejimini o'z ichiga oladi: interpretator, JIT-kompilyator va AOT-kompilyator dex2oat. Rejim tanlovi ilovaning hayot aylanishi bosqichiga bog'liq.

ART ning asosiy komponenti — dex2oat (dalvik executable to optimized android translator). Ushbu vosita ilova o'rnatilishi vaqtida (Android 7.0 dan — fon optimallashtirish vaqtida ham) ishga tushadi. dex2oat APK dan DEX fayllarini o'qiydi, bayt-kodni optimallashtiradi va mahalliy kodli OAT faylini — ELF binarini yaratadi. OAT fayllari /data/dalvik-cache/ katalogida saqlanadi.

bash
# Qurilmada OAT fayllarini tekshirish
adb shell ls -la /data/dalvik-cache/arm64/

# Ilovani majburiy qayta kompilyatsiya qilish
adb shell cmd package compile -m speed com.example.app

ART komponentlari

ART tizimi bir-biriga bog'liq bir nechta modullardan iborat. dex2oat kompilyatori mahalliy kodni yaratish uchun javobgardir. Axlat yig'uvchi (GC) xotirani bo'shatishni boshqaradi. Interpretator kam chaqiriladigan kodni kompilyatsiya qilmasdan bajaradi. Profillagich gibrid kompilyatsiya uchun hot-metodlarni kuzatib boradi. Har bir modul mustaqil ishlashi mumkin, bu esa ART ni moslashuvchan va masshtablanuvchan qiladi.

Gibrid kompilyatsiya: JIT + AOT + profillash

Android 7.0 Nougat dan boshlab, ART kompilyatsiya uchun JIT va AOT afzalliklarini birlashtiruvchi gibrid yondashuvdan foydalanadi. Ilova o'rnatilishi vaqtida ART endi to'liq AOT-kompilyatsiyani bajarmaydi — buning o'rniga ilova hot-metodlarning JIT-kompilyatsiyasi bilan interpretatsiya rejimida ishga tushadi. Bu o'rnatish vaqtini va egallangan joyni kamaytiradi.

Parallel ravishda fon profillagichi (background profiler) ishlaydi. U bajarish statistikasini to'playdi: qaysi metodlar ko'proq chaqiriladi, kodning qaysi tarmoqlari bajariladi, qaysi sinflar yuklanadi. Yetarli ma'lumot to'plangandan so'ng (odatda 2–3 ilova ishga tushirilishidan keyin) ART fonda dex2oat ni ishga tushiradi va faqat profillangan hot-metodlarni mahalliy kodda kompilyatsiya qiladi.

Kompilyatsiya rejimlari

ART system_server orqali boshqariladigan bir nechta kompilyatsiya rejimlarini qo'llab-quvvatlaydi. "speed" rejimi barcha metodlarni AOT da kompilyatsiya qiladi (maksimal unumdorlik, uzoq o'rnatish). "speed-profile" rejimi faqat profillangan hot-metodlarni kompilyatsiya qiladi (tezlik va o'lcham muvozanati). "verify" rejimi faqat bayt-kodni tekshiradi, kompilyatsiya qilmaydi (minimal joy, interpretatsiya). Standart sifatida ko'pchilik ilovalar uchun optimal bo'lgan speed-profile ishlatiladi.

RejimKompilyatsiyaO'rnatish vaqtiUnumdorlik
speedTo'liq AOTUzoqMaksimal
speed-profileProfillangan AOTTezYuqori
verifyKompilyatsiyasizDarholInterpretatsiya
spaceMinimal AOTO'rtachaO'rtacha

ART profillagichi

Profillagich bajarish ma'lumotlarini maxsus .prof fayllarida to'playdi. Har bir ilova o'z profilini /data/misc/profiles/ da saqlaydi. Chegaraga yetganda (odatda 1000 namuna) profillagich aniqlangan hot-metodlarni kompilyatsiya qilish uchun dex2oat ni ishga tushiradi. Profillar ilova yangilanishlari orasida saqlanadi, bu esa tizimning OTA yangilanishlaridan keyin qayta optimallashtirishni tezlashtiradi.

ART da axlat yig'ish

ART da axlat yig'ish Dalvik bilan solishtirganda tubdan yaxshilangan. Bir oqimli Concurrent Mark and Sweep (CMS) o'rniga ART bir nechta optimallashtirish bilan avlod kollektoridan foydalanadi: moving collector (yig'inni siqish), large object space (katta obyektlarni alohida saqlash) va concurrent compaction (parallel siqish).

ART dagi odatdagi GC pauzasi Dalvik dagi 5–10 ms o'rniga 2–3 ms ni tashkil qiladi. Bu bir nechta mexanizm tufayli mumkin bo'ldi. Birinchidan, ART concurrent fazalar uchun stop-the-world o'rniga read-barrier dan foydalanadi. Ikkinchidan, avlod kollektori ko'pchilik davrlarda butun yig'inni emas, balki faqat yosh avlod obyektlarini qayta ishlaydi. Uchinchidan, large object space (LOS) alohida ajratiladi va oddiy GC davrlarida qatnashmaydi.

java
// Nosozliklarni tuzatish uchun GC jurnallarini yoqish
System.logV("ART", "GC trigger: allocation failed");

// Majburiy GC chaqiruvi (production da tavsiya etilmaydi)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    Debug.getRuntimeIStats();
}

ART davrida xotira oqishlari

Yaxshilangan GC ga qaramay, xotira oqishlari dolzarb muammo bo'lib qolmoqda. ART ga xos sabab — JNI orqali mahalliy kutubxonalarni to'g'ri bo'shatmasdan yuklash. Agar mahalliy kod malloc orqali xotira ajratsa, lekin free chaqirmasa, ART bu xotirani bo'shata olmaydi — u boshqariladigan yig'indan tashqarida. Android NDK dagi AddressSanitizer vositasi bunday oqishlarni aniqlashga yordam beradi.

ART vs Dalvik: qiyosiy tahlil

ART va Dalvik bir xil vazifaning — Android ilovalarini bajarishning — ikkita tubdan farqli amalga oshirilishidir. Farqlar barcha darajalarga: kompilyatsiyadan xotira boshqaruvigacha ta'sir qiladi. Quyida asosiy unumdorlik va moslik parametrlari bo'yicha taqqoslash keltirilgan.

ART ning asosiy ustunligi — JIT isinishini bartaraf etishdir. Dalvik da ilova JIT hot-metodlarni kompilyatsiya qilayotganda dastlabki 3–10 soniya davomida sekinlashishi mumkin edi. ART da barcha metodlar allaqachon mahalliy kodga kompilyatsiya qilingan (yoki fonda kompilyatsiya qilinadi). Bu, ayniqsa, o'yinlarda va og'ir UI li ilovalarda sezilarli: fps farqi ART foydasiga 15–20% gacha yetishi mumkin.

ParametrDalvikART
KompilyatsiyaJIT (ish vaqtida)AOT + gibrid (o'rnatishda)
Ishga tushirish vaqti3–10 s (isinish)Darhol
APK o'lchami~6–7 MB (DEX)+20% (OAT)
GC pauzalari5–10 ms2–3 ms
Energiya sarfiYuqori (JIT CPU ni yuklaydi)Past (mahalliy kod)

Moslik

Dalvik uchun yozilgan barcha ilovalar ART da o'zgarishsiz ishlaydi. Google DEX bayt-kodi darajasida to'liq teskari moslikni kafolatlaydi. Istisno — refleksiya orqali Dalvik-specific ichki API dan foydalanadigan kod: Android SDK da @hide bilan belgilangan dalvik.system.DexFile sinf a'zolari. Bunday kod ochiq API lardan foydalanish uchun yangilanishi kerak.

Java 8 qo'llab-quvvatlashi va desugarizatsiya

ART Java 8 xususiyatlarini mahalliy qo'llab-quvvatlagan birinchi Android bajarish muhiti bo'ldi. Android 7.0 dan boshlab, ART desugarizatsiyani — Java 8 konstruksiyalarini (lambda, method references, Stream API) ekvivalent Java 7 kodiga aylantirish jarayonini o'z ichiga oladi. Bu eski qurilmalar bilan moslikni yo'qotmasdan zamonaviy sintaksisdan foydalanish imkonini beradi.

Desugarizatsiya D8 kompilyatori tomonidan amalga oshiriladi va quyidagicha ishlaydi. Lambda li manba kodi bir xil sinf ichida sintetik metodga aylantiriladi, lambda esa invoke-custom chaqiruvi bilan almashtiriladi. ART muhiti aynan Java 8 uchun qo'shilgan invoke-custom ko'rsatmasini qo'llab-quvvatlaydi. Android 6.0 va undan past qurilmalarda lambdalar anonim sinflarga desugarizatsiya qilinadi.

java
// Java 8 lambda — ART da desugarizatsiya
button.setOnClickListener(v -> handleClick(v));

// Desugarizatsiyadan so'ng (Java 7 dagi ekvivalent)
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        handleClick(v);
    }
});

Desugarizatsiya cheklovlari

Barcha Java 8 xususiyatlari desugarizatsiya tomonidan qo'llab-quvvatlanmaydi. java.time API (sana va vaqt) faqat build.gradle ga qo'shiladigan desugar_jdk_libs kutubxonasi orqali mavjud. Stream API ham desugar_jdk_libs ni talab qiladi. java.util.function va Optional qo'shimcha bog'liqliklarsiz ishlaydi. Java 8 ning to'liq qo'llab-quvvatlashi Android 8.0 va undan yuqori qurilmalarda desugarizatsiyasiz mavjud.

ART uchun ilovalarni optimallashtirish

ART teskari mos bo'lsa-da, ba'zi optimallashtirish amaliyotlari aynan shu muhitda unumdorlikni yaxshilaydi. Asosiy tavsiya — refleksiyani minimallashtirishdir. ART kompilyatsiya bosqichida ko'rinadigan metodlarni to'g'ridan-to'g'ri mashina kodi chaqiruviga kompilyatsiya qiladi. Refleksiya ART ni qo'shimcha stub-lar yaratishga majbur qiladi, bu esa bajarishni 10–15% sekinlashtiradi.

Android 9.0 dan boshlab ART da App Startup Optimization qo'llab-quvvatlashi paydo bo'ldi. Dasturchi manifestda <initialization> orqali boshlash sinflarini belgilashi mumkin va ART ularni ilova ishga tushganda oldindan yuklaydi. Bu ko'p sonli plagin yoki kutubxonaga ega ilovalar uchun ishga tushirish vaqtini 5–15% ga qisqartiradi.

xml
<!-- AndroidManifest.xml da App Startup Optimization -->
<application>
    <profileable
        android:shell="true"
        android:enable="true" />
</application>

Unumdorlikni tekshirish

ART da unumdorlikni o'lchash uchun systrace va perfetto dan foydalaning. Systrace dex2oat kompilyatsiya vaqtini, GC chastotasini va kadr chizish tezligini ko'rsatadi. Perfetto batafsilroq ma'lumot beradi: oqim taqsimoti, JNI o'tish vaqti, mahalliy kutubxonalarni yuklash. Ishga tushirish: adb shell perfetto -o /data/misc/perfetto-traces/trace.perfetto -t 10s sched freq idle am wm.

Tez-tez beriladigan savollar

Android da ART nima?

ART (Android Runtime) — ilova kodini o'rnatish vaqtida mashina kodiga kompilyatsiya qiluvchi Android ilova bajarish muhitidir. Bu eski Dalvik muhiti bilan solishtirganda ilovalarni ishga tushirish va ishlashini tezlashtiradi.

ART Dalvik dan qanday farq qiladi?

ART kodni ilova o'rnatilishi vaqtida oldindan (AOT) kompilyatsiya qiladi, Dalvik esa uni ish vaqtida qismlarga (JIT) kompilyatsiya qilgan. Shuning uchun ART da ilovalar tezroq ishga tushadi va kamroq energiya sarflaydi.

Ilovaning ART da ishlashini qanday tekshirish mumkin?

adb shell getprop ni bajaring va persist.sys.dalvik.vm.lib.2 xususiyatini toping. "libart.so" qiymati ART, "libdvm.so" — Dalvik degani. Android 5.0+ bo'lgan barcha qurilmalarda bajarish muhiti ART dir.

ART APK o'lchamiga ta'sir qiladimi?

Oz miqdorda. Ilovaning o'zi APK formatida DEX fayllari bilan qoladi. ART /data/dalvik-cache/ da qo'shimcha OAT faylini yaratadi, bu asl DEX dan 10–20% ko'proq joy egallaydi, ammo bu saqlash APK o'lchamiga kirmaydi.

ART Java 8 ni qo'llab-quvvatlaydimi?

Ha, ART desugarizatsiya mexanizmi orqali Java 8 xususiyatlarining ko'pchiligini qo'llab-quvvatlaydi. Lambdalar, method references va funksional interfeyslar Android 5.0+ bo'lgan barcha qurilmalarda ishlaydi. Stream API va java.time uchun desugar_jdk_libs kutubxonasi talab qilinadi.

Xulosa

  • ART — Android 5.0 Lollipop da Dalvik ni kompilyatsiyaga tubdan boshqacha yondashuv bilan almashtirgan Android bajarish muhiti.
  • AOT-kompilyatsiya dex2oat DEX bayt-kodini ilova o'rnatilishi vaqtida mahalliy ELF binariga aylantiradi.
  • JIT + AOT gibrid rejimi (Android 7.0+) o'rnatishni tezlashtiradi va haqiqiy foydalanishga moslashadi.
  • ART ning avlod axlat kollektori GC pauzalarini 5–10 ms dan 2–3 ms gacha qisqartirdi.
  • Profillagich 2–3 ishga tushirishdan ma'lumot to'playdi va hot-metodlarning fon kompilyatsiyasini ishga tushiradi.
  • Java 8 desugarizatsiyasi Android 5.0+ qurilmalarda lambda va Stream API dan foydalanish imkonini beradi.
  • ART da optimal unumdorlik uchun refleksiyani minimallashtiring va App Startup Optimization dan foydalaning.

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