DEX: यह क्या है, बाइटकोड की संरचना और कार्य सिद्धांत

लेखक: IT Sectr प्रकाशित: 2026-04-15 पढ़ने का समय: 8 मिनट

DEX (Dalvik Executable) एक बाइटकोड प्रारूप है जिसमें Java और Kotlin में Android अनुप्रयोगों का स्रोत कोड संकलित किया जाता है। DEX फ़ाइलें Dalvik वर्चुअल मशीन (Android 4.4 तक) या Android Runtime (ART, Android 5.0 से) द्वारा निष्पादित की जाती हैं। Android Open Source Project, 2026 के अनुसार, DEX प्रारूप मानक JVM Java बाइटकोड की तुलना में औसतन 30% अधिक संक्षिप्त कोड प्रस्तुतीकरण प्रदान करता है।

मुख्य बिंदु

  • DEX Android के लिए एक बाइटकोड प्रारूप है, जो Dalvik या ART पर निष्पादित होता है।
  • संक्षिप्तता — DEX मानक Java बाइटकोड की तुलना में 30% कम स्थान लेता है।
  • Multidex — एक ही DEX फ़ाइल में 65536 विधियों की सीमा को पार करने की एक तंत्र।
  • ART — Android Runtime, जिसने Dalvik को बदला, स्थापना के दौरान DEX को नेटिव कोड में संकलित करता है।
  • D8 — 2018 से DX को बदलने वाला Java/Kotlin से DEX में आधुनिक संकलक।

DEX क्या है और इसकी आवश्यकता क्यों है

DEX (Dalvik Executable) एक बाइटकोड प्रारूप है जो विशेष रूप से Android मोबाइल उपकरणों के लिए डिज़ाइन किया गया है। मानक Java बाइटकोड (.class फ़ाइलों) के विपरीत, DEX सीमित संसाधनों के लिए अनुकूलित है: कम मेमोरी, छोटा आकार और तेज़ क्लास लोडिंग।

Java से DEX तक

Java या Kotlin में स्रोत कोड javac/kotlinc द्वारा मानक .class फ़ाइलों (Java बाइटकोड) में संकलित किया जाता है। फिर d8 टूल (या पहले dx) .class को एक या अधिक DEX फ़ाइलों में परिवर्तित करता है। यह रूपांतरण सिर्फ रीपैकेजिंग नहीं है — d8 अनुकूलन करता है: स्थिरांक पूल को मर्ज करना, निर्देशों को रजिस्टर आर्किटेक्चर में फिर से लिखना और डुप्लिकेट डेटा को हटाना।

आर्किटेक्चरल विशेषताएँ

DEX रजिस्टर-आधारित आर्किटेक्चर का उपयोग करता है (स्टैक-आधारित JVM के विपरीत)। प्रत्येक विधि में रजिस्टरों की एक निश्चित संख्या होती है (65536 तक)। DEX निर्देश छोटे होते हैं — औसतन 2 बाइट बनाम JVM में 1–4 बाइट। यह अधिक संक्षिप्त कोड उत्पन्न करता है: एक सामान्य एप्लिकेशन 10–15 MB .class से घटकर 4–6 MB .dex हो जाता है।

DEX फ़ाइल की संरचना: अनुभाग और शीर्षलेख

DEX फ़ाइल की एक सख्ती से परिभाषित बाइनरी संरचना होती है। प्रत्येक फ़ाइल एक शीर्षलेख से शुरू होती है और इसमें कई अनुभाग होते हैं जो ऑफ़सेट के माध्यम से एक दूसरे को संदर्भित करते हैं।

अनुभागउद्देश्य
headerशीर्षलेख: magic, चेकसम, हस्ताक्षर, अनुभाग आकार और ऑफ़सेट
string_idsस्ट्रिंग तालिका: क्लास, विधि और फ़ील्ड नाम
type_idsप्रकार: प्रकार स्ट्रिंग पहचानकर्ताओं के संदर्भ
proto_idsविधि प्रोटोटाइप: वापसी प्रकार और पैरामीटर
field_idsक्लास फ़ील्ड: क्लास, प्रकार, नाम
method_idsविधियाँ: क्लास, प्रोटोटाइप, नाम
class_defsक्लास परिभाषाएँ: फ़्लैग, सुपरक्लास, इंटरफ़ेस, डेटा ऑफ़सेट
dataवास्तविक डेटा: विधि कोड, एनोटेशन, डीबग जानकारी

DEX शीर्षलेख

DEX का मैजिक नंबर `dex\n035\0` (संस्करण 035) है। अन्य संस्करण: 036, 037, 038 (Android 8.0+ के लिए)। शीर्षलेख 0x70 बाइट आकार का होता है और इसमें SHA-1 चेकसम और सभी अनुभागों के ऑफ़सेट होते हैं। शीर्षलेख सत्यापन वर्चुअल मशीन द्वारा DEX लोड करने का पहला चरण है।

स्थिरांक पूल

string_ids, type_ids, proto_ids, field_ids, method_ids — ये अनुक्रमित तालिकाएँ हैं। विधि कोड में पूर्ण नाम संग्रहीत करने के बजाय, 4-बाइट सूचकांक का उपयोग किया जाता है। यह एक महत्वपूर्ण अनुकूलन है: यदि किसी क्लास का 100 बार उल्लेख किया जाता है, तो उसका नाम string_ids में एक बार संग्रहीत होता है। dex2oat ART संकलन के दौरान इन तालिकाओं को और अनुकूलित करता है।

Java और Kotlin के DEX में संकलन की प्रक्रिया

स्रोत कोड को DEX में बदलने की प्रक्रिया कई चरणों से मिलकर बनी है। आधुनिक टूलचेन D8 संकलक का उपयोग करती है, जिसने 2018 में Android Gradle Plugin 3.2 के साथ DX को बदल दिया।

चरण 1: .class में संकलन

javac (Java के लिए) या kotlinc (Kotlin के लिए) स्रोत कोड को .class फ़ाइलों में संकलित करता है। प्रत्येक क्लास Java बाइटकोड में एक अलग .class फ़ाइल है। इस चरण में, प्रकार जाँच, ब्रिज विधियाँ उत्पन्न करना और स्थिरांक इनलाइनिंग की जाती है।

चरण 2: D8 संकलन

D8 सभी .class फ़ाइलों को लेता है और उन्हें DEX बाइटकोड में रूपांतरित करता है। D8 कई अनुकूलन करता है: अप्रयुक्त विधि तर्क हटाता है, विभिन्न .class फ़ाइलों से स्थिरांक पूल को एक वैश्विक DEX पूल में मर्ज करता है, और JVM स्टैक निर्देशों को Dalvik रजिस्टर निर्देशों में परिवर्तित करता है।

kotlin
// Kotlin स्रोत कोड
data class User(
    val name: String,
    val email: String
)

fun greet(user: User): String {
    return "Hello, ${user.name}!"
}

D8 संकलन के बाद, यह कोड संक्षिप्त DEX निर्देशों में बदल जाता है: स्ट्रिंग लोड करने के लिए const-string, ऑब्जेक्ट फ़ील्ड तक पहुँचने के लिए iget-object, StringBuilder.append को कॉल करने के लिए invoke-virtual।

D8 बनाम DX

D8 DX से 2–3 गुना तेज़ है, अधिक संक्षिप्त DEX उत्पन्न करता है (5–10% छोटा), और Kotlin-विशिष्ट निर्माणों (इनलाइन फ़ंक्शन, लैम्ब्डा) को बेहतर अनुकूलित करता है। DX को 2018 में पदावनत घोषित किया गया था और Android Gradle Plugin 8.0 से हटा दिया गया।

Dalvik vs ART: DEX निष्पादन कैसे बदला

Android में DEX कोड का निष्पादन दो चरणों से गुज़रा: मूल Dalvik वर्चुअल मशीन (Android 2.2–4.4) और Android Runtime ART (Android 5.0+)। संकलन दृष्टिकोण में अंतर मौलिक है।

Dalvik VM: JIT संकलन

Dalvik ने Just-In-Time (JIT) संकलन का उपयोग किया: DEX बाइटकोड की व्याख्या की जाती थी, और बार-बार कॉल की जाने वाली विधियों को मौके पर नेटिव कोड में संकलित किया जाता था। लाभ — तेज़ स्थापना। हानि — धीमा स्टार्टअप और JIT के लिए निरंतर CPU खर्च।

ART: AOT संकलन

ART (Android Runtime) dex2oat के माध्यम से एप्लिकेशन स्थापना के दौरान DEX को नेटिव कोड में संकलित करता है। यह Ahead-Of-Time (AOT) दृष्टिकोण है: स्थापना में अधिक समय लगता है, लेकिन स्टार्टअप तेज़ है और बिजली की खपत कम है। Android 7.0 से, ART एक हाइब्रिड दृष्टिकोण का उपयोग करता है — AOT + JIT + Profile Guided Optimization।

dex2oat: स्थापना के दौरान रूपांतरण

dex2oat टूल एप्लिकेशन स्थापित या अपडेट होने पर चलता है। यह DEX को डिवाइस आर्किटेक्चर के लिए नेटिव कोड वाली ELF फ़ाइल में संकलित करता है। परिणाम — /data/dalvik-cache/ निर्देशिका में .oat और .art फ़ाइलें। Google लगातार dex2oat में सुधार कर रहा है: Android 14 में फोल्डेबल डिवाइसों के लिए अनुकूलन जोड़े गए।

Multidex: 64K विधियों की सीमा को पार करना

प्रति DEX फ़ाइल 65536 विधियों की सीमा Dalvik आर्किटेक्चर की विरासत है। DEX शीर्षलेख में method_ids फ़ील्ड 4 बाइट लेता है, जो अधिकतम 2^16 = 65536 अद्वितीय संदर्भ देता है। Google Play Services, Firebase और अन्य SDK वाले आधुनिक एप्लिकेशन आसानी से इस सीमा को पार कर जाते हैं।

Multidex तंत्र

Multidex कोड को कई DEX फ़ाइलों में विभाजित करने का एक तंत्र है। मुख्य classes.dex में प्रवेश बिंदु (Application क्लास, मुख्य Activity) होते हैं, बाकी classes2.dex, classes3.dex इत्यादि हैं। स्टार्टअप पर, अतिरिक्त DEX से क्लासेस DexClassLoader के माध्यम से लोड की जाती हैं।

kotlin
// build.gradle.kts — multidex सक्षम करना
android {
    defaultConfig {
        multiDexEnabled = true
    }
}

// Multidex समर्थन के साथ Application क्लास
class MyApp : Application() {
    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }
}

Multidex समस्याएँ

एप्लिकेशन स्टार्टअप के दौरान अतिरिक्त DEX की लोडिंग Android 5.0 से पहले के उपकरणों पर ANR (Application Not Responding) का कारण बन सकती है। अनुशंसा — केवल आवश्यक होने पर multidex का उपयोग करें और सीमा से अधिक न होने के लिए निर्भरताओं को कम करें।

DEX अनुकूलन: ProGuard, R8 और अस्पष्टीकरण

DEX का अनुकूलन रिलीज़ Android एप्लिकेशन बनाने का एक मानक चरण है। R8 और ProGuard उपकरण DEX आकार को कम करते हैं, कोड को अस्पष्ट करते हैं और अप्रयुक्त क्लासेस को हटाते हैं।

R8 बनाम ProGuard

R8 ProGuard का उत्तराधिकारी है, जो 2019 से Android Gradle Plugin में निर्मित है। R8 एक ही पास में मिनिफिकेशन, अस्पष्टीकरण और अनुकूलन करता है, जबकि ProGuard को दो चरणों की आवश्यकता थी: ProGuard → D8। ProGuard अभी भी समर्थित है, लेकिन Google नई परियोजनाओं के लिए R8 की अनुशंसा करता है।

R8 अप्रयुक्त क्लासेस, विधियों और फ़ील्ड को हटाता है, उन्हें छोटे नामों (a, b, c) में बदलता है, इनलाइन फ़ंक्शन शामिल करता है और मृत कोड को हटाता है। परिणाम — कार्यक्षमता खोए बिना DEX 20–40% कम हो जाता है।

R8 नियम

R8 कॉन्फ़िगरेशन proguard-rules.pro फ़ाइल में निर्दिष्ट किया जाता है। डेवलपर यह निर्दिष्ट कर सकता है कि किन क्लासेस का नाम नहीं बदला जा सकता (उदाहरण के लिए, रिफ्लेक्शन या Gson सीरियलाइज़ेशन के लिए)। Firebase और अन्य SDK अपनी निर्भरताओं में अपने स्वयं के नियम प्रदान करते हैं।

DEX डीकंपाइलेशन: उपकरण और सुरक्षा

DEX को वापस Java कोड में डीकंपाइल किया जा सकता है। यह Android अनुप्रयोगों के लिए एक महत्वपूर्ण सुरक्षा प्रश्न है: अस्पष्टीकरण के बिना, कोड मूल के करीब के स्तर पर पुनर्स्थापित हो जाता है।

डीकंपाइलेशन उपकरण

JADX सबसे लोकप्रिय DEX से Java डीकंपाइलर है। यह क्लास नाम, विधियाँ, फ़ील्ड और अधिकांश तर्क को पुनर्स्थापित करता है। apktool DEX को smali कोड (Dalvik असेंबलर) में डीकंपाइल करता है — मूल निर्देशों के करीब एक निम्न-स्तरीय प्रस्तुतीकरण। Bytecode Viewer एक इंटरफ़ेस में कई डीकंपाइलरों को जोड़ता है।

सुरक्षा विधियाँ

R8/ProGuard के साथ अस्पष्टीकरण रक्षा की पहली पंक्ति है: क्लास और विधि के नाम अपठनीय हो जाते हैं। DexGuard अतिरिक्त विधियों वाला एक व्यावसायिक उपकरण है: स्ट्रिंग एन्क्रिप्शन, अखंडता जाँच, एंटी-टैम्पर। कंट्रोल फ़्लो अस्पष्टीकरण (O-LLVM) कार्यक्षमता को बनाए रखते हुए कोड संरचना को बदलता है, जिससे विश्लेषण अधिक कठिन हो जाता है।

अक्सर पूछे जाने वाले प्रश्न

DEX Java बाइटकोड से कैसे अलग है?

DEX स्टैक-आधारित JVM के बजाय रजिस्टर-आधारित आर्किटेक्चर का उपयोग करता है, इसमें अधिक संक्षिप्त प्रारूप (30% छोटा) है, सभी .class फ़ाइलों को एक ही स्थिरांक पूल के साथ एक फ़ाइल में मर्ज करता है, और 8-बिट के बजाय 16-बिट सूचकांक का उपयोग करता है।

smali क्या है?

Smali DEX बाइटकोड के लिए एक असेंबलर है। प्रत्येक DEX निर्देश का smali प्रारूप में एक टेक्स्ट प्रस्तुतीकरण होता है। baksmali टूल DEX को smali में बदलता है (डिसअसेंबली), और smali smali को वापस DEX में असेंबल करता है।

DEX में विधियों की संख्या कैसे जाँचें?

Gradle टास्क countMethods या dex-method-counts प्लगइन प्रत्येक DEX फ़ाइल में विधियों की संख्या दिखाते हैं। adb shell कमांड dumpsys के साथ स्थापित एप्लिकेशनों के लिए लोड किए गए DEX के आँकड़े भी प्रदर्शित करता है।

क्या DEX फ़ाइलों की संख्या प्रदर्शन को प्रभावित करती है?

हाँ, Android 8.0 से पहले के उपकरणों पर, कई DEX फ़ाइलें एप्लिकेशन स्टार्टअप को धीमा कर देती हैं क्योंकि प्रत्येक अतिरिक्त फ़ाइल अलग से लोड होती है। Android 8.0+ के साथ ART पर, एकल .oat फ़ाइल में dex2oat संकलन के कारण अंतर न्यूनतम है।

क्या DEX को Android के बिना चलाया जा सकता है?

हाँ, ऐसे प्रोजेक्ट हैं जैसे dexplorer और Android-संगत JVM कार्यान्वयन जो Android के बाहर DEX बाइटकोड निष्पादित कर सकते हैं। हालाँकि, अधिकांश DEX फ़ाइलें Android API का उपयोग करती हैं, जो उन्हें मानक JVM पर चलाने के लिए अनुपयुक्त बनाती हैं।

सारांश

  • DEX रजिस्टर-आधारित आर्किटेक्चर और संक्षिप्त कोड प्रस्तुतीकरण के साथ एक Android बाइटकोड प्रारूप है।
  • संरचना में शीर्षलेख, पहचानकर्ता तालिकाएँ और निर्देशों के साथ डेटा अनुभाग शामिल है।
  • संकलन D8 के माध्यम से DEX में किया जाता है: .class → DEX अनुकूलन और स्थिरांक पूल मर्जिंग के साथ।
  • ART स्थापना के दौरान DEX को नेटिव कोड (AOT) में संकलित करता है, एप्लिकेशन स्टार्टअप को तेज़ करता है।
  • Multidex कई DEX फ़ाइलों में विभाजित करके 65536 विधियों की सीमा को हल करता है।
  • अनुकूलन — R8 DEX को 20–40% कम करता है, नामों को अस्पष्ट करता है और मृत कोड हटाता है।
  • सुरक्षा — R8/ProGuard, DexGuard और O-LLVM के साथ अस्पष्टीकरण DEX डीकंपाइलेशन को रोकता है।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें