Was sind .dex-Dateien in Android?


193

Ich habe einige Fragen zu Dex-Dateien

  • Was ist eine dexDatei in Android?
  • Wie funktioniert Dex für Android?
  • Wie werden sie beim Debuggen einer Android-App verwendet?
  • Sind sie Java-Klassendateien ähnlich?

Ich brauche spezielle Informationen, bitte helfen Sie dabei und echte Beispiele sind willkommen!



Antworten:


226

Über die .dex-Datei:

Eine der bemerkenswertesten Eigenschaften des Dalvik Virtual Machine(Arbeitspferdes unter dem Android-System) ist, dass es keinen Java-Bytecode verwendet. Stattdessen wurde ein selbst entwickeltes Format namens DEX eingeführt, und nicht einmal die Bytecode-Anweisungen sind mit den Java-Bytecode-Anweisungen identisch.

Compiled Android application code file.

Android-Programme werden in .dex(Dalvik Executable) Dateien kompiliert , die wiederum in eine einzelne .apkDatei auf dem Gerät komprimiert werden. .dexDateien können erstellt werden, indem kompilierte Anwendungen, die in der Programmiersprache Java geschrieben sind, automatisch übersetzt werden.

Dex-Dateiformat:

 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 hat Dokumentation zu den Dalvik Executable Format( .dex- Dateien). Weitere Informationen finden Sie in den offiziellen Dokumenten: Dex-Dateiformat

.dex Dateien ähneln Java-Klassendateien, wurden jedoch unter der Dalkvik Virtual Machine (DVM) in älteren Android-Versionen ausgeführt und bei der Installation auf dem Gerät zu nativem Code mit ART in neueren Android-Versionen kompiliert.

Sie können decompile.dex mit dem dexdumpTool, das in android-sdk bereitgestellt wird.

Es gibt auch einige Reverse Engineering-Techniken , um eine jar fileoder java class fileaus einer .dexDatei zu erstellen.


Meine JAR-Datei enthält XML im Assets-Ordner. Ich möchte, dass dies Teil von .dex ist. Haben Sie eine Idee, wie Sie dies implementieren können?
AndroidGuy

@AndroidGuy - Die Jar-Datei enthält kein Android-Ressourcenpaket (/ Asset), für das Sie das Android Library Package verwenden müssen.
user370305

Wie funktioniert es auf ART, auf Android Lollipop? Welche Dateien werden dort verwendet und in welchem ​​Pfad? Einige sagten, es werde mehr Platz brauchen. Ist es wahr? Wenn ja, wie kommt es? Ich meine, nativer Code scheint immer viel kleiner als Bytecode zu sein, und Dex-Dateien ähneln dem Bytecode in Bezug auf die Funktionsweise.
Android-Entwickler

Eine wichtige Sache zu beachten ist, dass dexdumpes sich nicht um einen Dekompiler, sondern um einen Disassembler handelt
Dschingishan

90
.dex file

Kompilierte Android-Anwendungscodedatei.

Android-Programme werden in .dex-Dateien (Dalvik Executable) kompiliert, die wiederum in eine einzelne .apk-Datei auf dem Gerät komprimiert werden. .dex-Dateien können von Android automatisch erstellt werden, indem die kompilierten Anwendungen in die Programmiersprache Java übersetzt werden.


2
Meine JAR-Datei enthält XML im Assets-Ordner. Ich möchte, dass dies Teil von .dex ist. Haben Sie eine Idee, wie Sie dies implementieren können?
AndroidGuy

87

dex Datei ist eine Datei, die auf der Dalvik VM ausgeführt wird.

Dalvik VM enthält mehrere Funktionen zur Leistungsoptimierung, -verifizierung und -überwachung, darunter Dalvik Executable (DEX) .

Java-Quellcode wird vom Java-Compiler in .classDateien kompiliert . Anschließend verarbeitet das dx(Dexer-) Tool, das Teil des Android SDK ist, die .classDateien in ein Dateiformat namens DEXDalvik-Bytecode. Das dxTool eliminiert alle redundanten Informationen, die in den Klassen vorhanden sind. In DEXallen Klassen der Anwendung sind in einer Datei gepackt. Die folgende Tabelle bietet einen Vergleich zwischen den Codegrößen für JVM-JAR-Dateien und den vom dexTool verarbeiteten Dateien .

In der Tabelle werden die Codegrößen für Systembibliotheken, Webbrowseranwendungen und eine Allzweckanwendung (Wecker-App) verglichen. In allen Fällen reduzierte das Dex-Tool die Größe des Codes um mehr als 50%.

Geben Sie hier die Bildbeschreibung ein

In Standard-Java-Umgebungen führt jede Klasse in Java-Code zu einer .classDatei. Das heißt, wenn die Java-Quellcodedatei eine öffentliche Klasse und zwei anonyme Klassen hat, beispielsweise für die Ereignisbehandlung, erstellt der Java-Compiler insgesamt drei .classDateien.

Der Kompilierungsschritt ist auf der Android-Plattform identisch, sodass mehrere .classDateien erstellt werden. Nachdem die .classDateien generiert wurden, werden mit dem Tool "dx" alle .classDateien in eine einzelne .dexoder Dalvik Executable-Datei konvertiert . Es ist die .dexDatei, die auf der Dalvik-VM ausgeführt wird. Die .dexDatei wurde für die Speichernutzung optimiert und das Design basiert hauptsächlich auf der gemeinsamen Nutzung von Daten.


18
Gute Infos. Nur eine Sache, auf die man hinweisen muss. Manchmal gibt es mehrere Dex-Dateien, da die Anzahl der Anweisungen für Methodenaufrufe begrenzt ist. Diese Grenze liegt bei 65.000 Methoden. In diesem Fall befindet sich Ihr Code nicht in einer einzelnen Datei, sondern in 2 oder mehr, aber alles andere gilt weiterhin. Da auch das Laden dynamischer Klassen verfügbar ist, können Sie Code (wieder in dexierter Form) aus Dateien laden, sodass sich der Code in mehreren Dex-Dateien befindet.
Igor Čordaš
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.