pyjadx
Enlaces de Python para JADX a través de JPype. Descompila archivos APK y DEX de Android a código fuente Java desde Python.
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
for cls in jadx.classes:
print(cls.full_name)
print(cls.code)
¿Por qué pyjadx?
JADX es el descompilador de Android de código abierto líder: produce código fuente Java/Kotlin limpio a partir del bytecode Dalvik, preservando jerarquías de clases, genéricos, manejo de excepciones y anotaciones. pyjadx trae esto a Python sin la sobrecarga de subprocesos: JADX se ejecuta en proceso a través de JPype.
Instalación
Requisitos: JDK 11+ (los JARs de JADX se descargan automáticamente en el primer uso).
Inicio rápido
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
# All top-level classes (inner classes via cls.inner_classes)
for cls in jadx.classes:
print(cls.full_name, len(cls.methods), "methods")
# Search by fully qualified name
main = jadx.search_class("com.example.MainActivity")
if main:
print(main.code)
# Method-level decompilation
for method in main.methods:
print(f"{method.name}: {method.code}")
# Cross-references
for method in main.methods:
print(f"{method.name} called by: {[c.name for c in method.callers]}")
# Package navigation
for pkg in jadx.packages:
print(pkg.name, len(pkg.classes), "classes")
Entradas admitidas
| Formato | Ejemplo |
|---|
| APK | Jadx("app.apk") |
| DEX | Jadx("classes.dex") |
| APK multi-DEX | Manejado de forma transparente: todas las clases se fusionan |
Referencia de la API
Jadx(path, *, threads=None, mode="auto", code_cache=False)
Punto de entrada principal. Úsalo como administrador de contexto o llama a load()/close() manualmente.
Propiedades:
Métodos:
JavaClass
JavaMethod
JavaField
JavaPackage
Vía de escape
Cada envoltorio expone su objeto Java JADX subyacente a través de .java. Esto te permite llamar a cualquier API de JADX que aún no hayamos envuelto:
with Jadx("app.apk") as jadx:
cls = jadx.search_class("com.example.Foo")
# Call JADX Java API directly
code_info = cls.java.getCodeInfo()
Coexistencia de JVM
pyjadx coexiste con otros consumidores de JPype (p. ej., PyGhidra) en el mismo proceso. Si una JVM ya está en ejecución, pyjadx.start() añade los JARs de JADX al classpath existente. Si no, inicia una.
import pyghidra
pyghidra.start() # starts JVM for Ghidra
import pyjadx
pyjadx.start() # adds JADX JARs to existing JVM — no conflict
Configuración
Instalación personalizada de JADX:
# Via environment variable
# export JADX_HOME=/opt/jadx
# Or at runtime
import pyjadx
pyjadx.start(jadx_home="/opt/jadx")
Caché de JARs: Los JARs de JADX se descargan automáticamente desde Maven Central en el primer uso y se guardan en caché en ~/.pyjadx/jars/<version>/.
Licencia
MIT