Contents
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.xmland other resources fromresources.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.
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
pluginscommand 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
- 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-jrein the name. - Unpack the zip. The
binfolder holdsjadx(command line) andjadx-gui(GUI). For the Windows download, runjadx-gui-<version>.exeinside the unpacked folder. - Prepare an APK that you built. A real release build shows you the same file that users get.
- Start
jadx-guiand open the APK. - Open
AndroidManifest.xmland check that the permissions and settings you declared are what you intended. - Use full-text search for words such as
http,api,key,token, andpassword. If you left a secret or a test endpoint in the code, it shows up. - 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.
-
Run it with an output folder.
jadx -d out app.apk -
Search the files in the
outfolder 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.
Read next
When names are shortened (legitimate apps too)
- 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
- 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
- Official repository README (features, download, usage, options)github.com/skylot/jadx/blob/master/README.md
- License (Apache License 2.0)github.com/skylot/jadx/blob/master/LICENSE
- Release: v1.5.6 (assets and security fixes)github.com/skylot/jadx/releases/tag/v1.5.6
- Source: update check code (JadxUpdate.kt)github.com/skylot/jadx/blob/master/jadx-gui/src/main/java/jadx/gui/update/JadxUpdate.kt
- Source: GUI setting defaults (JadxSettingsData.java)github.com/skylot/jadx/blob/master/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsData.java
- Source: GUI settings window (JadxSettingsWindow.java)github.com/skylot/jadx/blob/master/jadx-gui/src/main/java/jadx/gui/settings/ui/JadxSettingsWindow.java
- Official wiki: Troubleshooting Q&A (dex checksum tampered by packers)github.com/skylot/jadx/wiki/Troubleshooting-Q&A
- Android Developers: Shrink, obfuscate, and optimize your app (R8)developer.android.com/build/shrink-code
- MITRE ATT&CK T1406 Obfuscated Files or Information (Mobile)attack.mitre.org/techniques/T1406/
- 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 onlyA 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
mitmproxy
Impact Reaches othersA 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
MobSF
Impact Local onlyA 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