pyjadx
Bindings Python para JADX via JPype. Descompila arquivos APK e DEX do Android para código fonte Java a partir do Python.
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
for cls in jadx.classes:
print(cls.full_name)
print(cls.code)
Por que pyjadx?
O JADX é o principal descompilador Android de código aberto — ele produz código fonte Java/Kotlin limpo a partir do bytecode Dalvik, preservando hierarquias de classes, genéricos, tratamento de exceções e anotações. O pyjadx traz isso para o Python sem a sobrecarga de subprocessos: o JADX é executado no mesmo processo via JPype.
Instalação
Requisitos: JDK 11+ (os JARs do JADX são baixados automaticamente na primeira utilização).
Início rápido
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
# Todas as classes de nível superior (classes internas via cls.inner_classes)
for cls in jadx.classes:
print(cls.full_name, len(cls.methods), "métodos")
# Pesquisa por nome totalmente qualificado
main = jadx.search_class("com.example.MainActivity")
if main:
print(main.code)
# Descompilação a nível de método
for method in main.methods:
print(f"{method.name}: {method.code}")
# Referências cruzadas
for method in main.methods:
print(f"{method.name} chamado por: {[c.name for c in method.callers]}")
# Navegação por pacotes
for pkg in jadx.packages:
print(pkg.name, len(pkg.classes), "classes")
Entradas suportadas
| Formato | Exemplo |
|---|
| APK | Jadx("app.apk") |
| DEX | Jadx("classes.dex") |
| Multi-DEX APK | Manipulado de forma transparente — todas as classes mescladas |
Referência da API
Jadx(path, *, threads=None, mode="auto", code_cache=False)
Ponto de entrada principal. Use como gerenciador de contexto ou chame load()/close() manualmente.
Propriedades:
Métodos:
JavaClass
JavaMethod
JavaField
JavaPackage
Escape hatch
Cada wrapper expõe seu objeto Java JADX subjacente através de .java. Isso permite que você chame qualquer API do JADX que ainda não encapsulamos:
with Jadx("app.apk") as jadx:
cls = jadx.search_class("com.example.Foo")
# Chama a API Java do JADX diretamente
code_info = cls.java.getCodeInfo()
O pyjadx coexiste com outros consumidores do JPype (por exemplo, PyGhidra) no mesmo processo. Se uma JVM já estiver em execução, pyjadx.start() adiciona os JARs do JADX ao classpath existente. Caso contrário, inicia uma.
import pyghidra
pyghidra.start() # inicia JVM para Ghidra
import pyjadx
pyjadx.start() # adiciona JARs do JADX à JVM existente — sem conflito
Configuração
Instalação personalizada do JADX:
# Via variável de ambiente
# export JADX_HOME=/opt/jadx
# Ou em tempo de execução
import pyjadx
pyjadx.start(jadx_home="/opt/jadx")
Cache de JARs: Os JARs do JADX são baixados automaticamente do Maven Central na primeira utilização e armazenados em cache em ~/.pyjadx/jars/<version>/.
Licença
MIT