Что такое файлы .dex в Android?


193

У меня есть несколько вопросов относительно файлов dex

  • Что такое dexфайл в Android?
  • Как работает dex для Android?
  • Как они используются при отладке приложения для Android?
  • Они похожи на файлы классов Java?

Мне нужна конкретная информация, пожалуйста, помогите по этому вопросу, и любые реальные примеры приветствуются!


Пожалуйста, видел эту ссылку stackoverflow.com/questions/1249973/…
Gensheriff

Ответы:


226

О файле .dex:

Одна из самых замечательных особенностей Dalvik Virtual Machine(рабочая лошадка в системе Android) заключается в том, что она не использует байт-код Java. Вместо этого был введен собственный формат, называемый DEX, и даже инструкции байт-кода не совпадают с инструкциями байт-кода Java.

Compiled Android application code file.

Программы Android скомпилированы в .dex(исполняемые файлы Dalvik) файлы, которые, в свою очередь, упакованы в один .apkфайл на устройстве. .dexфайлы могут быть созданы путем автоматического перевода скомпилированных приложений, написанных на языке программирования Java.

Формат файла Dex:

 1. File Header
 2. String Table
 3. Class List
 4. Field Table
 5. Method Table
 6. Class Definition Table
 7. Field List
 8. Method List
 9. Code Header
10. Local Variable List

У Android есть документация Dalvik Executable Format( файлы .dex ). Вы можете узнать больше на официальных документах: Dex File Format

.dex файлы похожи на файлы классов java, но они запускались под виртуальной машиной Dalkvik (DVM) в более старых версиях Android и компилировались во время установки на устройстве в собственный код с помощью ART на более новых версиях Android.

Вы можете decompile.dex, используя dexdumpинструмент, который предоставляется в Android-SDK.

Существуют также некоторые методы обратного проектирования для создания jar fileили java class fileиз .dexфайла.


Мой файл JAR содержит некоторые XML в папке активов. Я хочу, чтобы это было частью .dex Есть идеи, как это реализовать?
AndroidGuy

@AndroidGuy - Jar-файл не содержит пакета ресурсов Android (/ asset), для этого вы должны использовать пакет Android Library.
user370305

Как это работает на ART, на Android Lollipop? Какие файлы там используются и по какому пути? Некоторые говорили, что это займет больше места. Это правда? Если так, как получилось? Я имею в виду, что нативный код, кажется, всегда намного меньше байт-кода, а файлы dex похожи на байт-код с точки зрения его работы.
Android-разработчик

Важно отметить, что dexdumpэто не декомпилятор, а дизассемблер
Чингисхан

90
.dex file

Скомпилированный файл кода приложения Android.

Программы Android скомпилированы в файлы .dex (исполняемые Dalvik), которые, в свою очередь, заархивированы в один файл .apk на устройстве. Файлы .dex могут создаваться автоматически Android путем перевода скомпилированных приложений, написанных на языке программирования Java.


2
Мой файл JAR содержит некоторые XML в папке активов. Я хочу, чтобы это было частью .dex Есть идеи, как это реализовать?
AndroidGuy

87

dex файл - это файл, который выполняется на виртуальной машине Dalvik.

Dalvik VM включает в себя несколько функций для оптимизации, проверки и мониторинга производительности, одной из которых является Dalvik Executable (DEX) .

Исходный код Java компилируется компилятором Java в .classфайлы. Затем dxинструмент (dexer), входящий в состав Android SDK, обрабатывает .classфайлы в формате, называемом, DEXкоторый содержит байт-код Dalvik. dxИнструмент устраняет все избыточную информацию, которая присутствует в классах. Во DEXвсех классах приложения упакованы в один файл. В следующей таблице приведено сравнение размеров кода для jar-файлов JVM и файлов, обрабатываемых dexинструментом.

В таблице сравниваются размеры кода для системных библиотек, приложений веб-браузера и приложения общего назначения (приложение будильника). Во всех случаях инструмент dex уменьшал размер кода более чем на 50%.

введите описание изображения здесь

В стандартных средах Java каждый класс в коде Java приводит к одному .classфайлу. Это означает, что если файл исходного кода Java имеет один открытый класс и два анонимных класса, скажем, для обработки событий, то компилятор java создаст всего три .classфайла.

Шаг компиляции такой же на платформе Android, что приводит к нескольким .classфайлам. Но после .classгенерации файлов инструмент «dx» используется для преобразования всех .classфайлов в один .dexили исполняемый файл Dalvik. Это .dexфайл, который выполняется на виртуальной машине Dalvik. .dexФайл был оптимизирован для использования памяти и дизайна в основном за счет совместного использования данных.


18
Хорошая информация Просто одна вещь, чтобы указать. Иногда может быть несколько файлов dex из-за ограничения числа команд вызова метода. Этот предел составляет 65 тыс. Методов. В этом случае ваш код будет находиться не в одном файле, а в 2 или более, но все остальное применимо по-прежнему. Кроме того, поскольку динамическая загрузка классов также доступна, вы можете загружать код (снова в дексированной форме) из файлов, и, таким образом, код будет находиться в нескольких файлах dex.
Игорь Чордаш
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.