Formato ejecutable Dalvik

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
0000-1
01110
7f-1127126
80 7f-1281625616255

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_NATIVE.

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í).

* Solo se permite para anotaciones 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... Las U+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, U+d800 ... U+dfff) ya sea aislada o desordenada respecto de las condiciones la codificación de Unicode en UTF-16. Depende de los usos de mayor nivel para rechazar codificaciones no válidas, si corresponde.

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:

  1. Un controlador de método que representa el método del vinculador de arranque (VALUE_METHOD_HANDLE).
  2. Un nombre de método que el vinculador de arranque debe resolver (VALUE_STRING).
  3. 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:

  1. java.lang.invoke.Lookup
  2. java.lang.String
  3. 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 nombre
type_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 nombre
type_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 “dalvik.annotation.Signature” a continuación con advertencias sobre el manejo de firmas.

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:
  • 0x0010 : final, el parámetro se declaró definitivo
  • 0x1000 : Sintético; el compilador introdujo el parámetro
  • 0x8000 : obligatorio, el parámetro es sintético, pero también está implícito en el lenguaje especificación
Si hay bits fuera de este conjunto, un Se arrojará 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