Dalvik: bu nima, virtual mashina va qanday ishlaydi

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

Virtual mashina Dalvik — Android operatsion tizimining asosiy komponenti bo‘lib, 4.4 KitKat versiyasigacha ilovalarni bajarish uchun javobgar edi. Dan Bornshteyn tomonidan ishlab chiqilgan registr VM standart JVM kontseptsiyasini almashtirdi va cheklangan RAM hajmiga ega mobil qurilmalarda ilovalarni ishga tushirishni optimallashtirishga imkon berdi. Google, 2024 ma’lumotlariga ko‘ra, Dalvik JIT-kompilyatsiyasi orqali ilovalarning mosligini ta’minlab, DEX-bayt-kodni bajarish vaqtida to‘g’ridan-to‘g‘ri mashina ko‘rsatmalariga aylantirardi.

Asosiy ma’lumotlar

  • Dalvik — Android uchun optimallashtirilgan registr arxitekturali virtual mashina.
  • JVMdan farqli o‘laroq, Dalvik mobil qurilmalar uchun maxsus siqilgan DEX-bayt-kodni bajaradi.
  • JIT-kompilyatsiyasi DEX kodining bir qismini ilova ishlayotgan paytda to‘g’ridan-to‘g‘ri mashina kodiga aylantiradi.
  • Android 5.0 dan boshlab Dalvik oldindan AOT-kompilyatsiyasi bilan ART bilan almashtirildi.
  • Dalvikni tushunish eski Android versiyalarini qo‘llab-quvvatlash va orqaga qaytish mosligini tahlil qilish uchun zarur.

Dalvik nima?

Dalvik — ayniqsa Android platformasi uchun yaratilgan registr arxitekturali virtual mashina. Ishlab chiqish 2005 yilda Dan Bornshteyn kompaniyasida boshlangan, 2007 yilda esa loyiha Google tomonidan sotib olingan. Dalvikning birinchi tijoriy versiyasi 2008 yilda Android 1.0 chiqarilishi bilan birga paydo bo‘ldi.

Standart Java Virtual Machine (JVM)dan farqli o‘laroq, Dalvik Java-bayt-kodini bajarmaydi. Java kompilyatori manba kodini class-fayllarga aylantiradi, so‘ngra dx vositasi ularni Dalvik Executable (DEX) formatiga tarjima qiladi. Bu format class-fayllardan ko‘ra yig‘jamroq: class formatida 10 MB bo‘lgan ilova DEXda taxminan 6–7 MB joy egallaydi.

Yaratilish tarixi

Dan Bornshteyn Dalvikni cheklangan resursli operatsion tizimlar uchun loyiha sifatida yozgan. Nomi Islandiyaning Dalvík qishlog‘idan olingan. Google litsenziya cheklovlari va ARM arxitekturasiga ega mobil protsessorlar uchun chuqur optimallashtirish zarurati tufayli JVM o‘rniga Dalvikni tanladi. Tizim tezda mashhurlikka erishdi: 2012 yilga kelib 500 milliondan ortiq Android qurilmalari Dalvikda ishlagan.

Android ekotizimidagi roli

Har bir Android ilovasi o‘zining Dalvik VM nusxasi bilan alohida jarayonda ishga tushiriladi. Bu operatsion tizim darajasida ma’lumotlarning izolyatsiyasi va zararli koddan himoyalanishni ta’minlaydi. Bunday yondashuv virtualizatsiya afzalliklarini Linux qum qutisi bilan birlashtiradi — bir ilovadagi zararli dastur qo‘shni jarayonlarga ta’sir qila olmaydi.

Dalvik arxitekturasi: registr mashinasi va DEX

Registr arxitekturasi Dalvik JVMning stek arxitekturasidan prinsipial jihatdan farq qiladi. Stekning yuqori qismi bilan operatsiyalar o‘rniga, Dalvik registrlar — VM ichidagi virtual hujayralar bilan ishlaydi. Har bir ko‘rsatma operand registrlarining manzillarini o‘z ichiga oladi, bu esa bitta operatsiyaga to‘g‘ri keladigan ko‘rsatmalar sonini kamaytiradi.

JVM stek mashinasi push, pop va add kabi ko‘rsatmalardan foydalanadi — ikkita sonni qo‘shish uchun uchta ko‘rsatma kerak bo‘ladi. Dalvik xuddi shu vazifani uchta registrli bitta add-int ko‘rsatmasi bilan hal qiladi. Android Open Source Project ma’lumotlariga ko‘ra, DEX registr arxitekturasi bayt-kod hajmini stek class formatiga nisbatan o‘rtacha 30% ga kamaytiradi.

DEX formati

DEX-fayli (Dalvik Executable) ilovaning barcha sinflarining siqilgan tasvirini o‘z ichiga oladi. Fayl sarlavhasi nazorat summasi, bo‘lim o‘lchamlari va siljishlarni o‘z ichiga oladi. Asosiy bo‘limlar qatorlar, turlar, metod prototiplari, maydonlar, metodlar va bayt-kodning o‘zidan iborat. Bitta DEX-faylida 65536 tagacha metod saqlanishi mumkin (bu cheklov Android 5.0 da multi-dex joriy etilishi bilan olib tashlangan).

Class-fayllarni DEXga aylantirish uchun Android SDK Build Tools tarkibidagi dx vositasidan foydalaniladi. Buyruq namunasi: dx --dex --output=classes.dex myapp.jar. Zamonaviy loyihalar yaxshilangan optimallashtirish va Java 8+ xususiyatlarini qo‘llab-quvvatlash bilan D8 — dx vorisidan foydalanadi.

bash
# JARni dx yordamida DEXga aylantirish
dx --dex --output=classes.dex myapp.jar

# Zamonaviy versiya D8 orqali
d8 --lib android.jar --output dex/ myapp.jar

Zygote: freymvorkni oldindan yuklash

Zygote jarayoni — Dalvik arxitekturasining eng muhim elementi. Tizim ishga tushganda, Zygote Android SDKning barcha sinflarini yuklaydi, umumiy kutubxonalarni ochadi va oldindan yuklangan resurslar hovuzini yaratadi. Foydalanuvchi ilovani ochganda, tizim Zygote jarayonini nusxalaydi (fork) va tayyor freymvork bilan yangi Dalvik VM nusxasini yaratadi. Bu ilovani ishga tushirish vaqtini ~2–3 soniyadan 300–500 millisekundgacha qisqartiradi.

Dalvikda JIT-kompilyatsiyasi

JIT (Just-In-Time) — bayt-kodni ilova bajarilishi paytida to‘g‘ridan-to‘g‘ri mashina ko‘rsatmalariga kompilyatsiya qilish texnologiyasi. Dalvikda JIT-kompilyatori bajarilayotgan DEX kodini tahlil qiladi, tez-tez ishlatiladigan (hot) metodlarni aniqlaydi va ularni CPU uchun nativ kodga kompilyatsiya qiladi.

Androidning dastlabki versiyalarida to‘liq Ahead-Of-Time (AOT) kompilyatsiyasi o‘rniga JITni tanlash ongli edi. Mobil qurilmalar cheklangan flash xotiraga (4–16 GB) ega edi — barcha ilovalarni oldindan kompilyatsiya qilish sezilarli joy egallagan bo‘lardi. Bundan tashqari, dastlabki qurilmalarda ROM xotirasi RAMdan sekinroq ishlagan va oldindan kompilyatsiya qilingan kodni o‘qish unumdorlikni pasaytirishi mumkin edi.

JIT-kompilyatsiya jarayoni

Ilova ishga tushirilganda, Dalvik DEX-bayt-kodini interpretatsiya qila boshlaydi. Maxsus profiler qaysi metodlar tez-tez chaqirilayotganini kuzatib boradi. Chegaradan oshgandan so‘ng (odatda ~200 chaqiruv), JIT-kompilyatori metodni mashina kodiga aylantiradi va uni RAMda keshlaydi. Keyingi chaqiruvlar qayta kompilyatsiya qilmasdan kompilyatsiya qilingan versiyadan foydalanadi.

java
// JIT kompilyatsiya qiladigan hot-metod namunasi
public class Calculator {
    public int sumArray(int[] arr) {
        int total = 0;
        for (int i = 0; i < arr.length; i++) {
            total += arr[i];
        }
        return total;
    }
}

JIT unumdorligi

Google I/O 2013 ma’lumotlariga ko‘ra, Android 2.2 Froyoda JITni joriy etish ilovalarning bajarilishini sof interpretatsiyaga nisbatan o‘rtacha 2–5 baravar tezlashtirdi. Biroq JIT birinchi ishga tushirishda kechikish qo‘shadi: ilovaga isinish va hot-metodlarni kompilyatsiya qilish uchun 3 dan 10 soniyagacha vaqt kerak bo‘ladi. Isingandan so‘ng, unumdorlik nativ kodga yaqin darajada barqarorlashadi.

Dalvik vs JVM: asosiy farqlar

Dalvik JVMdan bir nechta fundamental parametrlar bo‘yicha farq qiladi. Birinchisi — arxitektura: JVM stekli, Dalvik registrli. Ikkinchisi — bayt-kod formati: JVM class-fayllaridan, Dalvik DEXdan foydalanadi. Uchinchisi — xotirani boshqarish: Dalvik mobil qurilmalarning cheklangan RAM hajmi uchun optimallashtirilgan.

Ikkala yondashuvning ham kuchli tomonlari bor. Stekli JVM ko‘rsatmalarni saqlash uchun kamroq joy talab qiladi — har bir ko‘rsatma qisqaroq, chunki operandlar stekdan yashirincha olinadi. Registrli Dalvik bitta operatsiyaga kamroq ko‘rsatma bajaradi, bu esa protsessor vaqtini tejaydi va energiya sarfini kamaytiradi. Batareya bilan ishlaydigan mobil qurilmalar uchun bu juda muhim.

ParametrDalvikJVM
ArxitekturaRegistrliStekli
Bayt-kodDEXclass
KompilyatsiyaJIT (Android 2.2+)JIT / AOT
OptimallashtirishKam energiya sarfiYuqori moslik
IzolyatsiyaLinux jarayonlari orqaliClassLoader orqali

Litsenziya jihatlari

JVM o‘rniga Dalvikni tanlash litsenziyalash bilan ham bog‘liq edi. Oracle Java SE va JVMga huquqlarga ega, Google esa litsenziya to‘lovlaridan qochishga intilgan. Alternativ bayt-kod formati bilan o‘z VMni yaratish Androidga Oraclegadan mustaqil rivojlanish imkonini berdi. Bu nizo Oracle vs Google (2010–2021) o‘rtasida ko‘p yillik sud jarayoniga aylandi va Google foydasiga hal bo‘ldi.

DEX formati va dx vositasi

DEX (Dalvik Executable) — Android ilovasining kompilyatsiya qilingan kodini o‘z ichiga olgan ikkilik format. Har bir DEX-fayl sarlavha (header) bilan boshlanadi, undan keyin bo‘limlar keladi: qator konstantalari (string_ids), turlar (type_ids), metod prototiplari (proto_ids), maydonlar (field_ids), metodlar (method_ids), sinf ta‘riflari (class_defs) va ma’lumotlar maydoni (data).

dx vositasi Java class-fayllarini bir yoki bir nechta DEX-faylga aylantiradi. Ishlash algoritmi konstantalarni deduplikatsiyasini o‘z ichiga oladi — bir xil qatorlar yoki turlar bir marta saqlanadi va indeks orqali murojaat qilinadi. Bu yakuniy hajmni sezilarli darajada kamaytiradi. Zamonaviy loyihalarda dx D8 bilan (Android Studio 3.1 da paydo bo‘lgan) almashtirilgan, u 2–3 baravar tez ishlaydi va Java 8 desugaringsini qo‘llab-quvvatlaydi.

java
// dexdump orqali dekompilyatsiya qilingan DEX-bayt-kod namunasi
// Manba kodi: return a + b;
@Ldalvik/annotation/Code;
    registers: 3
    add-int v0, v1, v2
    return v0

Multi-dex: 65536 limitidan oshish

DEX formatining 65536 metod cheklovi (16-bit indeks limiti) katta ilovalar uchun jiddiy muammoga aylandi. Yechim Android 5.0 da paydo bo‘ldi: multi-dex qo‘llab-quvvatlashi ilovaga bir nechta DEX-faylni o‘z ichiga olishga imkon beradi. Asosiy classes.dex kirish nuqtalarini o‘z ichiga oladi, qo‘shimcha classes2.dex, classes3.dex va hokazo esa qolgan kodni o‘z ichiga oladi. Multi-dex konfiguratsiyasi build.gradle faylida multiDexEnabled true qatori bilan yoqiladi.

Xotirani boshqarish va axlat yig‘ish

Dalvikda axlat yig‘ish belgilash va tozalash (mark-and-sweep) bilan avlod (generational) yig‘uvchi sifatida amalga oshirilgan. Xotira ikkita asosiy sohaga bo‘linadi: obyektlar uchun Heap (uyum) va primitivlar va havolalar uchun Stack (stek). Heap to‘lganda, Dalvik barcha iplarni to‘xtatadi (STW — Stop-The-World), erishish mumkin bo‘lgan obyektlarni belgilaydi va erishib bo‘lmaydiganlarni bo‘shatadi.

Android 2.2 gacha Dalvik 100–200 ms gacha pauzalar bilan bir ipli yig‘uvchidan foydalangan. Android 2.3 Gingerbread da parallel yig‘uvchi paydo bo‘ldi, odatdagi pauzalarni 5–10 ms gacha qisqartirdi. Android 4.0 Ice Cream Sandwich da esa qisman (incremental) tozalash bilan yig‘uvchi — Concurrent Mark and Sweep (CMS) qo‘shildi.

Xotira oqishi

Dalvik ilovalarining odatiy muammosi — Activityga statik havolalar orqali xotira oqishi. Agar statik maydon Context yoki Viewga havolani saqlasa, axlat yig‘uvchisi ekran yopilgandan keyin ham Activityni bo‘shata olmaydi. Eclipse MAT va LeakCanary kabi vositalar bunday oqishlarni aniqlashga yordam beradi: ular Heap dumpini tahlil qiladi va obyektni ushlab turgan havolalar zanjirini ko‘rsatadi.

java
// Statik havola orqali xotira oqishi namunasi
public class Utils {
    private static Context context;

    public static void init(Context ctx) {
        context = ctx; // Activityni finish() dan keyin ushlab turadi
    }
}

Dalvik cheklovlari va ARTga o‘tish

Muvaffaqiyatga qaramay, Dalvik bir qator kamchiliklarga ega edi. JIT-kompilyatsiyasi isinish uchun vaqt talab qilardi — ilovaning dastlabki soniyalari sekinroq edi. Bundan tashqari, JIT kompilyatsiya paytida protsessor energiyasini sarflardi, bu esa batareyaning ishlash muddatini qisqartirardi. Mobil qurilmalar unumdorligining oshishi va o‘rnatilgan xotira hajmining ko‘payishi bilan JITga bo‘lgan ehtiyoj kamaydi.

Android 4.4 KitKatda Google Dalvikga eksperimental o‘rinbosar sifatida ART (Android Runtime)ni taqdim etdi. Android 5.0 Lollipopdan boshlab ART yagona bajarish muhitiga aylandi. Asosiy farq — AOT-kompilyatsiyasi: ish vaqtida kompilyatsiya qilish o‘rniga, barcha ilovalar o‘rnatish vaqtida mashina kodiga kompilyatsiya qilinadi. Bu isinish kechikishlarini bartaraf etdi va energiya samaradorligini yaxshiladi.

Orqaga qaytish mosligi

Dalvikdan ARTga o‘tish dasturchilar uchun shaffof edi: ikkala muhit bir xil DEX-bayt-kodni bajaradi. Dalvik uchun yig‘ilgan ilovalar qayta kompilyatsiya qilmasdan ARTda ishlaydi — system_server ularni o‘rnatish vaqtida nativ kodga kompilyatsiya qiladi. Istisno — Dalvik VMning ichki a’zolariga kirish uchun refleksiyadan foydalanadigan kod: bunday kod ichki arxitekturaning o‘zgarishi tufayli ARTda ishlamasligi mumkin.

Tez-tez beriladigan savollar

Oddiy so‘zlar bilan Dalvik nima?

Dalvik — telefondagi Android ilovalarini ishga tushiradigan vositachi dastur. U ilova kodini olib, uni protsessor tushunadigan buyruqlarga aylantiradi, buni foydalanuvchi ishlayotgan paytda to‘g‘ridan-to‘g‘ri amalga oshiradi.

Dalvik JVMdan qanday farq qiladi?

Dalvik registr arxitekturasidan va DEX formatidan foydalanadi, JVM esa stek arxitekturasidan va class formatidan. Dalvik cheklangan xotira va protsessorga ega mobil qurilmalar uchun optimallashtirilgan, JVM esa statsionar kompyuterlar va serverlar uchun mo‘ljallangan.

Nima uchun Google Dalvikni ART bilan almashtirdi?

ART oldindan AOT-kompilyatsiyasi hisobiga yuqori unumdorlikni ta’minlaydi — ilova har safar ishga tushirilganda emas, balki o‘rnatish vaqtida bir marta kompilyatsiya qilinadi. Bu Dalvikning JIT yondashuviga nisbatan ishni tezlashtiradi va batareyani tejaydi.

Eski ilovalar ARTda ishlaydimi?

Ha, ART Dalvikning DEX-bayt-kodi bilan to‘liq orqaga qaytish mosligiga ega. O‘rnatish vaqtida ART eski DEX-fayllarni nativ kodga kompilyatsiya qiladi. Istisno — Dalvikning ichki mexanizmlariga kirish uchun refleksiyadan foydalanadigan ilovalar.

DEX-fayl nima?

DEX (Dalvik Executable) — Android ilovasining siqilgan bayt-kodini o‘z ichiga olgan bajariladigan fayl formati. Bitta APKda bir nechta DEX-fayl (multi-dex) bo‘lishi mumkin, agar ilova 65536 dan ortiq metodni o‘z ichiga olsa.

Xulosa

  • Dalvik VM — Android uchun yaratilgan va 4.4 KitKat versiyasigacha ishlatilgan registr virtual mashinasi.
  • DEX formati bayt-kodning yig‘jam saqlanishini ta’minlaydi — JVM class-fayllaridan 30% kam.
  • Dalvikda JIT-kompilyatsiyasi ilovalarning bajarilishini sof interpretatsiyaga nisbatan 2–5 baravar tezlashtirgan.
  • Zygote jarayoni Android freymvorkini oldindan yuklab, ilovalarni ishga tushirishni 300–500 ms gacha qisqartiradi.
  • Bitta DEX-faylda 65536 metod cheklovi Android 5.0 dan boshlab multi-dex orqali hal qilinadi.
  • Dalvikda axlat yig‘ish bir ipli STWdan Concurrent Mark and Sweepgacha rivojlandi.
  • Android 5.0 da ARTga o‘tish JIT isinish kechikishlarini bartaraf etdi va energiya samaradorligini yaxshiladi.

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