DEX: bu nima, bayt-kod tuzilishi va ishlash prinsipi

Muallif: IT Sectr Nashr etilgan: 2026-04-15 O'qish vaqti: 8 daq

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 — Android uchun bayt-kod formati, Dalvik yoki ART da bajariladi.
  • Ixchamlik — DEX standart Java bayt-kodidan 30% kam joy egallaydi.
  • Multidex — bitta DEX faylidagi 65536 metod limitidan o'tish mexanizmi.
  • ART — Dalvik o'rnini egallagan Android Runtime, o'rnatish vaqtida DEX ni native kodga kompilyatsiya qiladi.
  • D8 — 2018 yildan beri DX o'rnini egallagan Java/Kotlin dan DEX ga zamonaviy kompilyator.

DEX nima va nima uchun kerak

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 dan DEX ga

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.

Arxitektura xususiyatlari

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 faylining tuzilishi: bo'limlar va sarlavha

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'limMaqsad
headerSarlavha: magic, nazorat summasi, imzo, bo'limlar o'lchamlari va offsetlari
string_idsSatr jadvali: klass, metod, maydon nomlari
type_idsTiplar: tip satr identifikatorlariga havolalar
proto_idsMetod prototiplari: qaytariladigan tip va parametrlar
field_idsKlass maydonlari: klass, tip, nom
method_idsMetodlar: klass, prototip, nom
class_defsKlass ta'riflari: bayroqlar, superclass, interfeyslar, ma'lumot offsetlari
dataHaqiqiy ma'lumotlar: metod kodi, annotatsiyalar, debug ma'lumoti

DEX sarlavhasi

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.

Doimiy hovuzlar

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.

Java va Kotlin ni DEX ga kompilyatsiya jarayoni

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.

1-bosqich: .class ga kompilyatsiya

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.

2-bosqich: D8 kompilyatsiyasi

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
// 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 vs DX

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.

Dalvik vs ART: DEX bajarilishi qanday o'zgardi

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 VM: JIT kompilyatsiyasi

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: AOT kompilyatsiyasi

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: o'rnatish vaqtida konvertatsiya

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.

Multidex: 64K metod limitini yengish

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 mexanizmi

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.

kotlin
// 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)
    }
}

Multidex muammolari

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: ProGuard, R8 va obfuskatsiya

DEX optimallashtirish — release Android ilovasini qurishning standart bosqichi. R8 va ProGuard vositalari DEX hajmini kamaytiradi, kodni obfuskatisya qiladi va foydalanilmagan klasslarni olib tashlaydi.

R8 vs ProGuard

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 qoidalari

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 dekompilyatsiyasi: vositalar va himoya

DEX ni qayta Java kodiga dekompilyatsiya qilish mumkin. Bu Android ilovalari xavfsizligining asosiy masalasi: obfuskatsiyasiz kod asl nusxaga yaqin darajada tiklanadi.

Dekompilyatsiya vositalari

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.

Himoya usullari

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 Java bayt-kodidan qanday farq qiladi?

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 nima?

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.

DEX dagi metodlar sonini qanday tekshirish mumkin?

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.

DEX soni ishlashga ta'sir qiladimi?

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.

DEX ni Androidsiz ishga tushirish mumkinmi?

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

  • DEX — registr arxitekturasi va ixcham kod taqdimoti bilan Android bayt-kod formati.
  • Tuzilish sarlavha, identifikator jadvallari va ko'rsatmalar bilan ma'lumot bo'limini o'z ichiga oladi.
  • Kompilyatsiya DEX ga D8 orqali: .class → DEX optimallashtirishlar va doimiy hovuzlarni birlashtirish bilan.
  • ART DEX ni o'rnatish vaqtida native kodga (AOT) kompilyatsiya qiladi, ilova ishga tushishini tezlashtiradi.
  • Multidex — 65536 metod limiti muammosini bir nechta DEX fayllariga bo'lish orqali hal qilish.
  • Optimallashtirish — R8 DEX ni 20–40% kamaytiradi, nomlarni obfuskatisya qiladi va o'lik kodni olib tashlaydi.
  • Himoya — R8/ProGuard, DexGuard va O-LLVM obfuskatsiyasi DEX dekompilyatsiyasining oldini oladi.

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