jadx
Décompilateur Java/Dalvik pour fichiers APK et DEX Android. Produit du code source Java lisible à partir du bytecode compilé, avec une interface graphique et une interface en ligne de commande. Java/Dalvik decompiler for Android APK and DEX files. Produces readable Java source code from compiled bytecode with a GUI and CLI interface.
↗ https://github.com/skylot/jadxOverview
jadx decompiles Android APK files and DEX bytecode back into human-readable Java source code. Unlike smali (used by apktool), jadx produces Java pseudocode that is much easier to read and audit. It includes a powerful GUI (jadx-gui) and a command-line tool.
Basic Usage
Decompile APK to a directory (Java source + resources)
jadx app.apk -d output_dir/
Decompile DEX file
jadx classes.dex -d output_dir/
Decompile JAR file
jadx app.jar -d output_dir/
Decompile and show all resources
jadx app.apk -d output_dir/ --show-bad-code
GUI Usage
Launch the GUI
jadx-gui
Open an APK directly
jadx-gui app.apk
# GUI features:
# - Browse package tree (left panel)
# - View decompiled Java (center)
# - Search text/class/method (Ctrl+F / Ctrl+Shift+F)
# - Find usages (right-click → Find usages)
# - Navigate to definition (Ctrl+click)
# - Rename classes/methods (right-click → Rename)
Searching in jadx-gui
# Text search (in decompiled code)
Ctrl+F Search in current file
Ctrl+Shift+F Global search across all classes
# Class/method navigation
Ctrl+N Navigate to class
Ctrl+Shift+N Navigate to file
Ctrl+click Go to definition
Alt+Left/Right Navigate back/forward
CLI Options
Decompile with threads (faster)
jadx app.apk -d output/ -j 8
Include debug information
jadx app.apk -d output/ --debug-info
Export as gradle project (importable in Android Studio)
jadx app.apk -d output/ --export-gradle
Fallback to show raw bytecode on errors
jadx app.apk -d output/ --fallback
Set deobfuscation (rename obfuscated a/b/c → class1/class2)
jadx app.apk -d output/ --deobf
Set minimum string length for deobfuscation rename
jadx app.apk -d output/ --deobf --deobf-min 4
Manual Code Analysis After Decompile
Find hardcoded secrets
grep -r "password\|secret\|apikey\|token\|api_key" output_dir/sources/
Find network URLs
grep -rn "http[s]\?://" output_dir/sources/
Find interesting classes
find output_dir/ -name "*.java" | xargs grep -l "WebView\|executeSQL\|exec("
Find crypto usage
grep -rn "AES\|DES\|RSA\|SecretKey\|KeySpec" output_dir/sources/
Find logging (often reveals debug info)
grep -rn "Log\.\|System\.out\.\|printStackTrace" output_dir/sources/
Analyzing AndroidManifest.xml
Readable XML after decompile
cat output_dir/resources/AndroidManifest.xml
Check for exported components (attack surface)
grep -i "exported=\"true\"" output_dir/resources/AndroidManifest.xml
Check for debuggable flag
grep -i "debuggable" output_dir/resources/AndroidManifest.xml
Check permissions
grep "uses-permission" output_dir/resources/AndroidManifest.xml
Tips
- jadx-gui’s Find usages (right-click on any identifier) is invaluable for tracing data flows
- Use Rename to give meaningful names to obfuscated classes — jadx persists the mapping
--deobfrenames obfuscated identifiers based on length; not perfect but helps readability- For rebuilding/patching, switch to apktool — jadx output can’t be recompiled directly
Help / Man page
jadx [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip)
Options:
-d, --output-dir Output directory
-ds, --output-dir-src Output directory for sources
-dr, --output-dir-res Output directory for resources
-j, --threads-count Number of processing threads
--fallback Make simple dump (no deobfuscation)
--show-bad-code Show inconsistent code
--no-res Do not decode resources
--no-src Do not decompile source code
--deobf Enable deobfuscation
--deobf-min N Min name length for deobfuscation
--deobf-max N Max name length for deobfuscation
--rename-flags Rename flags: source, enum, lowercase, upper
--export-gradle Save as gradle project
--debug-info Include debug information
Vue d’ensemble
jadx décompile les fichiers APK Android et le bytecode DEX en code source Java lisible par un humain. Contrairement à smali (utilisé par apktool), jadx produit un pseudocode Java bien plus facile à lire et à auditer. Il inclut une interface graphique puissante (jadx-gui) et un outil en ligne de commande.
Utilisation de base
# Décompiler un APK vers un répertoire (source Java + ressources)
jadx app.apk -d output_dir/
# Décompiler un fichier DEX
jadx classes.dex -d output_dir/
# Décompiler un fichier JAR
jadx app.jar -d output_dir/
# Décompiler et afficher tout le code, même incohérent
jadx app.apk -d output_dir/ --show-bad-code
Utilisation du GUI
# Lancer le GUI
jadx-gui
# Ouvrir un APK directement
jadx-gui app.apk
# Fonctionnalités du GUI :
# - Parcourir l'arborescence des packages (panneau de gauche)
# - Visualiser le Java décompilé (au centre)
# - Rechercher texte/classe/méthode (Ctrl+F / Ctrl+Shift+F)
# - Trouver les usages (clic droit → Find usages)
# - Naviguer vers la définition (Ctrl+clic)
# - Renommer classes/méthodes (clic droit → Rename)
Recherche dans jadx-gui
# Recherche de texte (dans le code décompilé)
Ctrl+F Rechercher dans le fichier actuel
Ctrl+Shift+F Recherche globale dans toutes les classes
# Navigation classe/méthode
Ctrl+N Aller à la classe
Ctrl+Shift+N Aller au fichier
Ctrl+click Aller à la définition
Alt+Left/Right Naviguer en arrière/avant
Options CLI
# Décompiler avec plusieurs threads (plus rapide)
jadx app.apk -d output/ -j 8
# Inclure les informations de débogage
jadx app.apk -d output/ --debug-info
# Exporter en projet gradle (importable dans Android Studio)
jadx app.apk -d output/ --export-gradle
# Repli sur l'affichage du bytecode brut en cas d'erreur
jadx app.apk -d output/ --fallback
# Activer la désobfuscation (renommer a/b/c obfusqués → class1/class2)
jadx app.apk -d output/ --deobf
# Définir la longueur minimale de chaîne pour le renommage de désobfuscation
jadx app.apk -d output/ --deobf --deobf-min 4
Analyse manuelle du code après décompilation
# Trouver des secrets en dur
grep -r "password\|secret\|apikey\|token\|api_key" output_dir/sources/
# Trouver des URLs réseau
grep -rn "http[s]\?://" output_dir/sources/
# Trouver des classes intéressantes
find output_dir/ -name "*.java" | xargs grep -l "WebView\|executeSQL\|exec("
# Trouver l'utilisation de crypto
grep -rn "AES\|DES\|RSA\|SecretKey\|KeySpec" output_dir/sources/
# Trouver les logs (révèle souvent des infos de debug)
grep -rn "Log\.\|System\.out\.\|printStackTrace" output_dir/sources/
Analyse du AndroidManifest.xml
# XML lisible après décompilation
cat output_dir/resources/AndroidManifest.xml
# Vérifier les composants exportés (surface d'attaque)
grep -i "exported=\"true\"" output_dir/resources/AndroidManifest.xml
# Vérifier le flag debuggable
grep -i "debuggable" output_dir/resources/AndroidManifest.xml
# Vérifier les permissions
grep "uses-permission" output_dir/resources/AndroidManifest.xml
Conseils
- La fonction Find usages de jadx-gui (clic droit sur n’importe quel identifiant) est précieuse pour tracer les flux de données
- Utiliser Rename pour donner des noms explicites aux classes obfusquées : jadx conserve le mapping
--deobfrenomme les identifiants obfusqués selon leur longueur ; ce n’est pas parfait mais ça améliore la lisibilité- Pour reconstruire/patcher, passer à apktool : la sortie de jadx ne peut pas être recompilée directement
Aide / Page de manuel
jadx [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip)
Options:
-d, --output-dir Output directory
-ds, --output-dir-src Output directory for sources
-dr, --output-dir-res Output directory for resources
-j, --threads-count Number of processing threads
--fallback Make simple dump (no deobfuscation)
--show-bad-code Show inconsistent code
--no-res Do not decode resources
--no-src Do not decompile source code
--deobf Enable deobfuscation
--deobf-min N Min name length for deobfuscation
--deobf-max N Max name length for deobfuscation
--rename-flags Rename flags: source, enum, lowercase, upper
--export-gradle Save as gradle project
--debug-info Include debug information