Am 5. November 2007 ist der öffentliche Startschuss für die neue Smartphone-Plattform Android gefallen. Android basiert auf dem Betriebssystem-Kern Linux und besitzt eine virtuelle Maschine mit dem Namen Dalvik. Zur Erstellung von Applikationen wird auf die Programmiersprache Java zurückgegriffen. Doch was bzw. wo ist Dalvik? Gibt man mal "Dalvik" in Google-Maps ein erscheint eine Karte von Island auf dem Bildschirm - Dalvik ist eine kleinere Stadt im Norden von Island. Der bzw. die Entwickler der Dalvik Virtual Machine scheinen eine Verbindung zur besagten Gemeinde zu haben. Der zur virtuellen Maschine gehörende Bytecode wird als Dalvik-Bytecode bezeichnet und ist für eine Registermaschine ausgelegt. Dalvik-Bytecode wird in Dateien mit der Endung .dex abgelegt (dalvik executable). Dabei unterliegen die einzelnen Zahlenwerte der .dex-Datei einem eigenen Format, dem Dex File Format.
Für eine Beispieldatei classes.dex kann dieses Format gegliedert sein zu:
classes.dex
header:
header_file_signature (bytes): 100 101 120 10 48 48 57 0
header_1 (bytes): 65 54 35 141
header_2 (bytes): 60 141 61 87 68 75 195 95 199 97 5 66 32
252 0 100 245 158 129 17
header_length_file: 2364
header_length_header: 92
header_padding (bytes): 0 0 0 0 0 0 0 0
header_string_table_entries: 36
header_string_table_offset: 92
header_8 (bytes): 1 0 0 0
header_class_list_entries: 9
header_class_list_offset: 380
header_field_table_entries: 3
header_field_table_offset: 416
header_method_table_entries: 13
header_method_table_offset: 452
header_class_definition_table_entries: 6
header_class_definition_table_offset: 608
string table:
0. offset: 1806, length: 14, Hello Android!
1. offset: 1692, length: 3, ()V
2. offset: 1696, length: 28, (Landroid/content/Context;)V
3. offset: 1725, length: 22, (Landroid/os/Bundle;)V
4. offset: 1748, length: 22, (Landroid/view/View;)V
5. offset: 1771, length: 27, (Ljava/lang/CharSequence;)V
6. offset: 1799, length: 6,
7. offset: 1821, length: 17, HelloAndroid.java
8. offset: 1839, length: 1, I
9. offset: 1841, length: 19, Landroid/os/Bundle;
10. offset: 1861, length: 25, Landroid/widget/TextView;
11. offset: 1887, length: 33, Ltest/android/hello/
HelloAndroid;
12. offset: 1921, length: 27, Ltest/android/hello/R$attr;
13. offset: 1949, length: 31, Ltest/android/hello/
R$drawable;
14. offset: 1981, length: 29, Ltest/android/hello/R$layout;
15. offset: 2011, length: 29, Ltest/android/hello/R$string;
16. offset: 2041, length: 22, Ltest/android/hello/R;
17. offset: 2064, length: 6, R.java
18. offset: 2071, length: 20, android/app/Activity
19. offset: 2092, length: 23, android/widget/TextView
20. offset: 2116, length: 8, app_name
21. offset: 2125, length: 6, icicle
22. offset: 2132, length: 4, icon
23. offset: 2137, length: 16, java/lang/Object
24. offset: 2154, length: 4, main
25. offset: 2159, length: 8, onCreate
26. offset: 2168, length: 14, setContentView
27. offset: 2183, length: 7, setText
28. offset: 2191, length: 31, test/android/hello/
HelloAndroid
29. offset: 2223, length: 20, test/android/hello/R
30. offset: 2244, length: 25, test/android/hello/R$attr
31. offset: 2270, length: 29, test/android/hello/R$drawable
32. offset: 2300, length: 27, test/android/hello/R$layout
33. offset: 2328, length: 27, test/android/hello/R$string
34. offset: 2356, length: 4, this
35. offset: 2361, length: 2, tv
class list:
0. string pool index: 28, test/android/hello/HelloAndroid
1. string pool index: 32, test/android/hello/R$layout
2. string pool index: 29, test/android/hello/R
3. string pool index: 19, android/widget/TextView
4. string pool index: 30, test/android/hello/R$attr
5. string pool index: 33, test/android/hello/R$string
6. string pool index: 31, test/android/hello/R$drawable
7. string pool index: 18, android/app/Activity
8. string pool index: 23, java/lang/Object
...
Die DEX-Datei beginnt mit den Zahlenwerten 100 101 120 10 48 48 57 0. Beachtet man die Codierung nach ASCII folgt: d e x LF 0 0 9 NULL. Der Datei-Header gibt schon die Struktur
der Datei wieder: String-Tabelle, Klassenliste, Feldtabelle, Methodentabelle und ein Byteabschnitt zur Defintion von Klassen. In der Beipiel-DEX-Datei sind sechs Klassendefinitionen vorhanden. Eine .class-Datei enthält die Defintion einer einzigen Klasse (Interface).
Aber Androiden sind keine Aliens: Mit Hife des im Android-SDK enthaltenen Tools dx können .class-Dateien in .dex-Dateien konvertiert werden.