Jadx
JADX Documentation Index
Source: skylot/jadx (GitHub wiki + README)
Fetched: 2026-04-22
Files: 9
JADX Overview
JADX decompiles Dalvik bytecode to Java source code. It processes Android APK, DEX, AAR, AAB, XAPK, APKM, and ZIP files. Complete decompilation is not always possible — some code may fail.
Prerequisites: Java 11+ (64-bit). Build from source requires JDK 17+.
Core Capabilities
- Decompile Dalvik bytecode to Java from APK, DEX, AAR, AAB, ZIP
- Decode
AndroidManifest.xml and resources from resources.arsc - Built-in deobfuscator
- Export as Gradle project (Android app, Android library, or simple Java)
- Output formats:
java (default) or json
GUI (jadx-gui) Features
- Syntax-highlighted decompiled code viewer
- Jump to declaration
- Find usage
- Full-text search
- Smali debugger (requires separate setup)
Installation
| Platform | Command |
|---|
| Arch Linux | sudo pacman -S jadx |
| macOS | brew install jadx |
| Flathub | flatpak install flathub com.github.skylot.jadx |
| Binary zip | Download from GitHub releases, unpack, run bin/jadx or bin/jadx-gui |
Build from Source
Requires JDK 17+:
1git clone https://github.com/skylot/jadx.git
2cd jadx
3./gradlew dist
4# Windows: gradlew.bat dist
5# Output: build/jadx/bin/ and build/jadx-<version>.zip
CLI Usage
jadx[-gui] [command] [options] <input files>
Supported input extensions: .apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab, .xapk, .apkm, .jadx.kts
Output Options
| Flag | Description |
|---|
-d, --output-dir | Output directory (sources + resources) |
-ds, --output-dir-src | Output directory for sources only |
-dr, --output-dir-res | Output directory for resources only |
-r, --no-res | Skip resource decoding |
-s, --no-src | Skip source decompilation |
--output-format | java (default) or json |
-e, --export-gradle | Save as Gradle project (sets type to auto) |
--export-gradle-type | auto / android-app / android-library / simple-java |
--single-class | Decompile a single class by full name, raw or alias |
--single-class-output | File or dir for single-class output |
Decompilation Mode (-m, --decompilation-mode)
| Value | Description |
|---|
auto | Try best options (default) |
restructure | Restore code structure (normal Java) |
simple | Simplified linear instructions with goto |
fallback | Raw instructions, no modifications |
Threading
| Flag | Description |
|---|
-j, --threads-count | Processing thread count (default: 16) |
Code Output Flags
| Flag | Description |
|---|
--show-bad-code | Show inconsistently decompiled code |
--no-xml-pretty-print | Skip XML prettification |
--no-imports | Always write full package names |
--no-debug-info | Disable debug info parsing |
--add-debug-lines | Add debug line number comments |
--no-inline-anonymous | Disable anonymous class inlining |
--no-inline-methods | Disable method inlining |
--no-move-inner-classes | Disable moving inner classes into parent |
--no-inline-kotlin-lambda | Disable Kotlin lambda inlining |
--no-finally | Don’t extract finally blocks |
--no-restore-switch-over-string | Don’t restore switch-over-string |
--no-replace-consts | Don’t replace values with constant fields |
--escape-unicode | Escape non-latin characters as \u |
--respect-bytecode-access-modifiers | Keep original access modifiers |
Deobfuscation Options
| Flag | Description |
|---|
--mappings-path | Mapping file or dir. Formats: Tiny, Tiny v2 (.tiny), Enigma (.mapping), Enigma dir |
--mappings-mode | read (default) / read-and-autosave-every-change / read-and-autosave-before-closing / ignore |
--deobf | Activate deobfuscation |
--deobf-min | Rename names shorter than N (default: 3) |
--deobf-max | Rename names longer than N (default: 64) |
--deobf-whitelist | Space-separated classes/packages to exclude from deobfuscation |
--deobf-cfg-file | JADX auto-generated names mapping file (.jobf); defaults to same dir/name as input |
--deobf-cfg-file-mode | read (default) / read-or-save / overwrite / ignore |
--deobf-res-name-source | auto (default) / resources / code |
--use-source-name-as-class-name-alias | always / if-better / never |
--source-name-repeat-limit | Max uses of a source name (default: 10) |
--use-kotlin-methods-for-var-names | disable / apply (default) / apply-and-hide |
Rename / Fix Options (--rename-flags)
Comma-separated values or one of the shortcuts:
| Value | Description |
|---|
case | Fix case sensitivity (per --fs-case-sensitive) |
valid | Rename invalid Java identifiers |
printable | Remove non-printable chars from identifiers |
none | Disable all renames |
all | Enable all (default) |
Display Options
| Flag | Description |
|---|
--integer-format | auto (default) / decimal / hexadecimal |
--type-update-limit | Type update limit per instruction (default: 10) |
--fs-case-sensitive | Treat filesystem as case-sensitive (default: false) |
--cfg | Save control flow graph to dot file |
--raw-cfg | Save raw-instruction control flow graph |
--use-headers-for-detect-resource-extensions | Use file headers for resource extension detection |
Logging Options
| Flag | Description |
|---|
--comments-level | error / warn / info (default) / debug / user-only / none |
--log-level | quiet / progress (default) / error / warn / info / debug |
-v, --verbose | Set log level to DEBUG |
-q, --quiet | Set log level to QUIET |
Config File Options
| Flag | Description |
|---|
--config <config-ref> | Load config from .json file, short name (in config dir), or none to disable |
--save-config <config-ref> | Save current options to config file and exit |
--print-files | Print files/dirs used by jadx (config, cache, temp) |
--disable-plugins | Comma-separated plugin IDs to disable |
Plugin System
Plugin CLI (jadx plugins)
jadx plugins [options]
| Flag | Description |
|---|
-i, --install <locationId> | Install plugin by location ID |
-j, --install-jar <path> | Install plugin from JAR file |
-l, --list | List installed plugins |
-a, --available | List available plugins from marketplace |
-u, --update | Update installed plugins |
--uninstall <pluginId> | Uninstall plugin |
--disable <pluginId> | Disable plugin |
--enable <pluginId> | Enable plugin |
--list-all | List all plugins including bundled and dropins |
--list-versions <locationId> | Fetch latest versions (downloads artifacts, max 10) |
Built-in Plugin Options (-P<name>=<value>)
dex-input — Load .dex and .apk files
| Option | Values | Default |
|---|
dex-input.verify-checksum | yes, no | yes |
java-convert — Convert .class, .jar, .aar to dex
| Option | Values | Default |
|---|
java-convert.mode | dx, d8, both | both |
java-convert.d8-desugar | yes, no | no |
kotlin-metadata — Use kotlin.Metadata annotation for code generation
| Option | Values | Default |
|---|
kotlin-metadata.class-alias | yes, no | yes |
kotlin-metadata.method-args | yes, no | yes |
kotlin-metadata.fields | yes, no | yes |
kotlin-metadata.companion | yes, no | yes |
kotlin-metadata.data-class | yes, no | yes |
kotlin-metadata.to-string | yes, no | yes |
kotlin-metadata.getters | yes, no | yes |
kotlin-smap — Use kotlin.SourceDebugExtension for class alias renaming
| Option | Values | Default |
|---|
kotlin-smap.class-alias-source-dbg | yes, no | no |
rename-mappings — Various mapping format support
| Option | Values | Default |
|---|
rename-mappings.format | AUTO, TINY_FILE, TINY_2_FILE, ENIGMA_FILE, ENIGMA_DIR, PROGUARD_FILE, SRG_FILE, XSRG_FILE, JAM_FILE, CSRG_FILE, TSRG_FILE, TSRG_2_FILE, INTELLIJ_MIGRATION_MAP_FILE, RECAF_SIMPLE_FILE, JOBF_FILE | AUTO |
rename-mappings.invert | yes, no | no |
smali-input — Load .smali files
| Option | Values | Default |
|---|
smali-input.api-level | Android API level integer | 27 |
Environment Variables
| Variable | Description |
|---|
JADX_DISABLE_XML_SECURITY | Set to true to disable all XML security checks |
JADX_DISABLE_ZIP_SECURITY | Set to true to disable all ZIP security checks |
JADX_ZIP_MAX_ENTRIES_COUNT | Max entries allowed in ZIP files (default: 100,000) |
JADX_CONFIG_DIR | Custom config directory (default: system) |
JADX_CACHE_DIR | Custom cache directory (default: system) |
JADX_TMP_DIR | Custom temp directory (default: system) |
CLI Examples
1jadx -d out classes.dex
2jadx --rename-flags "none" classes.dex
3jadx --rename-flags "valid, printable" classes.dex
4jadx --log-level ERROR app.apk
5jadx -Pdex-input.verify-checksum=no app.apk
GUI options set via command line override the preferences dialog values.
Table of Contents
| File | Summary |
|---|
| content/JADX-GUI-Key-bindings.md | Complete keyboard shortcut reference for JADX GUI covering file operations, code navigation, search, and editor actions. |
| content/jadx-gui-features-overview.md | Overview of JADX GUI interactive features including declaration jumping, usage search, Smali/Java toggling, line mode switching, and package exclusion. |
| content/Jadx-plugins-guide.md | Complete guide to developing, installing, and publishing jadx decompiler plugins using the JadxPlugin interface and JadxPluginContext API. |
| content/Jadx-scripts-guide.md | Guide to writing and running Kotlin-based jadx scripts (.jadx.kts) for automating decompilation, renaming, class inspection, and GUI integration. |
| content/Smali-debugger.md | Reference for jadx-gui’s built-in Smali debugger, covering prerequisites, keyboard shortcuts, breakpoints, and step execution against Android processes via adb. |
| content/Troubleshooting-Q&A.md | Troubleshooting guide for jadx covering decompilation errors, loading failures, out-of-memory problems, and jadx-gui platform-specific issues with concrete fixes. |
| content/Use-jadx-as-a-library.md | Guide to embedding jadx as a Java/Kotlin library via Maven Central, covering dependency setup, the JadxDecompiler API, memory optimizations, custom directories, and snapshot builds. |
| content/code-formatting.md | JADX uses Spotless (Eclipse formatter) and Checkstyle via Gradle to enforce consistent code style across the codebase. |