jadx

A decompiler that turns Android APK and DEX files back into Java source you can read. It comes as a GUI for reading and a command-line tool for bulk output.

cat jadx/meta.ymlChecked on 2026-11-03

Safety

Impact Local onlyStays on your machine and sends nothing out
Admin rights
Not required
Test lab
Not required

Usage

Purpose
Audit
Difficulty
Intermediate
Type
Desktop app
Platforms
Windows / macOS / Linux

Trust

Repository
skylot/jadx
License
PermissiveApache-2.0
GitHub
stars51,7392026-11-10
Maintenance
Actively updatedLast update 2026-11-08
Contents
  1. Introduction
  2. What jadx is for
  3. How it works
  4. Network connections
  5. Requirements
  6. Try it safely with your own APK
  7. Common uses
  8. How jadx differs from MobSF and Ghidra
  9. Cautions
  10. Read next
  11. Sources

jadx turns an Android app file (such as an APK) back into Java source code that you can read on screen. This review covers one use: checking how an app you built yourself looks in the form you ship it.

This review is for people who build Android apps and want to see, before release, what someone can read from the APK. After reading it, you can do the following:

  • Install jadx and start the GUI and command-line versions
  • Open your own APK and read the manifest and the code
  • Search strings to check that no API keys or test endpoints remain in the app

What jadx is for

jadx is a decompiler that produces Java code from Dex, the executable format of Android apps. According to the official README, it can:

  • Produce Java code from APK, dex, aab, apks, apkm, xapk, and zip files
  • Also handle jar, class, aar, and smali files
  • Decode AndroidManifest.xml and other resources from resources.arsc
  • Rename unreadable names with its built-in deobfuscator

The GUI adds syntax highlighting, jump to declaration, find usage, and full-text search. It also has a smali debugger.

What it doesn’t dojadx does not rate how risky an app is. You read the decompiled code and decide what is a problem. The README also says that in most cases jadx cannot decompile 100% of the code, so errors will occur. Treat the output as a reference, not as the original source.

How it works

Read it as text (full explanation)

What gets in the way when you read an app with jadx is the attacker technique that hides code and strings (T1406 Obfuscated Files or Information in Mobile ATT&CK), which MITRE describes as hiding the contents of a payload or file by encryption, encoding, or similar means, including encoding the plaintext strings that would otherwise help defenders with discovery. Legitimate apps have short names too: the Android developer documentation says R8 shortens the names of classes, fields, and methods to reduce the size of the DEX file (for example, com.example.MyActivity can become a.b.a). jadx’s --deobf renames names shorter than 3 characters or longer than 64 by default, using names jadx chooses. A packer, which compresses or encrypts an executable (T1406.002 Software Packing), can fail the load itself: jadx’s official Troubleshooting page says some packers tamper with the dex checksum. In a MITRE example, AndroidOS/MalLocker.B stores encrypted code in the Assets directory and builds a .dex file with its own decryption routine, so a .dex like that may not be readable just by decompiling the APK. If strings are encoded, a full-text search for http or key may find nothing, and finding nothing does not show that nothing is there.

Network connections

Here is what we could confirm:

  • The GUI checks for a new version at startup by default. The check code asks the GitHub API (api.github.com) for the latest release.
  • The plugins command has options to list available plugins, install them, and update them. It fetches plugins from outside only when you use it.
  • I found no code that sends the contents of the APK you open to the outside. I could not confirm whether the command-line version makes any network connection.

To stop the update check, clear “Check for updates on startup” in the GUI settings.

Requirements

These are the conditions in the README (as of v1.5.6).

Item Details
Java 64-bit Java 11 or later. Download files with with-jre in the name don’t need Java
Download files jadx-<version>.zip, jadx-gui-<version>-win.zip, jadx-gui-<version>-with-jre-win.zip
Packages Arch Linux (pacman), macOS (Homebrew), Flathub
Building from source JDK 17 or later

Try it safely with your own APK

  1. From the official releases page, download the zip that fits your system. If you don’t want to install Java on Windows, pick the zip with with-jre in the name.
  2. Unpack the zip. The bin folder holds jadx (command line) and jadx-gui (GUI). For the Windows download, run jadx-gui-<version>.exe inside the unpacked folder.
  3. Prepare an APK that you built. A real release build shows you the same file that users get.
  4. Start jadx-gui and open the APK.
  5. Open AndroidManifest.xml and check that the permissions and settings you declared are what you intended.
  6. Use full-text search for words such as http, api, key, token, and password. If you left a secret or a test endpoint in the code, it shows up.
  7. If you find one, go back to your source code and fix it. Keep secrets such as keys on the server side instead of in the app.

You can also write everything out in one go from the command line.

  1. Run it with an output folder.

    jadx -d out app.apk
  2. Search the files in the out folder with your editor or a search tool.

If the names are short and hard to read, add --deobf to rename them.

Common uses

Option What it does
-d, --output-dir Output folder
-r, --no-res Don’t decode resources
-s, --no-src Don’t decompile source code
-e, --export-gradle Save as a Gradle project
--deobf Rename obfuscated names
--show-bad-code Show code that was not decompiled correctly
-m, --decompilation-mode Output style: auto, restructure, simple, or fallback
--single-class Decompile one class only
-j, --threads-count Number of processing threads. The default is half of the CPU threads

jadx --help lists all options. The official wiki has a Troubleshooting Q&A page for code that doesn’t decompile well.

How jadx differs from MobSF and Ghidra

jadx MobSF Ghidra
Main target Android Dex and Java bytecode Android, iOS, and Windows apps Compiled executables in general
Result Decompiled Java code A list of possible problems Disassembly and decompiled output
Who judges You The tool flags, and you verify You

A good order is to make a list with MobSF first, then check the places that look suspicious in jadx.

Cautions

  • Only read apps that you built or that are published for practice. Before you analyze someone else’s app, check its terms of use and license agreement. Some forbid reverse engineering. If you are unsure, use only your own apps and materials that clearly allow analysis.
  • When you open an APK of unknown origin, use an environment separate from your everyday PC. jadx does not run the app, but loading a file can still cause problems. The v1.5.6 release notes list security fixes, including how zip entries are handled. Use a recent version.
  • jadx has environment variables that turn off its zip and XML safety checks (such as JADX_DISABLE_ZIP_SECURITY). Don’t set them unless you need to.
  • Decompiled code has errors and gaps. Variable names and comments differ from your original source.
  • A plugin is a program that you fetch from outside and add. Check where it comes from before you install it.
  • Get jadx from the official GitHub releases page or from the packages listed in the README.
How code and strings get hidden, and what gets in the way in jadx

When names are shortened (legitimate apps too)

  1. R8 shortens the names of classes, fields, and methodsThe Android developer documentation says this reduces the size of the DEX file. For example, com.example.MyActivity can become a.b.a
  2. jadx’s --deobf renames namesBy default, jadx renames names shorter than 3 characters or longer than 64 characters, using names it chooses

ATT&CK T1406Obfuscated Files or Information (Mobile)

Attack technique
Hiding the contents of a payload or file by encryption, encoding, or similar means, including encoding the plaintext strings that would otherwise help defenders with discovery (MITRE)

ATT&CK T1406.002Obfuscated Files or Information: Software Packing

Attack technique
Compressing or encrypting an executable (a packer)
What happens in jadx
It can fail the load itself. jadx’s official Troubleshooting page says some packers tamper with the dex checksum

A MITRE example: AndroidOS/MalLocker.B

It stores encrypted code in the Assets directory and builds a .dex file with its own decryption routine. A .dex like that may not be readable just by decompiling the APK.

When you find nothing

If strings are encoded, a full-text search for http or key may find nothing. Finding nothing does not show that nothing is there.

Sources

  1. Official repository README (features, download, usage, options)github.com/skylot/jadx/blob/master/README.md
  2. License (Apache License 2.0)github.com/skylot/jadx/blob/master/LICENSE
  3. Release: v1.5.6 (assets and security fixes)github.com/skylot/jadx/releases/tag/v1.5.6
  4. Source: update check code (JadxUpdate.kt)github.com/skylot/jadx/blob/master/jadx-gui/src/main/java/jadx/gui/update/JadxUpdate.kt
  5. Source: GUI setting defaults (JadxSettingsData.java)github.com/skylot/jadx/blob/master/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsData.java
  6. Source: GUI settings window (JadxSettingsWindow.java)github.com/skylot/jadx/blob/master/jadx-gui/src/main/java/jadx/gui/settings/ui/JadxSettingsWindow.java
  7. Official wiki: Troubleshooting Q&A (dex checksum tampered by packers)github.com/skylot/jadx/wiki/Troubleshooting-Q&A
  8. Android Developers: Shrink, obfuscate, and optimize your app (R8)developer.android.com/build/shrink-code
  9. MITRE ATT&CK T1406 Obfuscated Files or Information (Mobile)attack.mitre.org/techniques/T1406/
  10. MITRE ATT&CK T1406.002 Obfuscated Files or Information Software Packing (Mobile)attack.mitre.org/techniques/T1406/002/

Checked on 2026-11-03

Similar tools

Ghidra

Impact Local only
NationalSecurityAgency/ghidra

A free, open-source software reverse engineering suite from the NSA. It disassembles and decompiles compiled programs so you can read what they do.

Purpose
Learning
Type
Desktop app
Difficulty
Advanced
License
PermissiveApache-2.0
Category
Reverse engineering / Learning and practice labs
Actively updatedstars99,232Last update 2026-11-10
Read the Ghidra review

mitmproxy

Impact Reaches others
mitmproxy/mitmproxy

A proxy that sits between your browser or app and a web server, so you can record, inspect, and modify HTTP traffic, including HTTPS.

Purpose
Audit
Type
Command line
Difficulty
Intermediate
License
PermissiveMIT
Category
Web security / Network
Actively updatedstars46,785Last update 2026-11-09
Read the mitmproxy review

MobSF

Impact Local only
MobSF/Mobile-Security-Framework-MobSF

A mobile app security tool that analyzes Android and iOS apps and lists risky permissions, settings, and code issues. You use it from a web browser.

Purpose
Audit
Type
Web service
Difficulty
Intermediate
License
CopyleftGPL-3.0
Category
Reverse engineering / Vulnerability scanning
Actively updatedstars22,187Last update 2026-11-10
Read the MobSF review