Pular para o conteúdo principal

Estrutura do APK

Formato APK

Um APK é o formato de pacote utilizado pelo Android para distribuir e instalar aplicativos. Ele é, essencialmente, um arquivo compactado (formato .zip) que contém todos os componentes necessários para a instalação e execução de um app Android.

$ unzip myapp.apk
$ ls -l

total 27584
-rw-r--r-- 1 bertolis bertolis 4220 Jan 1 1981 AndroidManifest.xml
drwxr-xr-x 49 bertolis bertolis 1568 May 10 13:36 META-INF
drwxr-xr-x 3 bertolis bertolis 96 May 10 13:36 assets
-rw-r--r-- 1 bertolis bertolis 8285624 Jan 1 1981 classes.dex
drwxr-xr-x 9 bertolis bertolis 288 May 10 13:36 kotlin
drwxr-xr-x 6 bertolis bertolis 192 May 10 13:36 lib
drwxr-xr-x 545 bertolis bertolis 17440 May 10 13:36 res
-rw-r--r-- 1 bertolis bertolis 922940 Jan 1 1981 resources.arsc
ComponenteDescrição
AndroidManifest.xmlDefine informações essenciais do app: permissões, atividades, serviços etc.
classes.dexContém o código compilado da aplicação em formato DEX (Dalvik Executable)
META-INF/Armazena os certificados e assinaturas digitais do app
assets/Contém arquivos arbitrários acessíveis via código, como fontes, textos, imagens etc.
lib/Código nativo (C/C++) separado por arquitetura (ex: armeabi-v7a, x86)
res/Recursos do app (layouts XML, imagens, strings), sem código
resources.arscÍndice compilado dos recursos (strings, dimensões, estilos etc.)

Compilação e estrutura de código

Um APK (Android Package) é compilado a partir de arquivos fonte em Java ou Kotlin.

Arquivos do APK

META-INF/ — Certificados e Assinaturas

Este diretório é criado durante o processo de assinatura do APK. Ele contém os arquivos que validam a integridade do pacote. Qualquer alteração no conteúdo do APK invalida essas assinaturas, exigindo que o APK seja assinado novamente.

ArquivoDescrição
CERT.RSAContém a chave pública usada para assinar e verificar CERT.SF
CERT.SFLista os hashes dos arquivos descritos em MANIFEST.MF
MANIFEST.MFLista os nomes e hashes SHA256 em Base64 de todos os arquivos do APK. Usado para verificar a integridade do pacote

assets/ — Recursos Arbitrários da Aplicação

Contém arquivos fornecidos pelos desenvolvedores que podem ser acessados via AssetManager. São incluídos aqui arquivos como imagens, vídeos, bancos de dados, documentos ou bibliotecas adicionais. Frameworks como Xamarin, Cordova e React Native frequentemente armazenam código e DLLs neste diretório.

lib/ — Bibliotecas Nativas

Contém código nativo compilado (em C/C++) na forma de arquivos .so (shared object), separados por arquitetura da CPU:

Visão dos arquivos de biblioteca
lib/
├── arm64-v8a/
├── armeabi-v7a/
├── x86/
└── x86_64/

Aplicativos que utilizam o NDK (Native Development Kit) incluem aqui componentes de baixo nível que interagem diretamente com o hardware.

res/ — Recursos Estáticos

Contém os recursos do aplicativo definidos estaticamente, que não podem ser modificados em tempo de execução. Exemplos:

  • color/: definições de cores
  • drawable/: imagens e vetores
  • layout/: estruturas de UI (XML)
  • xml/: configurações, segurança de rede, entre outros

AndroidManifest.xml — Metadados da Aplicação

Arquivo obrigatório e central, que define as informações estruturais do app. Ele inclui:

  • Nome do pacote
  • Versões do SDK e build
  • Permissões solicitadas
  • Configurações de segurança (ex: NetworkSecurityConfig)
  • Componentes: activities, services, providers, receivers

Esse arquivo é compilado em formato binário e deve ser convertido (ex: com apktool) para ser legível.

classes.dex — Código Compilado

Arquivo com as classes compiladas da aplicação em formato DEX (Dalvik Executable). Executado pela Dalvik VM (Android < 5.0) ou ART (Android Runtime) em versões modernas.

  • Aplicativos grandes podem ter vários DEX: classes.dex, classes2.dex, etc.
  • Suporta Multidex em projetos mais complexos.

resources.arsc — Mapeamento de Recursos

Arquivo binário que mapeia os identificadores dos recursos (R.string, R.layout, etc) para os seus valores reais (strings, layouts, estilos, etc).

  • É essencial para a renderização correta da interface.
  • Contém representações binárias de arquivos XML.

(Opcional) kotlin/

Diretório opcional presente em apps escritos em Kotlin. Contém metadados específicos usados pelo compilador e ferramentas de runtime.