Formato executável Dalvik

Este documento descreve o layout e o conteúdo dos arquivos .dex , que são usados ​​para armazenar um conjunto de definições de classe e seus dados adjuntos associados.

Guia de tipos

Nome Descrição
byte Int assinado de 8 bits
ubyte Int não assinado de 8 bits
curto Int assinado de 16 bits, little-endian
ucurto Int não assinado de 16 bits, little endian
interno Int assinado de 32 bits, little-endian
unint Int não assinado de 32 bits, little endian
longo Int assinado de 64 bits, little-endian
longe Int não assinado de 64 bits, little endian
sleb128 assinado LEB128, comprimento variável (veja abaixo)
uleb128 LEB128 não assinado, comprimento variável (veja abaixo)
uleb128p1 LEB128 mais 1 não assinado, comprimento variável (veja abaixo)

LEB128

LEB128 (" Little - E ndian B ase 128 ") é uma codificação de comprimento variável para quantidades inteiras arbitrárias com ou sem sinal. O formato foi emprestado da especificação DWARF3 . Em um arquivo .dex , LEB128 só é usado para codificar quantidades de 32 bits.

Cada valor codificado LEB128 consiste em um a cinco bytes, que juntos representam um único valor de 32 bits. Cada byte tem seu bit mais significativo definido, exceto o byte final da sequência, que tem seu bit mais significativo limpo. Os sete bits restantes de cada byte são carga útil, com os sete bits menos significativos da quantidade no primeiro byte, os próximos sete no segundo byte e assim por diante. No caso de um LEB128 assinado ( sleb128 ), o bit de carga útil mais significativo do byte final na sequência é estendido com sinal para produzir o valor final. No caso não assinado ( uleb128 ), quaisquer bits não representados explicitamente são interpretados como 0 .

Diagrama bit a bit de um valor LEB128 de dois bytes
Primeiro byte Segundo byte
1 bit 6 parte 5 parte 4 parte 3 parte 2 bit 1 bit 0 0 parte 13 parte 12 parte 11 bit 10 bit 9 bit 8 parte 7

A variante uleb128p1 é usada para representar um valor assinado, onde a representação é do valor mais um codificado como uleb128 . Isso torna a codificação de -1 (alternativamente considerada como o valor não assinado 0xffffffff ) - mas nenhum outro número negativo - um único byte e é útil exatamente naqueles casos em que o número representado deve ser não negativo ou -1 (ou 0xffffffff ) e onde nenhum outro valor negativo é permitido (ou onde é improvável que grandes valores não assinados sejam necessários).

Aqui estão alguns exemplos dos formatos:

Sequência Codificada Como sleb128 Como uleb128 Como uleb128p1
00 0 0 -1
01 1 1 0
7f -1 127 126
80 7f -128 16256 16255

Layout de arquivo

Nome Formatar Descrição
cabeçalho item_de_cabeçalho o cabeçalho
string_ids string_id_item[] lista de identificadores de string. Estes são identificadores para todas as strings usadas por este arquivo, seja para nomenclatura interna (por exemplo, descritores de tipo) ou como objetos constantes referidos por código. Essa lista deve ser classificada pelo conteúdo da string, usando valores de ponto de código UTF-16 (não de maneira sensível à localidade) e não deve conter entradas duplicadas.
tipo_ids tipo_id_item[] lista de identificadores de tipo. Estes são identificadores para todos os tipos (classes, matrizes ou tipos primitivos) referidos por este arquivo, definidos no arquivo ou não. Esta lista deve ser classificada pelo índice string_id e não deve conter entradas duplicadas.
proto_ids proto_id_item[] lista de identificadores de protótipo de método. Estes são identificadores para todos os protótipos referidos neste arquivo. Esta lista deve ser classificada em ordem principal de tipo de retorno (por índice type_id ) e, em seguida, por lista de argumentos (ordenação lexicográfica, argumentos individuais ordenados por índice type_id ). A lista não deve conter entradas duplicadas.
campos_ids campo_id_item[] lista de identificadores de campo. Estes são identificadores para todos os campos referidos por este arquivo, definidos no arquivo ou não. Esta lista deve ser classificada, onde o tipo de definição (por type_id ) é a ordem principal, o nome do campo (por índice string_id ) é a ordem intermediária e o tipo (por índice type_id ) é a ordem secundária. A lista não deve conter entradas duplicadas.
método_ids método_id_item[] lista de identificadores de método. Estes são identificadores para todos os métodos referidos por este arquivo, definidos no arquivo ou não. Esta lista deve ser classificada, onde o tipo de definição (por type_id ) é a ordem principal, o nome do método (por índice string_id ) é a ordem intermediária e o protótipo do método (por índice proto_id ) é a ordem secundária. A lista não deve conter entradas duplicadas.
class_defs class_def_item[] lista de definições de classe. As classes devem ser ordenadas de forma que a superclasse e as interfaces implementadas de uma determinada classe apareçam na lista antes da classe de referência. Além disso, é inválido que uma definição para a mesma classe apareça mais de uma vez na lista.
call_site_ids call_site_id_item[] lista de identificadores de site de chamada. Estes são identificadores para todos os locais de chamada referidos por este arquivo, definidos no arquivo ou não. Esta lista deve ser classificada em ordem crescente de call_site_off .
métodos_handles método_handle_item[] lista de manipuladores de método. Uma lista de todos os identificadores de método referidos por este arquivo, definidos no arquivo ou não. Esta lista não é classificada e pode conter duplicatas que corresponderão logicamente a diferentes instâncias de identificador de método.
dados ubyte[] área de dados, contendo todos os dados de suporte das tabelas listadas acima. Itens diferentes têm requisitos de alinhamento diferentes e bytes de preenchimento são inseridos antes de cada item, se necessário, para obter o alinhamento adequado.
link_data ubyte[] dados usados ​​em arquivos vinculados estaticamente. O formato dos dados nesta seção não é especificado neste documento. Esta seção está vazia em arquivos desvinculados e as implementações de tempo de execução podem usá-la como acharem adequado.

Definições de campo de bits, string e constante

DEX_FILE_MAGIC

Incorporado em header_item

A matriz/string constante DEX_FILE_MAGIC é a lista de bytes que devem aparecer no início de um arquivo .dex para que ele seja reconhecido como tal. O valor contém intencionalmente uma nova linha ( "\n" ou 0x0a ) e um byte nulo ( "\0" ou 0x00 ) para ajudar na detecção de certas formas de corrupção. O valor também codifica um número de versão do formato como três dígitos decimais, que deverá aumentar monotonicamente ao longo do tempo à medida que o formato evolui.

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

Observação: o suporte para a versão 039 do formato foi adicionado na versão Android 9.0, que introduziu dois novos bytecodes, const-method-handle e const-method-type . (Cada um deles está descrito na tabela Resumo do conjunto de bytes .) No Android 10, a versão 039 estende o formato de arquivo DEX para incluir informações ocultas da API que só são aplicáveis ​​a arquivos DEX no caminho da classe de inicialização.

Nota: O suporte para a versão 038 do formato foi adicionado na versão Android 8.0. A versão 038 adicionou novos bytecodes ( invoke-polymorphic e invoke-custom ) e dados para identificadores de métodos.

Observação: o suporte para a versão 037 do formato foi adicionado na versão Android 7.0. Antes da versão 037 a maioria das versões do Android usava a versão 035 do formato. A única diferença entre as versões 035 e 037 é a adição de métodos padrão e o ajuste da invoke .

Nota: Pelo menos algumas versões anteriores do formato foram usadas em lançamentos de software público amplamente disponíveis. Por exemplo, a versão 009 foi usada para as versões M3 da plataforma Android (novembro a dezembro de 2007) e a versão 013 foi usada para as versões M5 da plataforma Android (fevereiro a março de 2008). Em vários aspectos, estas versões anteriores do formato diferem significativamente da versão descrita neste documento.

ENDIAN_CONSTANT e REVERSE_ENDIAN_CONSTANT

Incorporado em header_item

A constante ENDIAN_CONSTANT é usada para indicar o endianness do arquivo em que se encontra. Embora o formato .dex padrão seja little-endian, as implementações podem optar por realizar a troca de bytes. Se uma implementação encontrar um cabeçalho cujo endian_tag seja REVERSE_ENDIAN_CONSTANT em vez de ENDIAN_CONSTANT , ela saberá que o arquivo foi trocado por bytes do formato esperado.

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

NO_INDEX

Incorporado em class_def_item e debug_info_item

A constante NO_INDEX é usada para indicar que um valor de índice está ausente.

Nota: Este valor não está definido como 0 , porque normalmente é um índice válido.

O valor escolhido para NO_INDEX é representável como um único byte na codificação uleb128p1 .

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

definições de access_flags

Incorporado em class_def_item, encoded_field, encoded_method e InnerClass

Os campos de bits desses sinalizadores são usados ​​para indicar a acessibilidade e as propriedades gerais das classes e dos membros da classe.

Nome Valor Para classes (e anotações InnerClass ) Para campos Para métodos
ACC_PUBLIC 0x1 public : visível em todos os lugares public : visível em todos os lugares public : visível em todos os lugares
ACC_PRIVATE 0x2 * private : visível apenas para definir a classe private : visível apenas para definir a classe private : visível apenas para definir a classe
ACC_PROTECTED 0x4 * protected : visível para pacotes e subclasses protected : visível para pacotes e subclasses protected : visível para pacotes e subclasses
ACC_STATIC 0x8 * static : não é construído com uma referência this externa static : global para definir a classe static : não aceita this argumento
ACC_FINAL 0x10 final : não subclassável final : imutável após a construção final : não substituível
ACC_SYNCHRONIZED 0x20 synchronized : bloqueio associado adquirido automaticamente em torno da chamada para este método.

Nota: Isto só é válido para definir quando ACC_NATIVE também está definido.

ACC_VOLATILE 0x40 volatile : regras de acesso especiais para ajudar na segurança do thread
ACC_BRIDGE 0x40 método bridge, adicionado automaticamente pelo compilador como uma ponte de tipo seguro
ACC_TRANSIENT 0x80 transient : não deve ser salvo pela serialização padrão
ACC_VARARGS 0x80 o último argumento deve ser tratado como um argumento de "repouso" pelo compilador
ACC_NATIVE 0x100 native : implementado em código nativo
ACC_INTERFACE 0x200 interface : classe abstrata multiimplementável
ACC_ABSTRACT 0x400 abstract : não diretamente instanciável abstract : não implementado por esta classe
ACC_STRICT 0x800 strictfp : regras estritas para aritmética de ponto flutuante
ACC_SYNTHETIC 0x1000 não definido diretamente no código-fonte não definido diretamente no código-fonte não definido diretamente no código-fonte
ACC_ANNOTATION 0x2000 declarado como uma classe de anotação
ACC_ENUM 0x4000 declarado como um tipo enumerado declarado como um valor enumerado
(não utilizado) 0x8000
ACC_CONSTRUCTOR 0x10000 método construtor (inicializador de classe ou instância)
ACC_DECLARED_
SINCRONIZADO
0x20000 declarado synchronized .

Nota: Isto não tem efeito na execução (exceto no reflexo deste sinalizador, por si só).

* Permitido apenas para anotações InnerClass e nunca deve estar ativado em um class_def_item .

Codificação UTF-8 modificada

Como uma concessão para um suporte legado mais fácil, o formato .dex codifica seus dados de string em um formato UTF-8 modificado padrão de fato, doravante denominado MUTF-8. Este formulário é idêntico ao padrão UTF-8, exceto:

  • Somente as codificações de um, dois e três bytes são usadas.
  • Os pontos de código no intervalo U+10000U+10ffff são codificados como um par substituto, cada um dos quais é representado como um valor codificado de três bytes.
  • O ponto de código U+0000 é codificado no formato de dois bytes.
  • Um byte nulo simples (valor 0 ) indica o fim de uma string, assim como a interpretação padrão da linguagem C.

Os dois primeiros itens acima podem ser resumidos como: MUTF-8 é um formato de codificação para UTF-16, em vez de ser um formato de codificação mais direto para caracteres Unicode.

Os dois itens finais acima tornam possível incluir simultaneamente o ponto de código U+0000 em uma string e ainda manipulá-lo como uma string terminada em nulo no estilo C.

No entanto, a codificação especial de U+0000 significa que, ao contrário do UTF-8 normal, o resultado da chamada da função C padrão strcmp() em um par de strings MUTF-8 nem sempre indica o resultado devidamente assinado da comparação de strings desiguais . Quando a ordem (não apenas a igualdade) é uma preocupação, a maneira mais direta de comparar strings MUTF-8 é decodificá-las caractere por caractere e comparar os valores decodificados. (No entanto, implementações mais inteligentes também são possíveis.)

Consulte o padrão Unicode para obter mais informações sobre codificação de caracteres. Na verdade, o MUTF-8 está mais próximo da codificação CESU-8 (relativamente menos conhecida) do que do UTF-8 em si.

codificação de valor_codificado

Incorporado em annotation_element e encoded_array_item

Um encoded_value é uma parte codificada de dados (quase) arbitrários estruturados hierarquicamente. A codificação deve ser compacta e fácil de analisar.

Nome Formatar Descrição
(valor_arg << 5) | tipo_valor ubyte byte indicando o tipo do value imediatamente subsequente junto com um argumento esclarecedor opcional nos três bits de ordem superior. Veja abaixo as diversas definições value . Na maioria dos casos, value_arg codifica o comprimento do value imediatamente subsequente em bytes, como (size - 1) , por exemplo, 0 significa que o valor requer um byte e 7 significa que requer oito bytes; no entanto, há exceções conforme observado abaixo.
valor ubyte[] bytes que representam o valor, de comprimento variável e interpretados de forma diferente para diferentes bytes value_type , embora sempre little-endian. Consulte as diversas definições de valores abaixo para obter detalhes.

Formatos de valor

Digite o nome value_type formato value_arg value Formato Descrição
VALUE_BYTE 0x00 (nenhum; deve ser 0 ) ubyte[1] valor inteiro de um byte assinado
VALUE_SHORT 0x02 tamanho - 1 (0…1) ubyte[tamanho] valor inteiro assinado de dois bytes, sinal estendido
VALUE_CHAR 0x03 tamanho - 1 (0…1) ubyte[tamanho] valor inteiro não assinado de dois bytes, estendido por zero
VALUE_INT 0x04 tamanho - 1 (0…3) ubyte[tamanho] valor inteiro assinado de quatro bytes, sinal estendido
VALUE_LONG 0x06 tamanho - 1 (0…7) ubyte[tamanho] valor inteiro assinado de oito bytes, sinal estendido
VALUE_FLOAT 0x10 tamanho - 1 (0…3) ubyte[tamanho] padrão de bits de quatro bytes, estendido com zero para a direita e interpretado como um valor de ponto flutuante IEEE754 de 32 bits
VALUE_DOUBLE 0x11 tamanho - 1 (0…7) ubyte[tamanho] padrão de bits de oito bytes, estendido com zero para a direita e interpretado como um valor de ponto flutuante IEEE754 de 64 bits
VALUE_METHOD_TYPE 0x15 tamanho - 1 (0…3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (estendido por zero), interpretado como um índice na seção proto_ids e representando um valor de tipo de método
VALUE_METHOD_HANDLE 0x16 tamanho - 1 (0…3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (estendido por zero), interpretado como um índice na seção method_handles e representando um valor de identificador de método
VALUE_STRING 0x17 tamanho - 1 (0…3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (estendido por zero), interpretado como um índice na seção string_ids e representando um valor de string
VALUE_TYPE 0x18 tamanho - 1 (0…3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (estendido por zero), interpretado como um índice na seção type_ids e representando um valor reflexivo de tipo/classe
VALUE_FIELD 0x19 tamanho - 1 (0…3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (estendido por zero), interpretado como um índice na seção field_ids e representando um valor de campo reflexivo
VALUE_METHOD 0x1a tamanho - 1 (0…3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (estendido por zero), interpretado como um índice na seção method_ids e representando um valor de método reflexivo
VALUE_ENUM 0x1b tamanho - 1 (0…3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (estendido por zero), interpretado como um índice na seção field_ids e representando o valor de uma constante de tipo enumerada
VALUE_ARRAY 0x1c (nenhum; deve ser 0 ) matriz_codificada uma matriz de valores, no formato especificado por " encoded_array format" abaixo. O tamanho do value está implícito na codificação.
VALUE_ANNOTATION 0x1d (nenhum; deve ser 0 ) anotação_codificada uma subanotação, no formato especificado por " encoded_annotation format" abaixo. O tamanho do value está implícito na codificação.
VALUE_NULL 0x1e (nenhum; deve ser 0 ) (nenhum) valor de referência null
VALUE_BOOLEAN 0x1f booleano (0…1) (nenhum) valor de um bit; 0 para false e 1 para true . O bit é representado no value_arg .

formato codificado_array

Nome Formatar Descrição
tamanho uleb128 número de elementos na matriz
valores valor_codificado[tamanho] uma série de sequências de bytes size encoded_value no formato especificado por esta seção, concatenadas sequencialmente.

formato de anotação_codificada

Nome Formatar Descrição
tipo_idx uleb128 tipo de anotação. Este deve ser um tipo de classe (não array ou primitivo).
tamanho uleb128 número de mapeamentos nome-valor nesta anotação
elementos elemento_anotação[tamanho] elementos da anotação, representados diretamente em linha (não como deslocamentos). Os elementos devem ser classificados em ordem crescente pelo índice string_id .

formato annotation_element

Nome Formatar Descrição
nome_idx uleb128 nome do elemento, representado como um índice na seção string_ids . A sequência deve estar em conformidade com a sintaxe de MemberName , definida acima.
valor valor_codificado valor do elemento

Sintaxe de string

Existem vários tipos de itens em um arquivo .dex que, em última análise, se referem a uma string. As seguintes definições de estilo BNF indicam a sintaxe aceitável para essas strings.

Nome Simples

Um SimpleName é a base para a sintaxe dos nomes de outras coisas. O formato .dex permite uma boa latitude aqui (muito mais do que a maioria dos idiomas de origem comuns). Resumindo, um nome simples consiste em qualquer caractere ou dígito alfabético de baixo ASCII, alguns símbolos específicos de baixo ASCII e a maioria dos pontos de código não ASCII que não são caracteres de controle, espaço ou especiais. A partir da versão 040 o formato permite adicionalmente caracteres de espaço (categoria Unicode Zs ). Observe que os pontos de código substitutos (no intervalo U+d800U+dfff ) não são considerados caracteres de nome válidos, por si só, mas os caracteres suplementares Unicode são válidos (que são representados pela alternativa final da regra para SimpleNameChar ), e eles devem ser representados em um arquivo como pares de pontos de código substitutos na codificação MUTF-8.

Nome Simples
SimpleNameChar ( SimpleNameChar )*
SimpleNameChar
'A''Z'
| 'a''z'
| '0''9'
| ' ' desde a versão DEX 040
| '$'
| '-'
| '_'
| U+00a0 desde a versão DEX 040
| U+00a1U+1fff
| U+2000U+200a desde a versão DEX 040
| U+2010U+2027
| U+202f desde a versão DEX 040
| U+2030U+d7ff
| U+e000U+ffef
| U+10000U+10ffff

Nome do membro

usado por field_id_item e method_id_item

Um MemberName é o nome de um membro de uma classe, sendo os membros campos, métodos e classes internas.

Nome do membro
Nome Simples
| '<' NomeSimples '>'

FullClassName

Um FullClassName é um nome de classe totalmente qualificado, incluindo um especificador de pacote opcional seguido por um nome obrigatório.

Nome completo da classe
OpcionalPackagePrefix SimpleName
OpcionalPackagePrefix
( NomeSimples '/' )*

TipoDescriptor

Usado por type_id_item

Um TypeDescriptor é a representação de qualquer tipo, incluindo primitivos, classes, arrays e void . Veja abaixo o significado das várias versões.

Descritor de tipo
'V'
| FieldTypeDescriptor
DescritorFieldType
Descritor NonArrayFieldType
| ( '[' * 1…255) NonArrayFieldTypeDescriptor
Descritor NonArrayFieldType
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L' FullClassName ';'

ShortyDescriptor

Usado por proto_id_item

Um ShortyDescriptor é a representação abreviada de um protótipo de método, incluindo tipos de retorno e de parâmetro, exceto que não há distinção entre vários tipos de referência (classe ou array). Em vez disso, todos os tipos de referência são representados por um único caractere 'L' .

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

Semântica do TypeDescriptor

Este é o significado de cada uma das variantes do TypeDescriptor .

Sintaxe Significado
V void ; válido apenas para tipos de retorno
Z boolean
B byte
S short
C char
EU int
J. long
F float
D double
L totalmente/qualificado/Nome ; a classe fully.qualified.Name
[ descritor array de descriptor , utilizável recursivamente para arrays de arrays, embora seja inválido ter mais de 255 dimensões.

Itens e estruturas relacionadas

Esta seção inclui definições para cada um dos itens de nível superior que podem aparecer em um arquivo .dex .

item_de_cabeçalho

Aparece na seção do cabeçalho

Alinhamento: 4 bytes

Nome Formatar Descrição
Magia ubyte[8] = DEX_FILE_MAGIC valor mágico. Veja a discussão acima em " DEX_FILE_MAGIC " para mais detalhes.
soma de verificação unint soma de verificação adler32 do resto do arquivo (tudo menos magic e este campo); usado para detectar corrupção de arquivos
assinatura ubyte[20] Assinatura SHA-1 (hash) do restante do arquivo (tudo menos magic , checksum e este campo); usado para identificar arquivos exclusivamente
tamanho do arquivo unint tamanho de todo o arquivo (incluindo o cabeçalho), em bytes
tamanho_do_cabeçalho int = 0x70 tamanho do cabeçalho (toda esta seção), em bytes. Isso permite pelo menos uma quantidade limitada de compatibilidade retroativa sem invalidar o formato.
endian_tag uint=ENDIAN_CONSTANT etiqueta endianidade. Consulte a discussão acima em " ENDIAN_CONSTANT e REVERSE_ENDIAN_CONSTANT " para obter mais detalhes.
link_size unint tamanho da seção do link ou 0 se este arquivo não estiver vinculado estaticamente
link_off unint deslocamento do início do arquivo até a seção do link ou 0 se link_size == 0 . O deslocamento, se diferente de zero, deve ser um deslocamento na seção link_data . O formato dos dados apontados não é especificado neste documento; este campo de cabeçalho (e o anterior) são deixados como ganchos para uso por implementações de tempo de execução.
mapa_off unint deslocamento do início do arquivo até o item do mapa. O deslocamento, que deve ser diferente de zero, deve ser um deslocamento na seção data , e os dados devem estar no formato especificado por " map_list " abaixo.
string_ids_size unint contagem de strings na lista de identificadores de string
string_ids_off unint deslocamento do início do arquivo para a lista de identificadores de string ou 0 se string_ids_size == 0 (reconhecidamente um caso extremo estranho). O deslocamento, se diferente de zero, deve estar no início da seção string_ids .
tipo_ids_tamanho unint contagem de elementos na lista de identificadores de tipo, no máximo 65535
type_ids_off unint deslocamento do início do arquivo para a lista de identificadores de tipo ou 0 se type_ids_size == 0 (reconhecidamente um caso extremo estranho). O deslocamento, se diferente de zero, deve estar no início da seção type_ids .
proto_ids_size unint contagem de elementos na lista de identificadores de protótipo, no máximo 65535
proto_ids_off unint deslocamento do início do arquivo para a lista de identificadores de protótipo ou 0 se proto_ids_size == 0 (reconhecidamente um caso extremo estranho). O deslocamento, se diferente de zero, deve ser no início da seção proto_ids .
campo_ids_tamanho unint contagem de elementos na lista de identificadores de campo
campo_ids_off unint deslocamento do início do arquivo até a lista de identificadores de campo ou 0 se field_ids_size == 0 . O deslocamento, se diferente de zero, deve ser no início da seção field_ids .
método_ids_size unint contagem de elementos na lista de identificadores de método
método_ids_off unint deslocamento do início do arquivo até a lista de identificadores de método ou 0 se method_ids_size == 0 . O deslocamento, se diferente de zero, deve estar no início da seção method_ids .
class_defs_size unint contagem de elementos na lista de definições de classe
class_defs_off unint deslocamento do início do arquivo para a lista de definições de classe ou 0 se class_defs_size == 0 (reconhecidamente um caso extremo estranho). O deslocamento, se diferente de zero, deve ser no início da seção class_defs .
tamanho_dados unint Tamanho da seção data em bytes. Deve ser um múltiplo par de sizeof(uint).
dados_desligados unint deslocamento do início do arquivo até o início da seção data .

lista_de_mapas

Aparece na seção de dados

Referenciado em header_item

Alinhamento: 4 bytes

Esta é uma lista de todo o conteúdo de um arquivo, em ordem. Ele contém alguma redundância em relação ao header_item , mas pretende ser uma forma fácil de usar para iterar um arquivo inteiro. Um determinado tipo deve aparecer no máximo uma vez em um mapa, mas não há nenhuma restrição sobre a ordem em que os tipos podem aparecer, além das restrições implícitas no restante do formato (por exemplo, uma seção header deve aparecer primeiro, seguida por uma string_ids seção, etc.). Além disso, as entradas do mapa devem ser ordenadas por deslocamento inicial e não devem se sobrepor.

Nome Formatar Descrição
tamanho unint tamanho da lista, em entradas
lista item_do mapa[tamanho] elementos da lista

formato map_item

Nome Formatar Descrição
tipo ucurto tipo dos itens; Veja a tabela abaixo
não utilizado ucurto (não utilizado)
tamanho unint contagem do número de itens a serem encontrados no deslocamento indicado
desvio unint deslocamento desde o início do arquivo até os itens em questão

Códigos de tipo

Tipo de item Constante Valor Tamanho do item em bytes
item_de_cabeçalho TYPE_HEADER_ITEM 0x0000 0x70
string_id_item TYPE_STRING_ID_ITEM 0x0001 0x04
tipo_id_item TYPE_TYPE_ID_ITEM 0x0002 0x04
proto_id_item TYPE_PROTO_ID_ITEM 0x0003 0x0c
campo_id_item TYPE_FIELD_ID_ITEM 0x0004 0x08
método_id_item TYPE_METHOD_ID_ITEM 0x0005 0x08
class_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
call_site_id_item TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
método_handle_item TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
lista_de_mapas TYPE_MAP_LIST 0x1000 4 + (tamanho do item * 12)
lista_tipo TYPE_TYPE_LIST 0x1001 4 + (tamanho do item * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (tamanho do item * 4)
anotação_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (tamanho do item * 4)
class_data_item TYPE_CLASS_DATA_ITEM 0x2000 implícito; deve analisar
item_código TYPE_CODE_ITEM 0x2001 implícito; deve analisar
string_data_item TYPE_STRING_DATA_ITEM 0x2002 implícito; deve analisar
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 implícito; deve analisar
item_de_anotação TYPE_ANNOTATION_ITEM 0x2004 implícito; deve analisar
item_array_codificado TYPE_ENCODED_ARRAY_ITEM 0x2005 implícito; deve analisar
annotations_directory_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 implícito; deve analisar
ocultoapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 implícito; deve analisar

string_id_item

Aparece na seção string_ids

Alinhamento: 4 bytes

Nome Formatar Descrição
string_data_off unint deslocamento do início do arquivo até os dados da string deste item. O deslocamento deve ser para um local na seção data e os dados devem estar no formato especificado por " string_data_item " abaixo. Não há nenhum requisito de alinhamento para o deslocamento.

string_data_item

Aparece na seção de dados

Alinhamento: nenhum (alinhado por byte)

Nome Formatar Descrição
utf16_size uleb128 tamanho desta string, em unidades de código UTF-16 (que é o "comprimento da string" em muitos sistemas). Ou seja, este é o comprimento decodificado da string. (O comprimento codificado está implícito na posição do byte 0 )
dados ubyte[] uma série de unidades de código MUTF-8 (também conhecidas como octetos, também conhecidas como bytes) seguidas por um byte de valor 0 . Consulte "Codificação MUTF-8 (UTF-8 modificado)" acima para obter detalhes e discussão sobre o formato de dados.

Nota: É aceitável ter uma string que inclua (a forma codificada de) unidades de código substituto UTF-16 (ou seja, U+d800U+dfff ) isoladamente ou fora de ordem em relação à codificação usual de Unicode em UTF-16. Cabe aos usos de strings de nível superior rejeitar tais codificações inválidas, se apropriado.

tipo_id_item

Aparece na seção type_ids

Alinhamento: 4 bytes

Nome Formatar Descrição
descritor_idx unint index na lista string_ids para a string do descritor deste tipo. A string deve estar em conformidade com a sintaxe de TypeDescriptor , definida acima.

proto_id_item

Aparece na seção proto_ids

Alinhamento: 4 bytes

Nome Formatar Descrição
shorty_idx unint index na lista string_ids para a string do descritor de formato abreviado deste protótipo. A string deve estar em conformidade com a sintaxe de ShortyDescriptor , definida acima, e deve corresponder ao tipo de retorno e aos parâmetros deste item.
return_type_idx unint indexe na lista type_ids para o tipo de retorno deste protótipo
parâmetros_desligado unint deslocamento do início do arquivo até a lista de tipos de parâmetros para este protótipo ou 0 se este protótipo não tiver parâmetros. Este deslocamento, se diferente de zero, deve estar na seção data , e os dados devem estar no formato especificado por "type_list" abaixo. Além disso, não deve haver referência ao tipo void na lista.

campo_id_item

Aparece na seção field_ids

Alinhamento: 4 bytes

Nome Formatar Descrição
class_idx ucurto index na lista type_ids para o definidor deste campo. Este deve ser um tipo de classe e não um array ou tipo primitivo.
tipo_idx ucurto índice na lista type_ids para o tipo deste campo
nome_idx unint index na lista string_ids para o nome deste campo. A sequência deve estar em conformidade com a sintaxe de MemberName , definida acima.

método_id_item

Aparece na seção method_ids

Alinhamento: 4 bytes

Nome Formatar Descrição
class_idx ucurto index na lista type_ids para o definidor deste método. Deve ser uma classe ou tipo de array, e não um tipo primitivo.
proto_idx ucurto indexe na lista proto_ids para o protótipo deste método
nome_idx unint indexe na lista string_ids para o nome deste método. A sequência deve estar em conformidade com a sintaxe de MemberName , definida acima.

class_def_item

Aparece na seção class_defs

Alinhamento: 4 bytes

Nome Formatar Descrição
class_idx unint index na lista type_ids para esta classe. Este deve ser um tipo de classe e não um array ou tipo primitivo.
access_flags unint sinalizadores de acesso para a classe ( public , final , etc.). Consulte "Definições access_flags " para obter detalhes.
superclasse_idx unint index na lista type_ids da superclasse ou no valor constante NO_INDEX se esta classe não tiver superclasse (ou seja, for uma classe raiz como Object ). Se presente, deve ser um tipo de classe e não um array ou tipo primitivo.
interfaces_off unint deslocamento do início do arquivo até a lista de interfaces ou 0 se não houver nenhuma. Este deslocamento deve estar na seção data , e os dados devem estar no formato especificado por " type_list " abaixo. Cada um dos elementos da lista deve ser um tipo de classe (não um array ou tipo primitivo) e não deve haver duplicatas.
arquivo_fonte_idx unint index na lista string_ids para o nome do arquivo que contém a fonte original para (pelo menos a maior parte) desta classe, ou o valor especial NO_INDEX para representar a falta desta informação. O debug_info_item de qualquer método pode substituir este arquivo fonte, mas a expectativa é que a maioria das classes venha apenas de um arquivo fonte.
anotações_desligadas unint deslocamento do início do arquivo até a estrutura de anotações desta classe ou 0 se não houver anotações nesta classe. Este deslocamento, se diferente de zero, deve estar na seção data , e os dados devem estar no formato especificado por " annotations_directory_item " abaixo, com todos os itens referentes a esta classe como o definidor.
class_data_off unint deslocamento do início do arquivo até os dados de classe associados para este item ou 0 se não houver dados de classe para esta classe. (Este pode ser o caso, por exemplo, se esta classe for uma interface de marcador.) O deslocamento, se diferente de zero, deve estar na seção data , e os dados devem estar no formato especificado por " class_data_item " abaixo, com todos os itens referentes a esta classe como o definidor.
valores_estáticos_desligados unint deslocamento do início do arquivo para a lista de valores iniciais para campos static ou 0 se não houver nenhum (e todos os campos static devem ser inicializados com 0 ou null ). Este deslocamento deve estar na seção data , e os dados devem estar no formato especificado por " encoded_array_item " abaixo. O tamanho do array não deve ser maior que o número de campos static declarados por esta classe, e os elementos correspondem aos campos static na mesma ordem declarada na field_list correspondente. O tipo de cada elemento do array deve corresponder ao tipo declarado do campo correspondente. Se houver menos elementos na matriz do que campos static , os campos restantes serão inicializados com um 0 ou null apropriado ao tipo.

call_site_id_item

Aparece na seção call_site_ids

Alinhamento: 4 bytes

Nome Formatar Descrição
call_site_off unint deslocamento do início do arquivo para chamar a definição do site. O deslocamento deve estar na seção de dados e os dados devem estar no formato especificado por "call_site_item" abaixo.

call_site_item

Aparece na seção de dados

Alinhamento: nenhum (alinhado por bytes)

O call_site_item é um encoded_array_item cujos elementos correspondem aos argumentos fornecidos para um método de vinculador de bootstrap. Os três primeiros argumentos são:

  1. Um identificador de método que representa o método do vinculador de inicialização (VALUE_METHOD_HANDLE).
  2. Um nome de método que o vinculador de bootstrap deve resolver (VALUE_STRING).
  3. Um tipo de método correspondente ao tipo do nome do método a ser resolvido (VALUE_METHOD_TYPE).

Quaisquer argumentos adicionais são valores constantes passados ​​para o método do vinculador de bootstrap. Esses argumentos são passados ​​em ordem e sem nenhuma conversão de tipo.

O identificador do método que representa o método do vinculador de bootstrap deve ter o tipo de retorno java.lang.invoke.CallSite . Os primeiros três tipos de parâmetros são:

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

Os tipos de parâmetros de quaisquer argumentos adicionais são determinados a partir dos seus valores constantes.

método_handle_item

Aparece na seção method_handles

Alinhamento: 4 bytes

Nome Formatar Descrição
método_handle_type ucurto tipo de identificador do método; Veja a tabela abaixo
não utilizado ucurto (não utilizado)
campo_ou_método_id ucurto ID do campo ou método, dependendo se o tipo de identificador do método é um acessador ou um invocador de método
não utilizado ucurto (não utilizado)

Códigos de tipo de identificador de método

Constante Valor Descrição
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 O identificador de método é um configurador de campo estático (acessador)
METHOD_HANDLE_TYPE_STATIC_GET 0x01 O identificador do método é um getter de campo estático (acessador)
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 O identificador do método é um configurador de campo de instância (acessador)
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 O identificador do método é um getter de campo de instância (acessador)
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 O identificador de método é um invocador de método estático
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 O identificador de método é um invocador de método de instância
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 O identificador de método é um invocador de método construtor
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 O identificador de método é um invocador direto de método
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 O identificador de método é um invocador de método de interface

class_data_item

Referenciado de class_def_item

Aparece na seção de dados

Alinhamento: nenhum (alinhado por byte)

Nome Formatar Descrição
static_fields_size uleb128 o número de campos estáticos definidos neste item
instance_fields_size uleb128 o número de campos de instância definidos neste item
métodos_diretos_size uleb128 o número de métodos diretos definidos neste item
virtual_methods_size uleb128 o número de métodos virtuais definidos neste item
campos_estáticos campo_codificado[static_fields_size] os campos estáticos definidos, representados como uma sequência de elementos codificados. Os campos devem ser classificados por field_idx em ordem crescente.
instância_campos campo_codificado[instance_fields_size] os campos de instância definidos, representados como uma sequência de elementos codificados. Os campos devem ser classificados por field_idx em ordem crescente.
métodos_diretos método_codificado[tamanho_de_métodos_diretos] os métodos diretos definidos (qualquer um dos métodos static , private ou construtores), representados como uma sequência de elementos codificados. Os métodos devem ser classificados por method_idx em ordem crescente.
métodos_virtuais método_codificado[tamanho_de_métodos_virtuais] os métodos virtuais definidos (nenhum dos static , private ou construtores), representados como uma sequência de elementos codificados. Esta lista não deve incluir métodos herdados, a menos que sejam substituídos pela classe que este item representa. Os métodos devem ser classificados por method_idx em ordem crescente. O method_idx de um método virtual não deve ser igual a qualquer método direto.

Nota: As instâncias field_id e method_id de todos os elementos devem referir-se à mesma classe de definição.

formato de campo_codificado

Nome Formatar Descrição
campo_idx_diff uleb128 index na lista field_ids para a identidade deste campo (inclui o nome e o descritor), representado como uma diferença do índice do elemento anterior na lista. O índice do primeiro elemento de uma lista é representado diretamente.
access_flags uleb128 sinalizadores de acesso para o campo ( public , final , etc.). Consulte "Definições access_flags " para obter detalhes.

formato de método_codificado

Nome Formatar Descrição
método_idx_diff uleb128 index na lista method_ids para a identidade deste método (inclui o nome e o descritor), representado como uma diferença do índice do elemento anterior na lista. O índice do primeiro elemento de uma lista é representado diretamente.
access_flags uleb128 sinalizadores de acesso para o método ( public , final , etc.). Consulte "Definições access_flags " para obter detalhes.
código_desligado uleb128 deslocamento do início do arquivo até a estrutura de código desse método ou 0 se esse método for abstract ou native . O deslocamento deve ser para um local na seção data . O formato dos dados é especificado por " code_item " abaixo.

lista_tipo

Referenciado de class_def_item e proto_id_item

Aparece na seção de dados

Alinhamento: 4 bytes

Nome Formatar Descrição
tamanho unint tamanho da lista, em entradas
lista tipo_item[tamanho] elementos da lista

formato type_item

Nome Formatar Descrição
tipo_idx ucurto índice na lista type_ids

item_código

Referenciado em encoded_method

Aparece na seção de dados

Alinhamento: 4 bytes

Nome Formatar Descrição
tamanho_de_registros ucurto o número de registros usados ​​por este código
ins_size ucurto o número de palavras de argumentos recebidos para o método ao qual este código se destina
tamanho_outs ucurto o número de palavras do espaço de argumento de saída exigido por este código para invocação de método
tentativas_tamanho ucurto o número de try_item s para esta instância. Se for diferente de zero, eles aparecerão como a matriz tries logo após o insns nesta instância.
debug_info_off unint deslocamento do início do arquivo até a sequência de informações de depuração (números de linha + informações da variável local) para este código ou 0 se simplesmente não houver informações. O deslocamento, se for diferente de zero, deverá ser para um local na seção data . O formato dos dados é especificado por " debug_info_item " abaixo.
insns_size unint tamanho da lista de instruções, em unidades de código de 16 bits
pousadas ushort[insns_size] matriz real de bytecode. O formato do código em uma matriz insns é especificado pelo documento complementar Dalvik bytecode . Observe que embora isso seja definido como uma matriz de ushort , existem algumas estruturas internas que preferem o alinhamento de quatro bytes. Além disso, se isso estiver em um arquivo trocado por endian, a troca será feita apenas em instâncias ushort individuais e não nas estruturas internas maiores.
preenchimento ucurto (opcional) = 0 dois bytes de preenchimento para fazer tries alinhadas com quatro bytes. Este elemento só está presente se tries_size for diferente de zero e insns_size for ímpar.
tentativas try_item[tries_size] (opcional) array indicando onde no código as exceções são capturadas e como tratá-las. Os elementos da matriz não devem se sobrepor no intervalo e na ordem do endereço inferior ao superior. Este elemento só estará presente se tries_size for diferente de zero.
manipuladores encoded_catch_handler_list (opcional) bytes que representam uma lista de listas de tipos de captura e endereços de manipuladores associados. Cada try_item possui um deslocamento de bytes nesta estrutura. Este elemento só estará presente se tries_size for diferente de zero.

formato try_item

Nome Formatar Descrição
endereço_inicial unint endereço inicial do bloco de código coberto por esta entrada. O endereço é uma contagem de unidades de código de 16 bits até o início da primeira instrução abrangida.
contagem_insn ucurto número de unidades de código de 16 bits abrangidas por esta entrada. A última unidade de código coberta (inclusive) é start_addr + insn_count - 1 .
manipulador_off ucurto deslocamento em bytes desde o início do encoded_catch_hander_list associado até o encoded_catch_handler para esta entrada. Este deve ser um deslocamento para o início de um encoded_catch_handler .

formato encoded_catch_handler_list

Nome Formatar Descrição
tamanho uleb128 tamanho desta lista, em entradas
lista encoded_catch_handler[tamanho_do_manipulador] lista real de listas de manipuladores, representadas diretamente (não como deslocamentos) e concatenadas sequencialmente

formato codificado_catch_handler

Nome Formatar Descrição
tamanho sleb128 número de tipos de captura nesta lista. Se não for positivo, então este é o negativo do número de tipos de captura, e as capturas são seguidas por um manipulador pega-tudo. Por exemplo: um size 0 significa que há uma captura geral, mas nenhuma captura explicitamente digitada. Um size 2 significa que há duas capturas digitadas explicitamente e nenhuma captura-tudo. E um size -1 significa que há um pega-pega digitado junto com um pega-tudo.
manipuladores encoded_type_addr_pair[abs(tamanho)] fluxo de itens codificados em abs(size) , um para cada tipo capturado, na ordem em que os tipos devem ser testados.
catch_all_addr uleb128 (opcional) endereço de bytecode do manipulador pega-tudo. Este elemento só está presente se size não for positivo.

formato encoded_type_addr_pair

Nome Formatar Descrição
tipo_idx uleb128 índice na lista type_ids para o tipo de exceção a ser capturada
endereço uleb128 endereço de bytecode do manipulador de exceção associado

debug_info_item

Referenciado em code_item

Aparece na seção de dados

Alinhamento: nenhum (alinhado por byte)

Cada debug_info_item define uma máquina de estado codificada em bytes inspirada em DWARF3 que, quando interpretada, emite a tabela de posições e (potencialmente) as informações da variável local para um code_item . A sequência começa com um cabeçalho de comprimento variável (cujo comprimento depende do número de parâmetros do método), é seguido pelos bytecodes da máquina de estado e termina com um byte DBG_END_SEQUENCE .

A máquina de estados consiste em cinco registradores. O registrador address representa o deslocamento da instrução no insns_item associado em unidades de código de 16 bits. O registro de address começa em 0 no início de cada sequência debug_info e deve aumentar apenas monotonicamente. O registrador line representa qual número de linha de origem deve ser associado à próxima entrada da tabela de posições emitida pela máquina de estados. É inicializado no cabeçalho da sequência e pode mudar nas direções positiva ou negativa, mas nunca deve ser menor que 1 . O registro source_file representa o arquivo de origem ao qual as entradas do número de linha se referem. Ele é inicializado com o valor de source_file_idx em class_def_item . As outras duas variáveis, prologue_end e epilogue_begin , são sinalizadores booleanos (inicializados como false ) que indicam se a próxima posição emitida deve ser considerada um prólogo ou epílogo do método. A máquina de estado também deve rastrear o nome e o tipo da última variável local ativa em cada registro para o código DBG_RESTART_LOCAL .

O cabeçalho é o seguinte:

Nome Formatar Descrição
início_linha uleb128 o valor inicial do registro de line da máquina de estado. Não representa uma entrada de posições reais.
parâmetros_tamanho uleb128 o número de nomes de parâmetros que são codificados. Deve haver um parâmetro por método, excluindo this de um método de instância, se houver.
parâmetros_nomes uleb128p1[tamanho_parâmetros] índice de string do nome do parâmetro do método. Um valor codificado NO_INDEX indica que nenhum nome está disponível para o parâmetro associado. O descritor de tipo e a assinatura estão implícitos no descritor e na assinatura do método.

Os valores do código de bytes são os seguintes:

Nome Valor Formatar Argumentos Descrição
DBG_END_SEQUENCE 0x00 (nenhum) encerra uma sequência de informações de depuração para um code_item
DBG_ADVANCE_PC 0x01 uleb128 endereço_diff addr_diff : valor a ser adicionado ao registro de endereço avança o registrador de endereços sem emitir uma entrada de posições
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff : valor para alterar o registro da linha em avança o registro de linha sem emitir uma entrada de posições
DBG_START_LOCAL 0x03 uleb128 número_registro
uleb128p1 nome_idx
uleb128p1 tipo_idx
register_num : registro que conterá local
name_idx : índice de string do nome
type_idx : índice de tipo do tipo
introduz uma variável local no endereço atual. name_idx ou type_idx podem ser NO_INDEX para indicar que esse valor é desconhecido.
DBG_START_LOCAL_EXTENDED 0x04 uleb128 número_registro
uleb128p1 nome_idx
uleb128p1 tipo_idx
uleb128p1 sig_idx
register_num : registro que conterá local
name_idx : índice de string do nome
type_idx : índice de tipo do tipo
sig_idx : índice de string da assinatura do tipo
introduz um local com uma assinatura de tipo no endereço atual. Qualquer um entre name_idx , type_idx ou sig_idx pode ser NO_INDEX para indicar que esse valor é desconhecido. (Se sig_idx for -1 , porém, os mesmos dados poderão ser representados de forma mais eficiente usando o opcode DBG_START_LOCAL .)

Nota: Veja a discussão em " dalvik.annotation.Signature " abaixo para advertências sobre o tratamento de assinaturas.

DBG_END_LOCAL 0x05 uleb128 número_registro register_num : registro que continha local marca uma variável local atualmente ativa como fora do escopo no endereço atual
DBG_RESTART_LOCAL 0x06 uleb128 número_registro register_num : registre-se para reiniciar reintroduz uma variável local no endereço atual. O nome e o tipo são iguais ao último local ativo no registro especificado.
DBG_SET_PROLOGUE_END 0x07 (nenhum) define o registro da máquina de estado prologue_end , indicando que a próxima entrada de posição adicionada deve ser considerada o final de um prólogo de método (um local apropriado para um ponto de interrupção de método). O registro prologue_end é limpo por qualquer opcode especial ( >= 0x0a ).
DBG_SET_EPILOGUE_BEGIN 0x08 (nenhum) define o registro da máquina de estado epilogue_begin , indicando que a próxima entrada de posição adicionada deve ser considerada o início de um epílogo do método (um local apropriado para suspender a execução antes da saída do método). O registro epilogue_begin é limpo por qualquer opcode especial ( >= 0x0a ).
DBG_SET_FILE 0x09 uleb128p1 nome_idx name_idx : índice de string do nome do arquivo de origem; NO_INDEX se desconhecido indica que todas as entradas de número de linha subsequentes fazem referência a este nome de arquivo de origem, em vez do nome padrão especificado em code_item
Códigos de operação especiais 0x0a…0xff (nenhum) avança os registros de line e address , emite uma entrada de posição e limpa prologue_end e epilogue_begin . Veja abaixo a descrição.

Códigos de operação especiais

Opcodes com valores entre 0x0a e 0xff (inclusive) movem os registros de line e address em uma pequena quantidade e então emitem uma nova entrada na tabela de posição. A fórmula para os incrementos é a seguinte:

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)

annotations_directory_item

Referenciado de class_def_item

Aparece na seção de dados

Alinhamento: 4 bytes

Nome Formatar Descrição
class_annotations_off unint deslocamento do início do arquivo até as anotações feitas diretamente na classe ou 0 se a classe não tiver anotações diretas. O deslocamento, se for diferente de zero, deverá ser para um local na seção data . O formato dos dados é especificado por " annotation_set_item " abaixo.
tamanho_campos unint contagem de campos anotados por este item
annotated_methods_size unint contagem de métodos anotados por este item
parâmetros_anotados_tamanho unint contagem de listas de parâmetros de método anotadas por este item
anotações_campo field_annotation[fields_size] (opcional) lista de anotações de campo associadas. Os elementos da lista devem ser ordenados em ordem crescente, por field_idx .
anotações_método anotação_método[tamanho_métodos] (opcional) lista de anotações de método associadas. Os elementos da lista devem ser ordenados em ordem crescente, por method_idx .
parâmetro_annotations parâmetro_annotation[parameters_size] (opcional) lista de anotações de parâmetros de método associados. Os elementos da lista devem ser ordenados em ordem crescente, por method_idx .

Nota: As instâncias field_id e method_id de todos os elementos devem referir-se à mesma classe de definição.

formato field_annotation

Nome Formatar Descrição
campo_idx unint índice na lista field_ids para a identidade do campo que está sendo anotado
anotações_desligadas unint deslocamento do início do arquivo até a lista de anotações do campo. O deslocamento deve ser para um local na seção data . O formato dos dados é especificado por " annotation_set_item " abaixo.

formato de anotação_método

Nome Formatar Descrição
método_idx unint índice na lista method_ids para a identidade do método que está sendo anotado
anotações_desligadas unint deslocamento do início do arquivo até a lista de anotações do método. O deslocamento deve ser para um local na seção data . O formato dos dados é especificado por " annotation_set_item " abaixo.

formato de parâmetro_anotação

Nome Formatar Descrição
método_idx unint índice na lista method_ids para a identidade do método cujos parâmetros estão sendo anotados
anotações_desligadas unint deslocamento do início do arquivo para a lista de anotações para os parâmetros do método. O deslocamento deve ser para um local na seção data . O formato dos dados é especificado por " annotation_set_ref_list " abaixo.

annotation_set_ref_list

Referenciado em parâmetro_annotations_item

Aparece na seção de dados

Alinhamento: 4 bytes

Nome Formatar Descrição
tamanho unint tamanho da lista, em entradas
lista anotação_set_ref_item[tamanho] elementos da lista

formato annotation_set_ref_item

Nome Formatar Descrição
anotações_desligadas unint deslocamento do início do arquivo até o conjunto de anotações referenciado ou 0 se não houver anotações para este elemento. O deslocamento, se for diferente de zero, deverá ser para um local na seção data . O formato dos dados é especificado por " annotation_set_item " abaixo.

anotação_set_item

Referenciado em annotations_directory_item, field_annotations_item, method_annotations_item e annotation_set_ref_item

Aparece na seção de dados

Alinhamento: 4 bytes

Nome Formatar Descrição
tamanho unint tamanho do conjunto, em entradas
entradas anotação_off_item[tamanho] elementos do conjunto. Os elementos devem ser ordenados em ordem crescente, por type_idx .

formato anotação_off_item

Nome Formatar Descrição
anotação_desligada unint deslocamento do início do arquivo para uma anotação. O deslocamento deve ser para um local na seção data , e o formato dos dados nesse local é especificado por " annotation_item " abaixo.

item_de_anotação

Referenciado em annotation_set_item

Aparece na seção de dados

Alinhamento: nenhum (alinhado por byte)

Nome Formatar Descrição
visibilidade ubyte visibilidade pretendida desta anotação (veja abaixo)
anotação anotação_codificada conteúdo da anotação codificada, no formato descrito por " encoded_annotation format" em " encoded_value encoding" acima.

Valores de visibilidade

Estas são as opções para o campo visibility em um annotation_item :

Nome Valor Descrição
VISIBILITY_BUILD 0x00 destinado apenas a ser visível em tempo de construção (por exemplo, durante a compilação de outro código)
VISIBILITY_RUNTIME 0x01 destinado a ser visível em tempo de execução
VISIBILITY_SYSTEM 0x02 destinado a ser visível em tempo de execução, mas apenas para o sistema subjacente (e não para o código de usuário normal)

item_array_codificado

Referenciado de class_def_item

Aparece na seção de dados

Alinhamento: nenhum (alinhado por byte)

Nome Formatar Descrição
valor matriz_codificada bytes que representam o valor da matriz codificada, no formato especificado por " encoded_array Format" em " encoded_value Encoding" acima.

ocultoapi_class_data_item

Esta seção contém dados sobre interfaces restritas usadas por cada classe.

Observação: o recurso de API oculta foi introduzido no Android 10.0 e só é aplicável aos arquivos DEX de classes no caminho da classe de inicialização. A lista de sinalizadores descrita abaixo poderá ser estendida em versões futuras do Android. Para obter mais informações, consulte restrições em interfaces não SDK .

Nome Formatar Descrição
tamanho unint tamanho total da seção
compensações uint[] matriz de deslocamentos indexados por class_idx . Uma entrada zero na matriz no índice class_idx significa que não há dados para este class_idx ou que todos os sinalizadores de API ocultos são zero. Caso contrário, a entrada da matriz será diferente de zero e conterá um deslocamento do início da seção para uma matriz de sinalizadores de API ocultos para este class_idx .
bandeiras uleb128[] matrizes concatenadas de sinalizadores de API ocultos para cada classe. Os possíveis valores de sinalização estão descritos na tabela abaixo. Os sinalizadores são codificados na mesma ordem em que os campos e métodos são codificados nos dados da classe.

Tipos de sinalizadores de restrição:

Nome Valor Descrição
lista branca 0 Interfaces que podem ser usadas livremente e são suportadas como parte da estrutura Android oficialmente documentada Package Index .
lista cinza 1 Interfaces não SDK que podem ser usadas independentemente do nível de API de destino do aplicativo.
lista negra 2 Interfaces não SDK que não podem ser usadas independentemente do nível de API de destino do aplicativo. Acessar uma dessas interfaces causa um erro de tempo de execução .
lista cinza‑max‑o 3 Interfaces não SDK que podem ser usadas para Android 8.x e versões anteriores, a menos que sejam restritas.
lista cinza‑max‑p 4 Interfaces não SDK que podem ser usadas para Android 9.x, a menos que sejam restritas.
lista cinza‑max‑q 5 Interfaces não SDK que podem ser usadas para Android 10.x, a menos que sejam restritas.
lista cinza‑max‑r 6 Interfaces não SDK que podem ser usadas para Android 11.x, a menos que sejam restritas.

Anotações do sistema

As anotações do sistema são usadas para representar várias informações reflexivas sobre classes (e métodos e campos). Geralmente, essas informações são acessadas apenas indiretamente pelo código do cliente (não pertencente ao sistema).

As anotações do sistema são representadas em arquivos .dex como anotações com visibilidade definida como VISIBILITY_SYSTEM .

dalvik.annotation.AnnotationDefault

Aparece em métodos em interfaces de anotação

Uma anotação AnnotationDefault é anexada a cada interface de anotação que deseja indicar ligações padrão.

Nome Formatar Descrição
valor Anotação as ligações padrão para esta anotação, representadas como uma anotação deste tipo. A anotação não precisa incluir todos os nomes definidos pela anotação; nomes ausentes simplesmente não têm padrões.

dalvik.annotation.EnclosingClass

Aparece nas aulas

Uma anotação EnclosingClass é anexada a cada classe que é definida como membro de outra classe, por si só, ou é anônima, mas não definida no corpo de um método (por exemplo, uma classe interna sintética). Toda classe que possui esta anotação também deve ter uma anotação InnerClass . Além disso, uma classe não deve ter uma anotação EnclosingClass e EnclosingMethod .

Nome Formatar Descrição
valor Aula a classe que mais se aproxima lexicamente desta classe

dalvik.annotation.EnclosingMethod

Aparece nas aulas

Uma anotação EnclosingMethod é anexada a cada classe definida dentro do corpo do método. Toda classe que possui esta anotação também deve ter uma anotação InnerClass . Além disso, uma classe não deve ter uma anotação EnclosingClass e EnclosingMethod .

Nome Formatar Descrição
valor Método o método que abrange mais lexicamente esta classe

dalvik.annotation.InnerClass

Aparece nas aulas

Uma anotação InnerClass é anexada a cada classe definida no escopo léxico da definição de outra classe. Qualquer classe que possua esta anotação também deve ter uma anotação EnclosingClass ou uma anotação EnclosingMethod .

Nome Formatar Descrição
nome Corda o nome simples originalmente declarado desta classe (sem incluir nenhum prefixo de pacote). Se esta classe for anônima, o nome será null .
bandeiras de acesso interno os sinalizadores de acesso originalmente declarados da classe (que podem diferir dos sinalizadores efetivos devido a uma incompatibilidade entre os modelos de execução da linguagem de origem e da máquina virtual de destino)

dalvik.annotation.MemberClasses

Aparece nas aulas

Uma anotação MemberClasses é anexada a cada classe que declara classes membros. (Uma classe membro é uma classe interna direta que possui um nome.)

Nome Formatar Descrição
valor Aula[] array das classes membros

dalvik.annotation.MethodParameters

Aparece em métodos

Observação: esta anotação foi adicionada após o Android 7.1. Sua presença em versões anteriores do Android será ignorada.

Uma anotação MethodParameters é opcional e pode ser usada para fornecer metadados de parâmetros, como nomes de parâmetros e modificadores.

A anotação pode ser omitida de um método ou construtor com segurança quando os metadados do parâmetro não são necessários em tempo de execução. java.lang.reflect.Parameter.isNamePresent() pode ser usado para verificar se os metadados estão presentes para um parâmetro, e os métodos de reflexão associados, como java.lang.reflect.Parameter.getName() retornarão ao comportamento padrão em tempo de execução se a informação não estiver presente.

Ao incluir metadados de parâmetro, os compiladores devem incluir informações para classes geradas, como enums, uma vez que os metadados de parâmetro incluem se um parâmetro é ou não sintético ou obrigatório.

Uma anotação MethodParameters descreve apenas parâmetros de métodos individuais. Portanto, os compiladores podem omitir totalmente a anotação para construtores e métodos que não possuem parâmetros, por causa do tamanho do código e da eficiência do tempo de execução.

As matrizes documentadas abaixo devem ter o mesmo tamanho da estrutura dex method_id_item associada ao método, caso contrário, uma java.lang.reflect.MalformedParametersException será lançada em tempo de execução.

Ou seja: method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size deve ser igual names().length e accessFlags().length .

Como MethodParameters descreve todos os parâmetros formais do método, mesmo aqueles não declarados explícita ou implicitamente no código-fonte, o tamanho das matrizes pode diferir da Assinatura ou de outras informações de metadados baseadas apenas em parâmetros explícitos declarados no código-fonte. MethodParameters também não incluirá nenhuma informação sobre parâmetros do receptor de anotação de tipo que não existam na assinatura real do método.

Nome Formatar Descrição
nomes Corda[] Os nomes dos parâmetros formais do método associado. A matriz não deve ser nula, mas deve estar vazia se não houver parâmetros formais. Um valor na matriz deve ser nulo se o parâmetro formal com esse índice não tiver nome.
Se as strings de nome de parâmetro estiverem vazias ou contiverem '.', ';', '[' ou '/', então uma java.lang.reflect.MalformedParametersException será lançada em tempo de execução.
bandeiras de acesso interno[] Os sinalizadores de acesso dos parâmetros formais do método associado. A matriz não deve ser nula, mas deve estar vazia se não houver parâmetros formais.
O valor é uma máscara de bits com os seguintes valores:
  • 0x0010: final, o parâmetro foi declarado final
  • 0x1000: sintético, o parâmetro foi introduzido pelo compilador
  • 0x8000: obrigatório, o parâmetro é sintético, mas também está implícito na especificação da linguagem
Se algum bit for definido fora deste conjunto, um java.lang.reflect.MalformedParametersException será lançado em tempo de execução.

dalvik.annotation.Signature

Aparece em classes, campos e métodos

Uma anotação Signature é anexada a cada classe, campo ou método definido em termos de um tipo mais complicado do que o representável por um type_id_item . O formato .dex não define o formato das assinaturas; destina-se apenas a ser capaz de representar quaisquer assinaturas que uma linguagem de origem exija para a implementação bem-sucedida da semântica dessa linguagem. Como tal, as assinaturas geralmente não são analisadas (ou verificadas) por implementações de máquinas virtuais. As assinaturas simplesmente são transferidas para APIs e ferramentas de nível superior (como depuradores). Qualquer uso de uma assinatura, portanto, deve ser escrito de modo a não fazer quaisquer suposições sobre o recebimento apenas de assinaturas válidas, protegendo-se explicitamente contra a possibilidade de encontrar uma assinatura sintaticamente inválida.

Como as strings de assinatura tendem a ter muito conteúdo duplicado, uma anotação Signature é definida como uma matriz de strings, onde os elementos duplicados referem-se naturalmente aos mesmos dados subjacentes, e a assinatura é considerada a concatenação de todas as strings na matriz . Não existem regras sobre como separar uma assinatura em sequências separadas; isso depende inteiramente das ferramentas que geram arquivos .dex .

Nome Formatar Descrição
valor Corda[] a assinatura desta classe ou membro, como uma matriz de strings que deve ser concatenada

dalvik.annotation.Throws

Aparece em métodos

Uma anotação Throws é anexada a cada método declarado para lançar um ou mais tipos de exceção.

Nome Formatar Descrição
valor Aula[] a matriz de tipos de exceção lançada