
Привязки Python для JADX.
Привязки Python для JADX через JPype. Декомпилируйте Android APK и DEX файлы в Java исходный код из Python.
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
for cls in jadx.classes:
print(cls.full_name)
print(cls.code)
JADX — ведущий Android-декопилятор с открытым исходным кодом. Он создает чистый Java/Kotlin код из Dalvik-байткода, сохраняя иерархию классов, дженерики, обработку исключений и аннотации. pyjadx переносит это в Python без накладных расходов на подпроцессы: JADX работает внутри процесса через JPype.
pip install pyjadx
Требования: JDK 11+ (JADX JAR-файлы загружаются автоматически при первом использовании).
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")
| Формат | Пример |
|---|---|
| APK | Jadx("app.apk") |
| DEX | Jadx("classes.dex") |
| Multi-DEX APK | Обрабатывается прозрачно — все классы объединяются |
Jadx(path, *, threads=None, mode="auto", code_cache=False)Основная точка входа. Используйте как контекстный менеджер или вызывайте load()/close() вручную.
| Параметр | Описание |
|---|---|
path | Путь к APK или DEX файлу |
threads | Размер пула потоков JADX (None = количество CPU) |
mode | "auto", "restructure", "simple" или "fallback" |
code_cache | False = кэш в памяти (по умолчанию), True = кэш на диске |
Свойства:
| Свойство | Тип | Описание |
|---|---|---|
classes | list[JavaClass] | Верхнеуровневые классы из всех DEX файлов |
packages | list[JavaPackage] | Навигация по пакетам |
class_count | int | Количество верхнеуровневых классов |
java | JObject | Лазейка к внутреннему jadx.api.JadxDecompiler |
Методы:
| Метод | Описание |
|---|---|
load() | Загружает и разрешает классы (вызывается в __enter__) |
close() | Освобождает ресурсы (вызывается в __exit__) |
decompile_all() | Принудительная декомпиляция всех классов |
search_class(name) | Поиск класса по полному имени |
JavaClass| Свойство | Тип | Описание |
|---|---|---|
name | str | Короткое имя ("MainActivity") |
full_name | str | Полное квалифицированное имя ("com.example.MainActivity") |
package | str | Имя пакета |
code | str | Декомпилированный Java-исходник (ленивый, кэшируется) |
smali | str | Дизассемблированный Smali (ленивый, кэшируется) |
methods | list[JavaMethod] | Методы этого класса |
fields | list[JavaField] | Поля этого класса |
inner_classes | list[JavaClass] | Внутренние/анонимные классы |
declaring_class | JavaClass | None | Родительский класс (если внутренний) |
top_class | JavaClass | Самый внешний объемлющий класс |
dependencies | list[JavaClass] | Классы, от которых зависит этот класс |
is_inner | bool | Является ли класс внутренним |
java | JObject | Лазейка к jadx.api.JavaClass |
JavaMethod| Свойство | Тип | Описание |
|---|---|---|
name | str | Имя метода |
full_name | str | Полное квалифицированное имя с классом |
code | str | Декомпилированный исходник (ленивый, кэшируется) |
callers | list[JavaMethod] | Методы, вызывающие этот (ленивый, кэшируется) |
callees | list[JavaMethod] | Методы, которые вызываются из этого (ленивый, кэшируется) |
override_related | list[JavaMethod] | Двунаправленная цепочка переопределений |
declaring_class | JavaClass | Класс, которому принадлежит метод |
java | JObject | Лазейка к jadx.api.JavaMethod |
JavaField| Свойство | Тип | Описание |
|---|---|---|
name | str | Имя поля |
full_name | str | Полное квалифицированное имя с классом |
type | str | Тип поля в виде строки |
callers | list[JavaMethod] | Методы, ссылающиеся на это поле (ленивый, кэшируется) |
declaring_class | JavaClass | Класс, которому принадлежит поле |
java | JObject | Лазейка к jadx.api.JavaField |
JavaPackage| Свойство | Тип | Описание |
|---|---|---|
name | str | Полное имя пакета |
classes | list[JavaClass] | Классы в этом пакете |
sub_packages | list[JavaPackage] | Подпакеты |
java | JObject | Лазейка к jadx.api.JavaPackage |
Каждая обёртка предоставляет доступ к исходному Java-объекту JADX через атрибут .java. Это позволяет вызывать любое API JADX, которое ещё не обёрнуто:
with Jadx("app.apk") as jadx:
cls = jadx.search_class("com.example.Foo")
# Call JADX Java API directly
code_info = cls.java.getCodeInfo()
pyjadx может сосуществовать с другими потребителями JPype (например, PyGhidra) в одном процессе. Если JVM уже запущена, pyjadx.start() добавляет JADX JAR-файлы в существующий classpath. Если нет — запускает новую JVM.
import pyghidra
pyghidra.start() # запускает JVM для Ghidra
import pyjadx
pyjadx.start() # добавляет JADX JAR-файлы в существующую JVM — без конфликтов
Пользовательская установка JADX:
# Via environment variable
# export JADX_HOME=/opt/jadx
# Or at runtime
import pyjadx
pyjadx.start(jadx_home="/opt/jadx")
Кэширование JAR-файлов: JADX JAR-файлы автоматически загружаются из Maven Central при первом использовании и кэшируются в ~/.pyjadx/jars/<version>/.
MIT