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 pelo 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 na verdade esse é 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_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ó). |
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+10000
…U+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+d800
… U+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+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 |
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, |
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 até 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:
- Um identificador de método que representa o método do vinculador de inicialização (VALUE_METHOD_HANDLE).
- Um nome de método que o vinculador de bootstrap deve resolver (VALUE_STRING).
- 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:
-
java.lang.invoke.Lookup
-
java.lang.String
-
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 campo de instância getter (acessador) |
Method_handle_type_invoke_static | 0x04 | O identificador de método é um invasor de método estático |
Method_handle_type_invoke_instance | 0x05 | O identificador do método é um invocador de métodos de instância |
Method_handle_type_invoke_constructor | 0x06 | O identificador de método é um invasor de método construtor |
Method_handle_type_invoke_direct | 0x07 | O identificador de método é um invasor de método direto |
Method_handle_type_invoke_interface | 0x08 | O identificador de método é um invasor de método de interface |
Class_data_item
Referenciado de classe_def_item
Aparece na seção de dados
Alinhamento: Nenhum (alinhado de byte)
Nome | Formatar | Descrição |
---|---|---|
static_fields_size | ULEB128 | O número de campos estáticos definidos neste item |
Instância_fields_size | ULEB128 | o número de campos de instância definidos neste item |
Direct_methods_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 |
static_fields | coded_field [static_fields_size] | Os campos estáticos definidos, representados como uma sequência de elementos codificados. Os campos devem ser classificados pelo field_idx em ordem crescente. |
Instância_fields | coded_field [instance_fields_size] | Os campos de instância definidos, representados como uma sequência de elementos codificados. Os campos devem ser classificados pelo field_idx em ordem crescente. |
Direct_methods | coded_method [diretor_methods_size] | 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 pelo method_idx em ordem crescente. |
virtual_methods | coded_method [virtual_methods_size] | 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 seja substituído pela classe que este item representa. Os métodos devem ser classificados pelo method_idx em ordem crescente. O method_idx de um método virtual não deve ser o mesmo que qualquer método direto. |
NOTA: As instâncias de todos os elementos ' field_id
e method_id
devem se referir à mesma classe definidora.
formato coded_field
Nome | Formatar | Descrição |
---|---|---|
field_idx_diff | ULEB128 | Índice 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 em uma lista é representado diretamente. |
access_flags | ULEB128 | Sinalizadores de acesso para o campo ( public , final , etc.). Consulte " access_flags Definições" para obter detalhes. |
formato coded_method
Nome | Formatar | Descrição |
---|---|---|
Method_idx_diff | ULEB128 | Índice 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 em uma lista é representado diretamente. |
access_flags | ULEB128 | Sinalizadores de acesso para o método ( public , final , etc.). Consulte " access_flags Definições" para obter detalhes. |
code_off | ULEB128 | Deslocamento desde o início do arquivo até a estrutura do código para este método, ou 0 se esse método for abstract ou native . O deslocamento deve estar em um local na seção data . O formato dos dados é especificado por " code_item " abaixo. |
type_list
Referenciado de classe_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 | type_item [tamanho] | Elementos da lista |
TIPO_Item formato
Nome | Formatar | Descrição |
---|---|---|
type_idx | Ushort | índice na lista type_ids |
code_item
Referenciado de coded_method
Aparece na seção de dados
Alinhamento: 4 bytes
Nome | Formatar | Descrição |
---|---|---|
registrs_size | Ushort | o número de registros usados por este código |
INS_SIZE | Ushort | o número de palavras de argumentos recebidos ao método para o qual este código é |
SUST_SIZE | Ushort | O número de palavras de espaço de argumento de saída exigido por este código para invocação de método |
tenta_size | Ushort | O número de try_item S para esta instância. Se diferente de zero, eles aparecem como a tries logo após as insns nesse caso. |
Debug_info_off | unint | Deslocamento desde o início do arquivo até a sequência de informações de depuração (números de linha + informações de variáveis locais) para este código, ou 0 se simplesmente não houver informações. O deslocamento, se diferente de zero, deve estar em 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 |
insns | ushort [insns_size] | Matriz real do bytecode. O formato de código em uma matriz insns é especificado pelo documento complementar Dalvik Bytecode . Observe que, embora isso seja definido como uma variedade de ushort , existem algumas estruturas internas que preferem o alinhamento de quatro bytes. Além disso, se isso estiver em um arquivo com troca de Endian, a troca só será feita em instâncias individuais ushort e não nas estruturas internas maiores. |
preenchimento | ushort (opcional) = 0 | Dois bytes de preenchimento para tornar tries de quatro bytes alinhadas. Esse elemento está presente apenas se tries_size for diferente de zero e insns_size for estranho. |
tentativas | try_item [TEPIES_SIZE] (opcional) | matriz indicando onde nas exceções do código são capturadas e como lidar com elas. Os elementos da matriz devem estar não sobrepostos no alcance e em ordem de endereço baixo a alto. Este elemento está presente apenas se tries_size não for muito zero. |
manipuladores | coded_catch_handler_list (opcional) | Bytes representando uma lista de listas de tipos de captura e endereços de manipuladores associados. Cada try_item tem um deslocamento de byte nessa estrutura. Este elemento está presente apenas se tries_size não for muito zero. |
formato try_item
Nome | Formatar | Descrição |
---|---|---|
start_addr | unint | Iniciar o endereço 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 coberta. |
insn_count | Ushort | Número de unidades de código de 16 bits cobertas por esta entrada. A última unidade de código coberta (inclusive) é start_addr + insn_count - 1 . |
Handler_off | Ushort | Offset em bytes desde o início do associado encoded_catch_hander_list até o encoded_catch_handler para esta entrada. Isso deve ser um deslocamento para o início de um encoded_catch_handler . |
formato coded_catch_handler_list
Nome | Formatar | Descrição |
---|---|---|
tamanho | ULEB128 | Tamanho desta lista, em entradas |
lista | coded_catch_handler [handlers_size] | Lista real de listas de manipuladores, representada diretamente (não como compensações) e concatenou sequencialmente |
formato coded_catch_handler
Nome | Formatar | Descrição |
---|---|---|
tamanho | Sleb128 | Número de tipos de captura nesta lista. Se não positivo, esse é o negativo do número de tipos de captura, e as capturas são seguidas por um manipulador de captura. Por exemplo: um size de 0 significa que há uma captura de captura, mas nenhuma captura explicitamente digitada. Um size de 2 significa que existem duas capturas explicitamente digitadas e sem captura. E um size de -1 significa que há uma captura digitada junto com um problema. |
manipuladores | coded_type_addr_pair [ABS (tamanho)] | Fluxo de itens codificados abs(size) , um para cada tipo capturado, na ordem em que os tipos sejam testados. |
catch_all_addr | uleb128 (opcional) | Endereço de bytecode do manipulador de captura. Este elemento está presente apenas se size não for positivo. |
formato coded_type_addr_pair
Nome | Formatar | Descrição |
---|---|---|
type_idx | ULEB128 | índice na lista type_ids para o tipo de exceção a capturar |
endereço | ULEB128 | Endereço de bytecode do manipulador de exceção associado |
Debug_info_item
Referenciado de code_item
Aparece na seção de dados
Alinhamento: Nenhum (alinhado de byte)
Cada debug_info_item
define uma máquina de estado codificada por byte inspirada no DWARF3 que, quando interpretada, emite a tabela de posições e (potencialmente) as informações variáveis locais 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 estadual consiste em cinco registros. O registro address
representa o deslocamento da instrução no insns_item
associado em unidades de código de 16 bits. O registro de address
é iniciado em 0
no início de cada sequência debug_info
e deve apenas aumentar monotonicamente. O registro da line
representa qual número de linha de origem deve estar associado à próxima entrada da tabela de posições emitida pela máquina de estado. Ele é inicializado no cabeçalho da sequência e pode mudar em direções positivas ou negativas, mas nunca deve ser menor que 1
. O registro source_file
representa o arquivo de origem a que as entradas do número da 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 para false
) que indicam se a próxima posição emitida deve ser considerada um prólogo de método ou epilogue. A máquina de estado também deve rastrear o nome e o tipo da última variável local ao vivo em cada registro para o código DBG_RESTART_LOCAL
.
O cabeçalho é o seguinte:
Nome | Formatar | Descrição |
---|---|---|
line_start | ULEB128 | O valor inicial para o registro de line da máquina de estado. Não representa uma entrada de posições reais. |
Parâmetros_size | ULEB128 | o número de nomes de parâmetros codificados. Deve haver um parâmetro por método, excluindo o método de uma instância, this houver. |
Parameter_Names | 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 a assinatura estão implícitos no descritor e na assinatura do método. |
Os valores do código de byte são os seguintes:
Nome | Valor | Formatar | Argumentos | Descrição |
---|---|---|---|---|
Dbg_end_sequence | 0x00 | (nenhum) | termina 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 endereço do registro | avança o registro de endereço sem emitir uma entrada de posições |
Dbg_advance_line | 0x02 | Sleb128 line_diff | line_diff : quantidade para mudar o registro de linha por | Avance o registro da linha sem emitir uma entrada de posições |
Dbg_start_local | 0x03 | uleb128 registr_num uleb128p1 name_idx uleb128p1 type_idx | register_num : registro que conterá localname_idx : índice da string do nometype_idx : tipo índice 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 registr_num uleb128p1 name_idx uleb128p1 type_idx uleb128p1 sig_idx | register_num : registro que conterá localname_idx : índice da string do nometype_idx : tipo índice do tiposig_idx : Índice de String da assinatura do tipo | Introduz um local com uma assinatura de tipo no endereço atual. Qualquer um dos name_idx , type_idx ou sig_idx pode ser NO_INDEX para indicar que esse valor é desconhecido. (Se sig_idx for -1 , no entanto, os mesmos dados poderão ser representados com mais eficiência usando o OPCode DBG_START_LOCAL .) Nota: Consulte a discussão em " |
Dbg_end_local | 0x05 | uleb128 registr_num | register_num : registro que continha local | marca uma variável local atualmente ao vivo como fora do escopo no endereço atual |
Dbg_restart_local | 0x06 | uleb128 registr_num | register_num : Registre -se para reiniciar | reintroduz uma variável local no endereço atual. O nome e o tipo são os mesmos que o último local que estava ao vivo no registro especificado. |
Dbg_set_prologue_end | 0x07 | (nenhum) | Define o registro da máquina do Estado prologue_end , indicando que a próxima entrada de posição adicionada deve ser considerada o final de um prólogo do método (um local apropriado para um ponto de interrupção do método). O Registro prologue_end é limpo por qualquer código OpCode Special ( >= 0x0a ). | |
DBG_SET_EPILOGE_BEGIN | 0x08 | (nenhum) | Define o registro da máquina do 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 código OPCODS ESPECIAL ( >= 0x0a ). | |
Dbg_set_file | 0x09 | uleb128p1 name_idx | name_idx : string índice do nome do arquivo de origem; NO_INDEX se desconhecido | Indica que todas as entradas do número da linha subsequente fazem referência a esse nome de arquivo de origem, em vez do nome padrão especificado em code_item |
Códigos de opções especiais | 0x0a… 0xff | (nenhum) | Avance 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 opções especiais
O OPCODES com valores entre 0x0a
e 0xff
(inclusive) move a line
e os registros de address
por uma pequena quantidade e, em seguida, emite uma nova entrada de tabela de posição. A fórmula para os incrementos são os seguintes:
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)
Anotações_directory_item
Referenciado de classe_def_item
Aparece na seção de dados
Alinhamento: 4 bytes
Nome | Formatar | Descrição |
---|---|---|
Class_ANNOTATIONS_OFF | unint | Deslocamento desde o 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 diferente de zero, deve estar em um local na seção data . O formato dos dados é especificado por " annotation_set_item " abaixo. |
campos_size | unint | contagem de campos anotados por este item |
AnoTated_Methods_size | unint | contagem de métodos anotados por este item |
AnoTated_Parameters_size | unint | contagem de listas de parâmetros de método anotados por este item |
field_annotações | 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 . |
Method_annotações | 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 . |
Parameter_annotações | Parameter_annotation [Parameters_size] (opcional) | Lista de anotações de parâmetros de método associados. Os elementos da lista devem ser classificados em ordem crescente, por method_idx . |
NOTA: As instâncias de todos os elementos ' field_id
e method_id
devem se referir à mesma classe definidora.
formato de field_annotation
Nome | Formatar | Descrição |
---|---|---|
field_idx | unint | índice na lista field_ids para a identidade do campo sendo anotada |
anotações_off | unint | Deslocamento desde o início do arquivo até a lista de anotações para o campo. O deslocamento deve estar em um local na seção data . O formato dos dados é especificado por " annotation_set_item " abaixo. |
Method_annotation Formato
Nome | Formatar | Descrição |
---|---|---|
Method_idx | unint | índice na lista method_ids para a identidade do método que está sendo anotado |
anotações_off | unint | Deslocamento desde o início do arquivo até a lista de anotações para o método. O deslocamento deve estar em um local na seção data . O formato dos dados é especificado por " annotation_set_item " abaixo. |
Parameter_annotation Formato
Nome | Formatar | Descrição |
---|---|---|
Method_idx | unint | índice na lista method_ids para a identidade do método cujos parâmetros estão sendo anotados |
anotações_off | unint | Deslocamento desde o início do arquivo até a lista de anotações para os parâmetros do método. O deslocamento deve estar em um local na seção data . O formato dos dados é especificado por " annotation_set_ref_list " abaixo. |
AnoTation_set_ref_list
Referenciado de parameter_annotações_item
Aparece na seção de dados
Alinhamento: 4 bytes
Nome | Formatar | Descrição |
---|---|---|
tamanho | unint | Tamanho da lista, em entradas |
lista | AnoTation_set_ref_item [tamanho] | Elementos da lista |
Annotation_set_ref_item formato
Nome | Formatar | Descrição |
---|---|---|
anotações_off | unint | Deslocamento desde o início do arquivo até o conjunto de anotação referenciado ou 0 se não houver anotações para este elemento. O deslocamento, se diferente de zero, deve estar em um local na seção data . O formato dos dados é especificado por " annotation_set_item " abaixo. |
AnoTation_set_item
Referenciado de anotações_directory_item, field_annotações_item, métodos_annotações_item e anotação_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 classificados em ordem crescente, por type_idx . |
AnoTation_Off_item Formato
Nome | Formatar | Descrição |
---|---|---|
anotação_off | unint | Deslocamento desde o início do arquivo para uma anotação. O deslocamento deve estar em um local na seção data e o formato dos dados nesse local é especificado por " annotation_item " abaixo. |
anotação_item
Referenciado de anotação_set_item
Aparece na seção de dados
Alinhamento: Nenhum (alinhado de byte)
Nome | Formatar | Descrição |
---|---|---|
visibilidade | ubyte | Visibilidade pretendida desta anotação (veja abaixo) |
anotação | coded_annotation | Conteúdo da anotação codificada, no formato descrito por "formato encoded_annotation " em " encoded_value codificação" acima. |
Valores de visibilidade
Essas são as opções para o campo visibility
em um annotation_item
:
Nome | Valor | Descrição |
---|---|---|
Visibilidade_build | 0x00 | pretendido apenas para ser visível no horário de construção (por exemplo, durante a compilação de outro código) |
Visibilidade_runtime | 0x01 | destinado a visível no tempo de execução |
Visibilidade_system | 0x02 | destinado a visível em tempo de execução, mas apenas para o sistema subjacente (e não para o código de usuário regular) |
coded_array_item
Referenciado de classe_def_item
Aparece na seção de dados
Alinhamento: Nenhum (alinhado de byte)
Nome | Formatar | Descrição |
---|---|---|
valor | coded_array | Bytes representando o valor da matriz codificado, no formato especificado por "formato encoded_array " em " encoded_value codificação" acima. |
hiddenpi_class_data_item
Esta seção contém dados sobre interfaces restritas usadas por cada classe.
Nota: O recurso de API oculto foi introduzido no Android 10.0 e é aplicável apenas aos arquivos DEX das classes no caminho da classe de inicialização. A lista de sinalizadores descritos abaixo pode ser estendida nos lançamentos futuros 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 compensações indexada por class_idx . Uma entrada de matriz zero no Index class_idx significa que não há dados para este class_idx ou todos os sinalizadores de API ocultos 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 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 sinalizador são descritos na tabela abaixo. Os sinalizadores são codificados na mesma ordem que os campos e métodos são codificados nos dados da classe. |
Tipos de bandeira de restrição:
Nome | Valor | Descrição |
---|---|---|
Lista de permissões | 0 | Interfaces que podem ser usadas gratuitamente e são suportadas como parte do índice de pacotes de estrutura Android oficialmente documentado. |
lista cinza | 1 | Interfaces não SDK que podem ser usadas independentemente do nível da API de destino do aplicativo. |
lista negra | 2 | Interfaces não SDK que não podem ser usadas independentemente do nível da API de destino do aplicativo. O acesso a uma dessas interfaces causa um erro de tempo de execução . |
Greylist -Max -O | 3 | Interfaces não SDK que podem ser usadas para Android 8.x e abaixo, a menos que sejam restritas. |
Greylist - max -p | 4 | Interfaces não SDK que podem ser usadas para o Android 9.x, a menos que sejam restritas. |
Greylist -Max -Q | 5 | Interfaces não SDK que podem ser usadas para Android 10.x, a menos que sejam restritas. |
Greylist - max -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árias informações reflexivas sobre classes (e métodos e campos). Essas informações geralmente são acessadas apenas indiretamente pelo código do cliente (não sistema).
As anotações do sistema são representadas nos arquivos .dex
como anotações com visibilidade definida como VISIBILITY_SYSTEM
.
dalvik.annotation.annotationDefault
Aparece nos 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 desse tipo. A anotação não precisa incluir todos os nomes definidos pela anotação; Os 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 dentro de um corpo de método (por exemplo, uma classe interna sintética). Todas as aulas que têm essa anotação também devem ter uma anotação InnerClass
. Além disso, uma classe não deve ter uma EnclosingClass
e uma anotação EnclosingMethod
.
Nome | Formatar | Descrição |
---|---|---|
valor | Aula | a aula que mais intimamente esconde esta classe |
dalvik.annotation.enclosingMethod
Aparece nas aulas
Uma anotação EnclosingMethod
é anexada a cada classe que é definida dentro de um corpo de método. Todas as aulas que têm essa anotação também devem ter uma anotação InnerClass
. Além disso, uma classe não deve ter uma EnclosingClass
e uma anotação EnclosingMethod
.
Nome | Formatar | Descrição |
---|---|---|
valor | Método | o método que mais intimamente esconde esta classe |
dalvik.annotation.innerclass
Aparece nas aulas
Uma anotação InnerClass
é anexada a cada classe, definida no escopo lexical da definição de outra classe. Qualquer aula que tenha essa anotação também deve ter uma anotação EnclosingClass
ou uma anotação EnclosingMethod
.
Nome | Formatar | Descrição |
---|---|---|
nome | Corda | O nome simples declarado originalmente desta classe (sem incluir nenhum prefixo de pacote). Se esta classe for anônima, o nome será null . |
AccessFlags | interno | Os sinalizadores de acesso originalmente declarados da classe (que podem diferir das bandeiras efetivas devido a uma incompatibilidade entre os modelos de execução da linguagem de origem e a máquina virtual de destino) |
dalvik.annotation.Memberclasses
Aparece nas aulas
Uma anotação MemberClasses
é anexada a cada classe que declara as classes membros. (Uma classe membro é uma classe interna direta que tem um nome.)
Nome | Formatar | Descrição |
---|---|---|
valor | Aula[] | Array das classes membros |
dalvik.annotation.methodparameters
Aparece nos métodos
Nota: Esta anotação foi adicionada após o Android 7.1. Sua presença nos lançamentos anteriores do Android será ignorada.
Uma anotação MethodParameters
é opcional e pode ser usada para fornecer metadados de parâmetros, como nomes e modificadores de parâmetros.
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()
voltarão ao comportamento padrão no tempo de execução Se a informação não estiver presente.
Ao incluir metadados de parâmetros, os compiladores devem incluir informações para classes geradas, como enums, pois os metadados do 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étodo individuais. Portanto, os compiladores podem omitir a anotação inteiramente para construtores e métodos que não possuem parâmetros, em prol da eficiência do tamanho do código e do tempo de execução.
As matrizes documentadas abaixo devem ter o mesmo tamanho que a estrutura method_id_item
DEX associada ao método, caso contrário, um java.lang.reflect.MalformedParametersException
será lançado em tempo de execução.
Ou seja: method_id_item.proto_idx
-> proto_id_item.parameters_off
-> type_list.size
deve ser o mesmo que names().length
e accessFlags().length
.
Como MethodParameters
descreve todos os parâmetros formais do método, mesmo aqueles não declarados de maneira 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ão nenhuma informação sobre os parâmetros do receptor de anotação de tipo que não existem na assinatura do método real.
Nome | Formatar | Descrição |
---|---|---|
nomes | Corda[] | Os nomes dos parâmetros formais para o 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 seqüências de nomes do java.lang.reflect.MalformedParametersException estiverem vazias ou conter '. |
AccessFlags | int [] | Os sinalizadores de acesso dos parâmetros formais para o 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 com os seguintes valores:
java.lang.reflect.MalformedParametersException será lançado em tempo de execução. |
dalvik.annotation.signature
Aparece em aulas, 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 é representável por um type_id_item
. O formato .dex
não define o formato para assinaturas; É apenas para poder representar as assinaturas que um idioma de origem exige para a implementação bem -sucedida da semântica desse idioma. Como tal, as assinaturas geralmente não são analisadas (ou verificadas) por implementações de máquinas virtuais. As assinaturas simplesmente são entregues a APIs e ferramentas de nível superior (como depuradores). Qualquer uso de uma assinatura, portanto, deve ser escrito para não fazer 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 cordas de assinatura tendem a ter muito conteúdo duplicado, uma anotação Signature
é definida como uma variedade de cordas, onde elementos duplicados se referem naturalmente aos mesmos dados subjacentes, e a assinatura é considerada a concatenação de todas as cordas da matriz . Não há regras sobre como separar uma assinatura em cordas separadas; Isso depende inteiramente das ferramentas que geram arquivos .dex
.
Nome | Formatar | Descrição |
---|---|---|
valor | Corda[] | a assinatura desta classe ou membro, como uma variedade de cordas que deve ser concatenada juntas |
dalvik.annotation.throws
Aparece nos métodos
A anotação Throws
é anexada a cada método que é declarado como lançar um ou mais tipos de exceção.
Nome | Formatar | Descrição |
---|---|---|
valor | Aula[] | a variedade de tipos de exceção jogados |