Sumário
Descompilar um APK significa converter o código compilado de volta para uma forma legível: código-fonte Java com o JADX, ou assembly Smali mais recursos decodificados com o APKTool. O JADX serve para entender o que um app faz, enquanto o APKTool serve para produzir arquivos que você pode editar e recompilar. Descompile apenas cópias de apps que lhe pertencem e mantenha os resultados na sua própria máquina.
Parte do hub de modding: como fazer mod de um APK · Próximo passo: recompilar um APK · Comandos: guia do APKTool.
Por Abdul Emam, testador de APKs da ApkZena. A minha primeira decodificação me ensinou a ordem das operações: abri um jogo de 92 MB no JADX, busquei o texto visível de uma funcionalidade bloqueada e encontrei o método de bloqueio em menos de dois minutos. Ler primeiro me salvou de corrigir o arquivo errado. Leia primeiro. Edite depois.
Este guia cobre o que significa descompilar, as três ferramentas que valem a pena conhecer, como ler o manifest e o Smali, os problemas que você vai encontrar e a fronteira legal. Cada seção aponta para os guias de recompilação e de assinatura quando a leitura vira edição.
O que significa descompilar um APK?
Descompilar converte o classes.dex compilado em código legível semelhante a Java por meio do JADX, ou em Smali por meio do APKTool, sem alterar o arquivo original; mantenha o pacote intacto e estude uma cópia decodificada, porque a saída pode omitir nomes e informações perdidas na compilação ou na ofuscação.
Definição
A compilação transforma código-fonte em bytecode; descompilar reverte a viagem tanto quanto o formato permite. A saída em Java quase lê como o programa original, enquanto o Smali espelha o bytecode instrução por instrução. Nenhum dos dois reproduz comentários, nomes originais de variáveis depois da ofuscação nem scripts de build.
Fronteiras legais
Estudar uma cópia que lhe pertence para aprendizado, revisão de segurança ou interoperabilidade é defensável em muitas jurisdições. Distribuir a saída decodificada, remover verificações de licença ou republicar o código de outra pessoa é infração. A regra deste guia: decodifique os seus próprios arquivos e mantenha cada resultado privado.
Casos de uso comuns
Entender uma permissão antes de concedê-la, descobrir qual método impõe um temporizador, auditar o que um app envia na inicialização e aprender os internos do Android a partir de pacotes reais. Cada um começa com leitura e termina antes da modificação, o que mantém o trabalho firmemente na categoria de estudo.
O que há dentro de um APK (recapitulando)
Um APK guarda o código compilado em classes.dex, os recursos em resources.arsc e res/, o AndroidManifest.xml e as bibliotecas nativas em lib/, com um certificado de assinatura protegendo a integridade do pacote; JADX e APKTool podem expor vários componentes, enquanto as bibliotecas nativas precisam de ferramentas diferentes.
Ferramenta 1: JADX (DEX para Java)
O JADX abre um APK e apresenta código reconstruído semelhante a Java que você pode navegar, buscar e exportar; ele ajuda a explicar o comportamento do app antes de editar, enquanto a saída dele não recria o projeto de código original, os nomes originais das variáveis nem a configuração de build.
Instale o JADX
Baixe o JADX no repositório oficial e execute o lançador gráfico ou a build de linha de comando. Confira nesse repositório os requisitos de runtime e as releases atuais; evite espelhos de terceiros e use a documentação oficial do APKTool quando precisar de recursos editáveis ou de um fluxo de recompilação.
Abra um APK
Aponte o JADX para a sua cópia do pacote e aguarde a árvore preencher. Jogos grandes levam um minuto ou mais na primeira abertura, enquanto cada arquivo DEX é convertido. Salve a sessão apenas se você pretende voltar ao mesmo pacote repetidamente.
Leia o Java descompilado
As classes aparecem sob os nomes dos pacotes, com os métodos na ordem do código-fonte. Builds ofuscados mostram nomes de uma letra, mas o fluxo de controle, as chamadas de API e as constantes de texto se leem com clareza. Siga o que o código chama, não o nome que o código tem.
Busque textos e métodos
Busque o texto exato que você vê na interface do app: rótulos de botão, mensagens de erro e nomes de funcionalidades o levam direto ao método responsável. Depois use referências cruzadas para ver cada chamador, o que mostra quanto aquele valor é usado antes de você considerar tocá-lo.
Exporte o projeto
O JADX pode salvar o código descompilado completo em disco para busca com outras ferramentas. Exporte quando o pacote é grande o bastante para a busca dentro do app parecer lenta, ou quando você quer comparar duas versões do mesmo app lado a lado.
Ferramenta 2: APKTool (recursos para XML e Smali)
O APKTool decodifica um APK em uma pasta com arquivos Smali, recursos e um manifest legível que você pode editar e recompilar; escolha ele quando a tarefa exige mudanças no nível do pacote, enquanto o JADX costuma ser mais fácil para ler código reconstruído semelhante a Java.
Decodifique com um único comando
Rode apktool d app.apk -o app-decode a partir do fluxo do guia do APKTool. A pasta que ele cria contém smali/, res/, AndroidManifest.xml e apktool.yml, e nada no pacote original muda.
Leia o AndroidManifest.xml
Permissões, activities, services e a faixa de SDK aparecem como XML puro. Este arquivo responde se um app merece o seu tempo antes de você ler uma única linha de código, então abra-o primeiro em cada decodificação.
Leia o código Smali
O Smali lista as instruções do Dalvik uma por linha: const-string para texto, invoke-virtual para chamadas, saltos condicionais para ramificações. Ancore em um texto conhecido, leia vinte linhas ao redor dele e a lógica de decisão se mostra.
Leia os recursos
Textos decodificados, cores e dimensões ficam em res/values/. O texto de exibição e os padrões numéricos vivem aqui, e não no código, o que torna os recursos o lugar mais barato para confirmar o que uma funcionalidade mostra ao usuário.
Ferramenta 3: JEB (descompilador avançado)
O JEB é uma ferramenta comercial de engenharia reversa com recursos de análise e scripting para aplicações complexas; considere-a quando as ferramentas gratuitas não conseguem responder uma pergunta de pesquisa específica, e confira os recursos atuais, os termos de licença e os formatos de arquivo suportados antes de escolhê-la.
Quando usar o JEB
Análise paga de malware, apps comerciais fortemente protegidos e trabalho diário de engenharia reversa justificam a licença. Para aprender modding nas suas próprias cópias de segurança, JADX mais APKTool cobre tudo a zero custo. Comece de graça e reavalie apenas se um pacote específico resistir aos dois.
Como ler o AndroidManifest.xml
O manifest declara a identidade de um pacote Android, os recursos solicitados e os pontos de entrada dos componentes; inspecione primeiro o nome do pacote, as declarações de SDK, as permissões e os componentes de application para entender como o app se integra ao sistema operacional e lança activities na inicialização.
Estrutura
Nome do pacote no topo, um bloco uses-sdk, declarações de permissão e depois o bloco application com activities e services. Aprenda essa ordem uma vez e todo manifest que você abrir se lê do mesmo jeito.
Permissões
Cada linha uses-permission concede um recurso, de uma vibração inofensiva ao acesso sensível a SMS. Compare a lista com o que o app realmente faz: uma lanterna pedindo contatos diz mais do que qualquer revisão de código.
Pontos de entrada
A activity com o intent filter de launcher é a tela que os usuários veem primeiro. Services e receivers revelam comportamentos em segundo plano que nunca aparecem na interface, incluindo tarefas agendadas e inicialização na hora do boot.
Versões de SDK
O minSdkVersion define o Android mais antigo que o app suporta, enquanto o targetSdkVersion declara quais regras de comportamento ele segue. Os dois importam quando um app decodificado se comporta de modo diferente entre os seus aparelhos de teste.
Como ler código Smali
O Smali representa o bytecode do Dalvik como instruções legíveis, incluindo carregamentos de registradores, chamadas de métodos e saltos condicionais; aprender essas formas básicas ajuda você a seguir o fluxo de controle de um método quando o Java reconstruído está incompleto, ofuscado ou enganoso durante uma inspeção cuidadosa de código de um app.
O que é o Smali
O Smali é a linguagem de montagem do bytecode do Dalvik: uma instrução por linha, registradores nomeados de v0 até vN e rótulos marcando os alvos dos saltos. O APKTool o gera, e qualquer editor de texto o exibe.
Instruções comuns
O const-string carrega texto, o const/4 carrega números pequenos, o invoke-* chama métodos e os saltos no estilo if-eqz ramificam em zero ou null. Os returns encerram métodos com return-void ou com uma variante que carrega um valor. Reconheça esses seis e os corpos dos métodos começam a se narrar.
Encontrando métodos
Busque textos primeiro, nomes de classe em segundo e chamadas de API em terceiro. Um método que confere o relógio, lê uma preferência ou abre uma chamada de rede se anuncia pelas APIs que invoca, independentemente de qual nome a ofuscação lhe deu.
Uma primeira sessão de leitura
Escolha um app offline pequeno que lhe pertença, decodifique-o e responda três perguntas sem mudar nada: quais permissões ele declara, qual activity inicia primeiro e onde fica o texto da funcionalidade principal. Essa sessão ensina o fluxo completo de leitura em cerca de quinze minutos e consolida o hábito de abrir o manifest primeiro.
Decodificar vs descompilar vs desmontar
Decodificar significa extrair arquivos estruturados e recursos de um pacote; descompilar significa reconstruir código semelhante a fonte a partir do bytecode; desmontar significa apresentar instruções de nível mais baixo, e esses rótulos descrevem saídas diferentes, então escolha a ferramenta com base no que você precisa inspecionar ou editar em um projeto APK no seu dispositivo.
Qual dos três você está fazendo
O JADX descompila para Java. O APKTool decodifica para Smali e recursos, o que se lê como uma desmontagem com estrutura. Conhecer a distinção importa quando o tutorial de alguém diz descompilar, mas os passos mostram o APKTool: a saída é diferente, e também é diferente o que você pode fazer em seguida.
Problemas comuns de descompilação
Nomes ofuscados, bibliotecas nativas, recursos criptografados e verificações anti-manuseio podem limitar o que um descompilador revela; identifique qual obstáculo se aplica antes de trocar de ferramenta, porque cada um exige uma abordagem diferente e algumas proteções bloqueiam de propósito a análise ou a modificação do pacote.
Código ofuscado
Nomes de uma letra e fluxo de controle achatado deixam a leitura lenta. Apoie-se nas constantes de texto sobreviventes e nas chamadas de API da framework, que os ofuscadores não conseguem renomear sem quebrar o app. Aqui, a paciência vence a ferramenta.
Bibliotecas nativas
O código em lib/ nunca vira Smali nem Java por meio dessas ferramentas. Anote quais funcionalidades passam por chamadas nativas e depois decida se a edição que você imaginou é sequer alcançável a partir das camadas que você pode mudar.
Recursos criptografados
Alguns pacotes criptografam textos ou assets que se decodificam como lixo. A chave de descriptografia vive no código ou nas bibliotecas nativas, e caçá-la é um projeto por si só. Trate as regiões criptografadas como fronteiras somente leitura por enquanto.
Proteção anti-manuseio
As verificações de assinatura na inicialização, a detecção de depurador e a verificação de integridade punem modificação, e não leitura. Descompilar ainda funciona para estudo; recompilar dispara os alarmes. Respeite o que a proteção diz sobre a intenção do app.
Descompilar é legal?
As regras de descompilação variam por jurisdição e por finalidade, incluindo exceções para interoperabilidade ou pesquisa de segurança; redistribuição, contorno de licença e builds modificados podem levantar questões legais e contratuais separadas, então consulte a lei local e os termos do software relevantes antes de compartilhar resultados publicamente.
O que continua seguro
Decodifique arquivos que você obteve legitimamente, mantenha cada saída nas suas próprias máquinas e use as descobertas para entender, e não para contornar controles de pagamento ou de acesso. Documente o que você fez e quando, caso alguma dúvida surja.
O que cruza a linha
Publicar código decodificado, compartilhar pacotes recompilados, remover verificações de compra ou vender modificações do app de outra pessoa. Cada um desses converte estudo em infração com dano identificável ao desenvolvedor.
Extraia o seu próprio pacote com o guia de extração, abra-o no JADX e leia o manifest antes de qualquer outra coisa. Quando o entendimento virar edição, o guia de recompilação e o guia de assinatura continuam exatamente onde este para.
Pontos principais
- O JADX transforma DEX em Java legível para entender; o APKTool decodifica Smali e recursos para editar.
- Leia o manifest primeiro e depois busque os textos visíveis para encontrar o código que importa.
- Descompile cópias que lhe pertencem, mantenha os resultados privados e nunca distribua pacotes recompilados.
Perguntas frequentes
Como eu descompilo um APK?
Abra o pacote no JADX para ler o código em Java, ou rode apktool d app.apk para decodificar Smali e recursos em uma pasta. O JADX responde o que o código faz, enquanto o APKTool produz arquivos que você pode editar e recompilar. Escolha a ferramenta que combina com o seu objetivo: ler ou mudar.
Posso descompilar um APK de volta para Java?
Sim, com o JADX, que converte o bytecode DEX em código-fonte Java legível para a maioria dos apps. A ofuscação renomeia classes e métodos, e alguns construtos se descompilam de forma imperfeita, então trate a saída como um mapa fiel, e não como o código-fonte original. É o suficiente para entender o comportamento.
O que é o JADX?
O JADX é um descompilador gratuito e de código aberto que transforma arquivos DEX do Android em código-fonte Java que você pode navegar e buscar. Ele roda em Windows, Mac e Linux, com interface gráfica e modo de linha de comando. Use-o quando quiser ler o código antes de decidir o que mudar.
Para que serve o APKTool na descompilação?
O APKTool decodifica um APK em assembly Smali mais recursos decodificados e o manifest, que você pode editar e recompilar. Diferente do JADX, a saída dele é feita para modificação, e não para leitura. Escolha o APKTool quando o próximo passo, depois de entender, for mudar alguma coisa.
Descompilar um APK é legal?
Descompilar uma cópia que você possui para estudo privado, pesquisa de segurança ou interoperabilidade é defensável em muitas jurisdições. Quebrar apps pagos, remover licenças ou distribuir pacotes recompilados é infração. Mantenha o trabalho no seu próprio dispositivo e nunca compartilhe a saída.
Posso descompilar código ofuscado?
Você consegue decodificá-lo, mas nomes como a, b e c substituem cada identificador com significado, o que torna a leitura lenta. Constantes de texto e chamadas de API do Android sobrevivem à ofuscação, então busque por esses, e não por nomes de métodos. Apps fortemente protegidos também podem resistir à decodificação por completo.
Como eu leio código Smali?
Leia-o como assembly com rótulos: as linhas const-string guardam texto, as linhas invoke chamam métodos e saltos no estilo if-eqz implementam condições. Comece por um texto que você reconheça e siga o método que o referencia. Vinte linhas de contexto costumam revelar a decisão que está sendo tomada.
O que é o AndroidManifest.xml?
O manifest é o contrato do app com o Android: nome do pacote, permissões, activities, services e versões de SDK suportadas. Manifests decodificados se leem como XML puro e mostram exatamente o que o app solicita e qual tela inicia primeiro. Leia-o sempre antes de tocar no código.
Posso descompilar bibliotecas nativas?
O JADX e o APKTool se concentram no código DEX e nos recursos do APK; arquivos em lib/ contêm código de máquina nativo para uma arquitetura de CPU. Essas ferramentas conseguem listar as bibliotecas nativas, enquanto entender as instruções delas exige um desmontador nativo e um fluxo de análise diferente.
Qual é o melhor descompilador de APK?
O JADX é o melhor para ler código como Java, o APKTool é o melhor quando você vai editar e recompilar, e o JEB serve para profissionais que pagam por uma análise mais profunda. A maioria dos aprendizes precisa apenas dos dois primeiros: leia com o JADX e depois decodifique com o APKTool quando uma edição for justificada.