O que são arquivos .dex no Android?


193

Tenho algumas perguntas sobre arquivos dex

  • O que é um dexarquivo no Android?
  • Como o dex funciona no Android?
  • Como eles são usados ​​na depuração de um aplicativo Android?
  • Eles são semelhantes aos arquivos de classe java?

Preciso de informações específicas, por favor ajude sobre isso e quaisquer exemplos reais são bem-vindos!



Respostas:


226

Sobre o arquivo .dex:

Uma das características mais notáveis ​​do Dalvik Virtual Machine(o cavalo de batalha do sistema Android) é que ele não usa o bytecode Java. Em vez disso, um formato interno chamado DEX foi introduzido e nem mesmo as instruções do bytecode são as mesmas que as instruções do Java bytecode.

Compiled Android application code file.

Os programas Android são compilados em .dexarquivos (Dalvik Executable), que por sua vez são compactados em um único .apkarquivo no dispositivo. .dexarquivos podem ser criados traduzindo automaticamente aplicativos compilados escritos na linguagem de programação Java.

Formato de arquivo Dex:

 1. File Header
 2. String Table
 3. Class List
 4. Field Table
 5. Method Table
 6. Class Definition Table
 7. Field List
 8. Method List
 9. Code Header
10. Local Variable List

O Android tem documentação sobre os Dalvik Executable Format( arquivos .dex ). Você pode descobrir mais nos documentos oficiais: Dex File Format

.dex os arquivos são semelhantes aos arquivos da classe java, mas foram executados na Dalkvik Virtual Machine (DVM) em versões mais antigas do Android e compilados no momento da instalação no dispositivo para codificar nativamente com ART nas versões mais recentes do Android.

Você pode decompile.dex usando a dexdumpferramenta fornecida no android-sdk.

Existem também algumas técnicas de engenharia reversa para criar um jar fileou a java class filepartir de um .dexarquivo.


Meu arquivo jar contém alguns xml na pasta assets. Quero que isso faça parte do .dex. Alguma idéia de como implementar isso?
usar o seguinte código

@AndroidGuy - O arquivo Jar não contém nenhum pacote de recursos do Android (/ asset), você precisa usar o Pacote da Biblioteca do Android para isso.
usar o seguinte comando

Como funciona no ART, no Android Lollipop? Quais arquivos são usados ​​lá e em qual caminho? Alguns disseram que vai ocupar mais espaço. É verdade? Se sim, como é que é? Quero dizer, o código nativo parece sempre ser muito menor que o código de bytes, e os arquivos dex são semelhantes ao código de bytes em termos de como ele funciona.
desenvolvedor android

Uma coisa importante a notar é que dexdumpnão é um decompiler, mas um desmontador
Genghiskhan

90
.dex file

Arquivo de código do aplicativo Android compilado.

Os programas Android são compilados em arquivos .dex (Dalvik Executable), que por sua vez são compactados em um único arquivo .apk no dispositivo. Os arquivos .dex podem ser criados automaticamente pelo Android, traduzindo os aplicativos compilados escritos na linguagem de programação Java.


2
Meu arquivo jar contém alguns xml na pasta assets. Quero que isso faça parte do .dex. Alguma idéia de como implementar isso?
usar o seguinte código

87

dex file é um arquivo que é executado na VM do Dalvik.

O Dalvik VM inclui vários recursos para otimização, verificação e monitoramento de desempenho, um dos quais é o Dalvik Executable (DEX) .

O código-fonte Java é compilado pelo compilador Java em .classarquivos. Em seguida, a dxferramenta (dexer), parte do SDK do Android, processa os .classarquivos em um formato de arquivo chamado DEXque contém o código de bytes Dalvik. A dxferramenta elimina todas as informações redundantes presentes nas classes. Em DEXtodas as classes do aplicativo são compactadas em um arquivo. A tabela a seguir fornece comparação entre tamanhos de código para arquivos jar da JVM e os arquivos processados ​​pela dexferramenta.

A tabela compara tamanhos de código para bibliotecas do sistema, aplicativos de navegador da Web e um aplicativo de uso geral (aplicativo de despertador). Em todos os casos, a ferramenta dex reduziu o tamanho do código em mais de 50%.

insira a descrição da imagem aqui

Nos ambientes Java padrão, cada classe no código Java resulta em um .classarquivo. Isso significa que, se o arquivo de código-fonte Java tiver uma classe pública e duas classes anônimas, digamos que para manipulação de eventos, o compilador java criará um total de três .classarquivos.

A etapa de compilação é a mesma na plataforma Android, resultando em vários .classarquivos. Porém, depois que os .classarquivos são gerados, a ferramenta “dx” é usada para converter todos os .classarquivos em um único .dexarquivo, ou Dalvik Executable. É o .dexarquivo que é executado na VM Dalvik. O .dexarquivo foi otimizado para uso da memória e o design é impulsionado principalmente pelo compartilhamento de dados.


18
Boa informação. Apenas uma coisa a destacar. Às vezes, haverá vários arquivos dex por causa do limite de número de instruções de chamada de método. Esse limite é de 65k métodos. Nesse caso, seu código não estará dentro de um único arquivo, mas em 2 ou mais, mas todo o resto se aplica ainda. Além disso, como o carregamento de classe dinâmica também está disponível, você pode carregar o código (novamente na forma dexed) dos arquivos e, portanto, o código estará dentro de vários arquivos dex.
Igor Čordaš
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.