Formato executável Dalvik

Este documento descreve o layout e o conteúdo de .dex que são usados para manter um conjunto de definições de classe e os respectivos os dados associados.

Guia de tipos

Nome Descrição
byte Int conectado de 8 bits
ubyte Int não assinado de 8 bits
short Int assinado de 16 bits, small-endian
Ushort Int não assinado de 16 bits, small-endian
int Int assinado de 32 bits, small-endian
Uint Int não assinado de 32 bits, small-endian
long Int assinado de 64 bits, small-endian
Ulong Int não assinado de 64 bits, small-endian
sleb128 LEB128 assinado, comprimento variável (veja abaixo)
Uleb128 LEB128 não assinado, comprimento variável (ver abaixo)
Uleb128p1 LEB128 mais 1, comprimento variável (veja abaixo)

LEB128

A LEB128 ("Ittle-Endian Base 128") é uma codificação de comprimento variável quantidades arbitrárias de números inteiros, assinados ou não, O formato era emprestado do DWARF3 especificação. Em um arquivo .dex, o LEB128 só é usado para codificar quantidades de 32 bits.

Cada valor codificado em LEB128 consiste em um a cinco bytes, que juntos representam um único valor de 32 bits. Cada byte tem seu conjunto de bits mais significativo, exceto o byte final no que tem um pouco mais claro. Os valores restantes sete bits de cada byte são carga, com os sete bits 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 payload mais significativo do byte final na sequência é sign-extended para produzir o valor final. No caso não assinado (uleb128), os bits não representados explicitamente interpretado como 0.

Diagrama bit a bit de um valor LEB128 de dois bytes
Primeiro byte Segundo byte
1 bit6 bit5 bit4 bit3 bit2 bit1 bit0 0 bit13 bit12 bit11 bit10 bit9 bit8 bit7

A variante uleb128p1 é usada para representar , em que a representação é do valor codificado mais um como uleb128. Isso torna a codificação de -1 (alternativamente considerado o valor não assinado 0xffffffff) — mas nenhum outro número negativo — um único byte, e é útil exatamente nos casos em que o número representado precisa não negativo ou -1 (ou 0xffffffff), e quando nenhum outro valor negativo for permitido (ou quando grandes volumes dificilmente serão necessários).

Veja alguns exemplos de formatos:

Sequência codificada Como sleb128 Como uleb128 Como uleb128p1
0000-1
01110
7f-1127126
80 7f-1281625616255

Layout do arquivo

Nome Formato Descrição
cabeçalho item_cabeçalho o cabeçalho
IDs_da_string item_id_string[] lista de identificadores de string. São identificadores para todas as strings usados por este arquivo, seja para nomenclatura interna (por exemplo, descritores de tipo) ou como objetos constantes referidos pelo código. Essa lista precisa ser classificada pelo conteúdo da string, usando valores de ponto de código UTF-16 (não em um maneira sensível à localidade) e não deve conter nenhuma entrada duplicada.
IDs de tipo item_id_tipo_[] lista de identificadores de tipo. São identificadores para todos os tipos (classes, matrizes ou tipos primitivos) referenciados por esse arquivo, se definidos no arquivo ou não. Esta lista precisa ser classificada por string_id índice e não deve conter entradas duplicadas.
proto_ids proto_id_item[] lista de identificadores de protótipos de método. Esses são identificadores para todos e protótipos referidos por este arquivo. A lista deve ser classificada em o tipo de retorno (pelo índice type_id) e a ordem principal por lista de argumentos (ordenação lexicográfica, argumentos individuais ordenadas pelo índice type_id). A lista não pode que contenham entradas duplicadas.
field_ids campo_id_item[] lista de identificadores de campo. São identificadores para todos os campos referido por este arquivo, se definido no arquivo ou não. Isso lista precisa ser classificada, em que o tipo de definição (por type_id) índice) é a ordem principal, o nome do campo (por índice string_id) é a ordem intermediária e é do tipo (pelo índice type_id) é a de menor importância. A lista não pode conter entradas duplicadas.
IDs do método item_id_do_método[] lista de identificadores de método. Estes são identificadores de todos os métodos referido por este arquivo, se definido no arquivo ou não. Isso lista precisa ser classificada, em que o tipo de definição (por type_id) índice) é a ordem principal, o nome do método (por string_id índice) é o pedido intermediário, e o protótipo do método (por proto_id) é a ordem secundária. A lista não pode que contenham entradas duplicadas.
class_defs class_def_item[] lista de definições de classe. As classes devem ser ordenadas de modo que um determinado superclasse e interfaces implementadas da classe aparecem no lista anterior à classe de referência. Além disso, é inválido para uma definição para a classe com o mesmo nome aparecer mais de uma vez no da lista.
IDs do site de chamada call_site_id_item[] chamar a lista de identificadores de site. Estes são os identificadores de todos os sites de ligações referido por este arquivo, se definido no arquivo ou não. Esta lista precisa ser classificado em ordem crescente de call_site_off.
alças de método método_item_do_identificador[] lista de identificadores de métodos. Uma lista de todos os manipuladores de método referidos por este arquivo, se definido no arquivo ou não. Esta lista não está classificada e pode conter duplicatas que correspondem logicamente a instâncias de tratamento de métodos diferentes.
dados ubyte[] área de dados, contendo todos os dados de suporte para as tabelas listadas acima. Diferentes itens têm diferentes requisitos de alinhamento, e bytes de preenchimento são inseridos antes de cada item, se necessário, para atingir alinhamento adequado.
link_data ubyte[] dados usados em arquivos vinculados estaticamente. O formato dos dados em esta seção não foi especificada por este documento. Esta seção está vazia em arquivos desvinculados e implementações de ambiente de execução poderá usá-lo como achar melhor.

Definições de bitfield, string e constantes

MÁGICA_DOS_ARQUIVOS_DEX

Incorporado em header_item

A string/matriz constante DEX_FILE_MAGIC é a lista de bytes que precisam aparecer no início de um arquivo .dex para que ele seja reconhecido dessa forma. O valor intencionalmente contém 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 de formato com três dígitos decimais, que é devem 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 foi adicionado na versão 9.0 do Android, incluindo duas novos bytecodes, const-method-handle e const-method-type. (Cada um está descrito nos Resumo do conjunto de bytecode tabela. No Android 10, a versão 039 estende o formato de arquivo DEX para incluir Informações da API aplicáveis apenas a arquivos DEX no caminho da classe de inicialização.

Observação: suporte para versão 038 do formato foi adicionado no Android 8.0 lançamento. A versão 038 adicionou novos bytecodes (invoke-polymorphic e invoke-custom) e dados para tratamento de métodos.

Observação:compatibilidade com a versão 037 dos O formato foi adicionado na versão 7.0 do Android. Antes da versão 037, a maioria versões do Android usaram a versão 035 do formato. O único a diferença entre as versões 035 e 037 é a adição de métodos padrão e o ajuste de invoke.

Observação: pelo menos algumas versões anteriores do formato têm ser usados em lançamentos de software públicos amplamente disponíveis. Por exemplo: A versão 009 foi usada para as versões M3 do Plataforma Android (novembro a dezembro de 2007), e a versão 013 foi usada para as versões M5 do sistema do Google (fevereiro a março de 2008). Em vários aspectos, os casos anteriores do formato são muito diferentes da versão descrita neste documento.

ENDIAN_CONSTANT e REVERSE_ENDIAN_CONSTANT

Incorporado em header_item

A constante ENDIAN_CONSTANT é usada para indicar a a finalidade do arquivo em que é encontrada. Embora o padrão O formato .dex é small-endian, as implementações podem escolher para realizar a troca de bytes. Caso uma implementação se depare com um cabeçalho em que o endian_tag é REVERSE_ENDIAN_CONSTANT; em vez de ENDIAN_CONSTANT, ele saberia que o arquivo foi trocada por bytes do formulário esperado.

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

ÍNDICE

Incorporado em class_def_item e debug_info_item

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

Observação:esse valor não é definido como 0, porque esse normalmente é um índice válido.

O valor escolhido para NO_INDEX é podem ser representados como um único byte na codificação uleb128p1.

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

Definições de access_flags

Incorporados em class_def_item,encoded_field,encoded_method e Classe interna

Os Bitfields dessas flags são usados para indicar a acessibilidade e o propriedades gerais de classes e membros de 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 a classe que define private: visível apenas para a classe que define private: visível apenas para a classe que define
ACC_PROTECTED 0x4 * protected: visível para o pacote e as subclasses protected: visível para o pacote e as subclasses protected: visível para o pacote e as subclasses
ACC_ESTÁTICO 0x8 * static: não é construído com uma Referência sobre this static: global para a classe definidora. static: não usa um argumento this.
ACC_FINAL 0x10 final: não pode ser uma subclasse. final: imutável após a construção final: não substituível
ACC_SYNCHRONIZED 0x20     synchronized: o bloqueio associado foi adquirido automaticamente em torno da chamada para este método.

Observação:isso só é válido quando ACC_NATIVE também foi definido.

ACC_VOLATILE 0x40   volatile: regras de acesso especiais para ajudar na linha de execução. segurança  
PONTE_ACC 0x40     método bridge, adicionado automaticamente pelo compilador como um tipo seguro ponte
ACELERAÇÃO 0x80   transient: não deve ser salvo por serialização padrão  
ACC_VARARGS 0x80     o último argumento precisa ser tratado como "resto" argumento por compilador
ACC_NATIVE 0x100     native: implementado em código nativo
INTERFACE ACC 0x200 interface: classe abstrata que pode ser implementada com multiplicação    
ACC_ABSTRACT 0x400 abstract: não é diretamente instanciado   abstract: não implementado por esta classe
ACC_STRICT 0x800     strictfp: regras rígidas para aritmética de ponto flutuante
ACC_SYNTHETIC 0 x 1.000 não definidas diretamente no código-fonte não definidas diretamente no código-fonte não definidas diretamente no código-fonte
ACC_ANOTAÇÃO 0 x 2.000 declarado como uma classe de anotação    
ACC_ENUM 0 x 4.000 declarado como um tipo enumerado declarado como um valor enumerado  
(não usado) 0 x 8.000      
ACC_CONSTRUCTOR 0 x 10.000     método construtor (inicializador de classe ou instância)
ACC_DECLARED_
SINCRONIZADO
0 x 20.000     declarou synchronized.

Observação: isso não afeta execução (exceto para refletir esta sinalização, por si só).

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

Codificação UTF-8 modificada

Para facilitar o suporte legado, o formato .dex codifica os dados de string em um formato UTF-8 modificado padrão de fato, que, a seguir, é chamada de MUTF-8. Esse formulário é idêntico ao padrão UTF-8, exceto:

  • Apenas as codificações de um, dois e três bytes são usadas.
  • Pontos de código no intervalo U+10000... U+10ffff são codificados como um par alternativo, cada um dos que é representado como um valor codificado de três bytes.
  • O ponto de código U+0000 é codificado em dois bytes.
  • Um byte nulo simples (valor 0) indica o fim do como uma string, assim como a interpretação padrão em 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 de codificação para caracteres Unicode.

Com os dois itens finais acima, é possível incluir simultaneamente o ponto de código U+0000 em uma string e ainda manipular como uma string com terminação nula no estilo C.

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

Consulte o artigo O código Unicode Standard para mais informações sobre a codificação de caracteres. Na verdade, o MUTF-8 está mais próximo da codificação (relativamente menos conhecida) CESU-8 do que em UTF-8 por si só.

codificação de valor_codificado

Incorporado em "annotation_element" e "encoded_array_item"

Um encoded_value é uma parte codificada de (quase) e hierarquicamente estruturados. A codificação tem como objetivo ser compacto e simples de analisar.

Nome Formato Descrição
(valor_arg << 5) | tipo_de_valor ubyte byte que indica o tipo do evento imediatamente subsequente value ao longo com um argumento de esclarecimento opcional nos três bits de ordem superior. Veja abaixo as diversas definições de value. Na maioria dos casos, value_arg codifica o comprimento imediatamente subsequente value em bytes, conforme (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.
value ubyte[] bytes que representam o valor, variável de comprimento e interpretada de forma diferente para value_type bytes diferentes, sempre small-endian. Confira as várias definições de valor abaixo para detalhes.

Formatos de valor

Nome do tipo value_type Formato value_arg Formato value Descrição
VALOR_BYTE 0x00 (nenhum; precisa ser 0) ubyte[1] valor inteiro de um byte assinado
VALOR_CURTO 0x02 tamanho - 1 (0...1) ubyte[tamanho] valor inteiro de dois bytes assinado, estendido por sinal
VALOR_GRÁFICO 0x03 tamanho - 1 (0...1) ubyte[tamanho] valor inteiro de dois bytes não assinado, estendido a zero
VALOR_INTEIRO 0x04 tamanho - 1 (0...3) ubyte[tamanho] valor inteiro de quatro bytes assinado, estendido por sinal
VALOR_LONGO 0x06 tamanho - 1 (0... 7) ubyte[tamanho] valor inteiro de oito bytes com sinal, estendido por sinal
VALOR_FLUTUAÇÃO 0x10 tamanho - 1 (0...3) ubyte[tamanho] padrão de bits de quatro bytes, estendido com zero à direita, e interpretado como um valor de ponto flutuante IEEE754 de 32 bits
DUPLO_VALOR 0x11 tamanho - 1 (0... 7) ubyte[tamanho] padrão de oito bytes, estendido com zero à direita, e interpretado como um valor de ponto flutuante de 64 bits IEEE754
VALOR_MÉTODO_TIPO 0x15 tamanho - 1 (0...3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (zero-estendido), interpretado como um índice a seção proto_ids e representando um valor de tipo de método
MÉDIA_DE_MÉTODO_VALOR 0x16 tamanho - 1 (0...3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (zero-estendido), interpretado como um índice a seção method_handles e representando um valor de identificador de método
VALOR_STRING 0x17 tamanho - 1 (0...3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (zero-estendido), interpretado como um índice a seção string_ids e representando um valor de string
TIPO_DE_VALOR 0x18 tamanho - 1 (0...3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (zero-estendido), interpretado como um índice seção type_ids e representando uma tipo/valor de classe
CAMPO_VALOR 0x19 tamanho - 1 (0...3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (zero-estendido), interpretado como um índice seção field_ids e representando uma valor do campo
MÉTODO_VALOR 0x1a tamanho - 1 (0...3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (zero-estendido), interpretado como um índice seção method_ids e representando uma valor do método
VALOR_ENUM 0 x 1 bi tamanho - 1 (0...3) ubyte[tamanho] valor inteiro de quatro bytes não assinado (zero-estendido), interpretado como um índice a seção field_ids e representando o valor uma constante de tipo enumerado
MATRIZ VALOR 0x1c (nenhum; precisa ser 0) matriz_codificada uma matriz de valores, no formato especificado por "encoded_array formato" a seguir. O tamanho do value está implícito na codificação.
VALOR_ANOTAÇÃO 0x1d (nenhum; precisa ser 0) anotação codificada uma subanotação, no formato especificado por "encoded_annotation formato" a seguir. O tamanho do value está implícito na codificação.
VALOR_NULO 0x1e (nenhum; precisa ser 0) (nenhuma) Valor de referência null
VALOR_BOOLEANO 0x1f booleano (0...1) (nenhuma) Valor de um bit 0 para false e 1 para true. O bit é representado na value_arg:

formato de matriz_codificada

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

formato de anotação codificada

Nome Formato Descrição
tipo_idx Uleb128 tipo da anotação. Precisa ser uma classe (não de matriz ou primitiva) não é válido.
size Uleb128 número de mapeamentos de nome-valor nesta anotação
elementos elemento_anotação[tamanho] elementos da anotação, representados diretamente em linha (não como e deslocamentos). Os elementos devem ser classificados em ordem crescente por Índice de string_id.

formato anotação_elemento

Nome Formato Descrição
nome_idx Uleb128 nome do elemento, representado como um índice no Seção string_ids. A string precisa estar de acordo com o para MemberName definida acima.
value valor_codificado valor do elemento

Sintaxe de string

Há vários tipos de item em um arquivo .dex que por fim, se referem a uma string. As seguintes definições de estilo BNF indicar a sintaxe aceitável para essas strings.

NomeSimples

Um SimpleName é a base para a sintaxe dos nomes de outras coisas. O formato .dex permite uma quantidade razoável de latitude aqui (muito mais do que os idiomas de origem mais comuns). Em resumo, um simples consiste em qualquer caractere ou dígito alfabético com baixo ASCII, alguns símbolos específicos com baixo ASCII e a maioria dos pontos de código não ASCII que não são controle, espaço ou caracteres especiais. A partir da versão 040 o formato também permite caracteres de espaço (Unicode Zs ). Os pontos de código alternativos (no intervalo U+d800 ... U+dfff) não estão são considerados caracteres de nome válidos, por si só, mas os caracteres Unicode complementares caracteres são válidos (que são representados pelo alternativa da regra para SimpleNameChar), e eles devem ser representados em um arquivo como pares de pontos de código alternativos no formato MUTF-8 e codificação.

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

NomedoMembro

usado por field_id_item e method_id_item

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

NomedoMembro
SimpleName (em inglês)
| '<' SimpleName '>'

NomeDeClasseCompleto

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

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(SimpleName '/')*

TypeDescriptor

Usado por type_id_item

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

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

ShortyDescriptor

Usado por proto_id_item

Um ShortyDescriptor é a representação curta de um método. incluindo tipos de retorno e parâmetro, exceto pelo fato sem distinção entre vários tipos de referência (classe ou matriz). Em vez disso, todos os tipos de referência são representados por um único caractere 'L'.

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

Semântica de TypeDescriptor

Esse é o significado de cada uma das variantes de TypeDescriptor.

Sintaxe Significado
V void válido somente para tipos de retorno
Z boolean
B byte
S short
C char
I int
J long
F float
D double
finalmente/qualificado/nome; a classe fully.qualified.Name
[descritor matriz de descriptor, pode ser usada de maneira recursiva para matrizes-de-matrizes, 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_cabeçalho

Aparece na seção de cabeçalho

Alinhamento: 4 bytes

Nome Formato Descrição
mágica ubyte[8] = DEX_FILE_MAGIC valor mágico. Ver a discussão acima em "DEX_FILE_MAGIC" para mais detalhes.
checksum Uint checksum adler32 do restante do arquivo (tudo, exceto magic e este campo). usada para detectar a corrupção de arquivos
assinatura ubyte[20] Assinatura SHA-1 (hash) do restante do arquivo (tudo, exceto) magic, checksum e este campo); usado para identificar arquivos
tamanho do arquivo Uint tamanho do arquivo inteiro (incluindo o cabeçalho), em bytes
tamanho_cabeçalho uint = 0x70 tamanho do cabeçalho (a seção inteira), em bytes. Isso permite que uma quantidade limitada de compatibilidade com versões anteriores/avançadas sem invalidando o formato.
tag endian uint = ENDIAN_CONSTANT tag endianness. Veja a discussão acima em "ENDIAN_CONSTANT" e REVERSE_ENDIAN_CONSTANT" para mais detalhes.
tamanho do link Uint da seção do link, ou 0 se este arquivo não for vinculado estaticamente
link_desativado Uint deslocamento do início do arquivo para a seção do link ou 0 se for link_size == 0. O deslocamento, se for diferente de zero, precisa estar deslocado na seção link_data. A o formato dos dados apontados não é especificado por este documento; este campo de cabeçalho (e o anterior) são deixados como ganchos para uso implementações de ambiente de execução.
map_off Uint deslocamento do início do arquivo até o item do mapa. O deslocamento, que deve ser diferente de zero, precisa estar em um deslocamento na seção data e os dados devem estar no formato especificado por "map_list" a seguir.
tamanho_dos_IDs_da_string Uint contagem de strings na lista de identificadores de string
IDs_string_desativados Uint deslocamento do início do arquivo para a lista de identificadores de string ou 0 se string_ids_size == 0 (uma caso extremo estranho). O deslocamento, se for diferente de zero, deve estar no início da seção string_ids.
tipo_id_tamanho Uint contagem de elementos na lista de identificadores de tipo, no máximo 65.535
tipo_ids_desativado Uint deslocamento do início do arquivo para a lista de identificadores de tipo ou 0 se type_ids_size == 0 (uma caso extremo estranho). O deslocamento, se for diferente de zero, precisa estar no início de type_ids. nesta seção.
proto_ids_size Uint contagem de elementos na lista de identificadores de protótipos, no máximo 65.535
proto_ids_desativado Uint deslocamento do início do arquivo para a lista de identificadores de protótipos ou 0 se proto_ids_size == 0 (uma caso extremo estranho). O deslocamento, se for diferente de zero, precisa estar no início de proto_ids. nesta seção.
campo_ids_size Uint contagem de elementos na lista de identificadores de campo
campo_ids_desativado Uint deslocamento do início do arquivo para a lista de identificadores de campo ou 0 se for field_ids_size == 0. O deslocamento, se diferente de zero, precisa estar no início de field_ids. nesta seção.
tamanho_dos_IDs do método Uint contagem de elementos na lista de identificadores de método
ID_do_método_desativado Uint deslocamento do início do arquivo para a lista de identificadores de método ou 0 se for method_ids_size == 0. O deslocamento, se diferente de zero, precisa estar no início de method_ids. nesta seção.
class_defs_size Uint contagem de elementos na lista de definições de classe
class_defs_off Uint deslocamento do início do arquivo para a lista de definições de classe ou 0 se class_defs_size == 0 (uma caso extremo estranho). O deslocamento, se for diferente de zero, deve estar no início da seção class_defs.
data_size Uint Tamanho da seção data em bytes. Precisa ser um par múltiplo de sizeof(uint).
dados_desativados Uint deslocamento do início do arquivo para o início da Seção data.

lista_de_mapas

Aparece na seção de dados

Referenciado a partir de header_item

Alinhamento: 4 bytes

Essa é uma lista de todo o conteúdo de um arquivo, em ordem. Ela contém redundância em relação ao header_item. mas destina-se a ser uma forma fácil de usar para iterar em todo um . Um tipo específico precisa aparecer no máximo uma vez em um mapa, mas não restrição sobre os tipos de pedidos que podem aparecer, além dos restrições implícitas no restante do formato (por exemplo, um A seção header precisa aparecer primeiro, seguida por um string_ids etc.). Além disso, as entradas do mapa devem ser ordenadas por deslocamento inicial e não podem se sobrepor.

Nome Formato Descrição
size Uint tamanho da lista, em entradas
list item_mapa[tamanho] elementos da lista

Formato map_item

Nome Formato Descrição
type Ushort tipo dos itens. consulte a tabela abaixo
unused Ushort (não usado)
size Uint contagem do número de itens encontrados no deslocamento indicado
compensação Uint deslocamento do início do arquivo para os itens em questão

Códigos de tipo

Tipo de item Constante Valor Tamanho do item em bytes
item_cabeçalho TYPE_HEADER_ITEM 0 x 0.000 0x70
item_id_string TYPE_STRING_ID_ITEM 0x0001 0x04
item_id_tipo TYPE_TYPE_ID_ITEM 0x0002 0x04
item_código_do_proto TYPE_PROTO_ID_ITEM 0x0003 0x0c
campo_id_item TYPE_FIELD_ID_ITEM 0x0004 0x08
id_item do método ID_ITEM_DE_TIPO_DE_TIPO 0x0005 0x08
class_def_item ITEM DE CLASSE_DEF_TIPO 0x0006 0x20
item_id_do_site_de_chamada TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
método_identificador_item ITEM DE MÉTODO_TIPO_DE_TIPO 0x0008 0x08
lista_de_mapas LISTA DE MAPAS DE TIPO 0 x 1.000 4 + (item.size * 12)
lista de tipos LISTA DE TIPO_DE 0 x 1.001 4 + (item.size * 2)
anotação_conjunto_ref_list TYPE_VERIFICATION_SET_REF_LIST 0 x 1.002 4 + (item.size * 4)
item_conjunto_de_anotações TYPE_NOT_SET_ITEM 0 x 1.003 4 + (item.size * 4)
item_de_dados_da_classe TYPE_CLASS_DATA_ITEM 0 x 2.000 implícito; precisa analisar
item_de_código TYPE_CODE_ITEM 0x2001 implícito; precisa analisar
item_de_dados_string TYPE_STRING_DATA_ITEM 0 x 2.002 implícito; precisa analisar
item_de_informações_de_depuração TYPE_DEBUG_INFO_ITEM 0x2003 implícito; precisa analisar
item_anotação TYPE_NOT_ITEM 0 x 2.004 implícito; precisa analisar
item_de_matriz_codificado TYPE_ENCODED_ARRAY_ITEM 0 x 2.005 implícito; precisa analisar
item_de_diretório_de_anotacoes TYPE_ITEMS_DIRECTORY_ITEM 0x2006 implícito; precisa analisar
oculto_da_classe_dados_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 implícito; precisa analisar

item_id_string

Aparece na seção "string_ids"

Alinhamento: 4 bytes

Nome Formato Descrição
string_data_off Uint deslocamento do início do arquivo para os dados da string para este do item de linha. O deslocamento deve ser em um local na seção data, e os dados precisam estar na formato especificado por "string_data_item" a seguir. Não há requisito de alinhamento para o deslocamento.

item_de_dados_string

Aparece na seção de dados

Alinhamento: nenhum (alinhado por bytes)

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

Observação: é aceitável ter uma string que inclua (a forma codificada de) unidades de código alternativo UTF-16 (ou seja, U+d800 ... U+dfff) isoladamente ou fora de ordem em relação codificação Unicode para UTF-16. Os usos de nível superior strings para rejeitar essas codificações inválidas, se apropriado.

item_id_tipo

Aparece na seção type_ids

Alinhamento: 4 bytes

Nome Formato Descrição
descritor_idx Uint na lista de string_ids para o descritor desse tipo. A string deve estar em conformidade com a sintaxe do TypeDescriptor, definido acima.

item_código_do_proto

Aparece na seção proto_ids

Alinhamento: 4 bytes

Nome Formato Descrição
short_idx Uint na lista de string_ids para a versão curta string de descritor do protótipo. A string precisa estar de acordo com o sintaxe do ShortyDescriptor, definida acima, e precisa corresponder ao tipo de retorno e aos parâmetros deste item.
tipo_de_devolução_idx Uint na lista de type_ids para o tipo de retorno deste protótipo
parâmetros_desativados Uint deslocamento do início do arquivo para a lista de tipos de parâmetro para este protótipo, ou 0 se este protótipo não tiver parâmetros. Esse deslocamento, se for diferente de zero, deve estar no seção data, e os dados contidos nela formato especificado por "type_list" abaixo. Além disso, há não pode ser referência ao tipo void na lista.

campo_id_item

Aparece na seção field_ids

Alinhamento: 4 bytes

Nome Formato Descrição
classe_idx Ushort na lista type_ids para o definidor . Precisa ser um tipo de classe, e não de matriz ou primitivo.
tipo_idx Ushort na lista de type_ids para o tipo de este campo
nome_idx Uint na lista string_ids para o nome deste . A string precisa estar em conformidade com a sintaxe de MemberName, definido acima.

id_item do método

Aparece na seção method_ids

Alinhamento: 4 bytes

Nome Formato Descrição
classe_idx Ushort na lista type_ids para o definidor . Precisa ser um tipo de classe ou matriz, não um tipo primitivo.
proto_idx Ushort indexar a lista de proto_ids para o protótipo de este método
nome_idx Uint na lista string_ids para o nome deste . A string precisa estar em conformidade com a sintaxe de MemberName, definido acima.

class_def_item

Aparece na seção class_defs

Alinhamento: 4 bytes

Nome Formato Descrição
classe_idx Uint na lista de type_ids dessa classe. Precisa ser um tipo de classe, e não de matriz ou primitivo.
access_flags Uint as flags de acesso da classe (public, final, etc.). Consulte "Definições de access_flags" para mais detalhes.
superclass_idx Uint na lista de type_ids para a superclasse o valor constante NO_INDEX se essa classe não tiver (ou seja, é uma classe raiz, como Object). Se presente, precisa ser um tipo de classe, e não de matriz ou primitivo.
interfaces_desativados Uint deslocamento do início do arquivo para a lista de interfaces ou 0 se não houver nenhum. Esse deslocamento estão na seção data, e os dados deve haver no formato especificado "type_list" a seguir. Cada um dos elementos da lista precisa ser um tipo de classe (não um tipo de matriz ou primitivo) e há não pode ser uma duplicata.
ID_do_arquivo_de_origem Uint na lista string_ids para o nome do que contém a fonte original (pelo menos a maior parte) desta classe, ou o valor especial NO_INDEX para representar a falta de essas informações. O debug_info_item de qualquer método pode substituir esse arquivo de origem, mas a expectativa é que a maioria das classes virá de apenas um arquivo de origem.
anotações_desativadas Uint deslocamento do início do arquivo até a estrutura de anotações para essa classe ou 0 se não houver anotações em essa classe. Esse deslocamento, se for diferente de zero, deve estar no seção data, e os dados que ela deve conter o formato especificado por "annotations_directory_item" abaixo, e todos os itens se referem a essa classe como o definidor.
class_data_off Uint deslocamento do início do arquivo para o dados de classe para este item ou 0 se não houver classe dados para esta classe. Esse pode ser o caso, por exemplo, se esta classe é uma interface de marcador. O deslocamento, se for diferente de zero, deve estar no seção data, e os dados contidos nela formato especificado por "class_data_item" abaixo, com todos itens que se referem a essa classe como o definidor.
valores estáticos_desativados Uint deslocamento do início do arquivo para a lista de endereços valores para os campos static, ou 0 se houver não são nenhum (e todos os campos static devem ser inicializados com 0 ou null). Esse deslocamento deve estar no data, e os dados devem estar na formato especificado por "encoded_array_item" a seguir. O tamanho da matriz não pode ser maior que o número de static campos declarados por esta classe, e os elementos correspondem ao static campos na mesma ordem declarada no field_list correspondente. O tipo de cada matriz deve corresponder ao tipo declarado do campo correspondente. Se houver menos elementos na matriz do que static, os campos restantes serão inicializados. com um 0 ou null adequado ao tipo.

item_id_do_site_de_chamada

Aparece na seção call_site_ids

Alinhamento: 4 bytes

Nome Formato Descrição
site_de_chamada_desativado Uint deslocamento do início do arquivo para chamar a definição de site. O deslocamento deve na seção de dados, e os dados devem estar no formato especificado pelo "call_site_item" a seguir.

item_do_site_de_chamada

Aparece na seção de dados

Alinhamento: nenhum (alinhado por byte)

O call_site_item é um item_de_matriz_codificado cujos elementos correspondem aos argumentos fornecido a um método vinculador de inicialização. 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 inicialização deve resolver (VALUE_STRING).
  3. Um tipo de método correspondente ao tipo de 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 inicialização. Esses argumentos são transmitidos em ordem e sem conversões de tipo.

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

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

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

método_identificador_item

Aparece na seção method_handles

Alinhamento: 4 bytes

Nome Formato Descrição
tipo_de_identificador_do_método Ushort tipo do identificador do método. consulte a tabela abaixo
unused Ushort (não usado)
campo_ou_método_id Ushort ID do campo ou do método, dependendo se o tipo de identificador do método é um acessador ou um invocador de método
unused Ushort (não usado)

Códigos de tipo de identificador de método

Constante Valor Descrição
MÉTODO_HANDLE_TYPE_STATIC_PUT 0x00 O gerenciador de métodos é um setter (acessor de acesso) estático
MÉTODO_HANDLE_TYPE_STATIC_GET 0x01 O identificador do método é um getter de campo estático (acessor)
MÉTODO_HANDLE_TYPE_INSTANCE_PUT 0x02 O gerenciador de método é um setter (acessor) de campo da instância
RECEBIMENTO_DE_INSTÂNCIA_DE_TIPO_DE_MÉTODO 0x03 O gerenciador do método é um getter (acessor) de campo da instância
MÉTODO_HANDLE_TYPE_INVOKE_ESTÁTICO 0x04 O identificador de método é um invocador de método estático.
MÉTODO_HANDLE_TYPE_INVOKE_INSTANCE 0x05 O identificador do método é um invocador do método da instância
MÉTODO_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 O identificador de método é um invocador de método do construtor.
MÉTODO_HANDLE_TYPE_INVOKE_DIRETO 0x07 O identificador do método é um invocador direto do método
MÉTODO_HANDLE_TYPE_INVOKE_INTERFACE 0x08 O identificador de método é um invocador de método da interface.

item_de_dados_da_classe

Referência de class_def_item

Aparece na seção de dados

Alinhamento: nenhum (alinhado por bytes)

Nome Formato 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
tamanho_dos_métodos_diretos Uleb128 o número de métodos diretos definidos neste item
tamanho_dos_métodos_virtual Uleb128 o número de métodos virtuais definidos neste item
"static_fields" 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.
instance_fields 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.
Direct_methods método_codificado[tamanho_dos_métodos_diretos] o direto definido (qualquer um entre static, private, ou construtor), 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_dos_métodos_virtual] o virtual definido (nenhum de static, private, ou construtor), representados como uma sequência de elementos codificados. Esta lista não deve incluir domínios herdados métodos, a menos que sejam substituídos pela classe que este item representa. A devem ser classificados por method_idx em ordem crescente. O method_idx de um método virtual não pode ser o mesmo como qualquer método direto.

Observação: o tamanho de todos os elementos field_id e As instâncias de method_id precisam se referir à mesma classe de definição.

Formato de campo codificado

Nome Formato Descrição
campo_idx_diferença Uleb128 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 o primeiro elemento de uma lista é representado diretamente.
access_flags Uleb128 flags de acesso para o campo (public, final, etc.). Consulte "Definições de access_flags" para mais detalhes.

formato codificado_método_codificado

Nome Formato Descrição
diferença_idx_método Uleb128 na lista method_ids para a identidade deste (inclui o nome e o descritor), representado como uma diferença do índice do elemento anterior na lista. O índice do o primeiro elemento de uma lista é representado diretamente.
access_flags Uleb128 flags de acesso para o método (public, final, etc.). Consulte "Definições de access_flags" para mais detalhes.
código_desativado Uleb128 deslocamento do início do arquivo para a estrutura de código desta ou 0 se esse método for abstract ou native. O deslocamento deve ser em um local no Seção data. O formato dos dados é especificado pela "code_item" a seguir.

lista de tipos

Referenciado em class_def_item e proto_id_item

Aparece na seção de dados

Alinhamento: 4 bytes

Nome Formato Descrição
size Uint tamanho da lista, em entradas
list item_tipo[tamanho] elementos da lista

formato type_item

Nome Formato Descrição
tipo_idx Ushort na lista de type_ids

item_de_código

Referenciado emencoded_method

Aparece na seção de dados

Alinhamento: 4 bytes

Nome Formato Descrição
tamanho_de_registros Ushort o número de registros usados por este código
tamanho_ins Ushort o número de palavras de argumentos de entrada para o método que este o código é para
tamanho_outs Ushort o número de palavras do espaço de argumento de saída exigido por esta código para invocação do método
tamanho das tentativas Ushort o número de try_items para essa instância. Se for diferente de zero, elas aparecerão como a matriz tries logo após o insns nesta instância.
informações_de_depuração_desativados Uint deslocamento do início do arquivo até as 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 há informação. O deslocamento, se for diferente de zero, deve ser para um local na seção data. O formato do os dados são especificados por "debug_info_item" a seguir.
tamanho_da_insns Uint tamanho da lista de instruções, em unidades de código de 16 bits
INSS ushort[insns_size] matriz real de bytecode. O formato do código em uma insns. matriz é especificada pelo documento complementar Bytecode Dalvik. Observação que, embora isso seja definido como uma matriz de ushort, há há algumas estruturas internas que preferem o alinhamento de quatro bytes. Além disso, caso haja um arquivo trocado por endian, a troca será feita É feito apenas em instâncias individuais de ushort e não na estruturas internas maiores.
preenchimento ushort (opcional) = 0 dois bytes de padding para que o tries seja alinhado com quatro bytes. Este elemento só estará presente se tries_size for diferente de zero e insns_size é ímpar.
tenta try_item[tries_size] (opcional) matriz que indica onde as exceções são capturadas no código e como lidar com eles. Os elementos da matriz não podem se sobrepor de um intervalo de endereços IP e em ordem crescente de endereço. Este elemento só é presente se tries_size for diferente de zero.
gerenciadores formatted_catch_handler_list (opcional) bytes que representam uma lista de listas de tipos de captura e de gerenciamento de identidade e acesso. Cada try_item tem um deslocamento por byte nessa estrutura. Esse elemento só estará presente se tries_size é diferente de zero.

Formato try_item

Nome Formato Descrição
adicionar_inicial Uint 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 para o início da primeira instrução.
contagem_de_insn Ushort número de unidades de código de 16 bits cobertas por esta entrada. O último código unidade coberta (inclusive) é start_addr + insn_count - 1.
gerenciador_desativado Ushort deslocamento em bytes desde o início da chamada encoded_catch_hander_list para o encoded_catch_handler para esta entrada. Ele precisa ser um deslocamento para o início de uma encoded_catch_handler.

Formato codificado_catch_handler_list

Nome Formato Descrição
size Uleb128 tamanho dessa lista, em entradas
list formatted_catch_handler[handlers_size] lista real de listas de manipuladores, representada diretamente (não como deslocamentos), e concatenados sequencialmente

formato formatted_catch_handler

Nome Formato Descrição
size sleb128 número de tipos de captura nesta lista. Se não for positivo, trata-se o negativo do número de tipos de capturas, e as capturas são seguidas por um gerenciador "pega-tudo". Por exemplo: um size de 0. significa que há uma categoria geral, mas nenhuma captura explicitamente codificada. Um size de 2 significa que há dois valores erros digitados e nenhum "pega-tudo". E um size de -1 significa que há uma captura digitada junto com uma captura geral.
gerenciadores tipo_codificado_addr_pair[abs(tamanho)] stream de abs(size) itens codificados, um para cada tipo, na ordem em que devem ser testados.
catch_all_addr uleb128 (opcional) endereço de bytecode do gerenciador "pega-tudo". Este elemento só é presente se size não for positivo.

formato codificados_type_addr_pair

Nome Formato Descrição
tipo_idx Uleb128 na lista de type_ids para o tipo do exceção a ser capturada
Adicionar Uleb128 endereço de bytecode do gerenciador de exceções associado

item_de_informações_de_depuração

Referenciado em code_item

Aparece na seção de dados

Alinhamento: nenhum (alinhado por bytes)

Cada debug_info_item define um valor de codificação de bytes inspirado em DWARF3 máquina de estado que, quando interpretada, emite as posições e (possivelmente) as informações de variáveis locais para uma code_item. A sequência começa com um tamanho variável cabeçalho (o comprimento do qual depende do número de cabeçalhos parâmetros), é seguida pelos bytecodes da máquina de estado e termina com um byte DBG_END_SEQUENCE.

A máquina de estado consiste em cinco registros. A address representa o deslocamento de instrução no associados insns_item em unidades de código de 16 bits. A O registro do address começa às 0 no início de cada debug_info e precisa aumentar apenas monotonicamente. O registro line representa o número da linha de origem deve ser associada à próxima entrada da tabela de posições emitida pelo a máquina de estado. Ele é inicializado no cabeçalho da sequência e pode mudança em direções positivas ou negativas, mas nunca deve ser menor que 1: O registro source_file representa arquivo de origem a que as entradas de número de linha se referem. Ele é inicializado para o valor de source_file_idx em class_def_item. As outras duas variáveis, prologue_end e epilogue_begin são sinalizações booleanas (inicializadas com false) que indicam se a próxima posição foi emitida deve ser considerado um prólogo ou epílogo do método. A máquina de estado também precisa rastrear o nome e o tipo da última variável local ativa no registre-se para o código DBG_RESTART_LOCAL.

O cabeçalho é o seguinte:

Nome Formato Descrição
início_da_linha Uleb128 o valor inicial do registro line da máquina de estado. Não representa uma entrada real de posições.
parâmetros_tamanho Uleb128 o número de nomes de parâmetros codificados. É preciso que haja uma por parâmetro de método, excluindo o this de um método de instância; se for o caso.
nomes_de_parâmetros uleb128p1[parameters_size] índice da string do nome do parâmetro do método. Um valor codificado de NO_INDEX indica que nenhum nome está disponível para o parâmetro associado. O descritor de tipo e assinatura são implícitas a partir do descritor do método e da assinatura.

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

Nome Valor Formato Argumentos Descrição
DBG_END_SEQUENCE 0x00 (nenhuma) encerra uma sequência de informações de depuração para um code_item.
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff: valor a ser adicionado ao registro de endereços avança o registro de endereços sem emitir uma entrada de posições
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: valor pelo qual o registro de linha será alterado avança o registro de linha sem emitir uma entrada de posições
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: registro que conterá informações locais
name_idx: índice de strings do nome
type_idx: índice de tipo
introduz uma variável local no endereço atual. De qualquer name_idx ou type_idx podem estar NO_INDEX para indicar que esse valor é desconhecido.
DBG_START_LOCAL_EXTENDED 0x04 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
uleb128p1 sig_idx
register_num: registro que conterá informações locais
name_idx: índice de strings do nome
type_idx: índice de tipo do tipo
sig_idx: índice de strings do tipo de assinatura
introduz um local com uma assinatura de tipo no endereço atual. Qualquer uma das seguintes opções: name_idx, type_idx ou sig_idx pode ser NO_INDEX para indicar que esse valor é desconhecido. Se sig_idx for No entanto, -1, os mesmos dados podem ser representados eficiente usando o código de operação DBG_START_LOCAL.

Observação: veja a discussão em "dalvik.annotation.Signature" abaixo para algumas ressalvas como lidar com assinaturas.

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

Códigos de operação especiais

Códigos de operação com valores entre 0x0a e 0xff (inclusive) movem line e address é registrada por uma pequena quantidade e, em seguida, emite uma nova entrada da tabela de posições. 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)

item_de_diretório_de_anotacoes

Referência de class_def_item

Aparece na seção de dados

Alinhamento: 4 bytes

Nome Formato Descrição
class_annotations_off Uint deslocamento do início do arquivo para 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á estar em um local no Seção data. O formato dos dados é especificado por "annotation_set_item" a seguir.
tamanho_dos_campos Uint contagem de campos anotados por este item
tamanho_dos_métodos_anotados Uint contagem de métodos anotados por este item
anotados_parâmetros_tamanho Uint contagem de listas de parâmetros de método anotadas por este item
field_annotations field_annotation[fields_size] (opcional) lista de anotações de campo associadas. Os elementos da lista devem ser classificados em ordem crescente por field_idx.
anotações_método method_annotation[methods_size] (opcional) lista de anotações de método associadas. Os elementos da lista devem ser classificados em ordem crescente por method_idx.
parâmetros_anotações parâmetro_annotation[parameters_size] (opcional) lista de anotações de parâmetro de método associadas. Os elementos do lista deve ser classificada em ordem crescente, por method_idx.

Observação: o tamanho de todos os elementos field_id e As instâncias de method_id precisam se referir à mesma classe de definição.

formato field_annotation

Nome Formato Descrição
campo_idx Uint na lista field_ids para a identidade do campo que está sendo anotado
anotações_desativadas Uint deslocamento do início do arquivo para a lista de anotações para campo. O deslocamento precisa ser de um local no data nesta seção. O formato dos dados é especificado pela "annotation_set_item" a seguir.

formato de anotação de método

Nome Formato Descrição
método_idx Uint na lista method_ids para a identidade do método que está sendo anotado
anotações_desativadas Uint deslocamento do início do arquivo para a lista de anotações para o método. O deslocamento deve ser em um local no Seção data. O formato dos dados é especificado pela "annotation_set_item" a seguir.

formato de anotação de parâmetro

Nome Formato Descrição
método_idx Uint na lista method_ids para a identidade do um método com parâmetros que estão sendo anotados
anotações_desativadas Uint deslocamento do início do arquivo para a lista de anotações para os parâmetros do método. O deslocamento deve ser em um local no Seção data. O formato dos dados é especificado pela "annotation_set_ref_list" a seguir.

anotação_conjunto_ref_list

Referência a partir de parameter_annotations_item

Aparece na seção de dados

Alinhamento: 4 bytes

Nome Formato Descrição
size Uint tamanho da lista, em entradas
list anotação_conjunto_de_ref_item[tamanho] elementos da lista

formato Annotation_set_ref_item

Nome Formato Descrição
anotações_desativadas Uint deslocamento do início do arquivo para o conjunto de anotações referenciado ou 0 se não houver anotações para esse elemento. O deslocamento, se for diferente de zero, precisa estar em um local no data nesta seção. O formato dos dados é especificado pela "annotation_set_item" a seguir.

item_conjunto_de_anotações

Referenciado a partir deannotations_directory_item, field_annotations_item, método_anotações_item e anotação_set_ref_item

Aparece na seção de dados

Alinhamento: 4 bytes

Nome Formato Descrição
size Uint tamanho do conjunto, em entradas
entries anotação_off_item[tamanho] elementos do conjunto. Os elementos devem ser classificados em ordem crescente, por type_idx.

Formato de anotação_off_item

Nome Formato Descrição
anotação_desativada Uint deslocamento do início do arquivo para uma anotação. O deslocamento precisa ser de um local na seção data. e o formato dos dados nesse local é especificado por "annotation_item" a seguir.

item_anotação

Referenciado a partir deannotate_set_item

Aparece na seção de dados

Alinhamento: nenhum (alinhado por bytes)

Nome Formato Descrição
visibilidade ubyte visibilidade pretendida desta anotação (ver abaixo)
annotation anotação codificada uma anotação codificada, no formato descrito por "encoded_annotation formato" abaixo "encoded_value codificação" acima.

Valores de visibilidade

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

Nome Valor Descrição
VISIBILITY_BUILD 0x00 ser visível apenas no momento da compilação (por exemplo, durante a compilação de outro código)
VISIBILITY_RUNTIME 0x01 pretendido para ser visível no momento da execução
SISTEMA DE VISIBILIDADE 0x02 que fica visível no momento da execução, mas apenas para o sistema (e não para o código de usuário normal)

item_de_matriz_codificado

Referência de class_def_item

Aparece na seção de dados

Alinhamento: nenhum (alinhado por bytes)

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

oculto_da_classe_dados_item

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

Observação: O recurso oculto da API foi introduzido no Android 10.0 e só se aplica aos arquivos DEX de classes no caminho da classe de inicialização. A lista de sinalizações descritas abaixo pode ser estendida em versões futuras do Android. Para mais informações, consulte restrições para interfaces externas ao SDK.

Nome Formato Descrição
size Uint tamanho total da seção
compensações uint[] matriz de deslocamentos indexados por class_idx. Uma entrada de matriz zero no índice class_idx significa que não há dados para esta class_idx ou para todas as APIs ocultas são zero. Caso contrário, a entrada da matriz é diferente de zero e contém um deslocamento do início da seção para uma matriz de sinalizações de API ocultas para este class_idx.
flags uleb128[] matrizes concatenadas de sinalizações de API ocultas para cada classe. Os valores de possíveis sinalizações estão descritos na tabela abaixo. As flags são codificadas na mesma ordem em que os campos e métodos são codificadas nos dados de classe.

Tipos de sinalizações de restrição:

Nome Valor Descrição
lista de permissões 0 que podem ser usadas livremente e são aceitas como parte do o framework do Android oficialmente documentado Índice de pacotes.
lista cinza 1 São interfaces externas ao SDK que podem ser usadas independentemente da nível desejado da API.
lista negra 2 São interfaces externas ao SDK que não podem ser usadas independentemente da nível desejado da API. O acesso a uma dessas interfaces causa uma erro de execução.
lista cinza-máx-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-máx-p 4 Interfaces não SDK que podem ser usadas para o Android 9.x a menos que sejam restritas.
lista cinza-max-q 5 Interfaces não SDK que podem ser usadas para o Android 10.x a menos que sejam restritas.
lista cinza-máx-r 6 Interfaces não SDK que podem ser usadas para o Android 11.x a menos que sejam restritas.

Anotações do sistema

As anotações do sistema são usadas para representar vários informações sobre classes (e métodos e campos). Essas informações são geralmente acessado somente indiretamente por código de cliente (não 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 quer indicar as vinculações padrão.

Nome Formato Descrição
value Annotation as vinculações padrão dessa anotação, representadas como uma anotação deste tipo. A anotação não precisa incluir todos os nomes definidos pelo anotação; nomes ausentes simplesmente não têm padrões.

dalvik.annotation.EnclosingClass

Aparece nas turmas

Uma anotação EnclosingClass é anexada a cada classe. que é definido como um membro de outra classe, por si só, ou anônimo, mas não definido no corpo de um método (por exemplo, um atributo classe interna). Toda classe que tem essa anotação também precisa ter um InnerClass. Além disso, uma classe não pode ter tanto uma EnclosingClass quanto uma EnclosingMethod.

Nome Formato Descrição
value Classe a classe que abrange lexicamente essa classe

dalvik.annotation.EnclosingMethod

Aparece nas turmas

Uma anotação EnclosingMethod é anexada a cada classe. que é definido dentro do corpo de um método. Toda turma que tem isso também precisam ter uma anotação InnerClass. Além disso, uma classe não pode ter um EnclosingClass ao mesmo tempo e uma anotação EnclosingMethod.

Nome Formato Descrição
value Método o método que restringe lexicamente o escopo dessa classe

dalvik.annotation.InnerClass

Aparece nas turmas

Uma anotação InnerClass é anexada a cada classe. que é definido no escopo léxico da definição de outra classe. Qualquer classe que tenha essa anotação também precisa ter uma ou anotação EnclosingClass ou uma EnclosingMethod.

Nome Formato Descrição
nome String o nome simples declarado originalmente dessa classe (sem incluir nenhum Prefixo do pacote). Se a classe for anônima, o nome será null:
AccessFlags int as flags de acesso da classe declaradas originalmente (que podem ser diferentes das sinalizações efetivas devido a uma incompatibilidade entre a execução modelos do idioma de origem e da máquina virtual de destino)

dalvik.annotation.MemberClasses

Aparece nas turmas

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

Nome Formato Descrição
value Classe[] matriz das classes de membros

dalvik.annotation.MethodParameters

Aparece em métodos

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

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

A anotação pode ser omitida de um método ou construtor com segurança quando o os metadados do parâmetro não são necessários no ambiente de execução. java.lang.reflect.Parameter.isNamePresent() pode ser usado para verificar se há metadados de um parâmetro e a reflexão associada métodos como java.lang.reflect.Parameter.getName() vão cair ao comportamento padrão no tempo de execução se as informações não estiverem presentes.

Ao incluir metadados de parâmetros, os compiladores precisam incluir informações para classes geradas, como tipos enumerados, já que os metadados do parâmetro inclui se um parâmetro é sintético ou obrigatório.

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

As matrizes documentadas abaixo devem ter o mesmo tamanho do Estrutura dex method_id_item associada ao método. Caso contrário, uma java.lang.reflect.MalformedParametersException será gerada no ambiente de execução.

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

Como MethodParameters descreve todos os métodos formais parâmetros, mesmo aqueles não declarados explicitamente ou implicitamente no código-fonte, o tamanho das matrizes pode ser diferente do valor da assinatura ou de outros metadados informações baseadas somente em parâmetros explícitos declarados na origem o código-fonte. MethodParameters também não vai incluir informações sobre Parâmetros do receptor de anotações do tipo que não existem no método real assinatura.

Nome Formato Descrição
nomes String[] Os nomes dos parâmetros formais para o método associado. A matriz não deve ser nulo, mas deve estar vazio se não houver parâmetros formais. Um valor em a matriz deve ser nula se o parâmetro formal com esse índice não tiver nome.
Se as strings de nome do parâmetro estiverem vazias ou contiverem '.', ';", '[' ou "/" depois um java.lang.reflect.MalformedParametersException será gerado no ambiente de execução.
AccessFlags int[] Os sinalizadores de acesso dos parâmetros formais para o método associado. A a matriz não deve ser nula, mas deve estar vazia se não houver parâmetros formais.
O valor é uma bitmask 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 no idioma especificação
. Se algum bit for definido fora desse conjunto, um java.lang.reflect.MalformedParametersException serão geradas no momento da execução.

dalvik.annotation.Signature

Aparece em classes, campos e métodos

Uma anotação Signature é anexada a cada classe. campo ou método que é definido em termos de um tipo mais complicado do que é representado por um type_id_item. A o formato .dex não define o formato das assinaturas; serve apenas para representar quaisquer assinaturas que uma fonte idioma exige para a implementação bem-sucedida da linguagem semântica. Dessa forma, as assinaturas geralmente não são analisadas (ou verificadas) por implementações de máquina virtual. As assinaturas são entregues para APIs e ferramentas de nível mais alto, como depuradores. Qualquer uso de um assinatura, portanto, deve ser escrita de modo a não fazer suposições de receber apenas assinaturas válidas, protegendo explicitamente contra a possibilidade de encontrar uma sintaxe assinatura inválida.

Como as strings de assinatura tendem a ter muito conteúdo duplicado, Uma anotação Signature é definida como uma matriz de em que elementos duplicados se referem naturalmente ao mesmo dados subjacentes, e a assinatura é considerada a concatenação de todas as strings da matriz. Não há regras sobre como extrair separar uma assinatura em strings separadas; isso depende totalmente ferramentas que geram arquivos .dex.

Nome Formato Descrição
value String[] a assinatura dessa classe ou membro, como uma matriz de strings que precisam ser concatenados

dalvik.annotation.Throws

Aparece em métodos

Uma anotação Throws é anexada a cada método, que é declarados para gerar um ou mais tipos de exceção.

Nome Formato Descrição
value Classe[] a matriz de tipos de exceção gerados