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 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
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_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é). |
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,
|
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:
- Handle del metodo che rappresenta il metodo del linker bootstrap (VALUE_METHOD_HANDLE).
- Un nome di metodo che il linker bootstrap deve risolvere (VALUE_STRING).
- 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:
java.lang.invoke.Lookup
java.lang.String
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 nometype_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 nometype_idx : indice del tiposig_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
" |
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:
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 |