Ang DEX (Dalvik Executable) ay ang bytecode format kung saan nico-compile ang source code ng Android applications sa Java at Kotlin. Ang mga DEX file ay pina-patakbo ng Dalvik virtual machine (hanggang Android 4.4) o Android Runtime (ART, simula Android 5.0). Ayon sa datos ng Android Open Source Project, 2026, ang DEX format ay nagbibigay ng average na 30% na mas compact na representasyon ng code kumpara sa standard na JVM bytecode.
Mga pangunahing punto
DEX (Dalvik Executable) ay isang bytecode format na espesyal na idinisenyo para sa Android mobile devices. Hindi tulad ng standard na Java bytecode (.class files), ang DEX ay optimized para sa limitadong resources: mas kaunting memory, mas maliit na sukat, at mas mabilis na pag-load ng mga klase.
Ang source code sa Java o Kotlin ay nico-compile ng javac/kotlinc sa standard na .class files (Java bytecode). Pagkatapos, ang tool na d8 (o dati ay dx) ay nagco-convert ng .class sa isa o maramihang DEX files. Ang conversion na ito ay hindi simpleng repackaging — gumagawa ang d8 ng mga optimization: pinagsasama ang constant pools, nire-rewrite ang mga instruction sa register architecture, at nagtatanggal ng mga duplicate na data.
Gumagamit ang DEX ng register architecture (salungat sa stack-based na JVM). Ang bawat method ay may fixed na bilang ng registers (hanggang 65536). Mas maikli ang DEX instructions — average na 2 bytes kumpara sa 1–4 bytes sa JVM. Ito ay nagbibigay ng mas compact na code: ang tipikal na application ay bumababa mula 10–15 MB .class tungo sa 4–6 MB .dex.
Ang DEX file ay may mahigpit na tinukoy na binary structure. Bawat file ay nagsisimula sa header at naglalaman ng ilang seksyon na nagre-reference sa isa't isa sa pamamagitan ng offsets.
| Seksyon | Layunin |
|---|---|
| header | Header: magic, checksum, signature, laki at offsets ng mga seksyon |
| string_ids | Talaan ng mga string: pangalan ng mga klase, method, field |
| type_ids | Mga uri: reference sa string identifiers ng mga uri |
| proto_ids | Prototype ng method: return type at parameters |
| field_ids | Field ng klase: klase, uri, pangalan |
| method_ids | Method: klase, prototype, pangalan |
| class_defs | Depinisyon ng klase: flags, superclass, interfaces, data offsets |
| data | Aktwal na data: code ng method, annotations, debug info |
Ang magic number ng DEX — `dex\n035\0` (bersyon 035). Iba pang bersyon: 036, 037, 038 (para sa Android 8.0+). Ang header na may sukat na 0x70 bytes ay naglalaman ng SHA-1 checksum at offsets ng lahat ng seksyon. Ang validation ng header — unang hakbang sa pag-load ng DEX ng virtual machine.
Ang string_ids, type_ids, proto_ids, field_ids, method_ids — ay mga naka-index na talaan. Sa halip na mag-imbak ng buong pangalan sa code ng method, ginagamit ang 4-byte na index. Ito ang pangunahing optimization: kung ang isang klase ay binanggit ng 100 beses, ang pangalan nito ay iniimbak nang isang beses sa string_ids. dex2oat sa compilation ng ART ay karagdagang nag-o-optimize ng mga talaang ito.
Ang proseso ng pagbabago ng source code sa DEX ay binubuo ng ilang yugto. Ang modernong chain ay gumagamit ng D8 compiler, na pumalit sa DX noong 2018 kasama ang Android Gradle Plugin 3.2.
javac (para sa Java) o kotlinc (para sa Kotlin) ay nagco-compile ng source code sa .class files. Bawat klase — hiwalay na .class file sa Java bytecode. Sa yugtong ito, ginagawa ang type checking, pagbuo ng bridge methods, at pag-embed ng constants.
D8 ay tumatanggap ng lahat ng .class files at ginagawa itong DEX bytecode. Gumagawa ang D8 ng ilang optimization: nagtatanggal ng hindi ginagamit na method arguments, pinagsasama ang constant pools mula sa iba't ibang .class sa iisang global DEX pool, nagco-convert ng JVM stack instructions sa Dalvik register instructions.
// Kotlin source code
data class User(
val name: String,
val email: String
)
fun greet(user: User): String {
return "Hello, ${user.name}!"
}
Pagkatapos ng D8 compilation, ang code na ito ay nagiging compact na DEX instructions: const-string para mag-load ng string, iget-object para ma-access ang field ng object, invoke-virtual para tawagin ang StringBuilder.append.
D8 ay 2–3 beses na mas mabilis kaysa sa DX, gumagawa ng mas compact na DEX (5–10%) at mas mahusay na nag-o-optimize ng Kotlin-specific constructs (inline functions, lambda). Ang DX ay idineklarang deprecated mula 2018 at tinanggal mula sa Android Gradle Plugin 8.0.
Ang pag-execute ng DEX code sa Android ay dumaan sa dalawang yugto: ang orihinal na Dalvik virtual machine (Android 2.2–4.4) at Android Runtime ART (Android 5.0+). Ang pagkakaiba sa approach sa compilation ay malaki.
Dalvik ay gumamit ng Just-In-Time (JIT) compilation: ang DEX bytecode ay ini-interpret, at ang madalas na tinatawag na method ay nico-compile sa native code on-the-fly. Bentahe — mabilis na pag-install. Disbentahe — mas mabagal na startup at patuloy na CPU load para sa JIT.
ART (Android Runtime) ay nagco-compile ng DEX sa native code kapag ini-install ang application sa pamamagitan ng dex2oat. Ito ay Ahead-Of-Time (AOT) approach: mas matagal ang pag-install, ngunit mas mabilis ang startup at mas mababa ang energy consumption. Mula Android 7.0, ang ART ay gumagamit ng hybrid approach — AOT + JIT + Profile Guided Optimization.
Ang tool na dex2oat ay tumatakbo kapag nag-i-install o nag-a-update ng application. Ito ay nagco-compile ng DEX sa ELF file na may native code para sa architecture ng device. Resulta — .oat at .art files sa direktoryo /data/dalvik-cache/. Google ay patuloy na pinapabuti ang dex2oat: sa Android 14 ay idinagdag ang optimization para sa mga foldable device.
Ang limitasyon ng 65536 method sa isang DEX file — legacy mula sa Dalvik architecture. Ang field na method_ids sa header ng DEX ay sumasakop ng 4 bytes, na nagbibigay ng maximum na 2^16 = 65536 na unique na reference. Ang mga modernong application na may Google Play Services, Firebase, at iba pang SDK ay madaling lumampas sa limitasyong ito.
Multidex ay isang mekanismo ng paghahati ng code sa maraming DEX files. Ang pangunahing classes.dex ay naglalaman ng entry points (Application class, pangunahing Activity), ang iba — classes2.dex, classes3.dex at iba pa. Sa startup, ang mga klase mula sa karagdagang DEX ay nilo-load sa pamamagitan ng DexClassLoader.
// build.gradle.kts — pag-enable ng multidex
android {
defaultConfig {
multiDexEnabled = true
}
}
// Application class na may suporta sa multidex
class MyApp : Application() {
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
MultiDex.install(this)
}
}
Ang pag-load ng karagdagang DEX sa yugto ng startup ay maaaring magdulot ng ANR (Application Not Responding) sa mga device na may Android hanggang 5.0. Rekomendasyon — gamitin lamang ang multidex kung kinakailangan at i-minimize ang dependencies upang hindi lumampas sa limitasyon.
Optimization ng DEX — standard na yugto ng pagbuo ng release version ng Android application. Ang mga tool na R8 at ProGuard ay nagpapaliit ng DEX, nag-o-obfuscate ng code, at nagtatanggal ng hindi ginagamit na mga klase.
R8 — kahalili ng ProGuard, naka-embed sa Android Gradle Plugin mula 2019. Ginagawa ng R8 ang minification, obfuscation, at optimization sa isang pass, samantalang ang ProGuard ay nangangailangan ng dalawang yugto: ProGuard → D8. ProGuard ay suportado pa rin, ngunit inirerekomenda ng Google ang R8 para sa mga bagong proyekto.
Tinatanggal ng R8 ang hindi ginagamit na mga klase, method, at field, pinapalitan ang kanilang mga pangalan ng maiikling pangalan (a, b, c), ini-embed ang inline functions, at itinatapon ang dead code. Resulta — ang DEX ay nababawasan ng 20–40% nang walang pagkawala ng functionality.
Ang configuration ng R8 ay itinakda sa file na proguard-rules.pro. Maaaring tukuyin ng developer kung aling mga klase ang hindi dapat palitan ng pangalan (halimbawa, para sa reflection o Gson serialization). Firebase at iba pang SDK ay nagbibigay ng sarili nilang mga panuntunan sa kanilang mga dependencies.
Ang DEX ay maaaring i-decompile pabalik sa Java code. Ito ay pangunahing isyu sa seguridad ng Android applications: walang obfuscation, ang code ay naibabalik sa antas na malapit sa orihinal.
JADX — ang pinakasikat na decompiler ng DEX papuntang Java. Ito ay nagpapanumbalik ng mga pangalan ng klase, method, field, at karamihan sa logic. apktool ay nagde-decompile ng DEX sa smali code (Dalvik assembler) — low-level na representasyon na malapit sa orihinal na mga instruction. Bytecode Viewer ay pinagsasama ang ilang decompiler sa isang interface.
Obfuscation ng R8/ProGuard — unang linya ng depensa: ang mga pangalan ng klase at method ay nagiging hindi nababasa. DexGuard — komersyal na tool na may karagdagang pamamaraan: encryption ng string, integrity check, anti-tamper. Obfuscation sa antas ng Control Flow (O-LLVM) ay nagbabago sa structure ng code, pinapanatili ang functionality nito, ngunit pinapahirap ang analysis.
Mga madalas itanong
DEX ay gumagamit ng register architecture sa halip ng stack-based na JVM, may mas compact na format (30% mas maliit), pinagsasama ang lahat ng .class files sa isang file na may unified constant pool, at gumagamit ng 16-bit indices sa halip ng 8-bit.
Smali — ay assembler ng DEX bytecode. Bawat DEX instruction ay may tekstwal na representasyon sa smali format. Ang tool na baksmali ay nagco-convert ng DEX sa smali (disassembly), at ang smali ay nag-a-assemble ng smali pabalik sa DEX.
Gradle task countMethods o plugin na dex-method-counts ay nagpapakita ng bilang ng method sa bawat DEX file. Ang command na adb shell na may dumpsys ay nagpapakita rin ng statistics ng naka-load na DEX para sa mga naka-install na application.
Oo, sa mga device na may Android hanggang 8.0, ang maraming DEX ay nagpapabagal ng startup ng application dahil ang bawat karagdagang file ay nilo-load nang hiwalay. Sa ART na may Android 8.0+ ang pagkakaiba ay minimal dahil sa compilation ng dex2oat sa iisang .oat file.
Oo, may mga proyekto tulad ng dexplorer at Android-compatible na JVM implementations na maaaring mag-execute ng DEX bytecode sa labas ng Android. Gayunpaman, karamihan sa DEX files ay gumagamit ng Android API, na ginagawang hindi angkop ang mga ito para i-execute sa ordinaryong JVM.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din