Dex to Java decompiler
Go to file
2022-03-31 17:30:06 +01:00
.github build: add CodeQL analysis 2022-01-13 22:37:36 +03:00
buildSrc build: disable missing warnings from javadoc 2021-12-21 12:52:52 +00:00
config fix: forbid 'printStackTrace()' usage 2021-12-18 19:24:36 +00:00
gradle/wrapper chore: update gradle and dependencies 2022-03-11 11:34:51 +00:00
jadx-cli feat: add 'simple' decompilation mode 2022-03-23 18:16:54 +03:00
jadx-core fix: handle inlined classes while collecting override related methods (#1422) 2022-03-25 12:56:18 +00:00
jadx-gui fix(gui): don't highlight whitespaces and special symbols (#1429) 2022-03-28 19:21:05 +01:00
jadx-plugins fix: various minor improvements (PR #1418) 2022-03-23 15:13:53 +00:00
.editorconfig style: enforce code style using checkstyle and spotless with eclipse formatter (PR #650) 2019-04-30 00:04:16 +03:00
.gitignore chore: update dependencies 2022-01-20 10:23:49 +00:00
.gitlab-ci.yml feat: input plugin for java bytecode 2021-08-13 23:07:29 +03:00
appdata.xml build: fix appdata.xml (#1427)(PR #1430) 2022-03-31 17:30:06 +01:00
build.gradle chore: update gradle and dependencies 2022-03-11 11:34:51 +00:00
CODE_OF_CONDUCT.md docs: update readme and contributing rules 2019-07-31 21:40:23 +03:00
CONTRIBUTING.md build: remove Travis and Bintray, disable codecov and sonarqube (#1113) 2021-02-04 12:14:39 +00:00
gradle.properties fix: various minor improvements (PR #1418) 2022-03-23 15:13:53 +00:00
gradlew build: update gradle wrapper to 7.2 (#1244) 2021-09-03 16:38:37 +01:00
gradlew.bat chore: update gradle and dependencies 2020-09-17 21:03:17 +03:00
lgtm.yml chore: update lgtm config 2021-12-22 12:24:01 +00:00
LICENSE add full license text file 2015-03-14 19:18:59 +03:00
NOTICE gui: support images view/unpack 2016-03-26 17:19:54 +03:00
README.md feat: add 'simple' decompilation mode 2022-03-23 18:16:54 +03:00
SECURITY.md docs: add security.md 2022-01-13 16:45:32 +00:00
settings.gradle feat: add raung input plugin, use raung in tests 2021-10-12 19:17:04 +01:00

JADX

Build status Alerts from lgtm.com semantic-release Maven Central License

jadx - Dex to Java decompiler

Command line and GUI tools for producing Java source code from Android Dex and Apk files

Please note that in most cases jadx can't decompile all 100% of the code, so errors will occur. Check Troubleshooting guide for workarounds

Main features:

  • decompile Dalvik bytecode to java classes from APK, dex, aar, aab and zip files
  • decode AndroidManifest.xml and other resources from resources.arsc
  • deobfuscator included

jadx-gui features:

  • view decompiled code with highlighted syntax
  • jump to declaration
  • find usage
  • full text search
  • smali debugger, check wiki page for setup and usage

Jadx-gui key bindings can be found here

See these features in action here: jadx-gui features overview

Download

After download unpack zip file go to bin directory and run:

  • jadx - command line version
  • jadx-gui - UI version

On Windows run .bat files with double-click
Note: ensure you have installed Java 11 or later 64-bit version. For Windows, you can download it from oracle.com (select x64 Installer).

Install

  1. Arch linux
        sudo pacman -S jadx
    
  2. macOS
        brew install jadx
    

Use jadx as a library

You can use jadx in your java projects, check details on wiki page

Build from source

JDK 8 or higher must be installed:

git clone https://github.com/skylot/jadx.git
cd jadx
./gradlew dist

(on Windows, use gradlew.bat instead of ./gradlew)

Scripts for run jadx will be placed in build/jadx/bin and also packed to build/jadx-<version>.zip

Usage

jadx[-gui] [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab)
options:
  -d, --output-dir                    - output directory
  -ds, --output-dir-src               - output directory for sources
  -dr, --output-dir-res               - output directory for resources
  -r, --no-res                        - do not decode resources
  -s, --no-src                        - do not decompile source code
  --single-class                      - decompile a single class, full name, raw or alias
  --single-class-output               - file or dir for write if decompile a single class
  --output-format                     - can be 'java' or 'json', default: java
  -e, --export-gradle                 - save as android gradle project
  -j, --threads-count                 - processing threads count, default: 4
  -m, --decompilation-mode            - code output mode:
                                         'auto' - trying best options (default)
                                         'restructure' - restore code structure (normal java code)
                                         'simple' - simplified instructions (linear, with goto's)
                                         'fallback' - raw instructions without modifications
  --show-bad-code                     - show inconsistent code (incorrectly decompiled)
  --no-imports                        - disable use of imports, always write entire package name
  --no-debug-info                     - disable debug info
  --add-debug-lines                   - add comments with debug line numbers if available
  --no-inline-anonymous               - disable anonymous classes inline
  --no-inline-methods                 - disable methods inline
  --no-replace-consts                 - don't replace constant value with matching constant field
  --escape-unicode                    - escape non latin characters in strings (with \u)
  --respect-bytecode-access-modifiers - don't change original access modifiers
  --deobf                             - activate deobfuscation
  --deobf-min                         - min length of name, renamed if shorter, default: 3
  --deobf-max                         - max length of name, renamed if longer, default: 64
  --deobf-cfg-file                    - deobfuscation map file, default: same dir and name as input file with '.jobf' extension
  --deobf-cfg-file-mode               - set mode for handle deobfuscation map file:
                                         'read' - read if found, don't save (default)
                                         'read-or-save' - read if found, save otherwise (don't overwrite)
                                         'overwrite' - don't read, always save
                                         'ignore' - don't read and don't save
  --deobf-rewrite-cfg                 - set '--deobf-cfg-file-mode' to 'overwrite' (deprecated)
  --deobf-use-sourcename              - use source file name as class name alias
  --deobf-parse-kotlin-metadata       - parse kotlin metadata to class and package names
  --use-kotlin-methods-for-var-names  - use kotlin intrinsic methods to rename variables, values: disable, apply, apply-and-hide, default: apply
  --rename-flags                      - fix options (comma-separated list of):
                                         'case' - fix case sensitivity issues (according to --fs-case-sensitive option),
                                         'valid' - rename java identifiers to make them valid,
                                         'printable' - remove non-printable chars from identifiers,
                                        or single 'none' - to disable all renames
                                        or single 'all' - to enable all (default)
  --fs-case-sensitive                 - treat filesystem as case sensitive, false by default
  --cfg                               - save methods control flow graph to dot file
  --raw-cfg                           - save methods control flow graph (use raw instructions)
  -f, --fallback                      - set '--decompilation-mode' to 'fallback' (deprecated)
  --use-dx                            - use dx/d8 to convert java bytecode
  --comments-level                    - set code comments level, values: error, warn, info, debug, user-only, none, default: info
  --log-level                         - set log level, values: quiet, progress, error, warn, info, debug, default: progress
  -v, --verbose                       - verbose output (set --log-level to DEBUG)
  -q, --quiet                         - turn off output (set --log-level to QUIET)
  --version                           - print jadx version
  -h, --help                          - print this help

Plugin options (-P<name>=<value>):
  1) dex-input (Load .dex and .apk files)
    -Pdex-input.verify-checksum       - Verify dex file checksum before load, values: [yes, no], default: yes
  2) java-convert (Convert .jar and .class files to dex)
    -Pjava-convert.mode               - Convert mode, values: [dx, d8, both], default: both
    -Pjava-convert.d8-desugar         - Use desugar in d8, values: [yes, no], default: no

Examples:
  jadx -d out classes.dex
  jadx --rename-flags "none" classes.dex
  jadx --rename-flags "valid, printable" classes.dex
  jadx --log-level ERROR app.apk
  jadx -Pdex-input.verify-checksum=no app.apk

These options also worked on jadx-gui running from command line and override options from preferences dialog

Troubleshooting

Please check wiki page Troubleshooting Q&A

Contributing

To support this project you can:

  • Post thoughts about new features/optimizations that important to you
  • Submit decompilation issues, please read before proceed: Open issue
  • Open pull request, please follow these rules: Pull Request Process

Licensed under the Apache 2.0 License