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 (Dalvik Executable) एक बाइटकोड प्रारूप है जो विशेष रूप से Android मोबाइल उपकरणों के लिए डिज़ाइन किया गया है। मानक Java बाइटकोड (.class फ़ाइलों) के विपरीत, 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 फ़ाइल की एक सख्ती से परिभाषित बाइनरी संरचना होती है। प्रत्येक फ़ाइल एक शीर्षलेख से शुरू होती है और इसमें कई अनुभाग होते हैं जो ऑफ़सेट के माध्यम से एक दूसरे को संदर्भित करते हैं।
| अनुभाग | उद्देश्य |
|---|---|
| header | शीर्षलेख: magic, चेकसम, हस्ताक्षर, अनुभाग आकार और ऑफ़सेट |
| string_ids | स्ट्रिंग तालिका: क्लास, विधि और फ़ील्ड नाम |
| type_ids | प्रकार: प्रकार स्ट्रिंग पहचानकर्ताओं के संदर्भ |
| proto_ids | विधि प्रोटोटाइप: वापसी प्रकार और पैरामीटर |
| field_ids | क्लास फ़ील्ड: क्लास, प्रकार, नाम |
| method_ids | विधियाँ: क्लास, प्रोटोटाइप, नाम |
| class_defs | क्लास परिभाषाएँ: फ़्लैग, सुपरक्लास, इंटरफ़ेस, डेटा ऑफ़सेट |
| data | वास्तविक डेटा: विधि कोड, एनोटेशन, डीबग जानकारी |
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 संकलन के दौरान इन तालिकाओं को और अनुकूलित करता है।
स्रोत कोड को DEX में बदलने की प्रक्रिया कई चरणों से मिलकर बनी है। आधुनिक टूलचेन D8 संकलक का उपयोग करती है, जिसने 2018 में Android Gradle Plugin 3.2 के साथ DX को बदल दिया।
javac (Java के लिए) या kotlinc (Kotlin के लिए) स्रोत कोड को .class फ़ाइलों में संकलित करता है। प्रत्येक क्लास Java बाइटकोड में एक अलग .class फ़ाइल है। इस चरण में, प्रकार जाँच, ब्रिज विधियाँ उत्पन्न करना और स्थिरांक इनलाइनिंग की जाती है।
D8 सभी .class फ़ाइलों को लेता है और उन्हें DEX बाइटकोड में रूपांतरित करता है। D8 कई अनुकूलन करता है: अप्रयुक्त विधि तर्क हटाता है, विभिन्न .class फ़ाइलों से स्थिरांक पूल को एक वैश्विक DEX पूल में मर्ज करता है, और JVM स्टैक निर्देशों को Dalvik रजिस्टर निर्देशों में परिवर्तित करता है।
// 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 से 2–3 गुना तेज़ है, अधिक संक्षिप्त DEX उत्पन्न करता है (5–10% छोटा), और Kotlin-विशिष्ट निर्माणों (इनलाइन फ़ंक्शन, लैम्ब्डा) को बेहतर अनुकूलित करता है। DX को 2018 में पदावनत घोषित किया गया था और Android Gradle Plugin 8.0 से हटा दिया गया।
Android में DEX कोड का निष्पादन दो चरणों से गुज़रा: मूल Dalvik वर्चुअल मशीन (Android 2.2–4.4) और Android Runtime ART (Android 5.0+)। संकलन दृष्टिकोण में अंतर मौलिक है।
Dalvik ने Just-In-Time (JIT) संकलन का उपयोग किया: DEX बाइटकोड की व्याख्या की जाती थी, और बार-बार कॉल की जाने वाली विधियों को मौके पर नेटिव कोड में संकलित किया जाता था। लाभ — तेज़ स्थापना। हानि — धीमा स्टार्टअप और JIT के लिए निरंतर CPU खर्च।
ART (Android Runtime) dex2oat के माध्यम से एप्लिकेशन स्थापना के दौरान DEX को नेटिव कोड में संकलित करता है। यह Ahead-Of-Time (AOT) दृष्टिकोण है: स्थापना में अधिक समय लगता है, लेकिन स्टार्टअप तेज़ है और बिजली की खपत कम है। Android 7.0 से, ART एक हाइब्रिड दृष्टिकोण का उपयोग करता है — AOT + JIT + Profile Guided Optimization।
dex2oat टूल एप्लिकेशन स्थापित या अपडेट होने पर चलता है। यह DEX को डिवाइस आर्किटेक्चर के लिए नेटिव कोड वाली ELF फ़ाइल में संकलित करता है। परिणाम — /data/dalvik-cache/ निर्देशिका में .oat और .art फ़ाइलें। Google लगातार dex2oat में सुधार कर रहा है: Android 14 में फोल्डेबल डिवाइसों के लिए अनुकूलन जोड़े गए।
प्रति DEX फ़ाइल 65536 विधियों की सीमा Dalvik आर्किटेक्चर की विरासत है। DEX शीर्षलेख में method_ids फ़ील्ड 4 बाइट लेता है, जो अधिकतम 2^16 = 65536 अद्वितीय संदर्भ देता है। Google Play Services, Firebase और अन्य SDK वाले आधुनिक एप्लिकेशन आसानी से इस सीमा को पार कर जाते हैं।
Multidex कोड को कई DEX फ़ाइलों में विभाजित करने का एक तंत्र है। मुख्य classes.dex में प्रवेश बिंदु (Application क्लास, मुख्य Activity) होते हैं, बाकी classes2.dex, classes3.dex इत्यादि हैं। स्टार्टअप पर, अतिरिक्त DEX से क्लासेस DexClassLoader के माध्यम से लोड की जाती हैं।
// build.gradle.kts — multidex सक्षम करना
android {
defaultConfig {
multiDexEnabled = true
}
}
// Multidex समर्थन के साथ Application क्लास
class MyApp : Application() {
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
MultiDex.install(this)
}
}
एप्लिकेशन स्टार्टअप के दौरान अतिरिक्त DEX की लोडिंग Android 5.0 से पहले के उपकरणों पर ANR (Application Not Responding) का कारण बन सकती है। अनुशंसा — केवल आवश्यक होने पर multidex का उपयोग करें और सीमा से अधिक न होने के लिए निर्भरताओं को कम करें।
DEX का अनुकूलन रिलीज़ Android एप्लिकेशन बनाने का एक मानक चरण है। R8 और ProGuard उपकरण DEX आकार को कम करते हैं, कोड को अस्पष्ट करते हैं और अप्रयुक्त क्लासेस को हटाते हैं।
R8 ProGuard का उत्तराधिकारी है, जो 2019 से Android Gradle Plugin में निर्मित है। R8 एक ही पास में मिनिफिकेशन, अस्पष्टीकरण और अनुकूलन करता है, जबकि ProGuard को दो चरणों की आवश्यकता थी: ProGuard → D8। ProGuard अभी भी समर्थित है, लेकिन Google नई परियोजनाओं के लिए R8 की अनुशंसा करता है।
R8 अप्रयुक्त क्लासेस, विधियों और फ़ील्ड को हटाता है, उन्हें छोटे नामों (a, b, c) में बदलता है, इनलाइन फ़ंक्शन शामिल करता है और मृत कोड को हटाता है। परिणाम — कार्यक्षमता खोए बिना DEX 20–40% कम हो जाता है।
R8 कॉन्फ़िगरेशन proguard-rules.pro फ़ाइल में निर्दिष्ट किया जाता है। डेवलपर यह निर्दिष्ट कर सकता है कि किन क्लासेस का नाम नहीं बदला जा सकता (उदाहरण के लिए, रिफ्लेक्शन या Gson सीरियलाइज़ेशन के लिए)। Firebase और अन्य SDK अपनी निर्भरताओं में अपने स्वयं के नियम प्रदान करते हैं।
DEX को वापस Java कोड में डीकंपाइल किया जा सकता है। यह Android अनुप्रयोगों के लिए एक महत्वपूर्ण सुरक्षा प्रश्न है: अस्पष्टीकरण के बिना, कोड मूल के करीब के स्तर पर पुनर्स्थापित हो जाता है।
JADX सबसे लोकप्रिय DEX से Java डीकंपाइलर है। यह क्लास नाम, विधियाँ, फ़ील्ड और अधिकांश तर्क को पुनर्स्थापित करता है। apktool DEX को smali कोड (Dalvik असेंबलर) में डीकंपाइल करता है — मूल निर्देशों के करीब एक निम्न-स्तरीय प्रस्तुतीकरण। Bytecode Viewer एक इंटरफ़ेस में कई डीकंपाइलरों को जोड़ता है।
R8/ProGuard के साथ अस्पष्टीकरण रक्षा की पहली पंक्ति है: क्लास और विधि के नाम अपठनीय हो जाते हैं। DexGuard अतिरिक्त विधियों वाला एक व्यावसायिक उपकरण है: स्ट्रिंग एन्क्रिप्शन, अखंडता जाँच, एंटी-टैम्पर। कंट्रोल फ़्लो अस्पष्टीकरण (O-LLVM) कार्यक्षमता को बनाए रखते हुए कोड संरचना को बदलता है, जिससे विश्लेषण अधिक कठिन हो जाता है।
अक्सर पूछे जाने वाले प्रश्न
DEX स्टैक-आधारित JVM के बजाय रजिस्टर-आधारित आर्किटेक्चर का उपयोग करता है, इसमें अधिक संक्षिप्त प्रारूप (30% छोटा) है, सभी .class फ़ाइलों को एक ही स्थिरांक पूल के साथ एक फ़ाइल में मर्ज करता है, और 8-बिट के बजाय 16-बिट सूचकांक का उपयोग करता है।
Smali DEX बाइटकोड के लिए एक असेंबलर है। प्रत्येक DEX निर्देश का smali प्रारूप में एक टेक्स्ट प्रस्तुतीकरण होता है। baksmali टूल DEX को smali में बदलता है (डिसअसेंबली), और smali smali को वापस DEX में असेंबल करता है।
Gradle टास्क countMethods या dex-method-counts प्लगइन प्रत्येक DEX फ़ाइल में विधियों की संख्या दिखाते हैं। adb shell कमांड dumpsys के साथ स्थापित एप्लिकेशनों के लिए लोड किए गए DEX के आँकड़े भी प्रदर्शित करता है।
हाँ, Android 8.0 से पहले के उपकरणों पर, कई DEX फ़ाइलें एप्लिकेशन स्टार्टअप को धीमा कर देती हैं क्योंकि प्रत्येक अतिरिक्त फ़ाइल अलग से लोड होती है। Android 8.0+ के साथ ART पर, एकल .oat फ़ाइल में dex2oat संकलन के कारण अंतर न्यूनतम है।
हाँ, ऐसे प्रोजेक्ट हैं जैसे dexplorer और Android-संगत JVM कार्यान्वयन जो Android के बाहर DEX बाइटकोड निष्पादित कर सकते हैं। हालाँकि, अधिकांश DEX फ़ाइलें Android API का उपयोग करती हैं, जो उन्हें मानक JVM पर चलाने के लिए अनुपयुक्त बनाती हैं।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें