Formato eseguibile Dalvik

Questo documento descrive il layout e i contenuti di .dex utilizzati per contenere un insieme di definizioni di classe e relativi dati aggiuntivi.

Guida ai tipi

Nome Descrizione
byte Accesso a 8 bit
ubyte Int non firmato a 8 bit
video breve Int con firma a 16 bit, small-endian
Ushort Int non firmato a 16 bit, small-endian
int Int con firma a 32 bit, small-endian
Uint Int non firmato a 32 bit, small-endian
lunghi Int con firma a 64 bit, small-endian
Ulong Int non firmato a 64 bit, small-endian
sleb128 firmato LEB128, lunghezza variabile (vedi sotto)
uleb128 LEB128 non firmato, lunghezza variabile (vedi sotto)
uleb128p1 LEB128 non firmato più 1, lunghezza variabile (vedi sotto)

LEB128

LEB128 ("Little-Endian Base 128") è un codifica a lunghezza variabile quantità intere con o senza segno arbitrario. Il formato precedente preso in prestito da DWARF3 e la specifica del prodotto. In un file .dex, LEB128 viene utilizzato solo per codificano quantità a 32 bit.

Ogni valore codificato LEB128 è composto da uno a cinque di byte, che insieme rappresentano un singolo valore a 32 bit. Ciascuna ha il bit più significativo impostato, ad eccezione dell'ultimo byte nel sequenza, che ha il suo bit più significativo chiaro. I restanti sette bit di ogni byte sono payload, con i sette bit meno significativi bit della quantità nel primo byte, i sette successivi nel secondo byte e così via. Nel caso di un LEB128 (sleb128) firmato, il bit di payload più significativo del byte finale della sequenza è esteso per produrre il valore finale. Nel caso non firmato (uleb128), tutti i bit non rappresentati esplicitamente sono interpretato come 0.

Diagramma a bit di un valore LEB128 a due byte
Primo byte Secondo byte
1 bit6 bit5 bit4 bit3 bit2 bit1 bit0 0 bit13 bit12 bit11 bit10 bit9 bit8 bit7

La variante uleb128p1 viene utilizzata per rappresentare un dove la rappresentazione è rappresentata dal valore più uno codificato come uleb128. Ciò rende la codifica di -1 (in alternativa si pensa al valore non firmato 0xffffffff) ma nessun altro numero negativo è un singolo byte, proprio nei casi in cui il numero rappresentato deve essere non negativo o -1 (o 0xffffffff), e dove non sono consentiti altri valori negativi (o dove non sono consentiti valori di grandi dimensioni è improbabile che siano necessari).

Ecco alcuni esempi di formati:

Sequenza codificata Come sleb128 Come uleb128 Come uleb128p1
0000-1
01110
7f-1127126
80 7f-1281625616255

Layout file

Nome Formato Descrizione
intestazione intestazione_elemento l'intestazione
ID_stringa stringa_id_item[] di identificatori di stringa. Questi sono identificatori per tutte le stringhe utilizzati da questo file, per denominazione interna (ad es. descrittori del tipo) o come oggetti costanti indicati dal codice. Questo elenco deve essere ordinato per contenuti di stringa, utilizzando valori in punti di codice UTF-16 (non in un in base alle impostazioni internazionali) e non deve contenere voci duplicate.
ID_tipo type_id_item[] degli identificatori dei tipi. Si tratta di identificatori per tutti i tipi (classi, o tipi primitivi) a cui si fa riferimento in questo file, se definiti presenti nel file. Questo elenco deve essere ordinato per string_id e non deve contenere voci duplicate.
ID_proto proto_id_item[] di identificatori del prototipo del metodo. Questi identificatori sono i prototipi a cui fa riferimento questo file. Questo elenco deve essere ordinato in tipo di reso (in base all'indice type_id) in ordine principale, quindi in base a un elenco di argomenti (ordinamento lessicografico, singoli argomenti) ordinati in base all'indice type_id). L'elenco non deve contenere voci duplicate.
campo_id campo_id_item[] di identificatori di campo. Questi sono identificatori per tutti i campi a cui fa riferimento questo file, indipendentemente dal fatto che siano definiti nel file o meno. Questo dell'elenco deve essere ordinato, dove il tipo che definisce (per type_id indice) è l'ordine principale, il nome del campo (per indice string_id) è l'ordine intermedio e il tipo (per indice type_id) è l'ordine minore. L'elenco non deve contenere voci duplicate.
ID_metodo metodo_id_item[] di identificatori dei metodi. Questi sono identificatori per tutti i metodi a cui fa riferimento questo file, indipendentemente dal fatto che siano definiti nel file o meno. Questo dell'elenco deve essere ordinato, dove il tipo che definisce (per type_id index) è l'ordine principale, il nome del metodo (di string_id ) è l'ordine intermedio e il prototipo del metodo (mediante proto_id) è l'ordine minore. L'elenco non deve contenere voci duplicate.
def_classi class_def_item[] delle definizioni delle classi. Le classi devono essere ordinate in modo che una determinata la superclasse della classe e le interfacce implementate precedente alla classe di riferimento. Inoltre, non è valida per una definizione che la classe con lo stesso nome appaia più di una volta dall'elenco.
ID_sito_di_chiamata call_site_id_item[] degli identificatori dei siti di chiamata. Questi sono identificatori per tutti i siti di chiamata a cui fa riferimento questo file, indipendentemente dal fatto che siano definiti nel file o meno. Questo elenco devono essere ordinati in ordine crescente di call_site_off.
handle_metodo metodo_handle_item[] dell'elenco di handle del metodo. Un elenco di tutti gli handle di metodi a cui fa riferimento questo file, indipendentemente dal fatto che siano definite nel file o meno. Questo elenco non è ordinato e può contenere duplicati che corrispondono logicamente a diverse istanze dell'handle di metodi.
dati ubyte[] contenente tutti i dati di supporto per le tabelle elencate sopra. Elementi diversi hanno requisiti di allineamento differenti. i byte di spaziatura interna vengono inseriti prima di ogni elemento se necessario corretto allineamento.
dati_link ubyte[] utilizzati in file collegati in modo statico. Il formato dei dati in questa sezione non è specificata da questo documento. Questa sezione è vuota nei file scollegati e nelle implementazioni del runtime possono utilizzarlo in base alle loro esigenze.

Definizioni di bitfield, stringa e costante

DEX_FILE_MAGIC

Incorporato in header_item

La matrice/stringa costante DEX_FILE_MAGIC è l'elenco di byte che devono essere visualizzati all'inizio di un file .dex affinché venga riconosciuto come tale. Il valore intenzionalmente contiene una nuova riga ("\n" o 0x0a) e un byte null ("\0" o 0x00) per facilitare nella rilevazione di determinate forme di corruzione. Il valore codifica un numero di versione in formato a tre cifre decimali, ovvero che si prevede aumenti in modo monotonico nel tempo con l'evoluzione del formato.

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

Nota: supporto per la versione 039 di è stato aggiunto nella release Android 9.0, che ha introdotto due nuovi bytecode, const-method-handle e const-method-type. (Ciascuna di queste opzioni è descritta Riepilogo del set di bytecode . In Android 10, la versione 039 estende il formato file DEX per includere Informazioni sull'API applicabili solo ai file DEX nel percorso della classe di avvio.

Nota: supporto per la versione 038 del formato è stato aggiunto in Android 8.0 . La versione 038 ha aggiunto nuovi bytecode (invoke-polymorphic e invoke-custom) e per gli handle dei metodi.

Nota: supporto per la versione 037 di è stato aggiunto nella release Android 7.0. Prima della versione 037 versioni di Android hanno utilizzato la versione 035 del formato. L'unico la differenza tra le versioni 035 e 037 è aggiunta di metodi predefiniti e modifica dei invoke.

Nota:almeno un paio di versioni precedenti del formato hanno in release di software pubblico ampiamente disponibili. Ad esempio: per le release M3 è stata utilizzata la versione 009 piattaforma Android (novembre-dicembre 2007), e la versione 013 è stata utilizzata per le release M5 di Android piattaforma (febbraio-marzo 2008). Per diversi aspetti, queste precedenti di queste versioni del formato differiscono significativamente da quelle descritte in questo documento.

ENDIAN_CONSTANT e REVERSE_ENDIAN_CONSTANT

Incorporato in header_item

La costante ENDIAN_CONSTANT viene utilizzata per indicare endianness del file in cui si trova. Sebbene lo standard Il formato .dex è small-endian, le implementazioni possono scegliere per eseguire lo scambio di byte. Se un'implementazione riscontra un intestazione il cui endian_tag è REVERSE_ENDIAN_CONSTANT invece di ENDIAN_CONSTANT, saprebbe che il file è stato scambiato in byte dal formato previsto.

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

NESSUN_INDICE

Incorporati in class_def_item e debug_info_item

La costante NO_INDEX viene utilizzata per indicare che non è presente un valore di indice.

Nota: questo valore non è definito come 0, perché si tratta di un indice generalmente valido.

Il valore scelto per NO_INDEX è rappresentabile come singolo byte nella codifica uleb128p1.

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

Definizioni di access_flags

Incorporati in class_def_item, coded_field, coded_method e Classe Interna

I bitfield di questi flag vengono utilizzati per indicare l'accessibilità e le proprietà complessive dei corsi e dei membri dei corsi.

Nome Valore Per i corsi (e InnerClass annotazioni) Per i campi Per metodi
ACC_PUBBLICO 0x1 public: visibile ovunque public: visibile ovunque public: visibile ovunque
ACC_PRIVATE 0x2 * private: visibile solo al corso che definisce private: visibile solo al corso che definisce private: visibile solo al corso che definisce
ACC_PROTECTED 0x4 * protected: visibile al pacchetto e alle sottoclassi protected: visibile al pacchetto e alle sottoclassi protected: visibile al pacchetto e alle sottoclassi
ACC_STATIC 0x8 * static: non è creato con un parametro esterno Riferimento this static: da globale a definizione della classe static: non accetta un argomento this
ACC_FINALE 0x10 final: non sottoclassificabile final: immutabile dopo la costruzione final: non sostituibile
ACC_SINCRONIZZATO 0x20     synchronized: blocco associato acquisito automaticamente circa la chiamata a questo metodo.

Nota:è valida solo per l'impostazione quando È impostato anche ACC_NATIVE.

ACC_VOLATILE 0x40   volatile: regole di accesso speciali utili per il thread sicurezza  
ACC_BRIDGE 0x40     metodo bridge, aggiunto automaticamente dal compilatore come metodo sicuro per il tipo ponte
ACC_TRANSIENT 0x80   transient: non da salvare per impostazione predefinita di serializzazione  
ACC_VARARGS 0x80     l'ultimo argomento deve essere trattato come "rest" argomento del compilatore
ACC_NATIVE 0x100     native: implementato nel codice nativo
INTERFACCIA_ACC_INTERFACCIA 0x200 interface: classe astratta implementabile moltiplicativa    
ACC_ABSTRACT 0x400 abstract: non è possibile creare direttamente un'istanza   abstract: non implementato da questa classe
ACC_STRICT 0x800     strictfp: regole rigide per l'aritmetica in virgola mobile
ACC_SINTETICO 0x1000 non definiti direttamente nel codice sorgente non definiti direttamente nel codice sorgente non definiti direttamente nel codice sorgente
ACC_annotazione 0x2000 dichiarato come classe di annotazione    
ACC_ENUM 0x4000 dichiarato come tipo enumerato dichiarato come valore enumerato  
(non utilizzato) 0x8000      
ACC_CONSTRUCTOR 0 x 10.000     Metodo del costruttore (inizializzatore di classi o istanze)
ACC_DECLARED_
SINCRONIZZATO
0 x 20.000     dichiarato synchronized.

Nota:questa operazione non ha alcun effetto su dell'esecuzione (tranne che in riferimento a questa segnalazione, di per sé).

* Consentito solo per InnerClass annotazioni, e non deve mai essere acceso in un class_def_item.

Codifica UTF-8 modificata

Come concessione di un supporto precedente più semplice, il formato .dex codifica i dati di stringa in un formato UTF-8 modificato standard di fatto, da qui in avanti noto come MUTF-8. Questo formato è identico a quello standard UTF-8, ad eccezione del fatto che:

  • Vengono utilizzate solo le codifiche da uno, due o tre byte.
  • Punti di codice nell'intervallo U+10000 ... U+10ffff sono codificati come una coppia di surrogati, ciascuno di che è rappresentato da un valore codificato a tre byte.
  • Il punto di codice U+0000 è codificato in formato a due byte.
  • Un byte null semplice (valore 0) indica la fine di una stringa, così come l'interpretazione standard del linguaggio C.

I primi due elementi sopra possono essere riassunti come: MUTF-8 è un formato di codifica per UTF-16, invece di essere un formato formato di codifica per i caratteri Unicode.

Gli ultimi due elementi sopra consentono di includere contemporaneamente il punto di codice U+0000 in una stringa e manipolare una stringa con terminazione null in stile C.

Tuttavia, la codifica speciale di U+0000 significa che, a differenza di UTF-8 normale, il risultato della chiamata alla funzione C standard strcmp() su una coppia di stringhe MUTF-8 non sempre indicare il risultato firmato correttamente del confronto di stringhe diseguali. Quando l'ordine (non solo l'uguaglianza) è un problema, la soluzione più diretta per confrontare le stringhe MUTF-8 è decodificarle carattere per carattere, e confronterai i valori decodificati. (Tuttavia, implementazioni più intelligenti sono possibile.)

Consulta la sezione The Unicode Standard per ulteriori informazioni sulla codifica dei caratteri. MUTF-8 è in realtà più vicino alla codifica (relativamente meno nota) CESU-8 rispetto a UTF-8 di per sé.

Codifica coded_value

Incorporati in annotazioni_element e coded_array_item

Un encoded_value è un elemento codificato di (quasi) di dati strutturati arbitrariamente. Lo scopo della codifica sia compatta che semplice da analizzare.

Nome Formato Descrizione
(valore_arg << 5) | tipo_valore ubyte che indica il tipo di account immediatamente successivo value insieme con un argomento di chiarimento facoltativo in tre bit di ordine più alto. Di seguito sono riportate le varie definizioni di value. Nella maggior parte dei casi, value_arg codifica la lunghezza il valore value immediatamente successivo in byte, (size - 1), ad esempio 0 significa che il valore richiede un byte, e 7 significa che richiede otto byte; tuttavia, ci sono delle eccezioni come indicato di seguito.
valore ubyte[] byte che rappresentano il valore, di lunghezza variabile e in modo diverso per value_type byte diversi, però sempre small-endian. Consulta le varie definizioni dei valori riportate di seguito per i dettagli.

Formati valore

Nome tipo value_type Formato value_arg Formato value Descrizione
VALORE_BYTE 0x00 (nessuno; deve essere 0) ubyte[1] valore intero a un byte firmato
VALORE_SHORT 0x02 dimensione - 1 (0...1) ubyte[dimensione] valore intero a due byte con segno, esteso per segno
CARTA DI VALORE 0x03 dimensione - 1 (0...1) ubyte[dimensione] valore intero a due byte senza segno, esteso zero
VALORE_INT 0x04 dimensione - 1 (0...3) ubyte[dimensione] valore intero a quattro byte con segno, segno esteso
VALORE_LUNGO 0x06 dimensione - 1 (0...7) ubyte[dimensione] valore intero a otto byte con segno, segno esteso
VALORE_FLOAT 0x10 dimensione - 1 (0...3) ubyte[dimensione] pattern a quattro byte, con estensione zero a destra e interpretato come un valore in virgola mobile IEEE754 a 32 bit
VALORE_DOPPIO 0x11 dimensione - 1 (0...7) ubyte[dimensione] pattern a otto byte, con estensione zero a destra e interpretato come un valore in virgola mobile IEEE754 a 64 bit
TIPO_DI_VALORE_METODO 0x15 dimensione - 1 (0...3) ubyte[dimensione] valore intero a quattro byte senza segno (zero esteso), interpretabili come un indice la sezione proto_ids e che rappresenta il valore di un tipo di metodo
GENERE_METODO_VALORE 0x16 dimensione - 1 (0...3) ubyte[dimensione] valore intero a quattro byte senza segno (zero esteso), interpretabili come un indice la sezione method_handles e che rappresenta il valore dell'handle di un metodo
VALORE_STRING 0x17 dimensione - 1 (0...3) ubyte[dimensione] valore intero a quattro byte senza segno (zero esteso), interpretabili come un indice la sezione string_ids e che rappresenta un valore stringa
TIPO_DI_VALORE 0x18 dimensione - 1 (0...3) ubyte[dimensione] valore intero a quattro byte senza segno (zero esteso), interpretabili come un indice sezione type_ids e che rappresenta un valore tipo/classe
CAMPO_VALORE 0x19 dimensione - 1 (0...3) ubyte[dimensione] valore intero a quattro byte senza segno (zero esteso), interpretabili come un indice sezione field_ids e che rappresenta un valore del campo
METODO_VALORE 0x1a dimensione - 1 (0...3) ubyte[dimensione] valore intero a quattro byte senza segno (zero esteso), interpretabili come un indice sezione method_ids e che rappresenta un valore del metodo
VALORE_ENUM 0x1b dimensione - 1 (0...3) ubyte[dimensione] valore intero a quattro byte senza segno (zero esteso), interpretabili come un indice la sezione field_ids e che rappresenta il valore una costante di tipo enumerato
ARRAY_VALORE 0x1c (nessuno; deve essere 0) array_codificato un array di valori, nel formato specificato "Formato encoded_array" di seguito. Le dimensioni di value è implicito nella codifica.
VALORE_annotazione 0 x 1 g (nessuno; deve essere 0) annotazione_codificata una sotto-annotazione, nel formato specificato "Formato encoded_annotation" di seguito. Le dimensioni di value è implicito nella codifica.
VALORE_NULL 0x1e (nessuno; deve essere 0) (nessuno) Valore di riferimento null
VALORE_BOOLEAN 0x1f booleano (0...1) (nessuno) valore a un bit; 0 per false e 1 per true. Il bit è rappresentato nel value_arg.

formato array_codificato

Nome Formato Descrizione
dimensioni uleb128 numero di elementi presenti nell'array
valori valore_codificato[size] una serie di size encoded_value byte sequenze nel formato specificato da questa sezione, concatenate in sequenza.

formato di annotazione_codificata

Nome Formato Descrizione
type_idx uleb128 tipo di annotazione. Deve essere una classe (non un array o primitiva) di testo.
dimensioni uleb128 numero di mappature nome-valore in questa annotazione
elementi elemento_annotazione[size] dell'annotazione, rappresentati direttamente in linea (non compensazioni). Gli elementi devono essere ordinati in ordine crescente per Indice string_id.

formato annotazioni_element

Nome Formato Descrizione
nome_idx uleb128 nome dell'elemento, rappresentato come un indice nel Sezione string_ids. La stringa deve essere conforme ai la sintassi per MemberName, definita sopra.
valore valore_codificato valore dell'elemento

Sintassi delle stringhe

In un file .dex esistono diversi tipi di elementi che in ultima analisi, per far riferimento a una stringa. Le seguenti definizioni di stile BNF indicare la sintassi accettabile per queste stringhe.

NomeSemplice

Un SimpleName è la base per la sintassi dei nomi degli altri cose nuove. Il formato .dex consente una discreta latitudine qui (molto più della maggior parte delle lingue di origine più comuni). In breve, un semplice è composto da qualsiasi carattere alfabetico o cifra bassa ASCII, alcune simboli specifici con caratteri ASCII basso e la maggior parte dei punti di codice non ASCII che non controllo, spazio o caratteri speciali. A partire dalla versione 040 il formato consente inoltre caratteri di spazio (Unicode Zs ). Tieni presente che i punti di codice surrogati (nell'intervallo U+d800 ... U+dfff) non sono considerati caratteri del nome validi, di per sé, ma Unicode supplementare sono validi (rappresentati dal testo finale) un'alternativa alla regola per SimpleNameChar), e dovrebbero essere rappresentati in un file come coppie di punti di codice surrogati nel file MUTF-8 codifica.

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

NomeMembro

utilizzato da field_id_item e method_id_item

MemberName è il nome di un membro di un corso, i cui membri vengono campi, metodi e classi interne.

NomeMembro
NomeSemplice
| '<' SimpleName '>'

NomeClasse Completa

Un FullClassName è il nome completo di un corso, che include un pacchetto facoltativo seguito da un nome obbligatorio.

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(SimpleName '/')*

Descrittore del tipo

Utilizzato da type_id_item

Un TypeDescriptor è la rappresentazione di qualsiasi tipo, tra cui primitive, classi, matrici e void. Vedi di seguito per il significato delle varie versioni.

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

Descrittore

Usato da proto_id_item

Uno ShortyDescriptor è la rappresentazione breve di un metodo un prototipo, inclusi i tipi di parametri e restituiti, con la differenza che nessuna distinzione tra i vari tipi di riferimento (classe o array). Invece, tutti i tipi di riferimento sono rappresentati da un singolo carattere 'L'.

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

semantica TypeDescriptor

Questo è il significato di ogni variante di TypeDescriptor.

Sintassi Significato
V void; valido solo per i tipi restituiti
Z boolean
B byte
S short
C char
I int
J long
F float
D double
qualificato/nome; il corso fully.qualified.Name
[descrittore array di descriptor, utilizzabile in modo ricorsivo ma non è valido avere più di 255 dimensioni.

Elementi e strutture correlate

Questa sezione include le definizioni di ciascuno degli elementi di primo livello potrebbe essere presente in un file .dex.

intestazione_elemento

Appare nella sezione dell'intestazione

Allineamento: 4 byte

Nome Formato Descrizione
magia ubyte[8] = DEX_FILE_MAGIC valore magico. Vedi la discussione sopra in "DEX_FILE_MAGIC" per ulteriori informazioni.
checksum Uint adler32 del checksum del resto del file (tutto tranne magic e questo campo); utilizzata per rilevare il danneggiamento dei file
firma ubyte[20] Firma SHA-1 (hash) del resto del file (tutto tranne magic, checksum e questo campo); in uso per identificare in modo univoco i file
dimensione_file Uint dimensioni dell'intero file (inclusa l'intestazione), in byte
dimensione_intestazione uint = 0x70 dimensioni dell'intestazione (l'intera sezione), in byte. Ciò consente una quantità limitata di compatibilità retro/inoltro senza l'annullamento della validità del formato.
tag_endian uint = ENDIAN_CONSTANT tag endianness. Consulta la discussione sopra in "ENDIAN_CONSTANT" e REVERSE_ENDIAN_CONSTANT" per ulteriori informazioni.
dimensione_link Uint dimensione della sezione dei link o 0 se questo file non è collegato in modo statico
collegamento_disattivato Uint dall'inizio del file alla sezione di collegamento, oppure 0 se link_size == 0. L'offset, se diverso da zero, dovrebbe essere su un offset nella sezione link_data. La dei dati indicati non è specificato da questo documento; questo campo di intestazione (e il precedente) vengono lasciati come hook per l'utilizzo implementazioni di runtime.
mappa_disattivata Uint dall'inizio del file all'elemento della mappa. L'offset, che deve essere diverso da zero, dovrebbe essere impostato su un offset nella sezione data, e i dati devono essere nel formato specificato da "map_list" di seguito.
dimensioni_id_stringa Uint numero di stringhe nell'elenco degli identificatori di stringa
ID_stringa_disattivato Uint dall'inizio del file all'elenco di identificatori di stringa; oppure 0 se string_ids_size == 0 (ammesso che strano caso limite). L'offset, se diverso da zero, dovrebbe essere all'inizio della sezione string_ids.
dimensioni_id_tipo Uint numero di elementi nell'elenco degli identificatori dei tipi, al massimo 65535
ID_tipo_disattivati Uint dall'inizio del file all'elenco di identificatori dei tipi, oppure 0 se type_ids_size == 0 (ammesso che strano caso limite). L'offset, se diverso da zero, deve essere all'inizio di type_ids .
dimensioni_ID_proto Uint numero di elementi nell'elenco di identificatori dei prototipi, al massimo 65535
ID_proto_disattivati Uint dall'inizio del file all'elenco di identificatori dei prototipi; oppure 0 se proto_ids_size == 0 (ammesso che strano caso limite). L'offset, se diverso da zero, deve essere all'inizio di proto_ids .
dimensione_id_campo Uint numero di elementi nell'elenco degli identificatori di campo
ID_campo_disattivato Uint dall'inizio del file all'elenco degli identificatori di campo oppure 0 se field_ids_size == 0. L'offset, se diverso da zero, dovrebbe essere all'inizio di field_ids .
ID_metodo_dimensione Uint numero di elementi nell'elenco degli identificatori di metodi
ID_metodo_off Uint dall'inizio del file all'elenco di identificatori di metodi, oppure 0 se method_ids_size == 0. L'offset, se diverso da zero, dovrebbe essere all'inizio di method_ids .
dimensione_def_classe Uint numero di elementi nell'elenco delle definizioni delle classi
def_classi_disattivato Uint l'offset dall'inizio del file all'elenco delle definizioni delle classi, oppure 0 se class_defs_size == 0 (ammesso che strano caso limite). L'offset, se diverso da zero, dovrebbe essere all'inizio della sezione class_defs.
data_size Uint Dimensioni della sezione data in byte. Deve essere un numero pari multiplo di sizeof(uint).
data_disattivata Uint dall'inizio del file all'inizio della Sezione data.

elenco_mappa

Viene visualizzato nella sezione dei dati.

Con riferimento da header_item

Allineamento: 4 byte

Questo è un elenco di tutti i contenuti di un file, in ordine. it contiene una certa ridondanza rispetto a header_item ma è pensato per essere una forma facile da usare per iterare l'intero . Un determinato tipo deve apparire al massimo una volta in una mappa, ma limitazione dei tipi di ordine in cui possono apparire, diversi dal limitazioni implicite nel resto del formato (ad es. La sezione header deve essere visualizzata per prima, seguita da un string_ids e così via). Inoltre, le voci della mappa devono essere ordinati per offset iniziale e non devono sovrapporsi.

Nome Formato Descrizione
dimensioni Uint dimensione dell'elenco, nelle voci
lista elemento_mappa[size] elementi dell'elenco

Formato mappa_elemento

Nome Formato Descrizione
digita Ushort il tipo di articoli; consulta la tabella seguente
unused Ushort (non utilizzato)
dimensioni Uint conteggio del numero di elementi da trovare nell'offset indicato
offset Uint sfalsato dall'inizio del file agli elementi in questione

Digita i codici

Tipo di elemento Costante Valore Dimensioni elemento in byte
intestazione_elemento TYPE_HEADER_ITEM 0x0000 0x70
stringa_id_item TYPE_STRING_ID_ITEM 0x0001 0x04
type_id_item TYPE_TYPE_ID_ITEM 0x0002 0x04
proto_id_item TYPE_PROTO_ID_ITEM 0x0003 0x0c
campo_id_elemento TYPE_FIELD_ID_ITEM 0x0004 0x08
metodo_id_item TYPE_METHOD_ID_ITEM 0x0005 0x08
class_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
call_site_id_item TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
metodo_handle_item ARTICOLO_TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
elenco_mappa TYPE_MAP_LIST 0x1000 4 + (dimensione articolo * 12)
elenco_tipi TYPE_TYPE_LIST 0x1001 4 + (item.size * 2)
annotazioni_set_ref_list TYPE_annotazione_SET_REF_LIST 0x1002 4 + (dimensione articolo * 4)
annotazioni_set_item TIPO_____SET_ITEM 0x1003 4 + (dimensione articolo * 4)
class_data_item TYPE_CLASS_DATA_ITEM 0x2000 implicit; devono analizzare
elemento_codice TYPE_CODE_ITEM 0x2001 implicit; devono analizzare
stringa_dati_item TYPE_STRING_DATA_ITEM 0x2002 implicit; devono analizzare
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 implicit; devono analizzare
elemento_annotazione TIPO______ITEM 0x2004 implicit; devono analizzare
elemento_array_codificato ELEMENTO_CODIFICATO_TYPE_CODIFICATO_ARRAY 0x2005 implicit; devono analizzare
annotazioni_directory_item TYPE_AnnotazioniS_DIRECTORY_ITEM 0x2006 implicit; devono analizzare
nascosta_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 implicit; devono analizzare

stringa_id_item

Appare nella sezione string_ids

Allineamento: 4 byte

Nome Formato Descrizione
dati_stringa_disattivati Uint dall'inizio del file ai dati stringa per questo molto utile. L'offset deve essere su una posizione nella sezione data e i dati devono essere nella formato specificato da "string_data_item" di seguito. Non è richiesto alcun allineamento per l'offset.

stringa_dati_item

Viene visualizzato nella sezione dei dati.

Allineamento: nessuno (allineato al byte)

Nome Formato Descrizione
dimensione_utf16 uleb128 di questa stringa, in unità di codice UTF-16 (ovvero il valore "stringa" lunghezza" in molti sistemi). Vale a dire, questa è la lunghezza decodificata la stringa. (La lunghezza codificata è implicita dalla posizione di il byte 0.
dati ubyte[] una serie di unità di codice MUTF-8 (o ottetti o byte) seguito da un byte del valore 0. Consulta "Codifica MUTF-8 (UTF-8 modificata)" qui sopra per maggiori dettagli una discussione sul formato dei dati.

Nota. È accettabile avere una stringa che includa (la forma codificata delle) unità di codice surrogate UTF-16 (ovvero, U+d800... U+dfff) da solo o in modo non in ordine rispetto alla consueta codifica Unicode in UTF-16. Dipende dagli utilizzi a un livello superiore per rifiutare codifiche non valide, se opportuno.

type_id_item

Appare nella sezione type_ids.

Allineamento: 4 byte

Nome Formato Descrizione
descriptor_idx Uint nell'elenco string_ids per il descrittore stringa di questo tipo. La stringa deve essere conforme alla sintassi per TypeDescriptor, definito sopra.

proto_id_item

Viene visualizzato nella sezione proto_id.

Allineamento: 4 byte

Nome Formato Descrizione
Shorty_idx Uint nell'elenco string_ids per il formato breve stringa descrittore del prototipo. La stringa deve essere conforme ai la sintassi per ShortyDescriptor, definita sopra, e che deve corrispondere al tipo restituito e ai parametri di questo elemento.
id_tipo_di_restituzione Uint indice nell'elenco type_ids per il tipo restituito di questo prototipo
parametri_disattivati Uint Offset dall'inizio del file all'elenco dei tipi di parametri per questo prototipo o 0 se il prototipo non ha parametri. Questo offset, se diverso da zero, dovrebbe essere data e i dati che dovrebbero trovarsi specificato da "type_list" di seguito. Inoltre, c'è non deve fare riferimento al tipo void nell'elenco.

campo_id_elemento

Viene visualizzato nella sezione field_id.

Allineamento: 4 byte

Nome Formato Descrizione
ID_classe Ushort nell'elenco type_ids per il definitore di questo . Deve essere un tipo di classe e non un tipo array o primitivo.
type_idx Ushort nell'elenco type_ids per il tipo di questo campo
nome_idx Uint indice nell'elenco string_ids per il nome di questo . La stringa deve essere conforme alla sintassi di MemberName, definita sopra.

metodo_id_item

Appare nella sezione method_id.

Allineamento: 4 byte

Nome Formato Descrizione
ID_classe Ushort nell'elenco type_ids per il definitore di questo . Deve essere un tipo di classe o array e non un tipo primitivo.
proto_idx Ushort nell'elenco proto_ids per il prototipo di questo metodo
nome_idx Uint indice nell'elenco string_ids per il nome di questo . La stringa deve essere conforme alla sintassi di MemberName, definita sopra.

class_def_item

Appare nella sezione class_defs.

Allineamento: 4 byte

Nome Formato Descrizione
ID_classe Uint nell'elenco type_ids per questo corso. Deve essere un tipo di classe e non un tipo array o primitivo.
flag_access Uint flag di accesso per il corso (public, final, e così via). Consulta le "Definizioni di access_flags" per maggiori dettagli.
idx superclasse Uint l'indice nell'elenco type_ids per la superclasse il valore costante NO_INDEX se questa classe non ha (ovvero, è una classe radice come Object). Se presente, deve essere un tipo di classe e non un tipo array o primitivo.
interfacce_disattivate Uint dall'inizio del file all'elenco delle interfacce, oppure 0 se non sono presenti. Questo offset devono essere nella sezione data e i dati deve essere nel formato specificato "type_list" di seguito. Ciascuno degli elementi dell'elenco deve essere un tipo di classe (non un array o un tipo primitivo) non devono essere duplicati.
ID_file_sorgente Uint nell'elenco string_ids per il nome del contenente la fonte originale di (almeno la maggior parte di) di questa classe, o il valore speciale NO_INDEX per rappresentare la mancanza di queste informazioni. debug_info_item di un determinato metodo può sostituire questo file sorgente, ma ci si aspetta che la maggior parte delle classi provengono da un solo file sorgente.
annotazioni_disattivate Uint Offset dall'inizio del file alla struttura delle annotazioni per questo corso o 0 se non ci sono annotazioni per questa lezione. Questo offset, se diverso da zero, dovrebbe essere sezione data e i dati al suo interno Il formato specificato da "annotations_directory_item" di seguito, in cui tutti gli elementi che fanno riferimento a questa classe sono definitivi.
data_classe_disattivata Uint dall'inizio del file all'oggetto associato dati del corso per questo elemento o 0 se non esiste un corso per questa classe. (ad esempio, se questa classe è l'interfaccia di un indicatore). L'offset, se diverso da zero, deve essere data e i dati che dovrebbero trovarsi formato specificato da "class_data_item" di seguito, con tutte che fanno riferimento a questa classe come "definitore".
valori_statici_disattivati Uint dall'inizio del file all'elenco dei valori iniziali per i campi static o 0, se presenti non sono (e tutti i campi static devono essere inizializzati 0 o null). Questo offset deve essere data e i dati che dovrebbero trovarsi formato specificato da "encoded_array_item" di seguito. Le dimensioni dell'array non deve essere superiore al numero di static campi dichiarati da questa classe e gli elementi corrispondono static campi nello stesso ordine dichiarato in field_list corrispondente. Il tipo di ogni array deve corrispondere al tipo dichiarato del campo corrispondente. Se l'array contiene meno elementi di quanti ne siano static campi, poi quelli rimanenti vengono inizializzati con 0 o null appropriati al tipo.

call_site_id_item

Viene visualizzato nella sezione call_site_ids.

Allineamento: 4 byte

Nome Formato Descrizione
call_site_off Uint dall'inizio del file per richiamare la definizione del sito. L'offset deve essere nella sezione dei dati e i dati devono essere nel formato specificato "elemento_sito_chiamata" di seguito.

elemento_sito_chiamata

Viene visualizzato nella sezione dei dati.

Allineamento: nessuno (allineato con il byte)

call_site_item è un elemento appuntito_array_item i cui elementi corrispondono agli argomenti fornite a un metodo linker bootstrap. I primi tre argomenti sono:

  1. Handle del metodo che rappresenta il metodo del linker bootstrap (VALUE_METHOD_HANDLE).
  2. Un nome di metodo che il linker bootstrap deve risolvere (VALUE_STRING).
  3. Un tipo di metodo corrispondente al tipo del nome del metodo da risolvere (VALUE_METHOD_TYPE).

Eventuali argomenti aggiuntivi sono valori costanti passati al metodo linker bootstrap. Questi argomenti sono passati in ordine e senza alcuna conversione di tipo.

L'handle del metodo che rappresenta il metodo del linker bootstrap deve avere un tipo restituito java.lang.invoke.CallSite. I primi tre tipi di parametri sono:

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

I tipi di parametri di eventuali argomenti aggiuntivi sono determinati dai relativi valori costanti.

metodo_handle_item

Viene visualizzato nella sezione metodo_handles.

Allineamento: 4 byte

Nome Formato Descrizione
metodo_handle_type Ushort tipo di handle del metodo; consulta la tabella seguente
unused Ushort (non utilizzato)
campo_o_id_metodo Ushort ID campo o metodo a seconda che il tipo di handle del metodo sia una funzione di accesso o un callback del metodo
unused Ushort (non utilizzato)

Codici del tipo di handle del metodo

Costante Valore Descrizione
METODO_HANDLE_TYPE_STATIC_PUT 0x00 L'handle del metodo è un setter di campo statico (accessor)
METODO_HANDLE_TYPE_STATIC_GET 0x01 L'handle del metodo è un getter di campo statico (accessor)
METODO_HANDLE_TYPE_INSTANCE_PUT 0x02 L'handle del metodo è un setter di campi di istanza (accessor)
METODO_HANDLE_TYPE_INSTANCE_GET 0x03 L'handle del metodo è un getter di campo di istanza (accessore)
METODO_HANDLE_TYPE_INVOKE_STATIC 0x04 L'handle del metodo è un invocato del metodo statico
METODO_HANDLE_TYPE_INVOKE_INSTANCE 0x05 L'handle del metodo è un invocato del metodo di istanza
METODO_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 L'handle del metodo è un invocato del metodo costruttore
METODO_HANDLE_TYPE_INVOKE_DIRECT 0x07 L'handle del metodo è un invocatore di metodo diretto
METODO_HANDLE_TYPE_INVOKE_INTERFACE 0x08 L'handle del metodo è un invocato del metodo di interfaccia

class_data_item

Con riferimento da class_def_item

Viene visualizzato nella sezione dei dati.

Allineamento: nessuno (allineato al byte)

Nome Formato Descrizione
dimensioni_campi_statici uleb128 il numero di campi statici definiti in questo elemento
dimensione_campo_istanza uleb128 il numero di campi di istanza definiti in questo elemento
dimensione_metodi_diretretti uleb128 il numero di metodi diretti definiti in questo elemento
dimensione_metodi_virtuali uleb128 il numero di metodi virtuali definiti in questo elemento
campi_statici campo_codificato[static_fields_size] campi statici definiti, rappresentati come una sequenza di codificati. I campi devono essere ordinati per field_idx in ordine crescente.
campi_istanza campo_codificato[instance_fields_size] campi dell'istanza definiti, rappresentati come una sequenza codificati. I campi devono essere ordinati per field_idx in ordine crescente.
metodi_diretti metodo_codificato[direct_methods_size] il diretto definito (uno qualsiasi tra static, private, o costruttore), rappresentati come una sequenza di codificati. I metodi devono essere ordinati per method_idx in ordine crescente.
metodi_virtuali metodo_codificato[virtual_methods_size] virtuale definita (nessuna tra static, private, o costruttore), rappresentati come una sequenza di codificati. Questo elenco non deve includere i file ereditato a meno che non venga sostituito dalla classe rappresentata da questo elemento. La devono essere ordinati per method_idx in ordine crescente. Il valore method_idx di un metodo virtuale non deve essere uguale come metodo diretto.

Nota: tutti gli elementi field_id e Le istanze method_id devono fare riferimento alla stessa classe definita.

formato campo_codificato

Nome Formato Descrizione
diff_idx_campo uleb128 indice nell'elenco field_ids per l'identità di questo (include nome e descrittore), rappresentato come differenza dall'indice dell'elemento precedente nell'elenco. L'indice del il primo elemento di un elenco è rappresentato direttamente.
flag_access uleb128 di accesso ai flag per il campo (public, final, e così via). Consulta le "Definizioni di access_flags" per maggiori dettagli.

formato coded_method

Nome Formato Descrizione
metodo_idx_diff uleb128 indice nell'elenco method_ids per l'identità di questo (inclusi nome e descrittore), rappresentato come differenza dall'indice dell'elemento precedente nell'elenco. L'indice del il primo elemento di un elenco è rappresentato direttamente.
flag_access uleb128 flag di accesso per il metodo (public, final, e così via). Consulta le "Definizioni di access_flags" per maggiori dettagli.
codice_off uleb128 dall'inizio del file alla struttura di codice, oppure 0 se questo metodo è abstract o native. L'offset deve essere in una posizione all'interno Sezione data. Il formato dei dati è specificato da "code_item" di seguito.

elenco_tipi

Con riferimento da class_def_item e proto_id_item

Viene visualizzato nella sezione dei dati.

Allineamento: 4 byte

Nome Formato Descrizione
dimensioni Uint dimensione dell'elenco, nelle voci
lista tipo di articolo[taglia] elementi dell'elenco

formato type_item

Nome Formato Descrizione
type_idx Ushort indice nell'elenco type_ids

elemento_codice

Con riferimento a coded_method

Viene visualizzato nella sezione dei dati.

Allineamento: 4 byte

Nome Formato Descrizione
dimensione_registri Ushort il numero di registri utilizzati da questo codice
dimensioni_ins Ushort il numero di parole degli argomenti in entrata nel metodo che per
dimensioni_outs Ushort il numero di parole di spazio di argomento in uscita richiesto codice per la chiamata del metodo
dimensioni_prova Ushort il numero di try_item per questa istanza. Se è diverso da zero, vengono visualizzati come array tries subito dopo il tag insns in questa istanza.
debug_info_off Uint dall'inizio del file alle informazioni di debug (numeri di riga + di informazioni sulle variabili locali) per questo codice o 0 se semplicemente non ci sono informazioni. L'offset, se diverso da zero, deve essere in una località nella sezione data. Il formato di i dati sono specificati da "debug_info_item" di seguito.
dimensione_insns Uint Dimensione dell'elenco di istruzioni, in unità di codice a 16 bit
ristoranti ushort[dimensione_insns] un array effettivo di bytecode. Il formato del codice in un insns viene specificato dal documento companion Bytecode Dalvik. Nota che, sebbene questo sia definito come un array di ushort, sono alcune strutture interne che preferiscono l'allineamento a quattro byte. Inoltre, se si tratta di un file endian-swappato, lo scambio è eseguita solo sulle singole istanze ushort e non sul strutture interne più grandi.
padding ushort (facoltativo) = 0 due byte di spaziatura interna per allineare tries a quattro byte. Questo elemento è presente solo se tries_size è diverso da zero e insns_size è strano.
prova prova_articolo[tries_size] (facoltativo) che indica dove vengono individuate le eccezioni del codice come gestirli. Gli elementi dell'array non devono essere sovrapposti e in ordine dal più basso al più alto. Questo elemento è solo presente se tries_size è diverso da zero.
gestori coded_catch_handler_list (facoltativo) byte che rappresentano un elenco di elenchi di tipi di cattura e di dati associati degli indirizzi IP esterni. Ogni try_item ha un offset in byte in questa struttura. Questo elemento è presente solo se tries_size è diverso da zero.

formato prova_elemento

Nome Formato Descrizione
aggiungi_inizio Uint dell'indirizzo iniziale del blocco di codice interessato da questa voce. L'indirizzo è un conteggio di unità di codice a 16 bit all'inizio della prima istruzioni.
numero_insn Ushort di unità di codice a 16 bit coperte da questa voce. L'ultimo codice unità coperta (inclusa) è start_addr + insn_count - 1.
gestore_disattivato Ushort in byte dall'inizio del set di dati associato encoded_catch_hander_list alla encoded_catch_handler per questa voce. Deve essere un all'inizio di un encoded_catch_handler.

formato elenco_handler_catch_codificato

Nome Formato Descrizione
dimensioni uleb128 dimensioni di questo elenco, nelle voci
lista gestore_catch_codificato[handlers_size] elenco effettivo di elenchi di gestori, rappresentati direttamente (non come offset), e concatenati in sequenza

formato gestore_catch_codificato

Nome Formato Descrizione
dimensioni sleb128 di tipi di cattura in questo elenco. Se non è un valore positivo, allora si tratta di il negativo del numero di tipi di catture e le catture vengono seguite da un gestore catch-all. Ad esempio: A size di 0 significa che sono presenti catch-all, ma non digitati esplicitamente. Il valore size di 2 indica che esistono due prese digitate e nessun catch-all. E un size di -1 significa che esiste un solo tipo di arresto tipo e uno catch-all.
gestori coppia_addr_tipo_codificata[AB(size)] stream di abs(size) elementi codificati, uno per ogni catturato nell'ordine in cui devono essere testati i tipi.
aggiungi_ catch_all uleb128 (facoltativo) l'indirizzo bytecode del gestore catch-all. Questo elemento è solo presente se size non è un valore positivo.

formato_codifica_tipo_di_aggiunta_codificata

Nome Formato Descrizione
type_idx uleb128 nell'elenco type_ids per il tipo di eccezione per rilevare
indirizzo uleb128 indirizzo bytecode del gestore di eccezioni associato

debug_info_item

Fa riferimento da code_item

Viene visualizzato nella sezione dei dati.

Allineamento: nessuno (allineato al byte)

Ogni debug_info_item definisce un valore byte-coded ispirato a DWARF3 a stati che, se interpretata, emette le posizioni e (potenzialmente) le informazioni sulle variabili locali per code_item. La sequenza inizia con una lunghezza variabile intestazione (la cui lunghezza dipende dal numero di metodi parametri), è seguito dai bytecode della macchina a stato e termina con DBG_END_SEQUENCE byte.

La macchina a stati è composta da cinque registri. La Il registro address rappresenta l'offset dell'istruzione insns_item associato in unità di codice a 16 bit. La Il registro address inizia alle ore 0 all'inizio di ogni debug_info e deve aumentare solo monotonicamente. Il registro line rappresenta il numero di riga di origine deve essere associato alla voce della tabella delle posizioni successive emessa da la macchina a stati. Viene inizializzata nell'intestazione della sequenza e può cambiamento in direzione positiva o negativa ma non deve mai essere inferiore a 1. Il registro source_file rappresenta di origine a cui fanno riferimento le voci dei numeri di riga. È inizializzato in il valore di source_file_idx in class_def_item. Le altre due variabili, prologue_end e epilogue_begin, sono flag booleani (inizializzati in false) che indicano se è stata emessa la posizione successiva deve essere considerato un prologo o un epilogo del metodo. La macchina a stati Devi anche monitorare il nome e il tipo dell'ultima variabile locale attiva ciascun registro per ottenere il codice DBG_RESTART_LOCAL.

L'intestazione è la seguente:

Nome Formato Descrizione
inizio_riga uleb128 il valore iniziale per il registro line della macchina a stati. Non rappresenta una voce effettiva delle posizioni.
parametri_dimensione uleb128 il numero di nomi dei parametri codificati. Dovrebbero essere uno per parametro del metodo, escluso this del metodo di istanza, se ce ne sono.
parametri_nome uleb128p1[dimensioni_parametri] indice di stringa del nome del parametro del metodo. Un valore codificato di NO_INDEX indica che nessun nome è disponibile per il parametro associato. Il descrittore del tipo e la firma sono implicite nel descrittore e nella firma del metodo.

I valori del codice byte sono i seguenti:

Nome Valore Formato Argomenti Descrizione
DBG_END_SEQUENCE 0x00 (nessuno) termina una sequenza di informazioni di debug per un code_item
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff: importo da aggiungere al registro degli indirizzi avanza il registro di indirizzi senza emettere una voce di inserimento
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: importo della modifica del registro di linea di avanza il registro di linea senza emettere una voce
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: registro che conterrà elementi
locali name_idx: indice stringa del nome
type_idx: indice del tipo
introduce una variabile locale all'indirizzo corrente. Entrambi name_idx o type_idx potrebbero essere NO_INDEX per indicare che quel valore è sconosciuto.
DBG_START_LOCAL_EXTENDED 0x04 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
uleb128p1 sig_idx
register_num: registro che conterrà elementi
locali name_idx: indice stringa del nome
type_idx: indice del tipo
sig_idx: indice stringa della firma del tipo
introduce un locale con una firma a macchina nell'indirizzo corrente. Qualsiasi tra name_idx, type_idx o sig_idx potrebbe essere NO_INDEX per indicare che quel valore è sconosciuto. (Se sig_idx è -1, però, gli stessi dati potrebbero essere rappresentati più in modo efficiente utilizzando il codice operativo DBG_START_LOCAL.)

Nota:consulta la discussione in "dalvik.annotation.Signature" di seguito per le avvertenze per la gestione delle firme.

DBG_END_LOCAL 0x05 uleb128 register_num register_num: registro contenente dati locali contrassegna una variabile locale attualmente attiva come fuori ambito nell'attuale indirizzo
DBG_RESTART_LOCAL 0x06 uleb128 register_num register_num: registrati per riavviare reintroduce una variabile locale all'indirizzo corrente. Il nome e type sono gli stessi dell'ultimo localizzatore che era presente nell'intervallo registro.
DBG_SET_PROLOGUE_END 0x07 (nessuno) imposta il registro delle macchine dello stato prologue_end, che indica che la voce di posizione successiva aggiunta considerata la fine di un prologo di un metodo (un posto appropriato per un punto di interruzione del metodo). Il registro prologue_end è eliminato da un opcode speciale (>= 0x0a).
DBG_SET_EPILOGUE_BEGIN 0x08 (nessuno) imposta il registro delle macchine dello stato epilogue_begin, che indica che la voce di posizione successiva aggiunta considerato l'inizio di un epilogo di un metodo (un luogo appropriato per sospendere l'esecuzione prima dell'uscita del metodo). Il registro epilogue_begin viene cancellato da un eventuale (>= 0x0a).
DBG_SET_FILE 0x09 uleb128p1 name_idx name_idx: indice stringa del nome del file di origine; NO_INDEX se sconosciuto indica che tutte le voci successive di numeri fanno riferimento a questo del file di origine, anziché il nome predefinito specificato in code_item
Codici operativi speciali 0x0a...0xff (nessuno) avanza i registri line e address, emette un valore di posizione e cancella prologue_end e epilogue_begin. Vedi la descrizione sotto.

Codici operativi speciali

Codici operativi con valori compresi tra 0x0a e 0xff (inclusi) sposta sia line sia address si registra di una piccola quantità e quindi emette una nuova voce della tabella delle posizioni. La formula per gli incrementi è la seguente:

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)

annotazioni_directory_item

Con riferimento da class_def_item

Viene visualizzato nella sezione dei dati.

Allineamento: 4 byte

Nome Formato Descrizione
annotazioni_classi_disattivate Uint dall'inizio del file alle annotazioni create direttamente sul corso o 0 se il corso non ha annotazioni dirette. L'offset, se diverso da zero, deve essere in una posizione Sezione data. Il formato dei dati è specificato di "annotation_set_item" di seguito.
dimensioni_campi Uint numero di campi annotati da questo elemento
dimensioni_metodi_annogati Uint numero di metodi annotati da questo elemento
dimensione_parametri_annotati Uint conteggio degli elenchi di parametri del metodo annotati da questo elemento
annotazioni_campo campo_annotation[fields_size] (facoltativo) delle annotazioni dei campi associate. Gli elementi dell'elenco devono Essere ordinata in ordine crescente, per field_idx.
annotazioni_metodo metodo_annotation[methods_size] (facoltativo) delle annotazioni dei metodi associati. Gli elementi dell'elenco devono Essere ordinata in ordine crescente, per method_idx.
annotazioni_parametro parametro_annotation[parameters_size] (facoltativo) delle annotazioni dei parametri di metodo associati. Gli elementi del elenco deve essere ordinato in ordine crescente, per method_idx.

Nota: tutti gli elementi field_id e Le istanze method_id devono fare riferimento alla stessa classe definita.

formato campo_annotazione

Nome Formato Descrizione
campo_idx Uint nell'elenco field_ids per l'identità dell'elemento campo annotato
annotazioni_disattivate Uint dall'inizio del file all'elenco di annotazioni per campo. L'offset deve essere in una posizione all'interno di data . Il formato dei dati è specificato da "annotation_set_item" di seguito.

formato metodo_annotation

Nome Formato Descrizione
id_metodo Uint nell'elenco method_ids per l'identità dell'elemento metodo annotato
annotazioni_disattivate Uint dall'inizio del file all'elenco di annotazioni per il metodo. L'offset deve essere in una posizione all'interno Sezione data. Il formato dei dati è specificato da "annotation_set_item" di seguito.

formato parametro_annotation

Nome Formato Descrizione
id_metodo Uint nell'elenco method_ids per l'identità dell'elemento i cui parametri vengono annotati
annotazioni_disattivate Uint dall'inizio del file all'elenco di annotazioni per i parametri del metodo. L'offset deve essere in una posizione all'interno Sezione data. Il formato dei dati è specificato da "annotation_set_ref_list" di seguito.

annotazioni_set_ref_list

Con riferimento a parameter_annotations_item

Viene visualizzato nella sezione dei dati.

Allineamento: 4 byte

Nome Formato Descrizione
dimensioni Uint dimensione dell'elenco, nelle voci
lista annotazioni_set_ref_item[size] elementi dell'elenco

formato annotazioni_set_ref_item

Nome Formato Descrizione
annotazioni_disattivate Uint Offset dall'inizio del file al set di annotazioni a cui viene fatto riferimento o 0 se non ci sono annotazioni per questo elemento. L'offset, se diverso da zero, deve essere in una posizione all'interno dell'intervallo data . Il formato dei dati è specificato da "annotation_set_item" di seguito.

annotazioni_set_item

Con riferimento da annotazioni_directory_item, campo_annotations_item, metodo_annotations_item e annotazioni_set_ref_item

Viene visualizzato nella sezione dei dati.

Allineamento: 4 byte

Nome Formato Descrizione
dimensioni Uint dimensione dell'insieme, nelle voci
voci annotazioni_off_item[size] elementi dell'insieme. Gli elementi devono essere ordinati in ordine crescente, entro il giorno type_idx.

formato annotazioni_off_item

Nome Formato Descrizione
annotazioni_disattivate Uint dall'inizio del file a un'annotazione. L'offset deve essere in una posizione nella sezione data, e il formato dei dati in quella posizione è specificato "annotation_item" di seguito.

elemento_annotazione

Con riferimento da annotazioni_set_item

Viene visualizzato nella sezione dei dati.

Allineamento: nessuno (allineato al byte)

Nome Formato Descrizione
visibilità ubyte visibilità prevista di questa annotazione (vedi sotto)
annotazione annotazione_codificata contenuti delle annotazioni codificati, nel formato descritto "Formato encoded_annotation" sotto "Codifica encoded_value" in alto.

Valori di visibilità

Queste sono le opzioni per il campo visibility in una annotation_item:

Nome Valore Descrizione
CREAZIONE_VISIBILITÀ 0x00 Deve essere visibile solo al momento della build (ad esempio, durante la compilazione di altro codice)
VISIBILITY_RUNTIME 0x01 destinato a essere visibile in fase di esecuzione
SISTEMA_VISIBILITÀ 0x02 visibili in fase di runtime, ma solo al sistema sottostante (e non al normale codice dell'utente)

elemento_array_codificato

Con riferimento da class_def_item

Viene visualizzato nella sezione dei dati.

Allineamento: nessuno (allineato al byte)

Nome Formato Descrizione
valore array_codificato byte che rappresentano il valore dell'array codificato, nel formato specificato per "Formato encoded_array" sotto "encoded_value "Codifica" in alto.

nascosta_class_data_item

Questa sezione contiene dati sulle interfacce con restrizioni utilizzate da ogni classe.

Nota: La funzionalità API nascosta è stata introdotta in Android 10.0 ed è applicabile solo ai file DEX delle classi nel percorso della classe di avvio. L'elenco dei flag descritto di seguito potrebbe essere esteso nelle versioni future di Android. Per ulteriori informazioni, vedi limitazioni relative alle interfacce non SDK.

Nome Formato Descrizione
dimensioni Uint dimensione totale della sezione
compensazioni uint[] array di offset indicizzati da class_idx. Una voce di array zero nell'indice class_idx significa che nessun dato disponibile per questa class_idx oppure nessuna API nascosta sono zero. In caso contrario, la voce dell'array è diversa da zero e contiene un offset da all'inizio della sezione, a un array di flag API nascosti per questo class_idx.
flag uleb128[] array concatenati di flag dell'API nascosti per ogni classe. I possibili valori dei flag sono descritti nella tabella riportata di seguito. I flag vengono codificati nello stesso ordine dei campi e dei metodi codificati nei dati del corso.

Tipi di flag di restrizione:

Nome Valore Descrizione
lista consentita 0 Interfacce utilizzabili liberamente e supportate come parte il framework Android documentato ufficialmente Indice del pacchetto.
greylist 1 Interfacce non SDK che possono essere utilizzate indipendentemente dal livello API target.
Inserisci nella blacklist 2 Interfacce non SDK che non possono essere utilizzate indipendentemente dal tipo di applicazione livello API target. L'accesso a una di queste interfacce provoca un errore di runtime.
greylist‐max‐o 3 Interfacce non SDK utilizzabili per Android 8.x e versioni precedenti a meno che non siano soggetti a limitazioni.
greylist-max-p 4 Interfacce non SDK che possono essere utilizzate per Android 9.x a meno che non siano soggetti a limitazioni.
greylist-max-q 5 Interfacce non SDK che possono essere utilizzate per Android 10.x a meno che non siano soggetti a limitazioni.
greylist-max-r 6 Interfacce non SDK che possono essere utilizzate per Android 11.x a meno che non siano soggetti a limitazioni.

Annotazioni di sistema

Le annotazioni di sistema vengono utilizzate per rappresentare varie parti di informazioni su classi (e metodi e campi). Queste informazioni sono in genere si accede indirettamente solo tramite codice client (non di sistema).

Le annotazioni di sistema sono rappresentate nei file .dex come annotazioni con visibilità impostata su VISIBILITY_SYSTEM.

dalvik.annotation.AnnotationDefault

Appare sui metodi nelle interfacce di annotazione

Un'annotazione AnnotationDefault è allegata a ogni di annotazione che vuole indicare associazioni predefinite.

Nome Formato Descrizione
valore Annotazione Le associazioni predefinite per questa annotazione, rappresentate come un'annotazione di questo tipo. L'annotazione non deve includere tutti i nomi definiti dal annotazione; i nomi mancanti semplicemente non hanno valori predefiniti.

dalvik.annotation.EnclosingClass

Appare nei corsi

A ogni corso è allegata un'annotazione EnclosingClass che è definito come membro di un'altra classe, di per sé, o anonimo ma non definito all'interno di un corpo del metodo (ad es. una proprietà sintetica classe interna). Ogni classe che include questa annotazione deve avere anche un parametro Annotazione InnerClass. Inoltre, un corso non deve avere sia EnclosingClass che Annotazione EnclosingMethod.

Nome Formato Descrizione
valore Classe la classe che definisce nel modo più preciso possibile questa classe

dalvik.annotation.EnclosingMethod

Appare nei corsi

A ogni corso è allegata un'annotazione EnclosingMethod definito all'interno del corpo di un metodo. Ogni corso con questo anche l'annotazione deve avere un'annotazione InnerClass. Inoltre, un corso non deve avere sia un EnclosingClass e un'annotazione EnclosingMethod.

Nome Formato Descrizione
valore Metodo il metodo che definisce nel modo più preciso possibile questa classe

dalvik.annotazione.InnerClass

Appare nei corsi

A ogni corso è allegata un'annotazione InnerClass che è definito nell'ambito lessicale della definizione di un'altra classe. Qualsiasi classe con questa annotazione deve avere anche uno l'annotazione EnclosingClass o un EnclosingMethod.

Nome Formato Descrizione
nome Stringa il nome semplice originariamente dichiarato di questa classe (escluso eventuali prefisso pacchetto). Se il corso è anonimo, il nome è null.
Flag di accesso int i flag di accesso dichiarati in origine per la classe (che potrebbero essere dai flag effettivi a causa di una mancata corrispondenza tra i flag di esecuzione del linguaggio di origine e della macchina virtuale di destinazione)

dalvik.annotation.MemberClass

Appare nei corsi

A ogni corso è allegata un'annotazione MemberClasses che dichiara le classi dei membri. Una classe di membri è una classe interna diretta che ha un nome).

Nome Formato Descrizione
valore Corso[] array delle classi membri

dalvik.annotation.MethodParameters

Appare nei metodi

Nota: questa annotazione è stata aggiunta dopo che era Android 7.1 La sua presenza nelle release precedenti di Android verrà ignorata.

Un'annotazione MethodParameters è facoltativa e può essere utilizzata per Fornire metadati dei parametri, come nomi e modificatori dei parametri.

L'annotazione può essere omessa da un metodo o da un costruttore in modo sicuro quando non sono richiesti metadati dei parametri al momento dell'attivazione. È possibile utilizzare java.lang.reflect.Parameter.isNamePresent() per verificare se sono presenti metadati per un parametro e la riflessione associata come java.lang.reflect.Parameter.getName() non rinunceranno al comportamento predefinito in fase di runtime, se le informazioni non sono presenti.

Quando si inseriscono i metadati dei parametri, i compilatori devono includere le informazioni per le classi generate, come le enum, poiché i metadati del parametro indica se un parametro è sintetico o obbligatorio.

Un'annotazione MethodParameters descrive solo un metodo individuale parametri. Pertanto, i compilatori possono omettere del tutto l'annotazione per costruttori e metodi che non hanno parametri, ai fini delle dimensioni del codice ed efficienza in termini di runtime.

Gli array documentati di seguito devono essere delle stesse dimensioni method_id_item struttura dex associata al metodo, altrimenti verrà lanciato un java.lang.reflect.MalformedParametersException alle runtime.

Vale a dire: method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size deve essere uguale a names().length e accessFlags().length.

Perché MethodParameters descrive tutti i metodi formali anche quelli non dichiarati in modo esplicito o implicito nel codice sorgente, la dimensione degli array può essere diversa dalla firma o da altri metadati Informazioni basate solo su parametri espliciti dichiarati nell'origine le API nel tuo codice. MethodParameters non includerà neanche informazioni su tipi di parametri ricevitore di annotazioni che non esistono nel metodo effettivo firma.

Nome Formato Descrizione
nomi String[] I nomi dei parametri formali per il metodo associato. L'array non deve essere nullo ma deve essere vuoto se non ci sono parametri formali. Un valore in l'array deve essere nullo se il parametro formale con quell'indice non ha nome.
Se le stringhe con i nomi dei parametri sono vuote o contengono '.', ';', '[' o "/" quindi a L'evento "java.lang.reflect.MalformedParametersException" verrà lanciato alle ore runtime.
Flag di accesso int[] I flag di accesso ai parametri formali per il metodo associato. La l'array non deve essere nullo ma deve essere vuoto se non ci sono parametri formali.
Il valore è una maschera di bit con i seguenti valori:
  • 0x0010 : finale, il parametro è stato dichiarato finale
  • 0x1000 : sintetico, il parametro è stato introdotto dal compilatore
  • 0x8000 : obbligatorio, il parametro è sintetico ma anche implicito nel linguaggio specifiche
di Gemini Advanced. Se vengono impostati bit al di fuori di questo set, viene Verrà visualizzato java.lang.reflect.MalformedParametersException durante il runtime.

dalvik.annotation.Firma

Appare su classi, campi e metodi

A ogni corso è allegata un'annotazione Signature, campo o metodo definito in termini di un tipo più complicato rappresentabile da un type_id_item. La Il formato .dex non definisce il formato delle firme. questo elemento è semplicemente in grado di rappresentare qualsiasi firma sia una fonte al linguaggio naturale richiede una corretta implementazione la semantica. Di conseguenza, le firme non vengono generalmente analizzate (o verificate) dalle implementazioni delle macchine virtuali. Le firme vengono consegnate ad API e strumenti di livello superiore (come i debugger). Qualsiasi uso di la firma, pertanto, deve essere scritta in modo da non rendere di ricevere solo firme valide, proteggendo esplicitamente contro la possibilità di imbattersi in una sintattica firma non valida.

Poiché le stringhe di firma tendono ad avere molti contenuti duplicati, un'annotazione Signature è definita come un array di in cui gli elementi duplicati fanno naturalmente riferimento dati sottostanti e la firma è considerata la concatenazione a tutte le stringhe dell'array. Non esistono regole su come estrarre separare una firma in stringhe separate; che spetta interamente che generano file .dex.

Nome Formato Descrizione
valore String[] la firma di questa classe o membro, sotto forma di array di stringhe devono essere concatenati

dalvik.annotazione.Tiri

Appare nei metodi

A ogni metodo è associata un'annotazione Throws, ha dichiarato di generare uno o più tipi di eccezioni.

Nome Formato Descrizione
valore Corso[] l'array dei tipi di eccezioni lanciati