En este documento, se describe el diseño y el contenido de .dex
.
que se usan para contener un conjunto de definiciones de clases y sus
datos complementarios.
Guía de tipos
Name | Descripción |
---|---|
byte | Int de 8 bits |
ubyte | Int sin firma de 8 bits |
short | Int-endian de 16 bits con firma |
ushort | Int sin firma de 16 bits, put-endian |
int | Int-endian de 32 bits con firma |
uint | Int sin firma de 32 bits, small-endian |
long | Int-endian de 64 bits con firma |
Ulong | Int-endian de 64 bits sin firma |
sleb128 | con firma LEB128, de longitud variable (ver a continuación) |
uleb128 | LEB128 sin signo, de longitud variable (ver a continuación) |
uleb128p1 | LEB128 sin signo más 1 , de longitud variable (ver a continuación) |
LEB128
LEB128 ("Little-Endian Base 128") es un
de longitud variable para
cantidades arbitrarias de números enteros firmados o sin esta. El formato era
tomado prestado de DWARF3
especificación. En un archivo .dex
, LEB128 solo se usa para lo siguiente:
para codificar cantidades de 32 bits.
Cada valor codificado en LEB128 consta de uno a cinco
bytes, que juntos representan un único valor de 32 bits. Cada
tiene su conjunto de bits más significativo, excepto por el último byte de la
secuencia, que tiene su parte más clara. El resto
siete bits de cada byte son de carga útil, con los siete menos
bits de la cantidad en el primer byte, los siguientes siete en el segundo
byte, etcétera. En el caso de una LEB128 firmada (sleb128
),
el bit de carga útil más significativo del último byte de la secuencia es
se extiende para producir el valor final. En el caso sin firmar
(uleb128
), si no se representa de forma explícita, se
interpretado como 0
.
Diagrama a nivel de bits de un valor LEB128 de dos bytes | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Primer byte | Segundo byte | ||||||||||||||
1 |
bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | 0 |
bit13 | bit12 | bit11 | bit10 | bit9 | bit8 | bit7 |
La variante uleb128p1
se usa para representar un
value, donde la representación es del valor más uno codificado
como uleb128
. Esto hace que la codificación de -1
(también se considera el valor sin signo 0xffffffff
)
(pero no otro número negativo), un solo byte, y
útil en los casos en que el número representado debe
ser no negativo o -1
(o 0xffffffff
),
y en los que no se permitan otros valores negativos (o cuando
es poco probable que sean necesarios).
Estos son algunos ejemplos de los formatos:
Secuencia codificada | Como sleb128 |
Como uleb128 |
Como uleb128p1 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
Diseño del archivo
Name | Formato | Descripción |
---|---|---|
encabezado | elemento_encabezado | el encabezado |
ID_de_cadena | string_id_item[] | una lista de identificadores de cadenas. Estos son identificadores para todas las cadenas utilizado por este archivo, ya sea para nombres internos (por ejemplo, descriptores de tipos) o como objetos constantes a los que se refiere el código. Esta lista debe estar ordenada por contenido de cadena, con valores de punto de código UTF-16 (no en un de manera sensible a la configuración regional) y no debe contener entradas duplicadas. |
id_tipo | type_id_item[] | lista de identificadores de tipos. Estos son identificadores para todos los tipos (clases,
arrays o tipos primitivos) a los que hace referencia este archivo, ya sea que estén definidos
en el archivo o no. Esta lista debe ordenarse por string_id
y no debe contener entradas duplicadas.
|
proto_id | elemento proto_id_item | de la lista de identificadores de prototipos de métodos. Estos son identificadores de todos
prototipos a los que hace referencia este archivo. Esta lista debe ordenarse en
return-type (por índice type_id ) en orden mayor y, luego,
por lista de argumentos (orden lexicográfico, argumentos individuales
ordenada por el índice type_id ). La lista no debe
contengan entradas duplicadas.
|
id_campo | elemento_id_campo | identificadores de campo. Estos son identificadores de todos los campos
a los que hace referencia este archivo, ya sea que esté definido en el archivo o no. Esta
La lista debe estar ordenada, donde el tipo de definición (por type_id )
índice) es el orden mayor, nombre del campo (por índice string_id )
es el orden y el tipo intermedios (por índice de type_id )
es la orden menor. La lista no debe contener entradas duplicadas.
|
ID_de_método | método_id_elemento | identificadores de métodos estándar. Estos son identificadores para todos los métodos
a los que hace referencia este archivo, ya sea que esté definido en el archivo o no. Esta
La lista debe estar ordenada, donde el tipo de definición (por type_id )
índice) es el orden principal, el nombre del método (por string_id
índice) es el orden intermedio y el prototipo del método (por
proto_id ) es el orden menor. La lista no debe
contengan entradas duplicadas.
|
class_defs | class_def_item | la lista de definiciones de la clase. Las clases deben estar ordenadas de modo que un determinado la superclase y las interfaces implementadas aparecen en el lista antes que la clase de referencia. Además, no es válido para una definición para que la clase con el mismo nombre aparezca más de una vez en la lista. |
id_sitio_llamada | elemento de id_sitio_de_llamada[] | lista de identificadores de sitios de llamadas. Estos son identificadores para todos los sitios de llamadas
a los que hace referencia este archivo, ya sea que esté definido en el archivo o no. Esta lista
debe ordenarse en orden ascendente de call_site_off .
|
controladores_de_métodos | método_de_identificador_de_la_manera[] | con la lista de controladores de métodos. Es una lista de todos los controladores de métodos a los que hace referencia este archivo. ya sea que esté definido en el archivo o no. Esta lista no está ordenada y puede contener que corresponden, de forma lógica, a distintas instancias de controladores de métodos. |
datos | ubyte | área de datos, que contiene todos los datos de asistencia de las tablas antes mencionadas. Cada elemento tiene distintos requisitos de alineación. los bytes de relleno se insertan antes de cada elemento si es necesario para lograr una alineación adecuada. |
datos_vínculo | ubyte | datos usados en archivos vinculados estáticamente. El formato de los datos en esta sección no se especifica en este documento. Esta sección está vacía en archivos no desvinculados y en implementaciones del entorno de ejecución pueden usarla como estimen conveniente. |
Definiciones de campo de bits, cadena y constantes
ARCHIVO_DEX_MAGIC
Incorporado en header_item
La matriz o cadena constante DEX_FILE_MAGIC
es la lista de
bytes que deben aparecer al principio de un archivo .dex
para que se lo reconozca como tal. El valor intencionalmente
contiene un salto de línea ("\n"
o 0x0a
) y un
byte nulo ("\0"
o 0x00
) para ayudar
en la detección de ciertas formas de corrupción. El valor también
codifica un número de versión de formato con tres dígitos decimales,
se espera que aumenten monótonamente con el tiempo a medida que evolucione el formato.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
Nota: La compatibilidad con la versión 039
de la
se agregó en la versión de Android 9.0, en la que se presentaron
nuevos códigos de bytes, const-method-handle
y
const-method-type
(Cada uno se describe en el
Resumen del conjunto de códigos de bytes
tabla). En Android 10, la versión 039
extiende el formato de archivo DEX para incluir elementos
Información de la API aplicable solo a los archivos DEX en la ruta de clase de inicio.
Nota: Compatibilidad con la versión
038
del formato se agregó en Android 8.0
lanzamiento. Se agregaron nuevos códigos de bytes en la versión 038
(invoke-polymorphic
y invoke-custom
) y
datos para los controladores de métodos.
Nota: La compatibilidad con la versión 037
de
el formato se agregó en la versión de Android 7.0. Antes de la versión 037
, más
versiones de Android usaron la versión 035
del formato. El único
La diferencia entre las versiones 035
y 037
es la
la adición de métodos predeterminados y el ajuste de invoke
Nota: Al menos un par de versiones anteriores del formato
se usó en lanzamientos de software
públicos de amplia disponibilidad. Por ejemplo:
se utilizó la versión 009
para las versiones M3 del
Plataforma de Android (de noviembre a diciembre de 2007),
y se usó la versión 013
para las versiones M5 de la
(febrero a marzo de 2008). En varios aspectos, estos anteriores
del formato difieren significativamente de la versión descrita en este
.
ENDIAN_CONSTANT y REVERSE_ENDIAN_CONSTANT
Incorporado en header_item
La constante ENDIAN_CONSTANT
se usa para indicar la
el formato del archivo en el que se encuentra. Aunque el flujo de trabajo
.dex
es un formato de tipo Little endian, por lo que las implementaciones pueden elegir
para realizar el intercambio de bytes. ¿En caso de que una implementación encuentre
encabezado cuyo endian_tag
es REVERSE_ENDIAN_CONSTANT
en lugar de ENDIAN_CONSTANT
, sabría que ese archivo
los bytes del formato esperado.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
SIN_ÍNDICE
Incorporados en class_def_item y debug_info_item
La constante NO_INDEX
se usa para indicar que
falta un valor de índice.
Nota: Este valor no está definido para lo siguiente:
0
, ya que, de hecho, suele ser un índice válido
El valor elegido para NO_INDEX
es
se representa como un solo byte en la codificación uleb128p1
.
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
Definiciones de access_flags
Incorporados en class_def_item, encoded_field, encoded_method y Clase interna
Los campos de bits de estas marcas se usan para indicar la accesibilidad y las propiedades generales de las clases y sus miembros.
Name | Valor | Para clases (y anotaciones InnerClass ) |
Para campos | Para métodos |
---|---|---|---|---|
ACC_PUBLIC | 0 × 1 | public : visible en todas partes |
public : visible en todas partes |
public : visible en todas partes |
ACC_PRIVATE | 0 × 2 | private : Solo es visible para la clase que lo define.
|
private : Solo es visible para la clase que lo define. |
private : Solo es visible para la clase que lo define. |
ACC_PROTECTED | 0 × 4 | protected : Visible para paquetes y subclases
|
protected : Visible para paquetes y subclases |
protected : Visible para paquetes y subclases |
ACC_ESTÁTICO | 0 × 8 | static : No se construye con un
Referencia de this |
static : global para la clase que define el campo. |
static : No toma un argumento this . |
AC_FINAL | 0 × 10 | final : No puede subclasificarse |
final : Es inmutable después de la construcción. |
final : no se puede anular |
ACC_SYNCHRONIZED | 0 × 20 | synchronized : bloqueo asociado adquirido automáticamente
de la llamada a este método. Nota: Esto solo es válido para establecerse cuando
También se estableció |
||
ACC_VOLATILE | 0 × 40 | volatile : Reglas de acceso especiales para ayudar con el subproceso
seguridad |
||
ACC_BRIDGE | 0 × 40 | método puente, agregado automáticamente por el compilador como un método de seguridad de tipos puente | ||
ACC_TRANSIENT | 0 × 80 | transient : no se guardará de forma predeterminada. |
||
ACC_VARARGS | 0 × 80 | El último argumento debe tratarse como un "resto". argumento del compilador | ||
ACC_NATIVE | 0 × 100 | native : implementado en código nativo |
||
INTERFAZ DE ACCESO | 0 × 200 | interface : Es una clase abstracta que se puede implementar de forma multiplicable. |
||
ACC_ABSTRACT | 0 × 400 | abstract : No se puede crear una instancia directamente. |
abstract : No implementado por esta clase |
|
ACC_STRICT | 0 × 800 | strictfp : reglas estrictas para la aritmética de punto flotante |
||
AC_SINTÉTICO | 0 × 1,000 | no están definidos directamente en el código fuente. | no están definidos directamente en el código fuente. | no están definidos directamente en el código fuente. |
ACC_Anotaciones | 0 × 2,000 | declarada como una clase de anotación | ||
ACC_ENUM | 0 × 4,000 | declarado como un tipo enumerado | se declaró como un valor enumerado | |
(sin usar) | 0 × 8,000 | |||
CONSTRUCTOR DE ACCESO | 0 x 10,000 | método de constructor (inicializador de clase o de instancia) | ||
ACC_DECLARED_ SYNCHRONIZED |
0 x 20,000 | declaró synchronized . Nota: Esto no afecta a ejecución (aparte de ser como reflejo de esta marca, en sí). |
InnerClass
,
y nunca debe estar activado en un class_def_item
.
Codificación UTF-8 modificada
Para facilitar la asistencia heredada, el formato .dex
codifica sus datos de cadena en un formato UTF-8 modificado estándar de facto y, a partir de ese momento,
conocido como MUTF-8. Este formulario es idéntico al formato UTF-8 estándar, excepto por lo siguiente:
- Solo se usan las codificaciones de uno, dos y tres bytes.
- Puntos de código en el rango
U+10000
... LasU+10ffff
se codifican como un par subrogado, cada uno de que se representa como un valor codificado de tres bytes. - El punto de código
U+0000
está codificado en formato de dos bytes. - Un byte nulo sin formato (valor
0
) indica el final de una cadena, como lo es la interpretación del lenguaje C estándar.
Los dos primeros elementos anteriores se pueden resumir de la siguiente manera: MUTF-8 es un formato de codificación para UTF-16, en lugar de ser un formato para caracteres Unicode.
Los dos últimos elementos anteriores permiten incluir simultáneamente
el punto de código U+0000
en una cadena y todavía manipular
como una cadena de estilo C terminada en nulo.
Sin embargo, la codificación especial de U+0000
significa que, a diferencia de
UTF-8 normal, el resultado de llamar a la función C estándar
strcmp()
en un par de cadenas MUTF-8 no siempre
indican el resultado firmado correctamente de la comparación de cadenas desiguales.
Cuando el ordenamiento (no solo la igualdad) es una preocupación, la más directa
para comparar cadenas MUTF-8 es decodificarlas carácter por carácter,
y comparar los valores decodificados. (Sin embargo, se requieren implementaciones más inteligentes
también es posible).
Consulta el Centro de ayuda Standard para obtener más información sobre la codificación de caracteres. En realidad, MUTF-8 está más cerca de la codificación (relativamente menos conocida) CESU-8 y luego a UTF-8 en sí.
Codificación encoded_value
Incorporados enannotation_element y encoded_array_item
Un encoded_value
es una pieza codificada (casi)
datos estructurados jerárquicamente de forma arbitraria. La codificación tiene como objetivo
debe ser compacto y fácil de analizar.
Name | Formato | Descripción |
---|---|---|
(argumento_valor << 5) | tipo_valor | ubyte | byte que indica el tipo de la puerta de enlace
value a lo largo
con un argumento aclaratorio opcional en los tres bits de orden superior.
Consulta a continuación las diferentes definiciones de value .
En la mayoría de los casos, value_arg codifica la longitud de
el value inmediatamente posterior en bytes, como
(size - 1) , p.ej., 0 significa que
el valor requiere un byte y 7 significa que requiere
ocho bytes; Sin embargo, hay excepciones, como se indica a continuación.
|
valor | ubyte | bytes que representan el valor, variables de longitud e interpretados
de manera diferente para bytes value_type diferentes, aunque
Siempre se usa como bit-endian. Consulta las diversas definiciones de valores a continuación para
más detalles.
|
Formatos de valor
Nombre del tipo | value_type |
Formato value_arg |
Formato value |
Descripción |
---|---|---|---|---|
VALOR_BYTE | 0 × 00 | (ninguno; debe ser 0 ) |
ubyte[1] | valor de número entero de un byte con firma |
VALOR_SHORT | 0x02 | tamaño - 1 (0...1) | ubyte[tamaño] | valor entero de dos bytes con firma, signo extendido |
CARACTERÍSTICAS_DE_VALOR | 0x03 | tamaño - 1 (0...1) | ubyte[tamaño] | valor entero de dos bytes sin firma, extendido por cero |
ENTERO_VALOR | 0x04 | tamaño - 1 (0...3) | ubyte[tamaño] | valor entero de cuatro bytes con firma, signo extendido |
VALOR_LARGO | 0x06 | tamaño - 1 (0...7) | ubyte[tamaño] | valor entero de ocho bytes con signo, con signo extendido |
FLOTANTE DE VALOR | 0 × 10 | tamaño - 1 (0...3) | ubyte[tamaño] | patrón de bits de cuatro bytes, con cero extendido a la derecha, y se interpreta como un valor de punto flotante IEEE754 de 32 bits |
VALOR_DOBLE | 0 × 11 | tamaño - 1 (0...7) | ubyte[tamaño] | de ocho bytes, con cero extendido a la derecha, y se interpreta como un valor de punto flotante IEEE754 de 64 bits |
TIPO_DE_MÉTODO_DE_VALOR | 0 × 15 | tamaño - 1 (0...3) | ubyte[tamaño] | un valor entero de cuatro bytes sin firma (cero extendido),
interpretarse como un índice en
la sección proto_ids y representa un valor de tipo de método
|
VALOR_MÉTODO_HANDLE | 0 × 16 | tamaño - 1 (0...3) | ubyte[tamaño] | un valor entero de cuatro bytes sin firma (cero extendido),
interpretarse como un índice en
la sección method_handles y representar un valor de controlador de método
|
VALUE_STRING | 0 × 17 | tamaño - 1 (0...3) | ubyte[tamaño] | un valor entero de cuatro bytes sin firma (cero extendido),
interpretarse como un índice en
la sección string_ids y representa un valor de cadena
|
TIPO_DE_VALOR | 0 × 18 | tamaño - 1 (0...3) | ubyte[tamaño] | un valor entero de cuatro bytes sin firma (cero extendido),
interpretarse como un índice en
la sección type_ids y que represente un valor reflexivo
valor de tipo/clase
|
VALUE_FIELD | 0 × 19 | tamaño - 1 (0...3) | ubyte[tamaño] | un valor entero de cuatro bytes sin firma (cero extendido),
interpretarse como un índice en
la sección field_ids y que represente un valor reflexivo
valor del campo
|
VALOR_MÉTODO | 0 × 1a | tamaño - 1 (0...3) | ubyte[tamaño] | un valor entero de cuatro bytes sin firma (cero extendido),
interpretarse como un índice en
la sección method_ids y que represente un valor reflexivo
valor del método
|
VALUE_ENUM | 0x1b | tamaño - 1 (0...3) | ubyte[tamaño] | un valor entero de cuatro bytes sin firma (cero extendido),
interpretarse como un índice en
la sección field_ids y representando el valor de
una constante de tipo enumerada
|
ARRAY_VALOR | 0×1c | (ninguno; debe ser 0 ) |
matriz_codificado | un array de valores, en el formato especificado por
"Formato encoded_array " a continuación. El tamaño
de value está implícita en la codificación.
|
VALUE_Anotaciones | 0 × 1 d | (ninguno; debe ser 0 ) |
anotación_codificada | una subanotación, en el formato especificado por
"Formato encoded_annotation " a continuación. El tamaño
de value está implícita en la codificación.
|
VALOR_NULL | 0 × 1e | (ninguno; debe ser 0 ) |
(ninguno) | Valor de referencia de null |
VALOR_BOOLEANO | 0 × 1 f | booleano (0...1) | (ninguno) | valor de un bit; 0 por false y
1 por true . El bit se representa en la
value_arg
|
formato de array_codificado
Name | Formato | Descripción |
---|---|---|
size | uleb128 | la cantidad de elementos en el array |
valores | valor_codificado[tamaño] | una serie de size encoded_value byte
secuencias en el formato que se especifica en esta sección, concatenadas
de forma secuencial.
|
formato encoded_annotation.
Name | Formato | Descripción |
---|---|---|
tipo_idx | uleb128 | el tipo de anotación. Debe ser una clase (no una matriz ni una primitiva) el tipo de letra. |
size | uleb128 | cantidad de asignaciones nombre-valor en esta anotación |
elementos | elemento_anotación[tamaño] | elementos de la anotación, representados directamente en la línea (no como
(compensaciones de desplazamiento de valores). Los elementos deben ordenarse de forma ascendente por
string_id .
|
Formato de elemento_anotación
Name | Formato | Descripción |
---|---|---|
id_nombre | uleb128 | de cada elemento, representado como un índice en el
string_ids . La cadena debe cumplir con el
la sintaxis de MemberName, que se definió anteriormente.
|
valor | valor_codificado | valor del elemento |
Sintaxis de cadenas
Un archivo .dex
contiene varios tipos de elementos que
en última instancia, se refieren a una cadena. Las siguientes definiciones de estilo BNF
indicar la sintaxis aceptable para esas cadenas.
Nombre_Sencillo
Un SimpleName es la base de la sintaxis de los nombres de otras
las cosas. El formato .dex
permite una buena cantidad de latitud
(mucho más que los idiomas de origen más comunes). En resumen, una forma simple
nombre consiste en cualquier carácter o dígito alfabético bajo ASCII, se
símbolos específicos de baja ASCII y la mayoría de los puntos de código que no son ASCII que no son
control, espacios o caracteres especiales. A partir de la versión 040
el formato también admite caracteres de espacio (Unicode Zs
categoría). Ten en cuenta que los puntos de código subrogados
(en el rango U+d800
... U+dfff
) no son
se consideran caracteres de nombre válidos, pero
caracteres son válidos (que se representan con la etiqueta
alternativa de la regla para SimpleNameChar), y deben ser
representados en un archivo como pares de puntos de código subrogados en el formato
o la codificación.
NombreSimple → | ||
SimpleNameChar (SimpleNameChar)* | ||
SimpleNameChar → | ||
'A' ... 'Z' |
||
| | 'a' ... 'z' |
|
| | '0' ... '9' |
|
| | ' ' |
desde la versión de DEX 040 |
| | '$' |
|
| | '-' |
|
| | '_' |
|
| | U+00a0 |
desde la versión de DEX 040 |
| | U+00a1 ... U+1fff |
|
| | U+2000 ... U+200a |
desde la versión de DEX 040 |
| | U+2010 ... U+2027 |
|
| | U+202f |
desde la versión de DEX 040 |
| | U+2030 ... U+d7ff |
|
| | U+e000 ... U+ffef |
|
| | U+10000 ... U+10ffff |
NombreDeMiembro
usado por field_id_item y method_id_item
Un MemberName es el nombre de un miembro de una clase; los miembros son campos, métodos y clases internas.
MemberName → | |
NombreSimple | |
| | '<' NombreSimple '>' |
NombreDeLaClaseCompleto
Un FullClassName es un nombre de clase completamente calificado, que incluye un especificador de paquete opcional seguido de un nombre obligatorio.
FullClassName → | |
OptionalPackagePrefix SimpleName | |
OptionalPackagePrefix → | |
(SimpleName '/' ).* |
TypeDescriptor.
Usado por type_id_item
Un TypeDescriptor es la representación de cualquier tipo, lo que incluye
primitivas, clases, arrays y void
. Consulta a continuación para
el significado de las diferentes versiones.
TypeDescriptor → | |
'V' |
|
| | FieldTypeDescriptor |
FieldTypeDescriptor → | |
NonArrayFieldTypeDescriptor. | |
| | ('[' * 1...255)
NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor→ | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' NombreCompletoDeLaClase ';' |
ShortyDescriptor
Usado por proto_id_item
Un ShortyDescriptor es la representación corta de un método.
prototipo, incluidos los tipos de parámetros y retornos, con la excepción de que
No hay distinción entre varios tipos de referencia (clase o array). En cambio,
todos los tipos de referencia se representan con un solo carácter 'L'
.
ShortyDescriptor → | |
ShortyReturnType (ShortyFieldType)* | |
ShortyReturnType → | |
'V' |
|
| | ShortyFieldType |
ShortyFieldType → | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
Semántica de TypeDescriptor
Este es el significado de cada una de las variantes de TypeDescriptor.
Sintaxis | Significado |
---|---|
V | void ; solo es válido para los tipos de datos que se muestran |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long |
F | float |
D | double |
completamente/calificado/nombre; | la clase fully.qualified.Name |
[descriptor | array de descriptor , que se puede usar de manera recurrente para
arrays de arrays, aunque no es válido tener más de 255
dimensiones.
|
Elementos y estructuras relacionadas
Esta sección incluye definiciones para cada uno de los elementos de nivel superior que
puede aparecer en un archivo .dex
.
elemento_encabezado
Aparece en la sección del encabezado
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
mágico | ubyte[8] = DEX_FILE_MAGIC | un valor mágico. Consulta el debate anterior en "DEX_FILE_MAGIC "
para obtener más información.
|
suma de comprobación | uint | la suma de comprobación de adler32 del resto del archivo (todo excepto
magic y este campo); que se usa para detectar la corrupción de archivos
|
firma | ubyte[20] | Firma SHA-1 (hash) del resto del archivo (todo excepto
magic , checksum y este campo); usado
para identificar archivos de forma única
|
tamaño_archivo | uint | tamaño del archivo completo (incluido el encabezado) en bytes |
tamaño_del_encabezado | uint = 0x70 | el tamaño del encabezado (toda la sección) en bytes. Esto permite que, al una cantidad limitada de retrocompatibilidad invalidar el formato. |
etiqueta_endian | uint = ENDIAN_CONSTANT | endianness. Consulta el debate anterior en "ENDIAN_CONSTANT ".
y REVERSE_ENDIAN_CONSTANT " para obtener más información.
|
tamaño_del_vínculo | uint | tamaño de la sección del vínculo o 0 si este archivo no es
vinculados estáticamente |
vínculo_desactivado | uint | el desplazamiento desde el inicio del archivo hasta la sección del vínculo
0 si es link_size == 0 . El desplazamiento, si no es cero,
debe ser un desplazamiento hacia la sección link_data . El
el formato de los datos a los que se apuntan no se especifica en este documento.
este campo de encabezado (y el anterior) quedan como hooks para que los use
implementaciones de entorno de ejecución.
|
mapa_desactivado | uint | el desplazamiento desde el inicio del archivo hasta el elemento del mapa. El desplazamiento, que debe
ser distinto de cero, debe ser un desplazamiento hacia la sección data
y los datos deben tener el formato especificado en “map_list ”
a continuación.
|
tamaño_de_ID_cadenas | uint | recuento de cadenas en la lista de identificadores de cadenas |
ID_de_cadena_desactivado | uint | el desplazamiento desde el inicio del archivo hasta la lista de identificadores de cadenas
0 si es string_ids_size == 0 (ciertamente un
un caso límite extraño). El desplazamiento, si no es cero,
debe estar al comienzo de la sección string_ids .
|
tamaño_ID_tipo | uint | recuento de elementos en la lista de identificadores de tipos, máximo 65,535 |
type_ids_off | uint | el desplazamiento desde el inicio del archivo hasta la lista de identificadores de tipos
0 si es type_ids_size == 0 (ciertamente un
un caso límite extraño). El desplazamiento, si no es cero,
debe estar al inicio de la type_ids
sección.
|
tamaño_de_los_proto_id | uint | recuento de elementos en la lista de identificadores de prototipos, como máximo 65,535 |
proto_ids_off | uint | el desplazamiento desde el inicio del archivo hasta la lista de identificadores del prototipo
0 si es proto_ids_size == 0 (ciertamente un
un caso límite extraño). El desplazamiento, si no es cero,
debe estar al inicio de la proto_ids
sección.
|
tamaño_de_ID_de_campo | uint | la cantidad de elementos en la lista de identificadores de campo |
ID_de_campo_desactivado | uint | el desplazamiento desde el inicio del archivo hasta la lista de identificadores de campo.
0 si es field_ids_size == 0 . El desplazamiento, si
distinto de cero, debe estar al inicio de field_ids
sección. |
tamaño_de_ID_de_métodos | uint | recuento de elementos en la lista de identificadores de métodos |
ID_de_método desactivado | uint | el desplazamiento desde el inicio del archivo hasta la lista de identificadores de métodos
0 si es method_ids_size == 0 . El desplazamiento, si
distinto de cero, debe estar al inicio de method_ids
sección. |
class_defs_size | uint | la cantidad de elementos en la lista de definiciones de clase |
clase_defs_desactivada | uint | el desplazamiento desde el inicio del archivo hasta la lista de definiciones de la clase, o
0 si es class_defs_size == 0 (ciertamente un
un caso límite extraño). El desplazamiento, si no es cero,
debe estar al comienzo de la sección class_defs .
|
data_size | uint | Tamaño de la sección data , expresada en bytes. Debe ser par
múltiplo de sizeof(uint). |
datos_desactivados | uint | desplazamiento desde el inicio del archivo hasta el inicio de la
data .
|
lista_mapa
Aparece en la sección de datos
Se hace referencia a partir de header_item
Alineación: 4 bytes
Esta es una lista de todo el contenido de un archivo, en orden. Integra
contiene cierta redundancia con respecto al header_item
pero está destinada a ser una forma fácil de usar para iterar en toda una
. Un tipo determinado debe aparecer como máximo una vez en un mapa, pero no hay
restricción en los tipos de orden que pueden aparecer, además del
restricciones implícitas en el resto del formato (por ejemplo, un
La sección header
debe aparecer primero y, luego,
string_ids
, etcétera). Además, las entradas del mapa deben
se ordenarán por desplazamiento inicial y no deben superponerse.
Name | Formato | Descripción |
---|---|---|
size | uint | el tamaño de la lista, en entradas |
list | elemento_mapa[tamaño] | elementos de la lista |
Formato de map_items
Name | Formato | Descripción |
---|---|---|
tipo | ushort | el tipo de artículos; consulta la tabla que aparece a continuación |
Sin usar | ushort | (sin usar) |
size | uint | recuento de la cantidad de elementos que se encontrarán en el desplazamiento indicado |
desplazamiento | uint | desplazamiento desde el inicio del archivo hasta los elementos en cuestión |
Códigos de tipo
Tipo de elemento | Constante | Valor | Tamaño del elemento en bytes |
---|---|---|---|
elemento_encabezado | TYPE_HEADER_ITEM | 0x0000 | 0 × 70 |
cadena_id_artículo | TYPE_STRING_ID_ITEM | 0x0001 | 0x04 |
type_id_item | TYPE_TYPE_ID_ITEM | 0x0002 | 0x04 |
elemento_proto_id | TYPE_PROTO_ID_ITEM | 0 × 0003 | 0x0c |
elemento_id_campo | TYPE_FIELD_ID_ITEM | 0 × 0004 | 0x08 |
método_id_elemento | ELEMENTO_TYPE_METHOD_ID_ | 0x0005 | 0x08 |
clase_def_item | TYPE_CLASS_DEF_ITEM | 0 × 0006 | 0 × 20 |
elemento_id_sitio_de_llamada | TYPE_CALL_SITE_ID_ITEM | 0 × 0007 | 0x04 |
elemento_identificador_de_método | ELEMENTO_TYPE_METHOD_HANDLE_ | 0 × 0008 | 0x08 |
lista_mapa | TYPE_MAP_LIST | 0 × 1,000 | 4 o más (item.size * 12) |
lista_tipos | TYPE_TYPE_LIST | 0 × 1,001 | 4 o más (item.size * 2) |
lista_de_referencias_del_conjunto_de_anotaciones | TYPE_NOTE_SET_REF_LIST | 0 × 1,002 | 4 o más (item.size * 4) |
elemento_de_la_anotación | TYPE_NOTE_SET_ITEM | 0 × 1,003 | 4 o más (item.size * 4) |
elemento_datos_clase | TYPE_CLASS_DATA_ITEM | 0 × 2,000 | implícito; debe analizar |
elemento_código | TYPE_CODE_ITEM | 0 × 2,001 | implícito; debe analizar |
cadena_datos_elemento | TYPE_STRING_DATA_ITEM | 0 × 2,002 | implícito; debe analizar |
elemento_información_de_depuración | TYPE_DEBUG_INFO_ITEM | 0 × 2,003 | implícito; debe analizar |
elemento_anotación | TYPE_Anotaciones_ITEM | 0 × 2,004 | implícito; debe analizar |
elemento_array_codificado | ITEM_ENCODED_ARRAY_ITEM | 0 × 2,005 | implícito; debe analizar |
elemento_directorio_anotaciones | ARTÍCULO DE TYPE_NOTES_DIRECTORY | 0 × 2,006 | implícito; debe analizar |
elemento_datos_de_clase_de_API_oculto | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | implícito; debe analizar |
cadena_id_artículo
Aparece en la sección string_ids
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
cadena_datos_desactivado | uint | desplazamiento desde el inicio del archivo hasta los datos de cadena para este
elemento. El desplazamiento debe ser hacia una ubicación
en la sección data , y los datos deben estar en
formato especificado por "string_data_item " a continuación.
No hay requisitos de alineación para el desplazamiento.
|
cadena_datos_elemento
Aparece en la sección de datos
Alineación: ninguna (alineada con bytes)
Name | Formato | Descripción |
---|---|---|
tamaño_utf16 | uleb128 | tamaño de esta cadena en unidades de código UTF-16 (que es la
duración" en muchos sistemas). Es decir, esta es la longitud decodificada de
la cadena. (La longitud codificada está implícita por la posición de
el byte 0 ). |
datos | ubyte | una serie de unidades de código MUTF-8 (también conocidas como octetos, también conocidos como bytes)
seguido de un byte de valor 0 . Consulta
"Codificación MUTF-8 (Modificada UTF-8)" arriba para obtener más detalles y
el debate sobre el formato de los datos.
Nota: Es aceptable tener una cadena que incluya
(la forma codificada de) unidades de código subrogadas UTF-16 (es decir,
|
type_id_item
Aparece en la sección type_ids
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
idx del descriptor | uint | índice en la lista string_ids del descriptor
string de este tipo. La cadena debe cumplir con la sintaxis para
TypeDescriptor, se definió anteriormente.
|
elemento_proto_id
Aparece en la sección proto_ids.
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
idx_corto | uint | índice en la lista string_ids para el formato
cadena de descriptor de este prototipo. La cadena debe cumplir con el
sintaxis de ShortyDescriptor, definida anteriormente, y debe corresponder
al tipo de datos que se muestra y los parámetros de este elemento.
|
return_type_idx | uint | índice en la lista type_ids para el tipo de datos que se muestra
de este prototipo
|
parámetros_off | uint | desplazamiento desde el inicio del archivo hasta la lista de tipos de parámetros
para este prototipo o 0 si este no tiene
parámetros. Este desplazamiento, si no es cero, debería estar en
data y los datos que contenga deberían estar en
formato especificado por "type_list" a continuación. Además, existen
no debe hacer referencia al tipo void en la lista.
|
elemento_id_campo
Aparece en la sección field_ids
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
id_clase | ushort | índice en la lista type_ids para el definidor de esta
. Debe ser un tipo de clase, no un tipo de array o primitivo.
|
tipo_idx | ushort | índice en la lista type_ids para el tipo de
este campo
|
id_nombre | uint | índice en la lista string_ids del nombre
. La cadena debe cumplir con la sintaxis de MemberName,
que se definieron con anterioridad.
|
método_id_elemento
Aparece en la sección method_ids.
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
id_clase | ushort | índice en la lista type_ids para el definidor de esta
. Debe ser un tipo de matriz o clase, no un tipo primitivo.
|
proto_idx | ushort | índice en la lista proto_ids del prototipo del
este método
|
id_nombre | uint | índice en la lista string_ids del nombre
. La cadena debe cumplir con la sintaxis de MemberName,
que se definieron con anterioridad.
|
clase_def_item
Aparece en la sección class_defs
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
id_clase | uint | índice en la lista type_ids de esta clase.
Debe ser un tipo de clase, no un tipo de array o primitivo.
|
marcas_de_acceso | uint | marcas de acceso para la clase (public , final ,
etcétera). Ver "access_flags Definiciones" para conocer los detalles.
|
superclase_idx | uint | índice en la lista type_ids de la superclase
el valor constante NO_INDEX si esta clase no tiene
superclase (es decir, es una clase raíz, como Object )
Si está presente, debe ser un tipo de clase y no un tipo de array o primitivo.
|
interfaces_off | uint | el desplazamiento desde el inicio del archivo hasta la lista de interfaces.
Es 0 si no hay ninguno. Este ajuste
debe estar en la sección data , y los datos
debe tener el formato especificado por
“type_list ” a continuación. Cada uno de los elementos de la lista
debe ser un tipo de clase (no un tipo de array ni primitivo), y
no deben estar duplicados.
|
id_del_archivo_fuente | uint | índice en la lista string_ids del nombre del
que contiene la fuente original de (al menos la mayor parte) de esta clase,
o el valor especial NO_INDEX para representar la falta de
esta información. El debug_info_item de cualquier método determinado
puede anular este archivo fuente, pero se espera que la mayoría de las clases
provendrán de un solo archivo fuente.
|
anotaciones_desactivadas | uint | el desplazamiento desde el inicio del archivo hasta la estructura de las anotaciones
para esta clase o 0 si no hay anotaciones en
esta clase. Este desplazamiento, si no es cero, debería estar en
data y los datos que contenga deberían estar en
el formato especificado por "annotations_directory_item " a continuación,
y todos los elementos se refieren a esta clase como el definidor.
|
datos_clase desactivado | uint | desplazamiento desde el inicio del archivo hasta el
datos de clase para este elemento o 0 si no hay ninguna clase
para esta clase. (por ejemplo, si esta clase
es una interfaz de marcador). El desplazamiento, si no es cero, debe estar en
data y los datos que contenga deberían estar en
formato especificado por "class_data_item " a continuación, con todos
elementos que hagan referencia a esta clase como el definidor.
|
valores_estáticos_desactivados | uint | desplazamiento desde el inicio del archivo hasta la lista de
valores para los campos static , o 0 si hay
son ninguno (y todos los campos static se deben inicializar con
0 o null ). Este desplazamiento debería estar en
data y los datos que contenga deberían estar en
formato especificado por "encoded_array_item " a continuación. El tamaño
del array no debe ser mayor que la cantidad de static
campos declarados por esta clase, y los elementos corresponden al
static en el mismo orden en que se declara en las
field_list correspondiente. El tipo de cada array
debe coincidir con el tipo declarado de su campo correspondiente.
Si el array tiene menos elementos de los que hay
static , se inicializarán los restantes
con un 0 o null apropiado para el tipo
|
elemento_id_sitio_de_llamada
Aparece en la sección call_site_ids.
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
sitio_de_llamada_desactivado | uint | el desplazamiento desde el inicio del archivo para llamar a la definición del sitio. El desplazamiento debe en la sección de datos, y estos deben estar en el formato que especifica "call_site_item" a continuación. |
elemento_de_sitio_de_llamada
Aparece en la sección de datos
Alineación: ninguna (alineada con bytes)
El elemento call_site_item es un elemento_array_codificado cuyos elementos corresponden a los argumentos a un método de vinculador de arranque. Los primeros tres argumentos son los siguientes:
- Un controlador de método que representa el método del vinculador de arranque (VALUE_METHOD_HANDLE).
- Un nombre de método que el vinculador de arranque debe resolver (VALUE_STRING).
- Un tipo de método que corresponde al tipo del nombre del método a resolver (VALUE_METHOD_TYPE).
Los argumentos adicionales son valores constantes que se pasan al método del vinculador de arranque. Estos argumentos son se pasan en orden y sin conversiones de ningún tipo.
El controlador del método que representa el método del vinculador de arranque debe tener el tipo de datos que se muestra java.lang.invoke.CallSite
. Los primeros tres tipos de parámetros son los siguientes:
java.lang.invoke.Lookup
java.lang.String
java.lang.invoke.MethodType
Los tipos de parámetros de cualquier argumento adicional se determinan a partir de sus valores constantes.
elemento_identificador_de_método
Aparece en la sección method_handles
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
tipo_de_identificador_de_método | ushort | el tipo de controlador del método; consulta la tabla que aparece a continuación |
Sin usar | ushort | (sin usar) |
campo_o_id_de_método | ushort | El ID del campo o del método depende de si el tipo de identificador del método es un descriptor de acceso o un invocador de métodos |
Sin usar | ushort | (sin usar) |
Códigos de tipo de controlador de método
Constante | Valor | Descripción |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0 × 00 | El controlador de método es un establecedor de campos estático (acceso) |
Método_HANDLE_TYPE_STATIC_GET | 0 × 01 | El controlador de método es un método get de campo estático (acceso). |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | El controlador de método es un colocador de campos de instancia (acceso) |
METHOD_HANDLE_TYPE_INSTANCE_GET | 0x03 | El controlador de método es un captador de campo de instancia (acceso) |
TIPO_DE_MÉTODO_ESTÁTICO_INVITACIÓN | 0x04 | El controlador de método es un invocador de método estático |
TIPO_DE_HANDLE_MÉTODO_INVOKE_INSTANCE | 0 × 05 | El controlador de método es un invocador de método de instancia |
CONSTRUCTOR DE TIPO_DE_MÉTODO_HANDLE_INVOKE_CONSTRUCTOR | 0x06 | El controlador de método es un constructor de método invocador |
METHOD_HANDLE_TYPE_INVOKE_DIRECT | 0x07 | El controlador de método es un invocador directo de métodos |
INTERFAZ DE TIPO DE_MÉTODO_HANDLE_INVOKE_INTERFACE | 0x08 | El controlador de método es un invocador de métodos de la interfaz |
elemento_datos_clase
Se hace referencia a partir de class_def_item
Aparece en la sección de datos
Alineación: ninguna (alineada con bytes)
Name | Formato | Descripción |
---|---|---|
tamaño_de_campos_estáticos | uleb128 | la cantidad de campos estáticos definidos en este elemento |
tamaño_de_campos_de_instancia | uleb128 | la cantidad de campos de instancia definidos en este elemento |
tamaño_de_métodos_directos | uleb128 | la cantidad de métodos directos definidos en este elemento |
tamaño_de_métodos_virtuales | uleb128 | la cantidad de métodos virtuales definidos en este elemento |
campos_estáticos | campo_codificado[static_fields_size] | los campos estáticos definidos, representados como una secuencia de
elementos codificados. Los campos deben ordenarse según
field_idx en orden ascendente.
|
campos_instancia | campo_codificado[instance_fields_size] | los campos de instancia definidos, representados como una secuencia de
elementos codificados. Los campos deben ordenarse según
field_idx en orden ascendente.
|
métodos_directos | método_codificado[direct_methods_size] | el valor directo definido (cualquiera de static , private ,
o constructor), representados como una secuencia de
elementos codificados. Los métodos deben ordenarse por
method_idx en orden ascendente.
|
métodos_virtuales | encoded_method[virtual_methods_size], | la clase virtual definida (ninguna de static , private ,
o constructor), representados como una secuencia de
elementos codificados. Esta lista no debe incluir elementos heredados
a menos que la clase que representa este elemento los anule. El
los métodos deben estar ordenados por method_idx en orden ascendente.
El method_idx de un método virtual no debe ser el mismo.
como cualquier método directo.
|
Nota: Todos los elementos field_id
y
Las instancias method_id
deben hacer referencia a la misma clase de definición.
formato encoded_field
Name | Formato | Descripción |
---|---|---|
ID_de_campo_diferencia | uleb128 | índice en la lista field_ids para la identidad
(incluye el nombre y el descriptor), representado como una diferencia
del índice del elemento anterior de la lista. El índice de la
el primer elemento de una lista se representa directamente.
|
marcas_de_acceso | uleb128 | marcas de acceso para el campo (public , final ,
etcétera). Ver "access_flags Definiciones" para conocer los detalles.
|
formato encoded_method
Name | Formato | Descripción |
---|---|---|
diferencia_idx_método | uleb128 | índice en la lista method_ids para la identidad
(incluye el nombre y el descriptor), representado como una diferencia
del índice del elemento anterior de la lista. El índice de la
el primer elemento de una lista se representa directamente.
|
marcas_de_acceso | uleb128 | marcas de acceso para el método (public , final ,
etcétera). Ver "access_flags Definiciones" para conocer los detalles.
|
código_apagado | uleb128 | el desplazamiento desde el inicio del archivo hasta la estructura del código para esta
o 0 si este método es abstract
o native . El desplazamiento debe ser a una ubicación en el
data . El formato de los datos se especifica mediante
“code_item ” a continuación.
|
lista_tipos
Se hace referencia a partir de class_def_item y proto_id_item
Aparece en la sección de datos
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
size | uint | el tamaño de la lista, en entradas |
list | tipo_elemento[tamaño] | elementos de la lista |
Formato de type_item
Name | Formato | Descripción |
---|---|---|
tipo_idx | ushort | índice en la lista type_ids |
elemento_código
Se hace referencia a partir de encoded_method
Aparece en la sección de datos
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
tamaño_registros | ushort | la cantidad de registros que usa este código |
ins_size | ushort | la cantidad de palabras de los argumentos entrantes al método al que el código es para |
outs_size | ushort | la cantidad de palabras del espacio de argumento saliente que requiere esta código para la invocación de métodos |
tamaño_de_pruebas | ushort | la cantidad de try_item para esta instancia. Si no es cero,
aparecen como el array tries justo después del
insns en esta instancia.
|
información_de_depuración_desactivada | uint | el desplazamiento desde el inicio del archivo hasta la información de depuración (números de línea +
de variable local) para este código o 0 si
simplemente no hay información. Si el desplazamiento no es cero, debería ser
a una ubicación de la sección data . El formato de
los datos se especifican con “debug_info_item ” a continuación.
|
tamaño_insns | uint | tamaño de la lista de instrucciones, en unidades de código de 16 bits |
Insns | talla corta[insns_size] | el array real de códigos de bytes. El formato del código en un insns
la matriz se especifica mediante el documento complementario
Código de bytes Dalvik. Nota
que, aunque se define como un array de ushort , hay
son algunas estructuras internas
que prefieren una alineación de cuatro bytes. Además,
si se encuentra en un archivo endian-intercambiado, entonces el intercambio es
solo se hace en instancias individuales de ushort y no en la
con estructuras internas más grandes.
|
relleno | ushort (opcional) = 0 | dos bytes de relleno para alinear tries con cuatro bytes.
Este elemento solo está presente si tries_size no es cero
y insns_size es impar.
|
intenta | try_item[tries_size] (opcional) | que indica en qué parte del código se capturan las excepciones
cómo manejarlos. Los elementos del array no deben superponerse en
y en orden de menor a mayor dirección. Este elemento es solo
presente si tries_size no es cero.
|
controladores | encoded_catch_handler_list (opcional) | bytes que representan una lista de listas de tipos de capturas y asociados
direcciones IP del controlador. Cada try_item tiene un desplazamiento en bytes.
en esta estructura. Este elemento solo está presente si
tries_size no es cero.
|
Formato try_item
Name | Formato | Descripción |
---|---|---|
suma_inicio | uint | dirección inicial del bloque de código cubierto por esta entrada. La dirección es un recuento de unidades de código de 16 bits hasta el comienzo de la primera instrucciones. |
insn_count | ushort | cantidad de unidades de código de 16 bits incluidas en esta entrada. El último código
la unidad cubierta (inclusive) es start_addr + insn_count - 1 .
|
controlador_desactivado | ushort | de desplazamiento en bytes desde el inicio de la
encoded_catch_hander_list al
encoded_catch_handler para esta entrada. Debe ser un
desplazamiento hacia el inicio de un encoded_catch_handler .
|
formato encoded_catch_handler_list
Name | Formato | Descripción |
---|---|---|
size | uleb128 | tamaño de esta lista, en entradas |
list | encoded_catch_handler[handlers_size] | real de listas de controladores, representadas directamente (no como compensaciones), y se concatenan de forma secuencial |
formato encoded_catch_handler
Name | Formato | Descripción |
---|---|---|
size | sleb128 | y la cantidad de tipos de captura en esta lista. Si no es positivo, entonces es
la parte negativa de la cantidad de tipos de captura, y se siguen las capturas
por un controlador genérico. Por ejemplo: un size de 0
significa que hay una captura genérica, pero no escrita explícitamente.
Un size de 2 significa que hay dos explícitamente
capturas escritas y ninguna genérica. Y un size de -1
significa que hay un catch escrito junto con un catch.
|
controladores | encoded_type_addr_pair[abs(tamaño)] | flujo de abs(size) elementos codificados, uno para cada capturado
tipo, en el orden en que se deben probar los tipos.
|
captura_all_addr | uleb128 (opcional) | del código de bytes del controlador genérico. Este elemento es solo
presente si size no es positivo.
|
formato encoded_type_addr_pair
Name | Formato | Descripción |
---|---|---|
tipo_idx | uleb128 | índice en la lista type_ids para el tipo de
excepción para atrapar
|
direc | uleb128 | Dirección de código de bytes del controlador de excepciones asociado |
elemento_información_de_depuración
Se hace referencia a partir de code_item
Aparece en la sección de datos
Alineación: ninguna (alineada con bytes)
Cada debug_info_item
define un código de bytes inspirado en DWARF3
de estado que, cuando se interpreta, emite las posiciones
y (posiblemente) la información de la variable local para un
code_item
La secuencia comienza con una regla
encabezado (cuyo longitud depende de la cantidad de métodos
parámetros), le siguen los códigos de bytes de la máquina de estado y termina
con un byte DBG_END_SEQUENCE
.
La máquina de estados consta de cinco registros. El
El registro address
representa el desplazamiento de la instrucción en el
asociado insns_item
en unidades de código de 16 bits. El
El registro address
comienza a las 0
al comienzo de cada
debug_info
y solo debe aumentar de forma monótona.
¿Qué número de línea de origen representa el registro line
?
se deben asociar con la siguiente entrada de tabla de posiciones emitida por
la máquina de estados. Se inicializa en el encabezado de la secuencia y puede
cambian en direcciones positivas o negativas, pero nunca debe ser menor que
1
El registro source_file
representa la
archivo fuente al que hacen referencia las entradas del número de línea. Se inicializa en
el valor de source_file_idx
en class_def_item
Las otras dos variables, prologue_end
y
epilogue_begin
, son marcas booleanas (inicializadas en
false
) que indican si la siguiente posición se emitió
debe considerarse un prólogo o epílogo del método. La máquina de estados
también debes realizar un seguimiento del nombre y el tipo de la última variable local publicada
cada registro para el código DBG_RESTART_LOCAL
.
El encabezado es el siguiente:
Name | Formato | Descripción |
---|---|---|
inicio_línea | uleb128 | Es el valor inicial del registro line de la máquina de estado.
No representa una entrada de posiciones reales.
|
parámetros_size | uleb128 | la cantidad de nombres de parámetros codificados. Debe haber
uno por parámetro de método, sin incluir el this de un método de instancia
si es que lo hacen.
|
nombres_de_parámetros | uleb128p1[parámetros_tamaño] | índice de cadena del nombre de parámetro del método. Un valor codificado de
NO_INDEX indica que no hay ningún nombre
está disponible para el parámetro asociado. El descriptor de tipo
y la firma están implícitas a partir del descriptor del método y la firma.
|
Los valores del código de bytes son los siguientes:
Name | Valor | Formato | Argumentos | Descripción |
---|---|---|---|---|
DBG_END_SEQUENCE | 0 × 00 | (ninguno) | finaliza una secuencia de información de depuración para un code_item |
|
DBG_ADVANCE_PC | 0 × 01 | uleb128 addr_diff | addr_diff : Importe que se agregará al registro de direcciones |
hace avanzar el registro de dirección sin emitir una entrada de posiciones |
LÍNEA_DE_ADVANCES | 0x02 | diferencia_línea sleb128 | line_diff : importe para cambiar el registro de línea por |
hace avanzar el registro de línea sin emitir una entrada de posiciones |
DBG_START_LOCAL | 0x03 | uleb128 register_num uleb128p1 name_idx uleb128p1 tipo_idx |
register_num : registro que contendrá locales name_idx : índice de cadena del nombretype_idx : índice de tipo del tipo
|
ingresa una variable local en la dirección actual. Cualquiera de las siguientes opciones
name_idx o type_idx pueden ser
NO_INDEX para indicar que ese valor es desconocido.
|
DBG_START_LOCAL_EXTENDED | 0x04 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx uleb128p1 sig_idx |
register_num : registro que contendrá locales name_idx : índice de cadena del nombretype_idx : índice de tipo del tipo sig_idx : índice de cadena del tipo de firma
|
ingresa un elemento local con una firma de tipo en la dirección actual.
Cualquiera de estos: name_idx , type_idx o
sig_idx puede ser NO_INDEX
para indicar que ese valor es desconocido. (Si sig_idx es
-1 , sin embargo, los mismos datos podrían estar más representados
de forma eficiente con el código de operación DBG_START_LOCAL ).
Nota: consulta el debate a continuación
“ |
DBG_END_LOCAL | 0 × 05 | número_registro_uleb128 | register_num : registro que contenía datos locales |
marca una variable local activa en ese momento como fuera del alcance en este momento dirección |
DBG_RESTART_LOCAL | 0x06 | número_registro_uleb128 | register_num : regístrate para reiniciar |
vuelve a introducir una variable local en la dirección actual. El nombre y type son los mismos que el último local que se publicó en la de registro. |
DBG_SET_PROLOGUE_END | 0x07 | (ninguno) | Configura el registro de máquina de estado prologue_end
que indica que la próxima entrada de posición que se agrega debe
considerado el final del prólogo de un método (un lugar apropiado para
un punto de interrupción de método). El registro prologue_end es
será borrado por cualquier código de operación (>= 0x0a ) especial.
|
|
DBG_SET_EPILOGUE_BEGIN | 0x08 | (ninguno) | Configura el registro de máquina de estado epilogue_begin
que indica que la próxima entrada de posición que se agrega debe
considerado el inicio de un epílogo de métodos (un lugar adecuado
suspender la ejecución antes de que salga el método).
El registro epilogue_begin se habilita con cualquier requisito
(>= 0x0a ) código de operación.
|
|
DBG_SET_FILE | 0x09 | uleb128p1 name_idx | name_idx : índice de cadena del nombre del archivo de origen;
NO_INDEX si se desconoce
|
indica que todas las entradas de números de línea posteriores hacen referencia a este
nombre del archivo de origen, en lugar del nombre predeterminado especificado en
code_item
|
Códigos de operación especiales | 0x0a...0xff | (ninguno) | hace que los registros line y address avancen,
emite una entrada de posición y borra prologue_end y
epilogue_begin Consulta la descripción a continuación.
|
Códigos de operaciones especiales
Códigos de operación con valores entre 0x0a
y 0xff
(inclusivo) mover tanto line
como address
se registra por una pequeña cantidad y, luego, emite una nueva entrada en la tabla de posiciones.
La fórmula de los incrementos es la siguiente:
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)
elemento_directorio_anotaciones
Se hace referencia a partir de class_def_item
Aparece en la sección de datos
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
class_anotaciones_desactivadas | uint | el desplazamiento desde el inicio del archivo hasta las anotaciones realizadas directamente
en la clase, o bien 0 si la clase no tiene anotaciones directas.
El desplazamiento, si no es cero, debe ser a una ubicación en la
data . Se especifica el formato de los datos
de “annotation_set_item ” a continuación.
|
tamaño_de_campos | uint | cantidad de campos anotados por este elemento |
tamaño_de_métodos_anotados | uint | recuento de métodos anotados por este elemento |
anotación_parámetros_tamaño | uint | recuento de las listas de parámetros de métodos anotadas por este elemento |
campo_anotaciones | field_annotation[fields_size] (opcional) | lista de anotaciones de campo asociadas. Los elementos de la lista deben
se ordenarán de forma ascendente, por field_idx .
|
anotaciones_de_método | method_annotation[methods_size] (opcional) | lista de anotaciones de métodos asociadas. Los elementos de la lista deben
se ordenarán de forma ascendente, por method_idx .
|
parámetros_anotaciones | parámetro_annotation[parámetros_tamaño] (opcional) | lista de anotaciones de parámetros de métodos asociadas. Los elementos del
La lista debe ordenarse de forma ascendente, por method_idx .
|
Nota: Todos los elementos field_id
y
Las instancias method_id
deben hacer referencia a la misma clase de definición.
Formato de field_annotation
Name | Formato | Descripción |
---|---|---|
idx de campo | uint | índice en la lista field_ids para la identidad del
campo anotado
|
anotaciones_desactivadas | uint | el desplazamiento desde el inicio del archivo hasta la lista de anotaciones
en el campo. El desplazamiento debe ser a una ubicación en data
sección. El formato de los datos se especifica mediante
“annotation_set_item ” a continuación.
|
Formato de method_annotation.
Name | Formato | Descripción |
---|---|---|
método_idx | uint | índice en la lista method_ids para la identidad del
método anotado
|
anotaciones_desactivadas | uint | el desplazamiento desde el inicio del archivo hasta la lista de anotaciones
el método. El desplazamiento debe ser a una ubicación en el
data . El formato de los datos se especifica mediante
“annotation_set_item ” a continuación.
|
Formato de parameter_annotation.
Name | Formato | Descripción |
---|---|---|
método_idx | uint | índice en la lista method_ids para la identidad del
método cuyos parámetros se anotan
|
anotaciones_desactivadas | uint | el desplazamiento desde el inicio del archivo hasta la lista de anotaciones
los parámetros del método. El desplazamiento debe ser a una ubicación en el
data . El formato de los datos se especifica mediante
“annotation_set_ref_list ” a continuación.
|
lista_de_referencias_del_conjunto_de_anotaciones
Se hace referencia a partir de parameter_annotations_item.
Aparece en la sección de datos
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
size | uint | el tamaño de la lista, en entradas |
list | elemento_anotación_set_ref_[tamaño] | elementos de la lista |
formato Annotation_set_ref_item
Name | Formato | Descripción |
---|---|---|
anotaciones_desactivadas | uint | desplazamiento desde el inicio del archivo hasta el conjunto de anotaciones al que se hace referencia
o 0 si no hay anotaciones para este elemento.
El desplazamiento, si no es cero, debe ser a una ubicación en data .
sección. El formato de los datos se especifica mediante
“annotation_set_item ” a continuación.
|
elemento_de_la_anotación
Se hace referencia desde anotaciones_directory_item, field_annotations_item, method_annotations_item yannotation_set_ref_item
Aparece en la sección de datos
Alineación: 4 bytes
Name | Formato | Descripción |
---|---|---|
size | uint | del conjunto, en entradas |
entradas | elemento_anotación_desactivado[tamaño] | elementos del conjunto. Los elementos deben ordenarse de forma ascendente,
de type_idx .
|
Formato de anotación fuera de elemento
Name | Formato | Descripción |
---|---|---|
anotación_desactivada | uint | el desplazamiento desde el inicio del archivo hasta una anotación.
El desplazamiento debe ser a una ubicación en la sección data .
y el formato de los datos en esa ubicación se especifica
“annotation_item ” a continuación.
|
elemento_anotación
Se hace referencia a partir deannotation_set_item
Aparece en la sección de datos
Alineación: ninguna (alineada con bytes)
Name | Formato | Descripción |
---|---|---|
visibilidad | ubyte | visibilidad prevista de esta anotación (ver a continuación) |
anotación | anotación_codificada | contenidos de anotaciones codificados, en el formato descrito por
"Formato encoded_annotation " por debajo de
"Codificación encoded_value " arriba.
|
Valores de visibilidad
Estas son las opciones para el campo visibility
en una
annotation_item
Name | Valor | Descripción |
---|---|---|
COMPILACIÓN_DE_VISIBILIDAD | 0 × 00 | previstos solo para ser visibles en el tiempo de compilación (p.ej., durante la compilación de otro código) |
VISIBILITY_RUNTIME | 0 × 01 | destinado a ser visible en el tiempo de ejecución |
SISTEMA_VISIBILIDAD | 0x02 | para ser visible en el tiempo de ejecución, pero solo para el sistema (y no al código de usuario normal) |
elemento_array_codificado
Se hace referencia a partir de class_def_item
Aparece en la sección de datos
Alineación: ninguna (alineada con bytes)
Name | Formato | Descripción |
---|---|---|
valor | matriz_codificado | bytes que representan el valor del array codificado, en el formato especificado
por "Formato encoded_array " en "encoded_value
Codificación" arriba.
|
elemento_datos_de_clase_de_API_oculto
Esta sección contiene datos sobre interfaces restringidas que usa cada clase.
Nota: La función oculta de la API se introdujo en Android 10.0 y solo se aplica a los archivos DEX de las clases de la ruta de acceso de la clase de inicio. Es posible que la lista de marcas que se describe a continuación se extienda en versiones futuras de Android. Para obtener más información, consulta para las interfaces que no pertenecen al SDK.
Name | Formato | Descripción |
---|---|---|
size | uint | tamaño total de la sección |
compensaciones | uint | array de desplazamientos indexados por class_idx
Una entrada de array cero en el índice class_idx significa que
no hay datos para este class_idx ni todas las APIs ocultas
son cero.
De lo contrario, la entrada del array no es cero y contiene un desplazamiento desde
el comienzo de la sección a un array de marcas de API ocultas
para este class_idx .
|
flags | uleb128 | arrays concatenados de marcas de API ocultas para cada clase. Los posibles valores de las marcas se describen en la siguiente tabla. Las marcas se codifican en el mismo orden que los campos y métodos. codificados en los datos de la clase. |
Tipos de marcas de restricción:
Name | Valor | Descripción |
---|---|---|
lista blanca | 0 | interfaces que se pueden usar sin restricciones y se admiten como parte de el framework de Android documentado oficialmente Índice del paquete. |
lista gris | 1 | Son interfaces que no pertenecen al SDK y que se pueden usar sin importar la configuración nivel de API objetivo. |
poner en la lista negra | 2 | Son interfaces que no pertenecen al SDK y que no se pueden usar, independientemente de la configuración nivel de API objetivo. El acceso a una de estas interfaces causa una error de entorno de ejecución. |
lista-gris-max-o | 3 | Interfaces que no pertenecen al SDK y se pueden usar para Android 8.x y versiones anteriores salvo que estén restringidas. |
lista gris | 4 | Interfaces que no pertenecen al SDK y se pueden usar para Android 9.x salvo que estén restringidas. |
lista gris-max-q | 5 | Interfaces que no pertenecen al SDK y se pueden usar para Android 10.x salvo que estén restringidas. |
lista gris | 6 | Interfaces que no pertenecen al SDK y se pueden usar para Android 11.x salvo que estén restringidas. |
Anotaciones del sistema
Las anotaciones del sistema se usan para representar varias piezas reflexivas información sobre clases (y métodos y campos). Esta información se Generalmente, solo accede indirectamente a través de un código cliente (que no es del sistema).
Las anotaciones del sistema se representan en archivos .dex
de la siguiente manera:
anotaciones con visibilidad establecida en VISIBILITY_SYSTEM
.
dalvik.annotation.AnnotationDefault
Aparece en los métodos de las interfaces de anotación.
Se adjunta una anotación AnnotationDefault
a cada
de anotaciones que desea indicar las vinculaciones predeterminadas.
Name | Formato | Descripción |
---|---|---|
valor | Anotación | las vinculaciones predeterminadas para esta anotación, representadas como una anotación de este tipo. La anotación no necesita incluir todos los nombres definidos por el anotación; los nombres faltantes simplemente no tienen valores predeterminados. |
dalvik.annotation.EnclosingClass
Aparece en las clases
Se adjunta una anotación EnclosingClass
a cada clase
que se define como un miembro de otra clase, en sí, o que se
anónimo, pero no definido dentro de un cuerpo de método (p.ej., un modelo
clase interna). Cada clase que tenga esta anotación también debe tener un
InnerClass
. Además, una clase no debe tener
un objeto EnclosingClass
y un
EnclosingMethod
.
Name | Formato | Descripción |
---|---|---|
valor | Clase | Es la clase que determina el alcance léxico de esta clase. |
dalvik.annotation.EnclosingMethod
Aparece en las clases
Se adjunta una anotación EnclosingMethod
a cada clase
que se define dentro del cuerpo de un método. Todas las clases con este
también debe tener una anotación InnerClass
.
Además, una clase no debe tener un EnclosingClass
y una anotación EnclosingMethod
.
Name | Formato | Descripción |
---|---|---|
valor | Método | es el método con el que se define el alcance léxico de esta clase |
dalvik.annotation.InnerClass
Aparece en las clases
Se adjunta una anotación InnerClass
a cada clase
que se define en el alcance léxico de la definición de otra clase.
Cualquier clase que tenga esta anotación también debe tener uno
EnclosingClass
o una
EnclosingMethod
.
Name | Formato | Descripción |
---|---|---|
nombre | String | el nombre simple declarado originalmente para esta clase (sin incluir los
el prefijo del paquete). Si la clase es anónima, el nombre es
null
|
accessFlags | int | las marcas de acceso declaradas originalmente de la clase (que pueden variar de las marcas eficaces debido a una discrepancia entre la ejecución del lenguaje de origen y la máquina virtual de destino) |
dalvik.annotation.MemberClasses
Aparece en las clases
Se adjunta una anotación MemberClasses
a cada clase
que declara clases de miembros. (Una clase de miembro es una clase interna directa
que tiene un nombre).
Name | Formato | Descripción |
---|---|---|
valor | Clase | array de las clases de miembros |
dalvik.annotation.MethodParameters.
Aparece en los métodos
Nota: Esta anotación se agregó después de que Android 7.1 Se ignorará su presencia en versiones anteriores de Android.
Una anotación MethodParameters
es opcional y se puede usar para
proporcionar metadatos de parámetros, como nombres y modificadores de parámetros.
La anotación se puede omitir de un método o constructor de manera segura cuando la
los metadatos de parámetros no son necesarios en el entorno de ejecución.
Se puede usar java.lang.reflect.Parameter.isNamePresent()
para comprobar
si los metadatos están presentes para un parámetro y el reflejo asociado
métodos como java.lang.reflect.Parameter.getName()
caerán
al comportamiento predeterminado en el tiempo de ejecución si la información no está presente.
Cuando se incluyen metadatos de parámetros, los compiladores deben incluir información para clases generadas, como enums, ya que los metadatos del parámetro incluye si un parámetro es sintético o obligatorio.
Una anotación MethodParameters
solo describe un método individual
parámetros. Por lo tanto, los compiladores pueden omitir la anotación por completo.
para constructores y métodos que no tienen parámetros, en cuanto al tamaño del código
y la eficiencia del entorno de ejecución.
Los arrays que se documentan a continuación deben tener el mismo tamaño que el de la
Estructura dex de method_id_item
asociada con el método; de lo contrario,
se arrojará una java.lang.reflect.MalformedParametersException
tiempo de ejecución.
Es decir: method_id_item.proto_idx
->
proto_id_item.parameters_off
->
type_list.size
debe ser el mismo que names().length
y
accessFlags().length
Porque MethodParameters
describe todos los métodos formales.
parámetros, incluso aquellos que no se declararon de forma explícita o implícita en el código fuente,
el tamaño de los arrays puede diferir de la Signature o de otros metadatos
Información que se basa solo en parámetros explícitos declarados en la fuente
código. MethodParameters
tampoco incluirá información sobre
parámetros del receptor de anotaciones de tipo que no existen en el método real
firma.
Name | Formato | Descripción |
---|---|---|
nombres | String[] | Los nombres de parámetros formales para el método asociado. El array
No debe ser nulo, pero debe estar vacío si no hay parámetros formales. Un valor en
el array debe ser nulo si el parámetro formal con ese índice no tiene nombre. Si las cadenas de nombre del parámetro están vacías o contienen ".", ";", "[" o “/” luego un Se arrojará java.lang.reflect.MalformedParametersException a
tiempo de ejecución.
|
accessFlags | int[] | Las marcas de acceso de los parámetros formales para el método asociado. El
El array no debe ser nulo, pero debe estar vacío si no hay parámetros formales. El valor es una máscara binaria con los siguientes valores:
java.lang.reflect.MalformedParametersException durante el tiempo de ejecución.
|
dalvik.annotation.Signature
Aparece en clases, campos y métodos
Se adjunta una anotación Signature
a cada clase.
campo o método definido en términos de un tipo más complicado
que se representa con un type_id_item
. El
El formato .dex
no define el formato para las firmas. it
solo está destinado a ser capaz de representar cualquier firma que sea una fuente
lenguaje requiere para la implementación exitosa de los recursos
semántica. Por lo tanto, las firmas por lo general no se analizan (ni verifican)
debido a las implementaciones
de máquinas virtuales. Las firmas simplemente se entregan
y pasar a APIs y herramientas de nivel superior (como depuradores). Cualquier uso de un
firma, por lo tanto, debe escribirse de modo que no quede ninguna
suposiciones sobre solo recibir firmas válidas, proteger explícitamente
frente a la posibilidad de encontrar una consulta sintáctica
firma no válida.
Como las cadenas de la firma suelen tener
mucho contenido duplicado,
una anotación Signature
se define como un array de
cadenas de texto, donde los elementos duplicados se refieren naturalmente a la misma
datos subyacentes, y se considera que la firma es la concatenación de
todas las cadenas del array. No hay reglas sobre cómo extraer
dividir una firma en cadenas separadas; que depende exclusivamente del
que generan archivos .dex
.
Name | Formato | Descripción |
---|---|---|
valor | String[] | la firma de esta clase o este miembro, como un array de cadenas que es que se concatenan |
dalvik.annotation.Throws
Aparece en los métodos
Se adjunta una anotación Throws
a cada método que se
declarado para arrojar uno o más tipos de excepción.
Name | Formato | Descripción |
---|---|---|
valor | Clase | el array de tipos de excepciones que se arroja |