pyjadx
Binding Python per JADX tramite JPype. Decompila file APK e DEX Android in codice Java da Python.
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
for cls in jadx.classes:
print(cls.full_name)
print(cls.code)
Perché pyjadx?
JADX è il decompilatore open-source leader per Android — produce codice Java/Kotlin pulito dal bytecode Dalvik, preservando gerarchie di classi, generici, gestione delle eccezioni e annotazioni. pyjadx porta tutto questo in Python senza l'overhead dei sottoprocessi: JADX gira in-process tramite JPype.
Installazione
Requisiti: JDK 11+ (i JAR di JADX vengono scaricati automaticamente al primo utilizzo).
Avvio rapido
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
# Tutte le classi di primo livello (classi interne tramite cls.inner_classes)
for cls in jadx.classes:
print(cls.full_name, len(cls.methods), "metodi")
# Ricerca per nome completamente qualificato
main = jadx.search_class("com.example.MainActivity")
if main:
print(main.code)
# Decompilazione a livello di metodo
for method in main.methods:
print(f"{method.name}: {method.code}")
# Riferimenti incrociati
for method in main.methods:
print(f"{method.name} chiamato da: {[c.name for c in method.callers]}")
# Navigazione dei pacchetti
for pkg in jadx.packages:
print(pkg.name, len(pkg.classes), "classi")
| Formato | Esempio |
|---|
| APK | Jadx("app.apk") |
| DEX | Jadx("classes.dex") |
| APK multi-DEX | Gestito in modo trasparente — tutte le classi unite |
Riferimento API
Jadx(path, *, threads=None, mode="auto", code_cache=False)
Punto di ingresso principale. Usare come context manager o chiamare load()/close() manualmente.
Proprietà:
Metodi:
JavaClass
JavaMethod
JavaField
JavaPackage
Vano tecnico
Ogni wrapper espone l'oggetto Java JADX sottostante tramite .java. Questo permette di chiamare qualsiasi API JADX non ancora coperta dal wrapper:
with Jadx("app.apk") as jadx:
cls = jadx.search_class("com.example.Foo")
# Chiama direttamente l'API Java di JADX
code_info = cls.java.getCodeInfo()
Coesistenza JVM
pyjadx coesiste con altri consumatori JPype (es. PyGhidra) nello stesso processo. Se una JVM è già in esecuzione, pyjadx.start() aggiunge i JAR di JADX al classpath esistente. In caso contrario, ne avvia una.
import pyghidra
pyghidra.start() # avvia la JVM per Ghidra
import pyjadx
pyjadx.start() # aggiunge i JAR di JADX alla JVM esistente — nessun conflitto
Configurazione
Installazione personalizzata di JADX:
# Tramite variabile d'ambiente
# export JADX_HOME=/opt/jadx
# Oppure a runtime
import pyjadx
pyjadx.start(jadx_home="/opt/jadx")
Cache JAR: I JAR di JADX vengono scaricati automaticamente da Maven Central al primo utilizzo e memorizzati nella cache in ~/.pyjadx/jars/<version>/.
Licenza
MIT