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 — 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.
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.
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.
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-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.
# 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 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.
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.
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.
// 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;
}
}
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 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.
| Parametr | Dalvik | JVM |
|---|---|---|
| Arxitektura | Registrli | Stekli |
| Bayt-kod | DEX | class |
| Kompilyatsiya | JIT (Android 2.2+) | JIT / AOT |
| Optimallashtirish | Kam energiya sarfi | Yuqori moslik |
| Izolyatsiya | Linux jarayonlari orqali | ClassLoader orqali |
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 (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.
// 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
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.
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.
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.
// 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
}
}
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.
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
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 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.
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.
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 (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
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.