Czym są pliki ODEX w systemie Android?

82

Po androidzainstalowaniu niektórych aplikacji stwierdziłem, że zmieni się na odexplik (nie apk) w smartfonie. Jak to się dzieje? Kto może mnie nauczyć, bardzo mnie to interesuje.

user1253435
źródło

Odpowiedzi:

85

Artykuł na blogu jest w większości poprawny, ale nie kompletny. Aby w pełni zrozumieć, co robi plik odex, musisz trochę zrozumieć, jak działają pliki aplikacji (APK).

Aplikacje są w zasadzie gloryfikowanymi archiwami ZIP. Kod java jest przechowywany w pliku o nazwie classes.dex i ten plik jest analizowany przez maszynę Dalvik JVM, a pamięć podręczna przetworzonego pliku classes.dex jest przechowywana w pamięci podręcznej Dalvik telefonu.

Odex jest w zasadzie wstępnie przetworzoną wersją class.dex aplikacji, która jest gotowa do wykonania dla Dalvik. Kiedy aplikacja jest odexed, class.dex jest usuwany z archiwum APK i nie zapisuje niczego w pamięci podręcznej Dalvik. Aplikacja, która nie jest odexed, kończy się z 2 kopiami pliku classes.dex - spakowaną w pliku APK i przetworzoną w pamięci podręcznej Dalvik. Pierwsze uruchomienie zajmuje trochę więcej czasu, ponieważ Dalvik musi wyodrębnić i przetworzyć plik classes.dex.

Jeśli tworzysz niestandardową pamięć ROM, naprawdę dobrym pomysłem jest odeksowanie zarówno plików JAR platformy, jak i aplikacji magazynowych, aby zmaksymalizować wewnętrzną przestrzeń dyskową dla aplikacji zainstalowanych przez użytkownika. Jeśli chcesz motywować, po prostu deodex -> zastosuj swój motyw -> reodex -> zwolnij.

Aby faktycznie deodeksować, użyj small i baksmali:

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

Nathan Strong
źródło
Czy możesz udostępnić, jak możemy ponownie przetworzyć plik APK?
Basher51
23

Ten artykuł na blogu wyjaśnia wewnętrzne funkcje plików ODEX:

CZYM JEST PLIK ODEX?

W systemie plików Android aplikacje są dostarczane w pakietach z rozszerzeniem .apk. Te pakiety aplikacji lub pliki APK zawierają określone pliki .odex, których rzekomą funkcją jest oszczędność miejsca. Te pliki „odex” to w rzeczywistości zbiory części aplikacji, które są zoptymalizowane przed uruchomieniem. Takie postępowanie przyspiesza proces uruchamiania, ponieważ wstępnie ładuje część aplikacji. Z drugiej strony utrudnia również hakowanie tych aplikacji, ponieważ część kodu została już wyodrębniona do innej lokalizacji przed wykonaniem.

theomega
źródło
Jeśli mam nadzieję, że moja aplikacja ma tę samą funkcję (aplikacje działają w odex, a nie w APK), jak to zrobić?
user1253435
Powinieneś dostać minus! Dalvik nie optymalizuje czasu rozruchu. Kod jest zoptymalizowany jak w kompilatorze z języka wysokiego poziomu na język niższego poziomu, tyle tylko, że w tym przypadku kod dla dalvik jest prawie tłumaczeniem na kod maszynowy. To jest powód, dla którego możesz stworzyć aplikację w C ++, a nie tylko w Javie.
Cox
Jesteś tego pewien APKs contain certain .odex files?!
Amir Rezazadeh
3

SZTUKA

Zgodnie z docs: http://web.archive.org/web/20170909233829/https://source.android.com/devices/tech/dalvik/configure o .odexpliku:

zawiera skompilowany kod AOT dla metod w APK.

Co więcej, wydają się być zwykłymi bibliotekami współdzielonymi, ponieważ jeśli masz jakąś aplikację, i sprawdź:

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

to mówi:

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

i aarch64-linux-gnu-objdump -d base.odexwydaje się działać i daje jakiś znaczący demontaż (ale także niektóre sekcje śmieci).

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
źródło