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


82

После установки некоторых androidприложений я обнаружил, что на смартфоне он изменится на odexфайл (не apk). Как это бывает? Кто может меня научить, мне это очень интересно.

Ответы:


85

Статья в блоге в основном правильная, но не полная. Чтобы иметь полное представление о том, что делает файл odex, вы должны немного понять, как работают файлы приложений (APK).

Приложения в основном представляют собой прославленные ZIP-архивы. Код Java хранится в файле с именем classes.dex, и этот файл анализируется JVM Dalvik, а кэш обработанного файла classes.dex хранится в кэше Dalvik телефона.

Odex - это, по сути, предварительно обработанная версия файла classes.dex приложения, готовая к выполнению для Dalvik. Когда приложение odexed, класс classes.dex удаляется из архива APK и ничего не записывает в кеш Dalvik. Неодексированное приложение получает две копии файла classes.dex - упакованную в APK и обработанную в кэше Dalvik. Также требуется немного больше времени для запуска в первый раз, поскольку Dalvik должен извлечь и обработать файл classes.dex.

Если вы создаете собственное ПЗУ, неплохо было бы разместить как JAR-файлы фреймворка, так и стандартные приложения, чтобы максимально увеличить внутреннее пространство для хранения приложений, установленных пользователем. Если вы хотите тему, то просто deodex -> примените вашу тему -> reodex -> отпустите.

Чтобы собственно деодексировать, используйте small и baksmali:

https://github.com/JesusFreke/smali/wiki/DeodexInstructions


Не могли бы вы рассказать о том, как мы можем повторно кодировать apk-файл?
Basher51 07

23

В этой статье блога объясняется внутреннее устройство файлов ODEX:

ЧТО ТАКОЕ ФАЙЛ ODEX?

В файловой системе Android приложения поставляются в виде пакетов с расширением .apk. Эти пакеты приложений или APK-файлы содержат определенные файлы .odex, предназначенные для экономии места. Эти файлы «odex» на самом деле представляют собой наборы частей приложения, которые оптимизируются перед загрузкой. Это ускоряет процесс загрузки, так как предварительно загружает часть приложения. С другой стороны, это также затрудняет взлом этих приложений, потому что часть кода уже была извлечена в другое место перед выполнением.


Если я надеюсь, что у моего приложения такая же функция (приложения работают в odex, а не в APK), как это сделать?
user1253435 07

У вас должен быть минус! Далвик не оптимизирует время загрузки. Код оптимизирован как в компиляторе с языка высокого уровня на язык более низкого уровня, только в этом случае код для dalvik является почти переводом в машинный код. По этой причине вы можете создать приложение на C ++, а не только на java.
cox

Вы в этом уверены APKs contain certain .odex files?!
Amir

3

ИЗОБРАЗИТЕЛЬНОЕ ИСКУССТВО

Согласно документам: http://web.archive.org/web/20170909233829/https://source.android.com/devices/tech/dalvik/ настроить .odexфайл:

содержит код, скомпилированный AOT для методов в APK.

Кроме того, они кажутся обычными общими библиотеками, поскольку, если вы получите какое-либо приложение, проверьте:

file /data/app/com.android.appname-*/oat/arm64/base.odex

он говорит:

base.odex: ELF shared object, 64-bit LSB arm64, stripped

и aarch64-linux-gnu-objdump -d base.odexвроде работает и дает какую-то осмысленную разборку (но и некоторые мусорные разделы).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.