Что такое формат файла DEX?
Файл .dex - это Dalvik Executable, контейнер со скомпилированным байт-кодом, предназначенный для работы в среде системы Android. Он содержит код, готовый к выполнению на Android, и изначально интерпретировался виртуальной машиной Dalvik. Начиная с Android 5.0 (Lollipop), современная среда ART (Android Runtime) компилирует байт-код .dex заранее (AOT), а не интерпретирует его, но формат остается стандартным форматом исполняемых файлов Android.
Файлы DEX в пакетах APK
Файлы .dex обычно находятся внутри пакетов APK, которые используются для установки программного обеспечения на Android. Исторически каждый APK содержал один файл classes.dex, в котором хранились все классы и методы, используемые приложением. Крупные приложения теперь используют multidex - разделение кода на classes.dex, classes2.dex, classes3.dex и так далее, чтобы преодолеть лимит в 65 536 методов, накладываемый одним файлом.
Создание и проверка файлов DEX
Файл .dex может быть создан автоматически в процессе сборки Android или вручную. Современный инструментарий использует компилятор d8 (часть Android SDK build-tools) для перевода байт-кода Java или Kotlin в формат .dex. Каждый файл начинается с магической сигнатуры dex\n, за которой следует трехзначный номер версии формата (например, 035, 037, 038 или 039) и нулевой байт. Во время установки ART дополнительно компилирует .dex в нативный код, создавая файлы .odex или .vdex, хранящиеся на устройстве.
Безопасность и защита
РИСК: MEDIUMСам по себе .dex не запускается на вашем ПК, поэтому простое его наличие не представляет риска. Реальный контекст - анализ вредоносного ПО для Android: вредоносные приложения скрывают свою логику в DEX (иногда загружая ее динамически), поэтому .dex, извлеченный из ненадежного APK, может содержать вредоносный код. Проверяйте такие файлы только в безопасной среде (декомпилятор/песочница), никогда не устанавливая родительский APK. Остерегайтесь сомнительных сайтов для загрузки «dex to exe / dex opener» - они не делают ничего полезного и часто содержат рекламное ПО.
Детали формата
в двух словахПрограммы, открывающие файлы DEX
Технические подробности
глубокая спецификация| Архитектура ВМ | Регистровая (в отличие от стековой JVM; каждая инструкция DEX явно называет операнды регистров, что сокращает общее количество инструкций) |
| Магические байты | 8 байт со смещением 0: ASCII «dex», перевод строки (0x0A), 3-значная версия формата (например, 035, 037, 038, 039), нулевой байт (0x00) |
| Версии формата | 035 (Android 2.2), 037 (Android 7.0), 038 (Android 8.0), 039 (Android 9+); цифры версии встроены в магический заголовок |
| Лимит индекса методов | 65 536 методов на один файл .dex (16-битный индекс ссылки на метод); приложения, превышающие этот предел, разделяют код на classes2.dex, classes3.dex и т. д. |
| Поля целостности | Заголовок содержит контрольную сумму Adler-32 и 20-байтовую подпись SHA-1, которые вместе охватывают остальную часть файла |
| Пул строк | Все строковые литералы сохраняются один раз в общем пуле строк с дедупликацией; байт-код ссылается на строки по целочисленному индексу |
| Порядок байтов | Little-endian по умолчанию; заголовок содержит константу порядка байтов 0x12345678 для обнаружения обратного порядка |
| Исходные языки | Java и Kotlin (и любой язык, ориентированный на JVM); компилятор d8 преобразует байт-код .class или архивы .jar в DEX |
| Компилятор сборки | d8 (Android SDK build-tools 28.0.1+) заменил устаревший инструмент dx; принимает файлы .class или архивы .jar в качестве входных данных |
| AOT-компиляция ART | При установке dex2oat в ART преобразует .dex в нативный машинный код, сохраняя результаты в виде файлов .odex / .oat в /data/dalvik-cache |
| MIME-тип | application/octet-stream (выделенного зарегистрированного MIME-типа для формата DEX не существует) |
| История выполнения | Интерпретировался Dalvik VM с JIT (Android 1.0-4.4); компилируется ART (AOT + JIT на основе профилей) (Android 5.0+) |
| Дизассемблирование и декомпиляция | baksmali дизассемблирует .dex в ассемблер Smali; jadx и подобные инструменты декомпилируют .dex обратно в читаемый исходный код Java |
| Расположение внутри APK | Хранится без сжатия внутри ZIP-архива APK; основной файл всегда называется classes.dex, начиная с classes2.dex для приложений с multidex |
| Выпущен | 2008 (Android 1.0; Dalvik VM, executed by ART since Android 5.0) |
| Открыть стандартное | Да · без роялти |
| Спецификация | source.android.com |
Конвертации DEX
Вопросы и ответы сообщества
спрошено пользователямиВопросов пока нет - станьте первым, кто спросит о файлах DEX.