
Python-Anbindungen für JADX.
Python-Bindungen für JADX über JPype. Dekompiliere Android APK- und DEX-Dateien in Java-Quellcode aus Python.
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
for cls in jadx.classes:
print(cls.full_name)
print(cls.code)
JADX ist der führende Open-Source-Android-Dekompiler – er erzeugt sauberen Java/Kotlin-Quellcode aus Dalvik-Bytecode und bewahrt Klassenhierarchien, Generics, Ausnahmebehandlung und Annotationen. pyjadx bringt dies in Python ohne Subprozess-Overhead: JADX läuft prozessintern über JPype.
pip install pyjadx
Voraussetzungen: JDK 11+ (JADX JARs werden beim ersten Gebrauch automatisch heruntergeladen).
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")
| Format | Beispiel |
|---|---|
| APK | Jadx("app.apk") |
| DEX | Jadx("classes.dex") |
| Multi-DEX APK | Wird transparent behandelt – alle Klassen zusammengeführt |
Jadx(path, *, threads=None, mode="auto", code_cache=False)Hauptzugangspunkt. Verwende es als Kontextmanager oder rufe load()/close() manuell auf.
Eigenschaften:
Methoden:
JavaClassJavaMethodJavaFieldJavaPackageJeder Wrapper stellt das zugrunde liegende JADX-Java-Objekt über .java bereit. Dadurch kannst du jede JADX-API aufrufen, die wir noch nicht implementiert haben:
with Jadx("app.apk") as jadx:
cls = jadx.search_class("com.example.Foo")
# Call JADX Java API directly
code_info = cls.java.getCodeInfo()
pyjadx koexistiert mit anderen JPype-Verbrauchern (z. B. PyGhidra) im selben Prozess. Wenn bereits eine JVM läuft, fügt pyjadx.start() JADX-JARs zum vorhandenen Klassenpfad hinzu. Andernfalls startet es eine.
import pyghidra
pyghidra.start() # starts JVM for Ghidra
import pyjadx
pyjadx.start() # adds JADX JARs to existing JVM — no conflict
Benutzerdefinierte JADX-Installation:
# Via environment variable
# export JADX_HOME=/opt/jadx
# Or at runtime
import pyjadx
pyjadx.start(jadx_home="/opt/jadx")
JAR-Zwischenspeicherung: JADX JARs werden beim ersten Gebrauch automatisch von Maven Central heruntergeladen und unter ~/.pyjadx/jars/<version>/ zwischengespeichert.
MIT
| Parameter | Beschreibung |
|---|
path | Pfad zur APK- oder DEX-Datei |
threads | JADX-Threadpool-Größe (None = Anzahl der CPUs) |
mode | "auto", "restructure", "simple" oder "fallback" |
code_cache | False = In-Memory-Cache (Standard), True = datenträgergestützt |
| Eigenschaft | Typ | Beschreibung |
|---|
classes | list[JavaClass] | Top-Level-Klassen über alle DEX-Dateien hinweg |
packages | list[JavaPackage] | Navigation auf Paketebene |
class_count | int | Anzahl der Top-Level-Klassen |
java | JObject | Notausstieg zum zugrunde liegenden jadx.api.JadxDecompiler |
| Methode | Beschreibung |
|---|
load() | Lädt und löst Klassen auf (aufgerufen von __enter__) |
close() | Gibt Ressourcen frei (aufgerufen von __exit__) |
decompile_all() | Dekompiliert alle Klassen sofort (eager) |
search_class(name) | Findet eine Klasse anhand des vollqualifizierten Namens |
| Eigenschaft | Typ | Beschreibung |
|---|
name | str | Kurzname ("MainActivity") |
full_name | str | Vollqualifiziert ("com.example.MainActivity") |
package | str | Paketname |
code | str | Dekompilierter Java-Quellcode (lazy, zwischengespeichert) |
smali | str | Smali-Disassemblierung (lazy, zwischengespeichert) |
methods | list[JavaMethod] | Methoden in dieser Klasse |
fields | list[JavaField] | Felder in dieser Klasse |
inner_classes | list[JavaClass] | Innere/anonyme Klassen |
declaring_class | JavaClass | None | Elternklasse (wenn innere Klasse) |
top_class | JavaClass | Äußerste umschließende Klasse |
dependencies | list[JavaClass] | Klassen, von denen diese Klasse abhängt |
is_inner | bool | Ob es sich um eine innere Klasse handelt |
java | JObject | Notausstieg zu jadx.api.JavaClass |
| Eigenschaft | Typ | Beschreibung |
|---|
name | str | Methodenname |
full_name | str | Vollqualifiziert mit Klasse |
code | str | Dekompilierter Quellcode (lazy, zwischengespeichert) |
callers | list[JavaMethod] | Methoden, die diese aufrufen (lazy, zwischengespeichert) |
callees | list[JavaMethod] | Methoden, die diese aufruft (lazy, zwischengespeichert) |
override_related | list[JavaMethod] | Bidirektionale Überschreibungskette |
declaring_class | JavaClass | Klasse, zu der diese Methode gehört |
java | JObject | Notausstieg zu jadx.api.JavaMethod |
| Eigenschaft | Typ | Beschreibung |
|---|
name | str | Feldname |
full_name | str | Vollqualifiziert mit Klasse |
type | str | Feldtyp als Zeichenkette |
callers | list[JavaMethod] | Methoden, die auf dieses Feld verweisen (lazy, zwischengespeichert) |
declaring_class | JavaClass | Klasse, zu der dieses Feld gehört |
java | JObject | Notausstieg zu jadx.api.JavaField |
| Eigenschaft | Typ | Beschreibung |
|---|
name | str | Vollständiger Paketname |
classes | list[JavaClass] | Klassen in diesem Paket |
sub_packages | list[JavaPackage] | Unterpakete |
java | JObject | Notausstieg zu jadx.api.JavaPackage |