Ausführbares Dalvik-Format

In diesem Dokument werden das Layout und der Inhalt von .dex beschrieben. -Dateien, die eine Reihe von Klassendefinitionen und die zugehörigen Zusatzdaten.

Anleitung zu Typen

Name Beschreibung
Byte 8-Bit-Int
Ubyte 8-Bit-Int ohne Vorzeichen
kurz 16-Bit-Signiert int, Little-Endian
Ushort 16-Bit, unsignierte Anmeldung, Little-Endian
int 32-Bit-Signiert int, Little-Endian
Uint 32-Bit ohne Vorzeichen, Little-Endian
long 64-Bit-Signiert int, Little-Endian
Ulong 64-Bit, unsignierte Anmeldung, Little-Endian
sleb128 signiert LEB128, variable Länge (siehe unten)
Uleb128 LEB128 ohne Vorzeichen, variable Länge (siehe unten)
Uleb128p1 LEB128 ohne Vorzeichen plus 1, variable Länge (siehe unten)

LEB128

LEB128 ("Little-Endian Base 128") ist ein Codierung mit variabler Länge für beliebige vorzeichenbehaftete oder vorzeichenlose Ganzzahlen Das Format war von DWARF3 übernommen Spezifikation zu ändern. In einer .dex-Datei wird LEB128 ausschließlich für Folgendes verwendet: 32-Bit-Mengen zu codieren.

Jeder LEB128-codierte Wert besteht aus einem bis fünf Byte, die zusammen einen einzelnen 32-Bit-Wert darstellen. Jedes Bei Byte ist das höchstwertige Bit gesetzt, mit Ausnahme des letzten Byte im -Sequenz, deren wichtigstes Bit klar ist. Die verbleibenden 7 Bits von jedem Byte sind Nutzlasten, wobei die niedrigstwertige sieben der Anzahl im ersten Byte, in den nächsten sieben im zweiten Byte Byte usw. Im Fall eines unterzeichneten LEB128 (sleb128) ist das höchstwertige Nutzlast-Bit des letzten Bytes in der Sequenz, um den Endwert zu erzeugen. Im nicht signierten Fall (uleb128), sind alle nicht explizit dargestellten Bits als 0 interpretiert.

Bitweises Diagramm eines Zwei-Byte-LEB128-Werts
Erstes Byte Zweites Byte
1 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 0 Bit13 Bit12 Bit11 Bit10 Bit9 Bit8 Bit7

Die Variante uleb128p1 wird für ein signiertes Wert, wobei der codierte Wert plus eins dargestellt wird als uleb128. Dadurch wird die Codierung von -1 (alternativ als vorzeichenloser Wert 0xffffffff angesehen) - aber keine andere negative Zahl - ein einzelnes Byte und ist in denen die dargestellte Zahl entweder nicht negativ oder -1 (oder 0xffffffff) sein, und keine anderen negativen Werte zulässig sind (oder große, vorzeichenlose -Werte wahrscheinlich nicht erforderlich sind).

Hier einige Beispiele für Formate:

Codierte Sequenz Als sleb128 Als uleb128 Als uleb128p1
0000-1
01110
7f-1127126
80 7f-1281625616255

Dateilayout

Name Format Beschreibung
Überschrift Header-Element der Header
String-IDs string_id_item[] Liste der Zeichenfolgenkennungen. Dies sind Kennungen für alle Strings, von dieser Datei verwendet, entweder für die interne Benennung (z.B. Typdeskriptoren) oder als konstante Objekte bezeichnet, auf die durch Code verwiesen wird. Diese Liste muss sortiert werden durch Zeichenfolgeninhalte unter Verwendung von UTF-16-Codepunktwerten (nicht in je nach Sprache) und darf keine doppelten Einträge enthalten.
Typ-IDs type_id_item[] Liste der Typenkennungen. Dies sind Kennungen für alle Typen (Klassen, Arrays oder primitive Typen), auf die in dieser Datei verwiesen wird, unabhängig davon, ob diese definiert wurden in der Datei ist oder nicht. Diese Liste muss nach string_id sortiert werden und darf keine doppelten Einträge enthalten.
proto_ids proto_id_item[] Liste der Prototyp-Identifikatoren. Dies sind Kennungen für alle auf die in dieser Datei verwiesen wird. Diese Liste muss sortiert werden in Rückgabetyp (nach type_id-Index) und dann Nach Argumentliste (lexikografische Sortierung, einzelne Argumente sortiert nach type_id-Index). Die Liste darf nicht doppelte Einträge enthalten.
Feld-IDs Feld_ID_Element[] Feldkennungen. Dies sind Kennungen für alle Felder auf die in dieser Datei verwiesen wird, unabhängig davon, ob sie in der Datei definiert ist oder nicht. Dieses Liste muss sortiert werden, wobei der definierende Typ (nach type_id) Index) ist die Hauptreihenfolge, Feldname (nach string_id-Index) ist die Zwischenreihenfolge und der Typ (nach type_id-Index) ist die Nebenreihenfolge. Die Liste darf keine doppelten Einträge enthalten.
method_ids method_id_item[] Liste der Methodenkennungen. Dies sind Kennungen für alle Methoden auf die in dieser Datei verwiesen wird, unabhängig davon, ob sie in der Datei definiert ist oder nicht. Dieses Liste muss sortiert werden, wobei der definierende Typ (nach type_id) Index) ist die Hauptreihenfolge, Methodenname (nach string_id) ist die Zwischenreihenfolge und die Methode „Prototype“ (nach proto_id-Index) die Nebenanordnung ist. Die Liste darf nicht doppelte Einträge enthalten.
Klassendefinitionen class_def_item[] Liste der Klassendefinitionen. Die Klassen müssen so geordnet sein, dass eine bestimmte Die Basisklasse und implementierten Schnittstellen der Klasse werden in der vor der verweisenden Klasse stehen. Außerdem ist es ungültig für eine Definition für dieselbe Klasse mit demselben Namen, die mehrmals in auf der Liste.
Anruf-Website-IDs call_site_id_item[] Liste der Website-IDs für Anrufe enthält. Dies sind Kennungen für alle Anrufwebsites. auf die in dieser Datei verwiesen wird, unabhängig davon, ob sie in der Datei definiert ist oder nicht. Diese Liste muss in aufsteigender Reihenfolge nach call_site_off sortiert werden.
Methoden-Handles method_handle_item[] Handles list. Eine Liste aller Methoden-Handles, auf die diese Datei verweist, unabhängig davon, ob die Datei in der Datei definiert ist oder nicht. Diese Liste ist nicht sortiert und enthält möglicherweise Duplikate, die logisch verschiedenen Methoden-Handle-Instanzen entsprechen.
Daten ubyte[] Datenbereich mit allen Supportdaten für die oben aufgeführten Tabellen. Verschiedene Elemente haben unterschiedliche Ausrichtungsanforderungen und Padding-Byte werden gegebenenfalls vor jedem Element eingefügt, falls erforderlich, um korrekt ausgerichtet sind.
link_data (Link-Daten) ubyte[] Daten, die in statisch verknüpften Dateien verwendet werden. Das Format der Daten Dieser Abschnitt wird in diesem Dokument nicht angegeben. Dieser Abschnitt ist in nicht verknüpften Dateien und Laufzeitimplementierungen leer kann es nach eigenem Ermessen verwenden.

Bitfeld-, String- und Konstantendefinitionen

DEX_DATEI_MAGIC

Eingebettet in „header_item“

Das konstante Array/String DEX_FILE_MAGIC ist die Liste der Byte, die am Anfang einer .dex-Datei stehen müssen damit sie als solche erkannt werden. Der Wert ist bewusst enthält einen Zeilenumbruch ("\n" oder 0x0a) und einen Nullbyte ("\0" oder 0x00) enthält, bei der Erkennung bestimmter Arten von Korruption. Der Wert codiert eine Versionsnummer des Formats mit drei Dezimalstellen, was mit der Zeit kontinuierlich zunehmen, während sich das Format weiterentwickelt.

ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 }
                        = "dex\n039\0"

Hinweis: Unterstützung für Version 039 des -Format wurde in der Android-Version 9.0 hinzugefügt, in der zwei neue Bytecodes, const-method-handle und const-method-type (Diese werden im Zusammenfassung des Bytecode-Satzes . In Android 10 wird das DEX-Dateiformat durch Version 039 um versteckte Dateien erweitert API-Informationen, die nur für DEX-Dateien im Bootklassenpfad gelten.

Hinweis: Versionsunterstützung 038 des Formats wurden in Android 8.0 hinzugefügt. Veröffentlichung. Version 038 hat neue Bytecodes hinzugefügt (invoke-polymorphic und invoke-custom) und Daten für Methoden-Handles.

Hinweis: Unterstützung für Version 037 von Das Format wurde in der Android-Version 7.0 hinzugefügt. Vor Version 037 am häufigsten -Versionen von Android haben Version 035 des Formats verwendet. Die einzige Unterschied zwischen den Versionen 035 und 037 ist der Hinzufügung von Standardmethoden und Anpassung der invoke.

Hinweis:Einige frühere Versionen dieses Formats wurden in allgemein verfügbaren öffentlichen Software-Releases verwendet werden. Beispiel: Version 009 wurde für die M3-Releases der Android-Plattform (November bis Dezember 2007), und Version 013 wurde für die M5-Releases von Android Plattform (Februar bis März 2008). In mehrfacher Hinsicht haben diese früheren Versionen des Formats erheblich von der hier beschriebenen Version unterscheiden. Dokument.

ENDIAN_CONSTANT und REVERSE_ENDIAN_CONSTANT

Eingebettet in „header_item“

Mit der Konstante ENDIAN_CONSTANT wird angegeben, Endianität der Datei, in der sie gefunden wurde. Obwohl der Standard Das Format von .dex ist Little-Endian, Implementierungen können gewählt werden um Byte-Swapping durchzuführen. Sollte bei einer Implementierung eine Header, dessen endian_tag REVERSE_ENDIAN_CONSTANT ist statt ENDIAN_CONSTANT würde die Datei wissen, für das erwartete Format mit Byte-Swapping durchgeführt wurde.

uint ENDIAN_CONSTANT = 0x12345678;
uint REVERSE_ENDIAN_CONSTANT = 0x78563412;

NO_INDEX

Eingebettet in class_def_item und debug_info_item

Mit der Konstante NO_INDEX wird angegeben, ein Indexwert fehlt.

Hinweis:Dieser Wert ist nicht als 0, da dies normalerweise ein gültiger Index ist.

Der ausgewählte Wert für NO_INDEX ist als einzelnes Byte in der uleb128p1-Codierung darstellbar.

uint NO_INDEX = 0xffffffff;    // == -1 if treated as a signed int

Definitionen für access_flags

Eingebettet in class_def_item, encoded_field, encoded_method und Innenklasse

Bitfelder dieser Flags werden verwendet, um die Barrierefreiheit und Gesamteigenschaften von Klassen und Klassenmitgliedern.

Name Wert Für Klassen (und InnerClass-Annotationen) Für Felder Für Methoden
ACC_PUBLIC 0x1 public: überall sichtbar public: überall sichtbar public: überall sichtbar
ACC_PRIVATE 0x2 * private: nur für die definierende Klasse sichtbar private: nur für die definierende Klasse sichtbar private: nur für die definierende Klasse sichtbar
GESCHÜTZT_GESCHÜTZT 0x4 * protected: sichtbar für Pakete und abgeleitete Klassen protected: sichtbar für Pakete und abgeleitete Klassen protected: sichtbar für Pakete und abgeleitete Klassen
ACC_STATIC 0x8 * static: ist nicht mit einer äußeren Referenz zu this static: global zur definierenden Klasse static: verwendet kein this-Argument
ACC_ENDGÜLTIGE 0x10 final: keine abgeleitete Klasse final: nach der Konstruktion unveränderlich final: nicht überschreibbar
ACC_SYNCHRONIZED (ACC_SYNCHRONIZED) 0x20     synchronized: zugehörige Sperre automatisch hergestellt für den Aufruf dieser Methode.

Hinweis:Dieses Feld kann nur festgelegt werden, wenn ACC_NATIVE ist ebenfalls festgelegt.

AKK-VOLATILE 0x40   volatile: spezielle Zugriffsregeln zur Unterstützung beim Thread Sicherheit  
ACC_BRIDGE 0x40     Brückenmethode, die vom Compiler automatisch als typsicher hinzugefügt wird Brücke
AKZE_TRANSIENT 0x80   transient: wird nicht als Standard-Serialisierung gespeichert  
ACC_VARARGS 0x80     Das letzte Argument sollte als „Ruhe“ behandelt werden. Argument nach Compiler
ACC_NATIVE 0x100     native: in nativem Code implementiert
ACC_BENUTZEROBERFLÄCHE 0x200 interface: multiplizierbare abstrakte Klasse    
ACC_ABSTRACT (ACC_ABSTRACT) 0x400 abstract: nicht direkt instanziierbar   abstract: von dieser Klasse nicht implementiert
ACC_STRICT (ACC_STRICT) 0x800     strictfp: strenge Regeln für die Gleitkommaarithmetik
ACC_SYNTHETISCH 0x1000 nicht direkt im Quellcode definiert nicht direkt im Quellcode definiert nicht direkt im Quellcode definiert
AKZEKHINWEIS 0x2000 als Anmerkungsklasse deklariert    
ACC_ENUM 0x4000 als Aufzählungstyp deklariert als Aufzählungswert deklariert  
(nicht verwendet) 0 x 8.000      
ACC_CONSTRUCTOR 0 x 10.000     Konstruktor-Methode (Klassen- oder Instanzinitialisierer)
ACC_DECLARED_
SYNCHRONIZED (SYNCHRONISIERT)
0 x 20.000     erklärte synchronized.

Hinweis:Dies hat keine Auswirkungen auf (außer in Anbetracht dieser Kennzeichnung an sich).

* Nur zulässig für InnerClass-Annotationen, und darf in einem class_def_item nicht aktiv sein.

Geänderte UTF-8-Codierung

Als Nachlass zur Vereinfachung des Legacy-Supports wurde das .dex-Format codiert seine Zeichenfolgendaten in einer De-facto-Standard-Modifizierte UTF-8-Form. auch als MUTF-8 bezeichnet. Dieses Formular entspricht dem Standard-UTF-8-Code, mit folgenden Ausnahmen:

  • Es werden nur die Ein-, Zwei- und Drei-Byte-Codierung verwendet.
  • Codepunkte im Bereich U+10000... U+10ffff sind als Ersatzwertpaar codiert, das jeweils die als codierter 3-Byte-Wert dargestellt wird.
  • Der Codepunkt U+0000 ist in Zwei-Byte-Form codiert.
  • Ein einfaches Nullbyte (Wert 0) zeigt das Ende von Einen String, ebenso wie die Interpretation der Standard-C-Sprache.

Die ersten beiden Elemente oben können wie folgt zusammengefasst werden: MUTF-8 ist ein Codierungsformat für UTF-16. Es ist kein direkter Codierungsformat für Unicode-Zeichen verwenden.

Mit den letzten beiden Punkten oben können Sie den Codepunkt U+0000 in einem String und bearbeiten weiterhin als C-ähnlicher String mit Nullabschluss.

Die spezielle Codierung von U+0000 bedeutet jedoch, dass im Gegensatz zu Normal UTF-8, das Ergebnis des Aufrufs der C-Standardfunktion strcmp() für ein Paar von MUTF-8-Strings bedeutet nicht immer, das richtig signierte Ergebnis des Vergleichs von ungleich-Strings anzeigen. Wenn die Reihenfolge (und nicht nur die Gleichheit) ein Problem ist, MUTF-8-Strings lassen sich Zeichen für Zeichen decodieren. und die decodierten Werte vergleichen. (Klügere Implementierungen sind jedoch ebenfalls möglich.)

Weitere Informationen finden Sie im Artikel Das Unicode- Standard. MUTF-8 ist näher an der (weniger bekannten) Codierung. CESU-8 als in UTF-8 nicht als Ganzes betrachtet.

codierte_Wert-Codierung

Eingebettet in „annotation_element“ und „encoded_array_item“

Ein encoded_value ist ein codiertes Teil eines (fast) beliebige hierarchisch strukturierte Daten. Die Codierung soll sowohl kompakt als auch einfach zu parsen sein.

Name Format Beschreibung
(value_arg << 5) | Werttyp Ubyte Byte, das den Typ der unmittelbar nachfolgenden value entlang mit einem optionalen klärenden Argument in den drei Bits höherer Ordnung. Unten findest du die verschiedenen Definitionen für value. In den meisten Fällen codiert value_arg die Länge die unmittelbar nachfolgenden value in Byte, wie (size - 1) z.B. 0 bedeutet Folgendes: Der Wert erfordert ein Byte und 7 bedeutet, dass acht Byte; Es gibt jedoch Ausnahmen.
value ubyte[] Bytes stehen für den Wert, mit variabler Länge und interpretierter Interpretation für verschiedene value_type-Byte unterschiedlich immer Little-Endian. Unten finden Sie die verschiedenen Wertdefinitionen für Details.

Wertformate

Typname value_type value_arg-Format value-Format Beschreibung
WERT_BYTE 0x00 (Keine; muss 0 sein) ubyte[1] Vorzeichenbehafteter 1-Byte-Ganzzahlwert
WERT_SHORT 0x02 Größe – 1 (0...1) Ubyte[Größe] 2-Byte-Ganzzahlwert mit Vorzeichen, vorzeichenerweitert
WERT_CHAR 0x03 Größe – 1 (0...1) Ubyte[Größe] 2-Byte-Ganzzahlwert ohne Vorzeichen, nullerweitert
WERT_INT 0x04 Größe – 1 (0...3) Ubyte[Größe] 4-Byte-Ganzzahlwert mit Vorzeichen, vorzeichenerweitert
WERT_LANG 0x06 size – 1 (0...7) Ubyte[Größe] 8-Byte-Ganzzahlwert mit Vorzeichen, vorzeichenerweitert
WERT_FLOAT 0x10 Größe – 1 (0...3) Ubyte[Größe] 4-Byte-Bitmuster, nullerweitert nach rechts und Wird als 32-Bit-Gleitkommawert nach IEEE 754 interpretiert
WERT_DOPPEL 0x11 size – 1 (0...7) Ubyte[Größe] Acht-Byte-Bitmuster, nullerweitert nach rechts und Wird als 64-Bit-Gleitkommawert nach IEEE754 interpretiert
WERT_METHODE_TYPE 0x15 Größe – 1 (0...3) Ubyte[Größe] vorzeichenloser (nullerweiter) 4-Byte-Ganzzahlwert, als Index interpretiert werden, den Abschnitt proto_ids und stellen einen Methodentypwert dar
WERT_METHODE_HANDLE 0x16 Größe – 1 (0...3) Ubyte[Größe] vorzeichenloser (nullerweiter) 4-Byte-Ganzzahlwert, als Index interpretiert werden, den Abschnitt method_handles und stellt einen Methoden-Handle-Wert dar
WERT_STRING 0x17 Größe – 1 (0...3) Ubyte[Größe] vorzeichenloser (nullerweiter) 4-Byte-Ganzzahlwert, als Index interpretiert werden, den Abschnitt string_ids und stellt einen Stringwert dar
WERT_TYP 0x18 Größe – 1 (0...3) Ubyte[Größe] vorzeichenloser (nullerweiter) 4-Byte-Ganzzahlwert, als Index interpretiert werden, type_ids-Abschnitt und stellt ein reflektierendes Element dar Typ/Klassenwert
WERT_FELD 0x19 Größe – 1 (0...3) Ubyte[Größe] vorzeichenloser (nullerweiter) 4-Byte-Ganzzahlwert, als Index interpretiert werden, field_ids-Abschnitt und stellt ein reflektierendes Element dar Feldwert
WERT_METHODE 0x1a Größe – 1 (0...3) Ubyte[Größe] vorzeichenloser (nullerweiter) 4-Byte-Ganzzahlwert, als Index interpretiert werden, method_ids-Abschnitt und stellt ein reflektierendes Element dar Methodenwert
WERT_ENUM 0x1b Größe – 1 (0...3) Ubyte[Größe] vorzeichenloser (nullerweiter) 4-Byte-Ganzzahlwert, als Index interpretiert werden, den Abschnitt field_ids und stellt den Wert von eine Konstante des Enum-Typs
WERT_ARRAY 0x1c (Keine; muss 0 sein) codiertes_Array ein Array von Werten im durch „encoded_array-Format“ unten. Die Größe der value ist in der Codierung implizit enthalten.
WERT_ANMERKUNG 0 x 1 Tag (Keine; muss 0 sein) codierte_Anmerkung eine Unteranmerkung im durch die „encoded_annotation-Format“ unten. Die Größe der value ist in der Codierung implizit enthalten.
WERT_NULL 0x1e (Keine; muss 0 sein) (Keine) null-Referenzwert
WERT_BOOLESCH 0x1f Boolesch (0...1) (Keine) 1-Bit-Wert; 0 für false und 1 für true. Das Bit wird im value_arg

codiertes_Array-Format

Name Format Beschreibung
Größe Uleb128 Anzahl der Elemente im Array
Werte codierter_Wert[Größe] eine Reihe von size encoded_value-Byte in dem in diesem Abschnitt angegebenen Format, verkettet sequenziell.

encoded_annotation-Format

Name Format Beschreibung
Typ_IDX Uleb128 Typ der Anmerkung. Dies muss eine Klasse sein (kein Array oder Primitiv). Typ.
Größe Uleb128 Anzahl der Name/Wert-Zuordnungen in dieser Annotation
Elemente annotation_element[Größe] -Elemente der Anmerkung, die direkt inline dargestellt werden (nicht als Offsets). Die Elemente müssen in aufsteigender Reihenfolge sortiert werden nach string_id-Index.

Format des Anmerkungselements

Name Format Beschreibung
name_idx Uleb128 -Elements, dargestellt als Index im string_ids Abschnitt. Der String muss den für MemberName wie oben definiert.
value codierter_Wert Elementwert

String syntax

Eine .dex-Datei enthält verschiedene Arten von Elementen, auf eine Zeichenfolge verweisen. Die folgenden Definitionen im BNF-Stil die akzeptable Syntax für diese Zeichenfolgen an.

Einfacher Name

Ein SimpleName ist die Grundlage für die Syntax der Namen anderer Dinge. Das Format .dex ermöglicht eine hohe Breite (deutlich mehr als die meisten Ausgangssprachen). Kurz gesagt: aus ASCII-Schriftzeichen oder Ziffern, und die meisten Nicht-ASCII-Codepunkte, die nicht Steuer-, Leer- oder Sonderzeichen. Ab Version 040 Das Format lässt zusätzlich Leerzeichen (Unicode Zs Kategorie). Beachten Sie, dass Ersatzcodepunkte (im Bereich U+d800 ... U+dfff) sind nicht als gültige Namenszeichen betrachtet, aber Unicode-Zeichen Zeichen gültig sind (gekennzeichnet durch das der Regel für SimpleNameChar). Außerdem sollten sie in einer Datei als Paare von Ersatzcodepunkten im MUTF-8-Format dargestellt. Codierung.

SimpleName
SimpleNameChar (SimpleNameChar)* (SimpleNameChar)*
SimpleNameChar
'A' ... 'Z'
| 'a' ... 'z'
| '0' ... '9'
| ' ' seit DEX-Version 040
| '$'
| '-'
| '_'
| U+00a0 seit DEX-Version 040
| U+00a1 ... U+1fff
| U+2000 ... U+200a seit DEX-Version 040
| U+2010 ... U+2027
| U+202f seit DEX-Version 040
| U+2030 ... U+d7ff
| U+e000 ... U+ffef
| U+10000 ... U+10ffff

Mitgliedsname

verwendet von „field_id_item“ und „method_id_item“

Ein MemberName ist der Name eines Gruppenmitglieds. -Feldern, Methoden und inneren Klassen.

MemberName
Einfacher Name
| '<' Einfacher Name '>'

Vollständiger Klassenname

Ein FullClassName ist ein vollständig qualifizierter Klassenname, einschließlich eines optionaler Paketspezifizierer gefolgt von einem erforderlichen Namen.

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(SimpleName '/')*

Typdeskriptor

Wird von type_id_item verwendet

Ein TypeDescriptor ist die Darstellung eines beliebigen Typs, einschließlich Primitiven, Klassen, Arrays und void. Siehe unten für die Bedeutung der verschiedenen Versionen.

TypeDescriptor
'V'
| FieldTypeDescriptor
FieldTypeDescriptor
NonArrayFieldTypeDescriptor
| ('[' * 1...255) NonArrayFieldTypeDescriptor
NonArrayFieldTypeDescriptor
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L' FullClassName ';'

Kurzbeschreibung

Wird von proto_id_item verwendet

Ein ShortyDescriptor ist die Kurzform einer Methode. Prototyp einschließlich Rückgabe- und Parametertypen, außer dass es keine Unterscheidung zwischen verschiedenen Referenztypen (Klasse oder Array). Stattdessen Alle Referenztypen werden durch ein einzelnes 'L'-Zeichen dargestellt.

ShortyDescriptor
ShortyReturnType (ShortyFieldType)*
ShortyReturnType
'V'
| ShortyFieldType
ShortyFieldType
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L'

TypeDescriptor-Semantik

Dies entspricht der Bedeutung der einzelnen Varianten von TypeDescriptor.

Syntax Bedeutung
V void; nur für Rückgabetypen gültig
Z boolean
B byte
S short
C char
I int
J long
F float
D double
Vollständig/qualifiziert/Name: die Klasse fully.qualified.Name
[Beschreibung Array von descriptor, rekursiv für Arrays-of-Arrays, auch wenn mehr als 255 Arrays nicht zulässig sind Dimensionen.

Elemente und verwandte Strukturen

Dieser Abschnitt enthält Definitionen für alle Elemente der obersten Ebene, die kann in einer .dex-Datei enthalten sein.

Header-Element

Erscheint im Kopfzeilenbereich

Ausrichtung: 4 Byte

Name Format Beschreibung
Magie ubyte[8] = DEX_FILE_MAGIC magischen Wert. Siehe Diskussion oben unter "DEX_FILE_MAGIC" .
Prüfsumme Uint adler32-Prüfsumme der Datei (alles außer magic und dieses Feld); zum Erkennen von Dateibeschädigungen
Signatur Ubyte[20] SHA-1-Signatur (Hash) der Datei (alles außer magic, checksum und dieses Feld); belegt zur eindeutigen Identifizierung von Dateien
Dateigröße Uint Größe der gesamten Datei (einschließlich Header) in Byte
Header-Größe uint = 0x70 Größe des Headers (dieses gesamten Abschnitts) in Byte. Dadurch können bei die Abwärts-/Vorwärtskompatibilität ohne damit das Format ungültig wird.
Endian-Tag uint = ENDIAN_CONSTANT endianness-Tag enthält. Siehe Diskussion oben unter "ENDIAN_CONSTANT" und REVERSE_ENDIAN_CONSTANT" .
Link-Größe Uint die Größe des Linkbereichs oder 0, wenn dies nicht statisch verknüpft
Link_off [Link_off] Uint der Abstand vom Anfang der Datei zum Linkbereich oder 0 wenn link_size == 0. Der Offset, falls ungleich null, sollte ein Versatz im Abschnitt link_data sein. Die Das Format der Daten, auf die verwiesen wird, wird in diesem Dokument nicht angegeben. werden dieses Header-Feld (und das vorherige) als Hooks für die Verwendung durch Laufzeitimplementierungen.
Map-off Uint Abstand vom Anfang der Datei zum Kartenelement. Das Offset, das nicht null sein, muss ein Versatz im Abschnitt data sein, Die Daten müssen in dem mit „map_list“ angegebenen Format vorliegen. unten.
string_ids_size Uint Anzahl der Strings in der Liste der Stringkennungen
String_IDs_off Uint vom Anfang der Datei zur Liste der String-IDs verschoben werden oder 0 wenn string_ids_size == 0 (zugegebenermaßen ein merkwürdigen Grenzfall). Der Offset, falls ungleich null, sollte am Anfang des Abschnitts string_ids stehen.
type_ids_size Uint Anzahl der Elemente in der Liste der Typkennungen, höchstens 65.535
typ_ids_off Uint der Abstand vom Anfang der Datei zur Liste der Typkennungen oder 0 wenn type_ids_size == 0 (zugegebenermaßen ein merkwürdigen Grenzfall). Der Offset, falls ungleich null, sollte am Anfang von type_ids sein .
proto_ids_size Uint Anzahl der Elemente in der Liste der Prototypkennungen, höchstens 65.535
proto_ids_off (Proto-IDs deaktiviert) Uint der Abstand vom Anfang der Datei zur Liste der Prototyp-IDs oder 0 wenn proto_ids_size == 0 (zugegebenermaßen ein merkwürdigen Grenzfall). Der Offset, falls ungleich null, sollte am Anfang von proto_ids sein .
Feld_ID_Größe Uint Anzahl der Elemente in der Liste der Feldkennungen
Feld_IDs_Aus Uint der Abstand vom Anfang der Datei zur Liste der Feldkennungen oder 0 wenn field_ids_size == 0. Der Offset, wenn nicht Null, muss am Anfang von field_ids stehen .
method_ids_size Uint Anzahl der Elemente in der Liste der Methodenkennungen
method_ids_off [method_ids_off] Uint der Abstand vom Anfang der Datei zur Liste der Methodenkennungen oder 0 wenn method_ids_size == 0. Der Offset, wenn nicht Null, muss am Anfang von method_ids stehen .
class_defs_size Uint Anzahl der Elemente in der Liste der Klassendefinitionen
klassen_defs_aus Uint der Abstand vom Anfang der Datei zur Liste der Klassendefinitionen oder 0 wenn class_defs_size == 0 (zugegebenermaßen ein merkwürdigen Grenzfall). Der Offset, falls ungleich null, sollte am Anfang des Abschnitts class_defs stehen.
data_size Uint Größe des Abschnitts data in Byte. Muss ein gerader Wert sein Vielfaches von sizeof(uint).
Daten deaktiviert Uint vom Anfang der Datei bis zum Anfang der data Abschnitt.

Kartenliste

Erscheint im Datenbereich

Verweist von „header_item“

Ausrichtung: 4 Byte

Dies ist eine geordnete Liste des gesamten Inhalts einer Datei. Es enthält eine gewisse Redundanz in Bezug auf header_item ist aber für die Iteration über das gesamte -Datei. Ein bestimmter Typ darf höchstens einmal in einer Karte vorkommen, ist die Einschränkung, in welchen Auftragstypen Einschränkungen, die durch das restliche Format (z.B. eine Der Abschnitt header muss zuerst stehen, gefolgt von einem string_ids usw.). Außerdem müssen die Zuordnungseinträge nach anfänglichem Offset sortiert werden und dürfen sich nicht überschneiden.

Name Format Beschreibung
Größe Uint Größe der Liste in Einträgen
Liste Kartenelement[Größe] Elemente der Liste

Format von „map_item“

Name Format Beschreibung
type Ushort Art der Elemente; siehe Tabelle unten
unused Ushort (nicht verwendet)
Größe Uint Anzahl der Elemente, die am angegebenen Offset gefunden werden sollen
kompensiert Uint Abstand vom Anfang der Datei zu den betreffenden Elementen

Typcodes

Artikeltyp Konstante Wert Artikelgröße in Byte
Header-Element TYPE_HEADER_ITEM 0x0000 0x70
String_ID_Element TYPE_STRING_ID_ITEM 0x0001 0x04
type_id_item [Typ_ID_Artikel] TYPE_ID-ARTIKEL 0x0002 0x04
proto_id_item TYPE_PROTO_ID_ITEM 0x0003 0x0c
Feld_ID_Element TYPE_FIELD_ID_ITEM 0x0004 0x08
method_id_item [method_id_item] METHODEN-ID_TYP 0x0005 0x08
class_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
Anruf-ID-Element TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
method_handle_item [Methode_Handle_item] METHODEN_HANDLE_TYPE 0x0008 0x08
Kartenliste TYPE_MAP_LISTE 0x1000 4 + (item.size * 12)
Typliste TYPE_LISTE 0x1001 4 + (item.size * 2)
Annotationssatz_Referenzliste TYP_NOTE_SET_REF_LIST 0x1002 4 + (item.size * 4)
Annotationssatzelement TYPE_NOTE_SET_ITEM 0x1003 4 + (item.size * 4)
class_data_item [Klasse_Datenelement] TYPE_CLASS_DATA_ITEM 0x2000 implizit; muss geparst werden
Codeelement TYPE_CODE_ITEM 0x2001 implizit; muss geparst werden
string_data_item TYPE_STRING_DATENELEMENT 0x2002 implizit; muss geparst werden
Debug-Infoelement TYPE_DEBUG_INFO_ITEM_FEHLERBEHEBUNG 0x2003 implizit; muss geparst werden
Anmerkungselement TYPE_NOTE_ITEM 0x2004 implizit; muss geparst werden
codiertes_Array-Element TYPE_ENCODED_ARRAY_ITEM 0x2005 implizit; muss geparst werden
Anmerkungen_Verzeichniselement TYP_VERWEIS_ARTIKEL 0x2006 implizit; muss geparst werden
verborgenes Datenelement der API-Klasse TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 implizit; muss geparst werden

String_ID_Element

Erscheint im Abschnitt string_ids

Ausrichtung: 4 Byte

Name Format Beschreibung
string_data_off (Zeichenfolgendaten_aus) Uint vom Anfang der Datei zu den Zeichenfolgendaten ein. Der Offset sollte zu einem Standort im Abschnitt data und die Daten sollten sich im Format angegeben durch "string_data_item" unten. Für den Offset ist keine Ausrichtung erforderlich.

string_data_item

Erscheint im Datenbereich

Ausrichtung: keine (byte-orientiert)

Name Format Beschreibung
utf16_size Uleb128 die Größe dieser Zeichenfolge in UTF-16-Codeeinheiten, also der Länge" in vielen Systemen). Das heißt, dies ist die decodierte Länge die Zeichenfolge. (Die codierte Länge wird durch die Position der das 0-Byte.)
Daten ubyte[] eine Reihe von MUTF-8-Codeeinheiten (auch Oktette genannt) gefolgt von einem Byte mit dem Wert 0. Weitere Informationen finden Sie unter MUTF-8-Codierung (geänderte UTF-8-Codierung) weiter oben. Diskussion über das Datenformat.

Hinweis: Zulässig sind Strings, die Folgendes enthalten: (die codierte Form von) UTF-16-Ersatzcodeeinheiten, d. h. U+d800 ... U+dfff) entweder isoliert oder nicht in der richtigen Reihenfolge Unicode-Codierung in UTF-16. Es geht um die höhere Nutzung Zeichenfolgen, um solche ungültigen Codierungen abzulehnen.

type_id_item [Typ_ID_Artikel]

Erscheint im Abschnitt „type_ids“

Ausrichtung: 4 Byte

Name Format Beschreibung
deskriptor_idx Uint in die string_ids-Liste für den Deskriptor aufnehmen String dieses Typs. Die Zeichenfolge muss der Syntax für TypeDescriptor, wie oben definiert.

proto_id_item

Erscheint im Abschnitt „proto_ids“

Ausrichtung: 4 Byte

Name Format Beschreibung
Shorty_IDX Uint in die string_ids-Liste für die Kurzform Deskriptor-String dieses Prototyps. Der String muss den Syntax für ShortyDescriptor, wie oben definiert. Sie muss den gibt den Rückgabetyp und die Parameter dieses Elements an.
return_type_idx [Rückgabetyp_IDx] Uint Index in die type_ids-Liste für den Rückgabetyp einfügen dieses Prototyps
Parameter_off Uint Abstand vom Anfang der Datei zur Liste der Parametertypen für diesen Prototyp oder 0, wenn dieser Prototyp keine Parameter. Dieser Offset, wenn dieser nicht null ist, sollte im data und die Daten sollten im Format, das unten durch "type_list" angegeben wird. Außerdem gibt es sollte kein Verweis auf den Typ void in der Liste sein.

Feld_ID_Element

Wird im „field_ids“-Abschnitt angezeigt

Ausrichtung: 4 Byte

Name Format Beschreibung
class_idx (Klasse IDX) Ushort Index in die type_ids-Liste für die Definition dieses ein. Dies muss ein Klassentyp sein, kein Array oder ein primitiver Typ.
Typ_IDX Ushort in die type_ids-Liste für den Typ dieses Feld
name_idx Uint Index in die string_ids-Liste einfügen, um den Namen dieses ein. Der String muss der Syntax für MemberName entsprechen, wie oben beschrieben.

method_id_item [method_id_item]

Erscheint im Abschnitt method_ids

Ausrichtung: 4 Byte

Name Format Beschreibung
class_idx (Klasse IDX) Ushort Index in die type_ids-Liste für die Definition dieses . Dies muss ein Klassen- oder Arraytyp sein, kein primitiver Typ.
proto_idx Ushort in die proto_ids-Liste für den Prototyp von diese Methode
name_idx Uint Index in die string_ids-Liste einfügen, um den Namen dieses . Der String muss der Syntax für MemberName entsprechen, wie oben beschrieben.

class_def_item

Wird im Abschnitt class_defs angezeigt

Ausrichtung: 4 Byte

Name Format Beschreibung
class_idx (Klasse IDX) Uint Index in die type_ids-Liste für diese Klasse ein. Dies muss ein Klassentyp sein, kein Array oder ein primitiver Typ.
Zugriffsflags Uint Zugriffs-Flags für die Klasse (public, final, usw.). Siehe „access_flags-Definitionen“ .
superclass_idx Uint in die type_ids-Liste für die Basisklasse indexieren oder den konstanten Wert NO_INDEX, wenn diese Klasse keine übergeordnete Klasse (d.h. eine Stammklasse wie Object). Falls vorhanden, muss dies ein Klassentyp und kein Array- oder primitiver Typ sein.
Interfaces_off Uint der Abstand vom Anfang der Datei zur Liste der Schnittstellen oder 0, wenn keine vorhanden sind. Dieser Offset sollte sich im Abschnitt data befinden und die Daten Sie muss in dem Format vorliegen, „type_list“ unten. Jedes der Elemente der Liste muss ein Klassentyp sein (kein Array oder primitiver Typ). darf keine Duplikate sein.
ID der Quelldatei Uint in die string_ids-Liste für den Namen des Datei mit der ursprünglichen Quelle für (zumindest den größten Teil) dieser Klasse, oder der spezielle Wert NO_INDEX, um das Fehlen diese Informationen. Die debug_info_item einer beliebigen Methode diese Quelldatei überschreiben, aber es wird erwartet, aus einer Quelldatei stammen.
Anmerkungen_aus Uint Versatz vom Anfang der Datei zur Anmerkungsstruktur für diese Klasse oder 0, wenn es keine Anmerkungen diesem Kurs. Dieser Offset, wenn dieser nicht null ist, sollte im data und die Daten sollten in das durch „annotations_directory_item“ angegebene Format unten wobei sich alle Elemente auf diese Klasse als Definierende beziehen.
class_data_off (Kursdaten deaktiviert) Uint vom Anfang der Datei bis zu dem Klassendaten für dieses Element oder 0, wenn keine Klasse vorhanden ist Daten für diesen Kurs. (Dies kann z. B. der Fall sein, wenn diese Klasse ist eine Markierungsoberfläche. Der Offset, wenn dieser nicht null ist, sollte in der data und die Daten sollten im Format angegeben durch "class_data_item" unten, mit allen Elemente, die sich auf diese Klasse als Definierende beziehen.
statische_werte_aus Uint der Versatz vom Anfang der Datei zur Liste der Anfangsbuchstaben Werte für static-Felder oder 0, wenn es sind keine (und alle static-Felder sollen mit 0 oder null). Dieser Offset sollte im data und die Daten sollten im Bereich Format angegeben durch "encoded_array_item" unten. Die Größe des Arrays darf nicht größer sein als die Anzahl von static. -Felder, die von dieser Klasse deklariert werden, und die Elemente entsprechen den static-Felder in der gleichen Reihenfolge wie in den entsprechenden field_list. Der Typ jedes Arrays -Element muss mit dem deklarierten Typ des entsprechenden Felds übereinstimmen. Wenn das Array weniger Elemente enthält als vorhanden sind, static Feldern, dann werden die verbleibenden Felder initialisiert. mit einem typgerechten 0- oder null-Element.

Anruf-ID-Element

Erscheint im Abschnitt „call_site_ids“

Ausrichtung: 4 Byte

Name Format Beschreibung
Anrufseite deaktiviert Uint vom Anfang der Datei aus, um die Website-Definition aufzurufen. Der Offset sollte befinden sich im Datenabschnitt und die Daten sollten in dem Format vorliegen, das durch die „call_site_item“ unten.

Element_der_Anrufwebsite

Erscheint im Datenbereich

Ausrichtung: keine (byte ausgerichtet)

"call_site_item" ist ein codiertes Arrayelement, dessen Elemente den Argumenten entsprechen. einer Bootstrap-Verknüpfungsmethode übergeben. Die ersten drei Argumente sind:

  1. Methoden-Handle, das die Bootstrap-Verknüpfungsmethode (VALUE_METHOD_HANDLE) darstellt.
  2. Ein Methodenname, den die Bootstrap-Verknüpfung auflösen soll (VALUE_STRING).
  3. Methodentyp, der dem Typ des aufzulösenden Methodennamens entspricht (VALUE_METHOD_TYPE)

Alle zusätzlichen Argumente sind konstante Werte, die an die Bootstrap-Verknüpfungsmethode übergeben werden. Diese Argumente sind werden in der richtigen Reihenfolge ohne Typ-Conversions weitergegeben.

Das Methoden-Handle, das die Bootstrap-Verknüpfungsmethode darstellt, muss den Rückgabetyp java.lang.invoke.CallSite haben. Die ersten drei Parametertypen sind:

  1. java.lang.invoke.Lookup
  2. java.lang.String
  3. java.lang.invoke.MethodType

Die Parametertypen zusätzlicher Argumente werden anhand ihrer konstanten Werte bestimmt.

method_handle_item [Methode_Handle_item]

Erscheint im Abschnitt method_handles

Ausrichtung: 4 Byte

Name Format Beschreibung
Handle_type_Methode Ushort Typ des Methoden-Handles: siehe Tabelle unten
unused Ushort (nicht verwendet)
Feld_oder_Methoden-ID Ushort Feld- oder Methoden-ID, je nachdem, ob der Methoden-Handle-Typ eine Zugriffsfunktion oder ein Methodenaufrufer ist
unused Ushort (nicht verwendet)

Codes der Methoden-Handle-Typen

Konstante Wert Beschreibung
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 Methoden-Handle ist ein statischer Feld-Setter (Accessor)
METHOD_HANDLE_TYPE_STATIC_GET 0x01 Methoden-Handle ist ein statischer Feld-Getter (Zugriffsfunktion)
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 Methoden-Handle ist ein Instanzfeld-Setter (Zugriffsfunktion)
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 Methoden-Handle ist ein Instanzfeld-Getter (Zugriffsfunktion)
METHODENHANDLE_TYPE_INVOKE_STATIC 0x04 Der Methoden-Handle ist ein statischer Methodenaufrufer
METHODENHANDLE_TYPE_INVOKE_INSTANCE 0x05 Die Methoden-Handle ist ein Instanzmethoden-Aufrufer.
METHODENHANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 Methoden-Handle ist ein Konstruktor-Methodenaufrufer
METHODENHANDLE_TYPE_INVOKE_DIRECT 0x07 Der Methoden-Handle ist ein direkter Methodenaufrufer
METHODENHANDLE_TYPE_INVOKE_INTERFACE 0x08 Der Methoden-Handle ist ein Interface-Methoden-Aufrufer

class_data_item [Klasse_Datenelement]

Von class_def_item referenziert

Erscheint im Datenbereich

Ausrichtung: keine (byte-orientiert)

Name Format Beschreibung
static_fields_size Uleb128 Anzahl der in diesem Element definierten statischen Felder
Größe der Instanzfelder Uleb128 die Anzahl der in diesem Element definierten Instanzfelder
direkte_methoden_größe Uleb128 Anzahl der in diesem Element definierten direkten Methoden
virtuelle_methoden_größe Uleb128 Anzahl der in diesem Element definierten virtuellen Methoden
Statische Felder codiertes_Feld[static_fields_size] definierten statischen Feldern, dargestellt als Folge von codierten Elementen. Die Felder müssen nach field_idx in aufsteigender Reihenfolge.
Instanzfelder codiertes_Feld[instance_fields_size] die definierten Instanzfelder, dargestellt als Folge von codierten Elementen. Die Felder müssen nach field_idx in aufsteigender Reihenfolge.
direkte_methoden codierte_Methode[direct_methods_size] die definierte Direktverbindung (static, private, oder Konstruktor), dargestellt als Folge von codierten Elementen. Die Methoden müssen nach method_idx in aufsteigender Reihenfolge.
virtuelle_methoden codierte_Methode[virtual_methods_size] die definierte virtuelle (nicht static, private, oder Konstruktor), dargestellt als Folge von codierten Elementen. Diese Liste sollte nicht übernommene , es sei denn, sie werden von der Klasse überschrieben, die dieses Element repräsentiert. Die Methoden müssen in aufsteigender Reihenfolge nach method_idx sortiert werden. Die method_idx einer virtuellen Methode darf nicht gleich sein wie jede direkte Methode.

Hinweis:Das Attribut „Alle Elemente“ field_id und method_id-Instanzen müssen auf dieselbe definierende Klasse verweisen.

codiertes_Feldformat

Name Format Beschreibung
Feld_IDX_Differenz Uleb128 Index in die field_ids-Liste für die Identität dieses -Feld (enthält den Namen und die Beschreibung), das als Differenz dargestellt wird aus dem Index des vorherigen Elements in der Liste. Der Index der in einer Liste direkt repräsentiert wird.
Zugriffsflags Uleb128 Zugriffs-Flags für das Feld (public, final, usw.). Siehe „access_flags-Definitionen“ .

encoded_method-Format

Name Format Beschreibung
method_idx_diff Uleb128 Index in die method_ids-Liste für die Identität dieses (einschließlich Name und Beschreibung), die als Differenz dargestellt wird aus dem Index des vorherigen Elements in der Liste. Der Index der in einer Liste direkt repräsentiert wird.
Zugriffsflags Uleb128 Zugriffs-Flags für die Methode (public, final, usw.). Siehe „access_flags-Definitionen“ .
Codeoff Uleb128 vom Anfang der Datei zur Codestruktur für dieses oder 0, wenn diese Methode entweder abstract ist oder native. Der Versatz sollte auf eine Position im data Abschnitt. Das Format der Daten wird durch „code_item“ unten.

Typliste

Verweist von class_def_item und proto_id_item

Erscheint im Datenbereich

Ausrichtung: 4 Byte

Name Format Beschreibung
Größe Uint Größe der Liste in Einträgen
Liste type_item[Größe] Elemente der Liste

type_item-Format

Name Format Beschreibung
Typ_IDX Ushort Index in die type_ids-Liste einfügen

Codeelement

Verweist von encoded_method

Erscheint im Datenbereich

Ausrichtung: 4 Byte

Name Format Beschreibung
Registers_Größe Ushort Anzahl der von diesem Code verwendeten Register
ins_size Ushort die Anzahl der Wörter von eingehenden Argumenten für die Methode, Code ist für
Übergröße Ushort die Anzahl der Wörter des von diesem Code für Methodenaufruf
Versuche_Größe Ushort Die Anzahl der try_items für diese Instanz. Wenn nicht null, werden diese als tries-Array direkt nach dem insns in dieser Instanz.
Debug-Informationen_aus Uint Abstand vom Anfang der Datei zu den Debug-Informationen (Zeilennummern + Informationen zu lokalen Variablen) für diesen Code oder 0, wenn einfach keine Informationen. Wenn der Offset ungleich null ist, sollte an einen Speicherort im Abschnitt data. Das Format von Die Daten werden durch „debug_info_item“ angegeben unten.
insns_größe Uint Größe der Anleitungsliste in 16-Bit-Codeeinheiten
Insns ushort[insns_größe] Array von Bytecode. Das Codeformat in einem insns Das Array wird vom Begleitdokument angegeben. Dalvik-Bytecode. Hinweis Obwohl dies als Array von ushort definiert ist, gibt es sind einige interne Strukturen, die eine 4-Byte-Ausrichtung bevorzugen. Außerdem wenn dies in einer Datei mit endiantgewechselter Datei auftritt, ist der Austausch nur für einzelne ushort-Instanzen und nicht für die größere interne Strukturen.
padding ushort (optional) = 0 zwei Byte Padding, damit tries auf vier Byte ausgerichtet ist. Dieses Element ist nur vorhanden, wenn tries_size ungleich null ist und insns_size ist ungerade.
Versuche Try_item[tries_size] (optional) Array, das angibt, wo im Code Ausnahmen abgefangen werden wie Sie damit umgehen. Elemente des Arrays dürfen sich in und in der Reihenfolge von niedrig nach hoher Adresse. Dieses Element ist nur vorhanden, wenn tries_size ungleich null ist.
Handler encoded_catch_handler_list (optional) Byte, die eine Liste von Listen mit Fangtypen und zugehörigen Handler-Adressen. Jeder try_item hat einen byteweisen Offset in diese Struktur verschieben. Dieses Element ist nur vorhanden, wenn tries_size ist ungleich null.

„try_item“-Format

Name Format Beschreibung
Ausgangsadresse Uint Startadresse des Codeblocks, der von diesem Eintrag abgedeckt wird. Adresse entspricht der Anzahl der 16-Bit-Codeeinheiten bis zum Beginn der ersten Anleitung.
Insn-Anzahl Ushort Anzahl der 16-Bit-Codeeinheiten, die von diesem Eintrag abgedeckt werden. Der letzte Code abgedeckte Einheit (einschließlich) start_addr + insn_count - 1.
Handler_off Ushort Offset in Byte vom Beginn des zugehörigen encoded_catch_hander_list in den encoded_catch_handler für diesen Eintrag. Dies muss ein Versatz zum Anfang eines encoded_catch_handler.

Format „codierter_catch_handler_list“

Name Format Beschreibung
Größe Uleb128 Größe dieser Liste in Einträgen
Liste codierter_catch_handler[handlers_size] tatsächliche Liste der Handler-Listen, direkt dargestellt (nicht als Offsets), und sequenziell verkettet.

codiertes_Handler-Format

Name Format Beschreibung
Größe sleb128 Anzahl der Catch-Typen in dieser Liste. Ist dies nicht positiv, ist dies der negative Wert der Anzahl der Catch-Typen, und die Catch-Typen werden befolgt durch einen Catchall-Handler. Beispiel: Ein size von 0 bedeutet, dass es zwar einen Catch-all gibt, aber keine explizit typisierten Catcher. Ein size von 2 bedeutet, dass zwei explizit Fake-Eingaben und kein Auffangen. Und size von -1 bedeutet, dass es einen typisierten Fang zusammen mit einem Catchall gibt.
Handler encoded_type_addr_pair[Abs(Größe)] Stream von abs(size) codierten Elementen, eines für jedes gefangene Objekt und zwar in der Reihenfolge, in der die Typen getestet werden sollen.
Catchall-Adresse uleb128 (optional) Bytecode-Adresse des Catchall-Handlers. Dieses Element ist nur vorhanden, wenn size nicht positiv ist.

codiertes_type_addr_pair-Format

Name Format Beschreibung
Typ_IDX Uleb128 in die type_ids-Liste für den Typ des Zu erfassende Ausnahme
Addr Uleb128 Bytecode-Adresse des zugehörigen Ausnahme-Handlers

Debug-Infoelement

Von „code_item“ referenziert

Erscheint im Datenbereich

Ausrichtung: keine (byte-orientiert)

Jeder debug_info_item definiert einen DWARF3-inspirierten byte-codierten Zustandsautomat, der bei Interpretation die Positionen und ggf. auch die Informationen zu den lokalen Variablen code_item. Die Sequenz beginnt mit einer variablen Länge Header (ihre Länge hängt von der Anzahl der Methoden Parameter) gefolgt von den Bytecodes der Zustandsmaschine und endet mit einem DBG_END_SEQUENCE-Byte.

Der Zustandsautomat besteht aus fünf Registern. Die Das Register address steht für den Anweisungs-Offset im verknüpfte insns_item in 16-Bit-Codeeinheiten. Die address-Registrierungen beginnen jeweils um 0 debug_info-Sequenz und darf nur monoton ansteigen. Das line-Register gibt an, welche Quellzeilennummer sollte mit dem Tabelleneintrag für nächste Positionen verknüpft werden, der von Zustandsautomaten. Sie wird im Sequenzheader initialisiert und kann Änderung in positive oder negative Richtungen, darf aber nie kleiner sein als 1 Das source_file-Register steht für die Quelldatei, auf die sich die Einträge mit der Zeilennummer beziehen. Sie ist initialisiert mit Wert von source_file_idx in class_def_item Die anderen beiden Variablen prologue_end und epilogue_begin sind boolesche Flags (mit false), die angeben, ob die nächste Position sollte als Methodenprolog oder Epilog betrachtet werden. Der Zustandsautomat müssen auch den Namen und den Typ der letzten lokalen Variablen jedes Registers für den DBG_RESTART_LOCAL-Code.

Der Header lautet wie folgt:

Name Format Beschreibung
line_start Uleb128 Anfangswert für das line-Register der Zustandsmaschine Stellt keinen tatsächlichen Positionseintrag dar.
parameter_size [Parameter_Größe] Uleb128 die Anzahl der codierten Parameternamen. Es sollte einen pro Methodenparameter, mit Ausnahme von this einer Instanzmethode, falls zutreffend.
parameter_names (Parameternamen) uleb128p1[Parametergröße] Stringindex des Methodenparameternamens. Ein codierter Wert von NO_INDEX gibt an, dass kein Name vorhanden ist. für den zugehörigen Parameter verfügbar ist. Die Typbeschreibung und Signatur aus dem Methodendeskriptor und der Signatur impliziert.

Die Bytecodewerte sind:

Name Wert Formatieren Argumente Beschreibung
DBG_END_SEQUENCE 0x00 (Keine) beendet eine Sequenz von Debug-Informationen für ein code_item
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff: Betrag, der in das Adressregister aufgenommen wird führt das Adressregister fort, ohne einen Positionseintrag auszugeben.
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: Betrag, um den das Linienregister geändert werden soll fährt im Linienregister fort, ohne einen Positionseintrag auszugeben
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: Registrieren, das die lokale
enthält name_idx: Stringindex des Namens
type_idx: Typindex des Typs
eine lokale Variable bei der aktuellen Adresse ein. Beides name_idx oder type_idx ist möglicherweise NO_INDEX fest, wenn dieser Wert unbekannt ist.
DBG_START_LOCAL_EXTENDED 0x04 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
uleb128p1 sig_idx
register_num: Registrieren, das die lokale
enthält name_idx: Stringindex des Namens
type_idx: Typindex des Typs
sig_idx: Stringindex des Typssignatur
führt einen lokalen mit einer Typsignatur unter der aktuellen Adresse ein. name_idx, type_idx oder sig_idx ist möglicherweise NO_INDEX um anzuzeigen, dass dieser Wert unbekannt ist. (Wenn sig_idx gleich -1. Dieselben Daten könnten jedoch stärker repräsentiert werden. mit dem Opcode DBG_START_LOCAL.)

Hinweis: Die Diskussion finden Sie unter „dalvik.annotation.Signature“ weiter unten. Umgang mit Signaturen.

DBG_END_LOCAL 0x05 uleb128 register_num register_num: Registrieren, das lokale Elemente enthält eine derzeit aktive lokale Variable als ausgeschlossen markiert, Adresse
DBG_RESTART_LOCAL 0x06 uleb128 register_num register_num: zum Neustart registrieren wird erneut eine lokale Variable unter der aktuellen Adresse eingefügt. Name und Typ sind mit den letzten lokalen Einträgen in der angegebenen
DBG_SET_PROLOGUE_END 0x07 (Keine) legt das prologue_end-Zustandsmaschinenregister fest, Dies gibt an, dass der nächste hinzugefügte Positionseintrag als Ende eines Methodenvorfalls betrachtet (ein geeigneter Platz für einen Methodenhaltepunkt). Das prologue_end-Register ist wird durch einen speziellen Opcode (>= 0x0a) gelöscht.
DBG_SET_EPILOGUE_BEGIN 0x08 (Keine) legt das epilogue_begin-Zustandsmaschinenregister fest, Dies gibt an, dass der nächste hinzugefügte Positionseintrag als der Anfang eines Methodenepilogues betrachtet (ein geeigneter Ort, die Ausführung vor dem Beenden der Methode auszusetzen). Das epilogue_begin-Register wird von einem besonderen (>= 0x0a)-Opcode.
DBG_SET_FILE 0x09 uleb128p1 Name_IDx name_idx: Stringindex des Namens der Quelldatei; NO_INDEX, falls unbekannt gibt an, dass sich alle nachfolgenden Zeilennummerneinträge auf diese Namen der Quelldatei anstelle des Standardnamens, der in code_item
Spezielle Opcodes 0x0a...0xff (Keine) erhöht die line- und address-Register, gibt einen Positionseintrag aus und löscht prologue_end und epilogue_begin. Eine Beschreibung finden Sie unten.

Spezielle Opcodes

Opcodes mit Werten zwischen 0x0a und 0xff (einschließlich) verschieben sowohl line als auch address registriert und gibt dann einen neuen Positionstabelleneintrag aus. Die Formel für die Inkremente lautet wie folgt:

DBG_FIRST_SPECIAL = 0x0a  // the smallest special opcode
DBG_LINE_BASE   = -4      // the smallest line number increment
DBG_LINE_RANGE  = 15      // the number of line increments represented

adjusted_opcode = opcode - DBG_FIRST_SPECIAL

line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE)
address += (adjusted_opcode / DBG_LINE_RANGE)

Anmerkungen_Verzeichniselement

Von class_def_item referenziert

Erscheint im Datenbereich

Ausrichtung: 4 Byte

Name Format Beschreibung
Klassenannotationen_aus Uint der Versatz vom Anfang der Datei zu den direkt eingefügten Anmerkungen für die Klasse oder 0, wenn die Klasse keine direkten Anmerkungen hat. Wenn der Versatz nicht null ist, sollte er sich an einer Position in der data Abschnitt. Das Format der Daten wird angegeben. von "annotation_set_item" unten.
Felder_Größe Uint Anzahl der von diesem Element annotierten Felder
Methoden_für_Annotierungen Uint Anzahl der von diesem Element annotierten Methoden
annotierte_parameter_größe Uint Anzahl der von diesem Element annotierten Methodenparameterlisten
Feldannotationen Feldannotation [fields_size] (optional) Liste der zugehörigen Feldanmerkungen. Die Elemente der Liste müssen in aufsteigender Reihenfolge nach field_idx sortiert werden.
Methodenannotationen method_annotation[methods_size] (optional) Liste der zugehörigen Methodenanmerkungen. Die Elemente der Liste müssen in aufsteigender Reihenfolge nach method_idx sortiert werden.
Parameterannotationen parameter_annotation[parameters_size] (optional) Liste der zugehörigen Annotationen von Methodenparametern. Die Elemente der Liste muss in aufsteigender Reihenfolge nach method_idx sortiert werden.

Hinweis:Das Attribut „Alle Elemente“ field_id und method_id-Instanzen müssen auf dieselbe definierende Klasse verweisen.

Format von „field_annotation“

Name Format Beschreibung
Feld_ID Uint in die field_ids-Liste für die Identität des Feld, das annotiert wird
Anmerkungen_aus Uint der Abstand vom Anfang der Datei zur Liste der Anmerkungen für auf dem Feld. Der Offset sollte auf eine Position im data sein. . Das Format der Daten wird durch „annotation_set_item“ unten.

Format der method_annotation

Name Format Beschreibung
method_idx (method_idx) Uint in die method_ids-Liste für die Identität des annotierte Methode
Anmerkungen_aus Uint der Abstand vom Anfang der Datei zur Liste der Anmerkungen für die Methode verwenden. Der Versatz sollte auf eine Position im data Abschnitt. Das Format der Daten wird durch „annotation_set_item“ unten.

Format „parameter_annotation“

Name Format Beschreibung
method_idx (method_idx) Uint in die method_ids-Liste für die Identität des -Methode, deren Parameter annotiert werden
Anmerkungen_aus Uint der Abstand vom Anfang der Datei zur Liste der Anmerkungen für Methodenparameter an. Der Versatz sollte auf eine Position im data Abschnitt. Das Format der Daten wird durch „annotation_set_ref_list“ unten.

Annotationssatz_Referenzliste

Verweist von parameter_annotations_item

Erscheint im Datenbereich

Ausrichtung: 4 Byte

Name Format Beschreibung
Größe Uint Größe der Liste in Einträgen
Liste Annotationssatz_ref_item[Größe] Elemente der Liste

Format „annotation_set_ref_item“

Name Format Beschreibung
Anmerkungen_aus Uint Versatz vom Anfang der Datei zum referenzierten Annotationssatz oder 0, wenn für dieses Element keine Anmerkungen vorhanden sind. Der Offset, wenn er ungleich null ist, sollte bei einer Position im data sein. . Das Format der Daten wird durch „annotation_set_item“ unten.

Annotationssatzelement

Verweist von „annotations_directory_item“, „field_annotations_item“ method_annotations_item undannotation_set_ref_item

Erscheint im Datenbereich

Ausrichtung: 4 Byte

Name Format Beschreibung
Größe Uint Größe des Datasets in Einträgen
Einträge Anmerkung_aus_Artikel[Größe] Elemente des Datasets. Die Elemente müssen in aufsteigender Reihenfolge sortiert werden, von type_idx.

Format „annotation_off_item“

Name Format Beschreibung
Anmerkung_aus Uint vom Anfang der Datei zu einer Annotation. Der Versatz sollte einer Position im Abschnitt data entsprechen. und das Format der Daten an diesem Speicherort wird durch „annotation_item“ unten.

Anmerkungselement

Verweist von „annotation_set_item“

Erscheint im Datenbereich

Ausrichtung: keine (byte-orientiert)

Name Format Beschreibung
Sichtbarkeit Ubyte beabsichtigte Sichtbarkeit dieser Anmerkung (siehe unten)
Hinweis codierte_Anmerkung codierten Anmerkungsinhalten in dem von „encoded_annotation-Format“ unter „encoded_value-Codierung“ oben.

Sichtbarkeitswerte

Dies sind die Optionen für das Feld visibility in einer annotation_item:

Name Wert Beschreibung
SICHTBARKEIT_AUFBAUEN 0x00 die nur während der Build-Erstellung sichtbar sein sollen (z.B. während der Kompilierung) des anderen Codes)
VISIBILITY_RUNTIME 0x01 die während der Laufzeit sichtbar sein sollen,
VISIBILITÄT_SYSTEM 0x02 zur Laufzeit sichtbar sein sollen, aber nur für das zugrunde liegende System (und nicht mit dem normalen Nutzercode)

codiertes_Array-Element

Von class_def_item referenziert

Erscheint im Datenbereich

Ausrichtung: keine (byte-orientiert)

Name Format Beschreibung
value codiertes_Array Bytes, die den codierten Arraywert im angegebenen Format darstellen von "encoded_array Format" unter „encoded_value“ Codierung“ oben.

verborgenes Datenelement der API-Klasse

Dieser Abschnitt enthält Daten zu eingeschränkten Schnittstellen, die von jeder Klasse verwendet werden.

Hinweis: Die verborgene API-Funktion wurde mit Android 10.0 eingeführt. und gilt nur für die DEX-Dateien von Klassen im Bootklassenpfad. Die Liste der unten beschriebenen Flags wird in zukünftigen Releases möglicherweise erweitert. von Android. Weitere Informationen finden Sie unter Einschränkungen für Nicht-SDK-Schnittstellen.

Name Format Beschreibung
Größe Uint Gesamtgröße des Bereichs
Offsets uint[] Array von Offsets, die von class_idx indexiert wurden. Ein Array-Eintrag mit Null bei Index class_idx bedeutet, dass entweder Für diese class_idx oder alle ausgeblendeten APIs sind keine Daten vorhanden sind null. Andernfalls ist der Arrayeintrag ungleich null und enthält einen Versatz von dem Anfang des Abschnitts zu einem Array ausgeblendeter API-Flags für dieses class_idx.
Flags uleb128[] Verkettete Arrays von verborgenen API-Flags für jede Klasse. Mögliche Flag-Werte sind in der folgenden Tabelle beschrieben. Flags werden in der gleichen Reihenfolge codiert wie Felder und Methoden. in Klassendaten codiert.

Arten von Einschränkungs-Flags:

Name Wert Beschreibung
auf die Zulassungsliste setzen 0 Schnittstellen, die frei verwendet werden können und als Teil von das offiziell dokumentierte Android-Framework, Paketindex:
Greylist 1 Nicht-SDK-Schnittstellen, die unabhängig vom Ziel-API-Level an.
Auf die Sperrliste setzen 2 Nicht-SDK-Schnittstellen, die unabhängig vom Typ der Anwendung nicht verwendet werden können Ziel-API-Level an. Wenn Sie auf eine dieser Schnittstellen zugreifen, Laufzeitfehler
Greylist-max-o 3 Nicht-SDK-Schnittstellen, die für Android 8.x und niedriger verwendet werden können es sei denn, sie sind eingeschränkt.
Greylist‐max‐p 4 Nicht-SDK-Schnittstellen, die für Android 9.x verwendet werden können es sei denn, sie sind eingeschränkt.
Greylist‐max‐q 5 Nicht-SDK-Schnittstellen, die für Android 10.x verwendet werden können es sei denn, sie sind eingeschränkt.
Greylist-max-r 6 Nicht-SDK-Schnittstellen, die für Android 11.x verwendet werden können es sei denn, sie sind eingeschränkt.

Systemhinweise

Systemanmerkungen stellen verschiedene reflektierende Elemente dar. Informationen zu Klassen (sowie Methoden und Feldern). Diese Informationen sind Der Zugriff erfolgt in der Regel nur indirekt über Client-Code (kein Systemcode).

Systemanmerkungen werden in .dex-Dateien als Anmerkungen, deren Sichtbarkeit auf VISIBILITY_SYSTEM festgelegt ist.

dalvik.annotation.AnnotationDefault

Erscheint bei Methoden in Anmerkungsoberflächen

Jedem Element wird eine Anmerkung AnnotationDefault beigefügt. Anmerkungsoberfläche, in der Standardbindungen angegeben werden sollen.

Name Format Beschreibung
value Anmerkung Die Standardbindungen für diese Annotation, dargestellt als Annotation dieses Typs. Die Annotation muss nicht alle von der Anmerkung; fehlende Namen haben einfach keine Standardnamen.

dalvik.annotation.EnclosureClass

Erscheint in Kursen

Jede Klasse wird mit einer EnclosingClass-Anmerkung versehen. das entweder als Mitglied einer anderen Klasse definiert ist, per se oder anonym, aber nicht innerhalb eines Methodentexts definiert (z.B. eine synthetische innere Klasse). Jeder Kurs mit dieser Anmerkung muss auch einen InnerClass-Anmerkung. Außerdem darf eine Klasse keine sowohl ein EnclosingClass als auch ein EnclosingMethod-Anmerkung.

Name Format Beschreibung
value Klasse Die Klasse, die diese Klasse lexikalisch am ehesten beschreibt

dalvik.annotation.EnclosureMethod

Erscheint in Kursen

Jede Klasse wird mit einer EnclosingMethod-Anmerkung versehen. der in einem Methodentext definiert ist. In allen Kursen mit dieser -Annotation auch eine InnerClass-Annotation haben. Außerdem darf eine Klasse nicht sowohl einen EnclosingClass-Wert haben als auch und einer EnclosingMethod-Anmerkung.

Name Format Beschreibung
value Method die Methode, die diese Klasse lexikalisch am genauesten umfasst

dalvik.annotation.InnerClass

Erscheint in Kursen

Jede Klasse wird mit einer InnerClass-Anmerkung versehen. der im lexikalischen Bereich der Definition einer anderen Klasse definiert ist. Jede Klasse mit dieser Annotation muss außerdem entweder ein Anmerkung EnclosingClass oder eine EnclosingMethod-Anmerkung.

Name Format Beschreibung
Name String der ursprünglich deklarierte einfache Name dieser Klasse (ohne Paketpräfix). Wenn diese Klasse anonym ist, lautet der Name null
accessFlags int Die ursprünglich deklarierten Zugriffs-Flags der Klasse (die sich unterscheiden können) von den geltenden Flags entfernt, weil es eine Diskrepanz zwischen der Ausführung der Quellsprache und der virtuellen Zielmaschine)

dalvik.annotation.MemberClass

Erscheint in Kursen

Jedem Kurs wird eine MemberClasses-Anmerkung angehängt. mit der Member-Klassen deklariert werden. (Eine Mitgliederklasse ist eine direkte innere Klasse, das einen Namen hat.)

Name Format Beschreibung
value Klasse[] Array der Mitgliederklassen

dalvik.annotation.MethodParameters

Erscheint bei Methoden

Hinweis:Diese Anmerkung wurde nach Android hinzugefügt. 7.1 In früheren Android-Versionen wird die Funktion ignoriert.

Eine MethodParameters-Anmerkung ist optional und kann für Folgendes verwendet werden: Parametermetadaten wie Parameternamen und Modifikatoren bereitstellen.

Die Annotation kann bei einer Methode oder einem Konstruktor sicher weggelassen werden, wenn der Parametermetadaten sind zur Laufzeit nicht erforderlich. Mit java.lang.reflect.Parameter.isNamePresent() kann Folgendes überprüft werden: Ob Metadaten für einen Parameter vorhanden sind, und die zugehörige Reflexion wie java.lang.reflect.Parameter.getName() während der Laufzeit auf das Standardverhalten zurückgesetzt werden, wenn keine Informationen vorhanden sind.

Beim Einbeziehen von Parametermetadaten müssen Compiler Informationen angeben für generierte Klassen wie enums, da die Parameter-Metadaten gibt an, ob ein Parameter synthetisch ist oder erforderlich ist.

Eine MethodParameters-Anmerkung beschreibt nur eine einzelne Methode. Parameter. Daher können Compiler die Annotation unter Umständen ganz für Konstruktoren und Methoden, die keine Parameter haben, aus Gründen der Codegröße und Laufzeiteffizienz.

Die unten dokumentierten Arrays müssen dieselbe Größe wie für den method_id_item dex-Struktur, die der Methode zugeordnet ist, andernfalls wird ein java.lang.reflect.MalformedParametersException Laufzeit.

Das heißt: method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size muss mit names().length übereinstimmen und accessFlags().length

Weil MethodParameters alle formalen Methoden beschreibt auch solche, die nicht explizit oder implizit im Quellcode deklariert sind, Die Größe der Arrays kann sich von der Signatur oder anderen Metadaten unterscheiden. Informationen, die nur auf expliziten Parametern basieren, die in der Quelle deklariert wurden Code. MethodParameters gibt auch keine Informationen über -Typanmerkungsempfängerparameter, die in der eigentlichen Methode nicht vorhanden sind. Signatur.

Name Format Beschreibung
namen String[] Die Namen der formalen Parameter für die zugehörige Methode. Das Array darf nicht null sein, muss aber leer sein, wenn keine formalen Parameter vorhanden sind. Ein Wert in Das Array muss null sein, wenn der formale Parameter mit diesem Index keinen Namen hat.
Strings für Parameternamen sind leer oder enthalten „.“, „;“, „[“ oder "/" dann ein java.lang.reflect.MalformedParametersException wird um Laufzeit.
accessFlags int[] Die Zugriffs-Flags der formalen Parameter für die zugehörige Methode. Die Das Array darf nicht null sein, muss aber leer sein, wenn keine formalen Parameter vorhanden sind.
Der Wert ist eine Bitmaske mit den folgenden Werten:
<ph type="x-smartling-placeholder">
    </ph>
  • 0x0010 : final, der Parameter wurde als final deklariert
  • 0x1000 : synthetisch, der Parameter wurde vom Compiler eingeführt
  • 0x8000 : erforderlich; der Parameter ist synthetisch, wird aber auch von der Sprache impliziert Spezifikation
Wenn Bits außerhalb dieses Satzes gesetzt sind, java.lang.reflect.MalformedParametersException wird zur Laufzeit ausgelöst.

dalvik.annotation.Signatur

Erscheint für Klassen, Felder und Methoden

Jede Klasse wird mit einer Signature-Anmerkung versehen. Feld oder Methode, die im Hinblick auf einen komplizierteren Typ definiert ist, als durch type_id_item dargestellt werden kann. Die Das .dex-Format definiert nicht das Format für Signaturen. sie soll lediglich die Signaturen einer Quelle darstellen. Sprache ist für die erfolgreiche Implementierung des Semantik. Daher werden Signaturen im Allgemeinen nicht geparst (oder verifiziert) durch virtuelle Maschinenimplementierungen. Die Unterschriften werden einfach zugestellt. auf übergeordnete APIs und Tools (wie Debugger) übertragen. Jegliche Verwendung eines Signatur ist daher so zu verfassen, Annahmen darüber, nur gültige Signaturen zu erhalten, expliziter Schutz der Möglichkeit eines syntaktischen ungültige Signatur.

Da Signaturstrings in der Regel viele duplizierte Inhalte enthalten, Eine Signature-Annotation ist definiert als Array aus , bei denen sich duplizierte Elemente naturgemäß auf dasselbe zugrunde liegende Daten und die Signatur ist die Verkettung von alle Zeichenfolgen im Array. Es gibt keine Regeln dazu, wie Signatur in separate Strings aufteilen; die vollständig von der Tools zum Generieren von .dex-Dateien.

Name Format Beschreibung
value String[] die Signatur dieser Klasse oder dieses Mitglieds als Array von Zeichenfolgen, die miteinander verkettet werden,

dalvik.annotation.wirft

Erscheint bei Methoden

Jeder Methode wird eine Throws-Anmerkung zugeordnet, deklariert, um einen oder mehrere Ausnahmetypen auszulösen.

Name Format Beschreibung
value Klasse[] Das Array der ausgelösten Ausnahmetypen