Czym są pliki ODEX w systemie Android?


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


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.


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).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.