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 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
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_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ó). |
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,
|
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:
- 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 inicialização deve resolver (VALUE_STRING).
- 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:
java.lang.invoke.Lookup
java.lang.String
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_item s 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 locaisname_idx : índice de strings do nometype_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 locaisname_idx : índice de strings do nometype_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
" |
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:
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 |