DEX (Dalvik Executable) — Java va Kotlin-dagi Android ilovalarining manba kodi kompilyatsiya qilinadigan bayt-kod formatidir. DEX fayllari Dalvik virtual mashinasi (Android 4.4 gacha) yoki Android Runtime (ART, Android 5.0 dan boshlab) tomonidan bajariladi. Android Open Source Project, 2026 ma'lumotlariga ko'ra, DEX formati standart JVM bayt-kodi bilan solishtirganda o'rtacha 30% ixchamroq kod taqdim etadi.
Asosiy ma'lumotlar
DEX (Dalvik Executable) — aynan Android mobil qurilmalari uchun mo'ljallangan bayt-kod formatidir. Standart Java bayt-kodidan (.class fayllari) farqli o'laroq, DEX cheklangan resurslar uchun optimallashtirilgan: kam xotira, kichikroq hajm va tezroq klass yuklash.
Java yoki Kotlin dagi manba kodi javac/kotlinc tomonidan standart .class fayllariga (Java bayt-kodi) kompilyatsiya qilinadi. Keyin d8 (yoki avvalroq dx) vositasi .class fayllarini bir yoki bir nechta DEX fayllariga konvertatsiya qiladi. Bu konvertatsiya oddiy qayta joylash emas — d8 optimallashtirishlarni amalga oshiradi: doimiy hovuzlarni birlashtiradi, ko'rsatmalarni registr arxitekturasiga qayta yozadi va takrorlanuvchi ma'lumotlarni olib tashlaydi.
DEX registr arxitekturasidan foydalanadi (JVM stek arxitekturasidan farqli). Har bir metodning belgilangan sonli registri bor (65536 gacha). DEX ko'rsatmalari qisqaroq — o'rtacha 2 bayt, JVM da 1–4 bayt. Bu ixchamroq kod beradi: odatiy ilova 10–15 MB .class dan 4–6 MB .dex gacha kamayadi.
DEX fayli qat'iy belgilangan ikkilik tuzilishga ega. Har bir fayl sarlavha bilan boshlanadi va bir-biriga offsetlar orqali havola qiluvchi bir nechta bo'limlarni o'z ichiga oladi.
| Bo'lim | Maqsad |
|---|---|
| header | Sarlavha: magic, nazorat summasi, imzo, bo'limlar o'lchamlari va offsetlari |
| string_ids | Satr jadvali: klass, metod, maydon nomlari |
| type_ids | Tiplar: tip satr identifikatorlariga havolalar |
| proto_ids | Metod prototiplari: qaytariladigan tip va parametrlar |
| field_ids | Klass maydonlari: klass, tip, nom |
| method_ids | Metodlar: klass, prototip, nom |
| class_defs | Klass ta'riflari: bayroqlar, superclass, interfeyslar, ma'lumot offsetlari |
| data | Haqiqiy ma'lumotlar: metod kodi, annotatsiyalar, debug ma'lumoti |
Sehrli DEX soni — `dex\n035\0` (versiya 035). Boshqa versiyalar: 036, 037, 038 (Android 8.0+ uchun). 0x70 bayt o'lchamdagi sarlavha SHA-1 nazorat summasini va barcha bo'limlarning offsetlarini o'z ichiga oladi. Sarlavhani validatsiya qilish — virtual mashina tomonidan DEX yuklanayotganda birinchi qadamdir.
string_ids, type_ids, proto_ids, field_ids, method_ids — indekslangan jadvallardir. Metod kodida to'liq nomlarni saqlash o'rniga 4-baytli indeks ishlatiladi. Bu asosiy optimallashtirish: agar klass 100 marta eslatilsa, uning nomi string_ids da bir marta saqlanadi. dex2oat ART kompilyatsiyasida ushbu jadvallarni qo'shimcha optimallashtiradi.
Jarayon manba kodini DEX ga aylantirish bir necha bosqichdan iborat. Zamonaviy zanjir 2018 yilda Android Gradle Plugin 3.2 bilan DX ni almashtirgan D8 kompilyatoridan foydalanadi.
javac (Java uchun) yoki kotlinc (Kotlin uchun) manba kodini .class fayllariga kompilyatsiya qiladi. Har bir klass — Java bayt-kodida alohida .class fayli. Ushbu bosqichda tip tekshiruvi, bridge metodlarini yaratish va doimiylarni joylashtirish amalga oshiriladi.
D8 barcha .class fayllarini qabul qiladi va ularni DEX bayt-kodiga aylantiradi. D8 bir nechta optimallashtirishlarni amalga oshiradi: foydalanilmagan metod argumentlarini olib tashlaydi, turli .class lardan doimiy hovuzlarni bitta global DEX hovuzida birlashtiradi, JVM stek ko'rsatmalarini Dalvik registr ko'rsatmalariga konvertatsiya qiladi.
// Kotlin manba kodi
data class User(
val name: String,
val email: String
)
fun greet(user: User): String {
return "Hello, ${user.name}!"
}
D8 kompilyatsiyasidan so'ng bu kod ixcham DEX ko'rsatmalariga aylanadi: satr yuklash uchun const-string, obyekt maydoniga kirish uchun iget-object, StringBuilder.append chaqirish uchun invoke-virtual.
D8 DX dan 2–3 marta tez ishlaydi, ixchamroq DEX yaratadi (5–10%) va Kotlin-spesifik konstruksiyalarni (inline funksiyalar, lambda) yaxshiroq optimallashtiradi. DX 2018 yildan beri eskirgan (deprecated) deb belgilangan va Android Gradle Plugin 8.0 dan olib tashlangan.
DEX kodining Android da bajarilishi ikki bosqichdan o'tgan: asl Dalvik virtual mashinasi (Android 2.2–4.4) va Android Runtime ART (Android 5.0+). Kompilyatsiya yondashuvidagi farq tubdan.
Dalvik Just-In-Time (JIT) kompilyatsiyasidan foydalangan: DEX bayt-kodi interpretatsiya qilingan va tez-tez chaqiriladigan metodlar joyida native kodga kompilyatsiya qilingan. Afzallik — tez o'rnatish. Kamchilik — sekinroq ishga tushirish va JIT uchun doimiy CPU yuki.
ART (Android Runtime) ilova o'rnatilayotganda dex2oat orqali DEX ni native kodga kompilyatsiya qiladi. Bu Ahead-Of-Time (AOT) yondashuvi: o'rnatish uzoqroq davom etadi, lekin ishga tushirish tezroq va energiya sarfi kamroq. Android 7.0 dan ART gibrid yondashuvdan foydalanadi — AOT + JIT + Profile Guided Optimization.
dex2oat vositasi ilova o'rnatilayotganda yoki yangilanayotganda ishga tushadi. U DEX ni qurilma arxitekturasi uchun native kod bilan ELF fayliga kompilyatsiya qiladi. Natija — /data/dalvik-cache/ katalogidagi .oat va .art fayllari. Google dex2oat ni doimiy takomillashtiradi: Android 14 da yig'iladigan qurilmalar uchun optimallashtirish qo'shilgan.
Bitta DEX faylidagi 65536 metod cheklovi — Dalvik arxitekturasidan qolgan meros. DEX sarlavhasidagi method_ids maydoni 4 baytni egallaydi, bu maksimal 2^16 = 65536 unikal havolani beradi. Google Play Services, Firebase va boshqa SDK larga ega zamonaviy ilovalar ushbu limitni osonlikcha oshib ketadi.
Multidex — kodni bir nechta DEX fayllariga bo'lish mexanizmi. Asosiy classes.dex kirish nuqtalarini (Application klassi, asosiy Activity) o'z ichiga oladi, qolganlari — classes2.dex, classes3.dex va hokazo. Ishga tushirishda qo'shimcha DEX lardan klasslar DexClassLoader orqali yuklanadi.
// build.gradle.kts — multidex ni yoqish
android {
defaultConfig {
multiDexEnabled = true
}
}
// Multidex qo'llab-quvvatlashi bilan Application klassi
class MyApp : Application() {
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
MultiDex.install(this)
}
}
Qo'shimcha DEX larning ilova starti bosqichida yuklanishi Android 5.0 gacha bo'lgan qurilmalarda ANR (Application Not Responding) ga sabab bo'lishi mumkin. Tavsiya — multidex ni faqat zarur bo'lganda ishlating va limitni oshib ketmaslik uchun bog'liqliklarni minimallashtiring.
DEX optimallashtirish — release Android ilovasini qurishning standart bosqichi. R8 va ProGuard vositalari DEX hajmini kamaytiradi, kodni obfuskatisya qiladi va foydalanilmagan klasslarni olib tashlaydi.
R8 — ProGuard ning vorisi, 2019 yildan Android Gradle Plugin ga o'rnatilgan. R8 minifikatsiya, obfuskatsiya va optimallashtirishni bir o'tishda amalga oshiradi, ProGuard esa ikki bosqichni talab qilgan: ProGuard → D8. ProGuard hali ham qo'llab-quvvatlanadi, ammo Google yangi loyihalar uchun R8 ni tavsiya qiladi.
R8 foydalanilmagan klasslarni, metodlarni va maydonlarni olib tashlaydi, ularning nomlarini qisqa nomlarga (a, b, c) o'zgartiradi, inline funksiyalarni joylashtiradi va o'lik kodni tashlaydi. Natija — DEX funksionallikni yo'qotmasdan 20–40% kamayadi.
R8 konfiguratsiyasi proguard-rules.pro faylida beriladi. Dasturchi qaysi klasslarning nomlari o'zgartirilmasligini ko'rsatishi mumkin (masalan, refleksiya yoki Gson serializatsiyasi uchun). Firebase va boshqa SDK lar o'z bog'liqliklarida o'z qoidalarini taqdim etadi.
DEX ni qayta Java kodiga dekompilyatsiya qilish mumkin. Bu Android ilovalari xavfsizligining asosiy masalasi: obfuskatsiyasiz kod asl nusxaga yaqin darajada tiklanadi.
JADX — DEX ni Java ga eng mashhur dekompilyatori. U klass nomlarini, metodlarni, maydonlarni va logikaning katta qismini tiklaydi. apktool DEX ni smali kodiga (Dalvik assembler) dekompilyatsiya qiladi — asl ko'rsatmalarga yaqin past darajadagi tasvir. Bytecode Viewer bir nechta dekompilyatorlarni bitta interfeysda birlashtiradi.
R8/ProGuard obfuskatsiyasi — birinchi himoya chizig'i: klass va metod nomlari o'qib bo'lmaydigan bo'ladi. DexGuard — qo'shimcha usullar bilan tijorat vositasi: satr shifrlash, yaxlitlik tekshiruvi, anti-tamper. Obfuskatsiya Control Flow darajasida (O-LLVM) kod tuzilishini o'zgartiradi, funksionallikni saqlab qoladi, lekin tahlilni ancha qiyinlashtiradi.
Tez-tez beriladigan savollar
DEX JVM stek arxitekturasidan farqli ravishda registr arxitekturasidan foydalanadi, ixchamroq formatga ega (30% kichik), barcha .class fayllarini yagona doimiy hovuzli bitta faylda birlashtiradi va 8-bitli indekslar o'rniga 16-bitli indekslardan foydalanadi.
Smali — DEX bayt-kodining assembleri. Har bir DEX ko'rsatmasi smali formatida matnli tasvirga ega. baksmali vositasi DEX ni smali ga aylantiradi (dezasembllash), smali esa smali ni qayta DEX ga yig'adi.
Gradle countMethods vazifasi yoki dex-method-counts plagini har bir DEX faylidagi metodlar sonini ko'rsatadi. adb shell buyrug'i dumpsys bilan ham o'rnatilgan ilovalar uchun yuklangan DEX lar statistikasini ko'rsatadi.
Ha, Android 8.0 gacha bo'lgan qurilmalarda bir nechta DEX ilova ishga tushishini sekinlashtiradi, chunki har bir qo'shimcha fayl alohida yuklanadi. Android 8.0+ bilan ART da farq minimal, chunki dex2oat yagona .oat fayliga kompilyatsiya qiladi.
Ha, dexplorer va Android-mos JVM implementatsiyalari kabi loyihalar DEX bayt-kodini Android tashqarisida bajarishi mumkin. Biroq, ko'pchilik DEX fayllari Android API dan foydalanadi, bu ularni oddiy JVM da ishga tushirish uchun yaroqsiz qiladi.
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.