pyjadx
Bindings Python pour JADX via JPype. Décompilateur de fichiers APK et DEX Android en code source Java depuis Python.
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
for cls in jadx.classes:
print(cls.full_name)
print(cls.code)
Pourquoi pyjadx ?
JADX est le principal décompilateur Android open-source — il produit un code source Java/Kotlin propre à partir du bytecode Dalvik, en préservant les hiérarchies de classes, les génériques, la gestion des exceptions et les annotations. pyjadx intègre cela dans Python sans surcharge de sous-processus : JADX s'exécute directement dans le processus via JPype.
Installation
Prérequis : JDK 11+ (les JAR de JADX sont téléchargés automatiquement lors de la première utilisation).
Démarrage rapide
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")
Entrées supportées
| Format | Exemple |
|---|
| APK | Jadx("app.apk") |
| DEX | Jadx("classes.dex") |
| Multi-DEX APK | Géré de manière transparente — toutes les classes fusionnées |
Référence de l'API
Jadx(path, *, threads=None, mode="auto", code_cache=False)
Point d'entrée principal. Utilisez-le comme gestionnaire de contexte ou appelez load()/close() manuellement.
Propriétés :
Méthodes :
JavaClass
JavaMethod
JavaField
JavaPackage
Passerelle de sortie
Chaque wrapper expose son objet Java JADX sous-jacent via .java. Cela vous permet d'appeler toute API JADX que nous n'avons pas encore encapsulée :
with Jadx("app.apk") as jadx:
cls = jadx.search_class("com.example.Foo")
# Call JADX Java API directly
code_info = cls.java.getCodeInfo()
Coexistence JVM
pyjadx coexiste avec d'autres consommateurs JPype (par exemple, PyGhidra) dans le même processus. Si une JVM est déjà en cours d'exécution, pyjadx.start() ajoute les JAR JADX au classpath existant. Sinon, elle en démarre une.
import pyghidra
pyghidra.start() # starts JVM for Ghidra
import pyjadx
pyjadx.start() # adds JADX JARs to existing JVM — no conflict
Configuration
Installation personnalisée de JADX :
# Via environment variable
# export JADX_HOME=/opt/jadx
# Or at runtime
import pyjadx
pyjadx.start(jadx_home="/opt/jadx")
Mise en cache des JAR : Les JAR JADX sont téléchargés automatiquement depuis Maven Central lors de la première utilisation et mis en cache dans ~/.pyjadx/jars/<version>/.
Licence
MIT