Eine .dex-Datei ist das Transportformat für Dalvik-Bytecode. Es gibt bestimmte syntaktische und semantische Einschränkungen, damit eine Datei eine gültige .dex-Datei ist. Außerdem ist eine Laufzeit erforderlich, die nur gültige .dex-Dateien unterstützt.
Allgemeine Einschränkungen für die Integrität von .dex-Dateien
Allgemeine Integritätseinschränkungen beziehen sich auf die größere Struktur einer .dex-Datei, wie im .dex-Format ausführlich beschrieben.
| ID | Beschreibung | 
|---|---|
| G1 | Die magic-Nummer der.dex-Datei mussdex\n035\0für Version 35 oder ähnlich für spätere Versionen sein. | 
| G2 | Die Prüfsumme muss eine Adler-32-Prüfsumme des gesamten Dateiinhalts sein, mit Ausnahme der Felder magicundchecksum. | 
| G3 | Die Signatur muss ein SHA-1-Hash des gesamten Dateiinhalts mit Ausnahme von magic,checksumundsignaturesein. | 
| G4 | 
 Das  | 
| G5 | 
 
 | 
| G6 | endian_tagmuss entweder den WertENDIAN_CONSTANToderREVERSE_ENDIAN_CONSTANThaben. | 
| G7 | Für die Abschnitte  
            Die Felder  | 
| G8 | Alle Offset-Felder in der Kopfzeile mit Ausnahme von map_offmüssen auf vier Byte ausgerichtet sein. | 
| G9 | Das Feld map_offmuss entweder null sein oder auf den Datenabschnitt verweisen. In diesem Fall muss der Abschnittdatavorhanden sein. | 
| G10 | Die Abschnitte link,string_ids,type_ids,proto_ids,field_ids,method_ids,class_defsunddatadürfen sich nicht überschneiden oder den Header überlagern. | 
| G11 | Wenn eine Zuordnung vorhanden ist, muss jeder Zuordnungseintrag einen gültigen Typ haben. Jeder Typ darf höchstens einmal vorkommen. | 
| G12 | Wenn eine Map vorhanden ist, muss jeder Map-Eintrag einen nicht nullwertigen Offset und eine nicht nullwertige Größe haben. Der Offset muss auf den entsprechenden Abschnitt der Datei verweisen (d.h. ein string_id_itemmuss auf den Abschnittstring_idsverweisen) und die explizite oder implizite Größe des Elements muss mit dem tatsächlichen Inhalt und der Größe des Abschnitts übereinstimmen. | 
| G13 | Wenn eine Zuordnung vorhanden ist, muss der Offset des Zuordnungseintrags n+1größer oder gleich dem Offset des Zuordnungseintragsn plus than size of map entry nsein. Das bedeutet, dass sich Einträge nicht überschneiden dürfen und in absteigender Reihenfolge sortiert sein müssen. | 
| G14 | Die folgenden Arten von Einträgen müssen einen auf vier Byte ausgerichteten Offset haben: string_id_item,type_id_item,proto_id_item,field_id_item,method_id_item,class_def_item,type_list,code_itemundannotations_directory_item. | 
| G15 | Für jede  Für jede   Für den referenzierten  | 
| G16 | Für jeden type_id_itemmuss das Felddescriptor_idxeine gültige Referenz auf die Listestring_idsenthalten. Der referenzierte String muss ein gültiger Typdeskriptor sein. | 
| G17 | Für jeden proto_id_itemmuss das Feldshorty_idxeine gültige Referenz auf die Listestring_idsenthalten. Der referenzierte String muss ein gültiger Shorty-Beschreibungsstring sein. Außerdem muss das Feldreturn_type_idxein gültiger Index in den Abschnitttype_idssein und das Feldparameters_offmuss entweder null oder ein gültiger Offset sein, der auf den Abschnittdataverweist. Wenn der Wert ungleich null ist, darf die Parameterliste keine ungültigen Einträge enthalten. | 
| G18 | Für jede field_id_itemmüssen sowohl die Felderclass_idxals auchtype_idxgültige Indizes in der Listetype_idssein. Der Eintrag, auf denclass_idxverweist, muss kein Arrayreferenztyp sein. Außerdem muss das Feldname_idxein gültiger Verweis auf den Abschnittstring_idssein und der Inhalt des referenzierten Eintrags muss derMemberName-Spezifikation entsprechen. | 
| G19 | Für jede method_id_itemmuss das Feldclass_idxein gültiger Index in den Abschnitttype_idssein und der referenzierte Eintrag darf kein Arraytyp sein. Das Feldproto_idmuss eine gültige Referenz auf die Listeproto_idssein. Das Feldname_idxmuss ein gültiger Verweis auf den Abschnittstring_idssein und der Inhalt des referenzierten Eintrags muss derMemberName-Spezifikation entsprechen. | 
| G20 | Für jede field_id_itemmuss das Feldclass_idxein gültiger Index in der Listetype_idssein. Der referenzierte Eintrag darf kein Array-Referenztyp sein. | 
Statische Bytecodeeinschränkungen
Statische Einschränkungen sind Einschränkungen für einzelne Elemente des Bytecodes. Sie können in der Regel ohne Kontroll- oder Datenflussanalysemethoden geprüft werden.
| ID | Beschreibung | 
|---|---|
| A1 | Das insns-Array darf nicht leer sein. | 
| A2 | Der erste Opcode im insns-Array muss den Index 0 haben. | 
| A3 | Das insns-Array darf nur gültige Dalvik-Opcodes enthalten. | 
| A4 | Der Index von Anweisung n+1muss dem Index von Anweisungnplus der Länge von Anweisungnentsprechen, wobei mögliche Operanden berücksichtigt werden. | 
| A5 | Die letzte Anweisung im insns-Array muss am Indexinsns_size-1enden. | 
| A6 | Alle goto- undif-<kind>-Ziele müssen Opcodes innerhalb derselben Methode sein. | 
| A7 | Alle Ziele einer packed-switch-Anweisung müssen Opcodes innerhalb derselben Methode sein. Größe und Liste der Ziele müssen übereinstimmen. | 
| A8 | Alle Ziele einer sparse-switch-Anweisung müssen Opcodes innerhalb derselben Methode sein. Die entsprechende Tabelle muss konsistent sein und von niedrig nach hoch sortiert sein. | 
| A9 | Der B-Operand der Anweisungenconst-stringundconst-string/jumbomuss ein gültiger Index in den Stringkonstantenpool sein. | 
| A10 | Der C-Operand der Anweisungeniget<kind>undiput<kind>muss ein gültiger Index in den Feldkonstantenpool sein. Der referenzierte Eintrag muss ein Instanzfeld sein. | 
| A11 | Der C-Operand der Anweisungensget<kind>undsput<kind>muss ein gültiger Index in den Feldkonstantenpool sein. Der referenzierte Eintrag muss ein statisches Feld sein. | 
| A12 | Der C-Operand der Anweisungeninvoke-virtual,invoke-super,invoke-directundinvoke-staticmuss ein gültiger Index in den Methodenkonstantenpool sein. | 
| A13 | Der B-Operand der Anweisungeninvoke-virtual/range,invoke-super/range,invoke-direct/rangeundinvoke-static/rangemuss ein gültiger Index in den Methodenkonstantenpool sein. | 
| A14 | Eine Methode, deren Name mit „<“ beginnt, darf nur implizit von der VM aufgerufen werden, nicht durch Code, der aus einer .dex-Datei stammt. Die einzige Ausnahme ist der Instanzinitialisierer, der voninvoke-directaufgerufen werden kann. | 
| A15 | Der C-Operand derinvoke-interface-Anweisung muss ein gültiger Index in den Methodenkonstantenpool sein. Der referenziertemethod_idmuss zu einer Schnittstelle (nicht zu einer Klasse) gehören. | 
| A16 | Der B-Operand derinvoke-interface/range-Anweisung muss ein gültiger Index in den Methodenkonstantenpool sein.
          Der referenziertemethod_idmuss zu einer Schnittstelle gehören (nicht zu einer Klasse). | 
| A17 | Der B-Operand der Anweisungenconst-class,check-cast,new-instanceundfilled-new-array/rangemuss ein gültiger Index in den Typkonstantenpool sein. | 
| A18 | Der C-Operand der Anweisungeninstance-of,new-arrayundfilled-new-arraymuss ein gültiger Index in den Typkonstantenpool sein. | 
| A19 | Die Dimensionen eines Arrays, das mit einer new-array-Anweisung erstellt wurde, müssen kleiner als256sein. | 
| A20 | Die new-Anweisung darf sich nicht auf Arrayklassen, Schnittstellen oder abstrakte Klassen beziehen. | 
| A21 | Der Typ, auf den eine new-array-Anweisung verweist, muss ein gültiger Nicht-Referenztyp sein. | 
| A22 | Alle Register, auf die eine Anweisung in einer einzelnen Breite (nicht paarweise) verweist, müssen für die aktuelle Methode gültig sein. Das bedeutet, dass ihre Indizes nicht negativ und kleiner als registers_sizesein dürfen. | 
| A23 | Alle Register, auf die eine Anweisung in doppelter Breite (Paare) verweist, müssen für die aktuelle Methode gültig sein. Die Indizes dürfen also nicht negativ und kleiner als registers_size-1sein. | 
| A24 | Der method_id-Operand der Anweisungeninvoke-virtualundinvoke-directmuss zu einer Klasse (nicht zu einer Schnittstelle) gehören. In Dex-Dateien vor Version037gilt das auch fürinvoke-super- undinvoke-static-Anweisungen. | 
| A25 | Der method_id-Operand der Anweisungeninvoke-virtual/rangeundinvoke-direct/rangemuss zu einer Klasse (nicht zu einer Schnittstelle) gehören. In Dex-Dateien vor Version037muss dies auch fürinvoke-super/range- undinvoke-static/range-Anweisungen gelten. | 
Strukturelle Bytecode-Einschränkungen
Strukturelle Einschränkungen sind Einschränkungen für Beziehungen zwischen mehreren Elementen des Bytecodes. Sie können in der Regel nicht ohne Kontroll- oder Datenflussanalysetechniken geprüft werden.
| ID | Beschreibung | 
|---|---|
| B1 | Die Anzahl und die Typen der Argumente (Register und unmittelbare Werte) müssen immer mit der Anweisung übereinstimmen. | 
| B2 | Registerpaare dürfen niemals getrennt werden. | 
| B3 | Ein Register (oder Paar) muss zuerst zugewiesen werden, bevor es gelesen werden kann. | 
| B4 | Eine invoke-direct-Anweisung darf nur einen Instanzinitialisierer oder eine Methode in der aktuellen Klasse oder in einer ihrer übergeordneten Klassen aufrufen. | 
| B5 | Ein Instanzinitialisierer darf nur auf einer nicht initialisierten Instanz aufgerufen werden. | 
| B6 | Instanzmethoden können nur auf bereits initialisierten Instanzen aufgerufen und auf Instanzfelder nur auf bereits initialisierten Instanzen zugegriffen werden. | 
| B7 | Ein Register, das das Ergebnis einer new-instance-Anweisung enthält, darf nicht verwendet werden, wenn dieselbenew-instance-Anweisung noch einmal ausgeführt wird, bevor die Instanz initialisiert wird. | 
| B8 | Ein Instanzinitialisierer muss einen anderen Instanzinitialisierer (derselben Klasse oder übergeordneten Klasse) aufrufen, bevor auf Instanzmitglieder zugegriffen werden kann.
           Ausnahmen sind nicht vererbte Instanzfelder, die zugewiesen werden können, bevor ein anderer Initialisator und die Object-Klasse allgemein aufgerufen werden. | 
| B9 | Alle tatsächlichen Methodenargumente müssen mit ihren jeweiligen formellen Argumenten kompatibel sein. | 
| B10 | Bei jedem Aufruf einer Instanzmethode muss die tatsächliche Instanz mit der in der Anweisung angegebenen Klasse oder Schnittstelle kompatibel sein. | 
| B11 | Eine return<kind>-Anweisung muss mit dem Rückgabetyp der Methode übereinstimmen. | 
| B12 | Beim Zugriff auf geschützte Mitglieder einer Superklasse muss der tatsächliche Typ der Instanz, auf die zugegriffen wird, entweder die aktuelle Klasse oder eine ihrer Unterklassen sein. | 
| B13 | Der Typ eines Werts, der in einem statischen Feld gespeichert wird, muss mit dem Typ des Felds übereinstimmen oder in diesen konvertiert werden können. | 
| B14 | Der Typ eines in einem Feld gespeicherten Werts muss mit dem Typ des Felds übereinstimmen oder in diesen konvertiert werden können. | 
| B15 | Der Typ jedes in einem Array gespeicherten Werts muss mit dem Komponententyp des Arrays kompatibel sein. | 
| B16 | Der A-Operand einerthrow-Anweisung muss mitjava.lang.Throwablekompatibel sein. | 
| B17 | Die letzte erreichbare Anweisung einer Methode muss entweder eine rückwärtsgerichtete goto- oder Verzweigungsanweisung, einereturn- oder einethrow-Anweisung sein. Es darf nicht möglich sein, dasinsns-Array unten zu lassen. | 
| B18 | Die nicht zugewiesene Hälfte eines früheren Registerpaars kann erst gelesen werden (wird als ungültig betrachtet), wenn sie durch eine andere Anweisung neu zugewiesen wurde. | 
| B19 | Vor einer move-result<kind>-Anweisung muss iminsns-Array unmittelbar eineinvoke-<kind>-Anweisung stehen. Die einzige Ausnahme ist die Anweisungmove-result-object, vor der auch eine Anweisungfilled-new-arraystehen kann. | 
| B20 | Einer move-result<kind>-Anweisung muss im tatsächlichen Kontrollfluss unmittelbar eine übereinstimmendereturn-<kind>-Anweisung vorausgehen. Es darf nicht zu ihr gesprungen werden. Die einzige Ausnahme ist die Anweisungmove-result-object, der auch eine Anweisungfilled-new-arrayvorangestellt werden kann. | 
| B21 | Eine move-exception-Anweisung darf nur als erste Anweisung in einem Ausnahme-Handler erscheinen. | 
| B22 | Die Pseudoanweisungen packed-switch-data,sparse-switch-dataundfill-array-datadürfen nicht über die Ablaufsteuerung erreichbar sein. |