Dex to Java decompiler

Overview

JADX

Build status Alerts from lgtm.com semantic-release License

jadx - Dex to Java decompiler

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

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

Upcoming unstable features:

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

jadx-gui screenshot

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 8 or later 64-bit version. For windows you can download it from adoptopenjdk.net (select "Install JRE").

Install

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

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 file> (.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
  --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
  --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
  --no-inline-anonymous               - disable anonymous classes 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-rewrite-cfg                 - force to save deobfuscation map
  --deobf-use-sourcename              - use source file name as class name alias
  --deobf-parse-kotlin-metadata       - parse kotlin metadata to class and package names
  --rename-flags                      - what to rename, comma-separated, 'case' for system case sensitivity, 'valid' for java identifiers, 'printable' characters, 'none' or '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                      - make simple dump (using goto instead of 'if', 'for', etc)
  -v, --verbose                       - verbose output (set --log-level to DEBUG)
  -q, --quiet                         - turn off output (set --log-level to QUIET)
  --log-level                         - set log level, values: QUIET, PROGRESS, ERROR, WARN, INFO, DEBUG, default: PROGRESS
  --version                           - print jadx version
  -h, --help                          - print this help
Example:
 jadx -d out classes.dex
 jadx --rename-flags "none" classes.dex
 jadx --rename-flags "valid,printable" classes.dex
 jadx --log-level error 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

Comments
  • Support for exporting to proper deobfuscation mapping file formats

    Support for exporting to proper deobfuscation mapping file formats

    Adds support for exporting manually renamed classes/methods/fields etc. in the Tiny v2 format, which is the most versatile out there and can handle a lot more features than JADX's default .jobf format. For more details, see its spec.

    Depends on FabricMC's mapping-io library, which theoretically allows JADX to support many more formats in the future. This PR doesn't add Tiny v2 import support yet, as I don't need it personally atm, but it can be easily added later when needed.

    Fixes #1491.

    Currently working:

    • [x] Exporting classes
    • [x] Exporting fields
    • [x] Exporting methods
    • [x] Exporting method args
    • [x] Exporting method vars
    • [x] Exporting comments
    opened by NebelNidas 33
  • [feature] Support for renaming classes, methods and fields

    [feature] Support for renaming classes, methods and fields

    Hello.

    I added a Rename popup menu item that allows the user to rename classes, methods and fields. It is useful for obfuscated code, it makes it much easier to read. The implementation is very basic and perhaps not optimal, but it works. I pushed it to https://github.com/S-trace/jadx/tree/rename Could you please review it and allow me to open a pull request?

    Thanks.

    new feature 
    opened by S-trace 30
  • Wrong Characters on DexGuarded Classes Names

    Wrong Characters on DexGuarded Classes Names

    Problem

    jadx-bug

    Also deobfuscation of methods and fields is applied but it wasn't enabled on preferences

    package o;
    
    /* renamed from: o.ᴻ */
    public final /* synthetic */ class C implements Qn {
        /* renamed from: ˊ */
        private final HttpInterface f19353;
        /* renamed from: ˏ */
        private final DownloadPdfRequest f19354;
    
        public C(HttpInterface httpInterface, DownloadPdfRequest downloadPdfRequest) {
            this.f19353 = httpInterface;
            this.f19354 = downloadPdfRequest;
        }
    
        public Object apply(Object obj) {
            return LeagueListingFeature.m29926(this.f19353, this.f19354, (PermissionEnum) obj);
        }
    }
    

    Jadx version

    Latest unstable

    Comments contain the right symbol:

    /* renamed from: o.Ч */
    public class C extends C {
        /* renamed from: ˋ */
    

    Sample

    bug deobfuscation 
    opened by enovella 24
  • XML decode errors (missing tags, attributes, etc)

    XML decode errors (missing tags, attributes, etc)

    This app https://play.google.com/store/apps/details?id=ru.abb.mobilebank Proceed to res/xml/config.xml

    A lot of wrong decodes can be found like

        <name
            АК БАРС Online/>
        <description
            Etalon version of OpenWay Mobile Bank/>
        <author email="[email protected]" href="http://openwaygroup.com"
            OpenWay Group/>
    

    or

        <feature name="CardIO">
            <param name="android-package" value="io.card.cordova.sdk.CardIOCordovaPlugin"/>
        </http://www.w3.org/ns/widgets:feature>
        <feature name="PickContact">
            <param name="android-package" value="com.kolwit.cordova.PickContactPlugin"/>
        </http://www.w3.org/ns/widgets:feature>
        <feature name="MMA">
            <param name="android-package" value="com.openwaygroup.ic.otp.MMAPlugin"/>
        </http://www.w3.org/ns/widgets:feature>
        <feature name="InAppBrowserXwalk">
            <param name="android-package" value="com.example.plugin.InAppBrowserXwalk.InAppBrowserXwalk"/>
        </http://www.w3.org/ns/widgets:feature>
        <feature name="Contacts">
            <param name="android-package" value="org.apache.cordova.contacts.ContactManager"/>
        </http://www.w3.org/ns/widgets:feature>
    
    opened by bagipro 23
  • add a smali debugger

    add a smali debugger

    #1136 Hi guys, this debugger works on android 7 , 8(thanks to @Surendrajat for testing), and 11, but it can't get registers on 9 and 10 without debug info in the app.

    And for Android 11, when a register is "zero value", ART won't change such register's value, so we can't set value to it.

    Now it supports to modify fields of this object, surprise~

    For debugging, you must have

    1. adb
    2. a debuggable app, or a rooted device/emulator that can make apps debuggable.

    ps: this debugger will search ANDROID_HOME and PATH to look for adb.

    Features:

    • single step
    • set breakpoint
    • modify register value

    Short cuts:

    • f2 set/remove breakpoint
    • f7 step into
    • f8 step over
    • shift + f8 step out
    • f9 run

    Demo setting up an app to debug

    debugger_present_wait

    adb usage

    debugger_present_adb

    debugging

    debugger_present_debug2

    opened by busmaker 22
  • [core] Gradle issue

    [core] Gradle issue

    Team: Thanks for offering this tool. Lately, "Save as gradleproject" feature is not working for me. Nothing has changed since the time when I had this option functional. Could you clarify the steps involved in creating the gradle project, and whether I need to do anything specific to make this work? OS: Ubuntu 20.0.4

    bug Core 
    opened by srk2014 19
  • use source filename to rename obfuscated class name

    use source filename to rename obfuscated class name

    meet some obfuscated app, the extracted class name and its file name are not friendly

    import java.util.concurrent.LinkedBlockingDeque;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    /* compiled from: MonConfig */
    public class c {
    }
    

    wish a feature it can use the source file name to rename the obfuscated class name.

    the we get

    public class MonConfig{
    }
    

    if multi-class defined in one file, append something like $+number,

    MonConfig$1 MonConfig$2 ...

    then update package statement and import statement and calls update output file name when export

    opened by kissstudio 19
  • Deobfuscator forgets to replace some expressions

    Deobfuscator forgets to replace some expressions

    Hi, please use the following APK https://play.google.com/store/apps/details?id=ru.akbars.mobile

    When you open com.akbars.bankok.activities.legacy.NfcActivity you can see import

    import ru.b.a.b.C4184b;
    

    but in reality it was moved to ru.p313b.p314a.EmvClient.C4184b

    Deobfuscator was ran with args --deobf --deobf-use-sourcename

    opened by bagipro 18
  • type-inference-wip branch: CodegenException, IF can be used only in fallback mode

    type-inference-wip branch: CodegenException, IF can be used only in fallback mode

    Hi, I've noticed tons of such exceptions in Kotlin sources, example is in class com.tinder.profile.presenter.C17676a

    Method generation error in method: com.tinder.profile.presenter.a.a(java.lang.String, java.lang.String, com.tinder.overflowmenu.model.c):void, dex: classes4.dex
    jadx.core.utils.exceptions.CodegenException: Error generate insn: 0x0020: IF  (r4v2 'function1' kotlin.jvm.functions.Function1) == (0 ?[int, boolean, OBJECT, ARRAY, byte, short, char])  -> B:3:0x0028 in method: com.tinder.profile.presenter.a.a(java.lang.String, java.lang.String, com.tinder.overflowmenu.model.c):void, dex: classes4.dex
    	at jadx.core.codegen.InsnGen.makeInsn(InsnGen.java:233)
    	at jadx.core.codegen.InsnGen.makeInsn(InsnGen.java:210)
    	at jadx.core.codegen.RegionGen.makeSimpleBlock(RegionGen.java:109)
    	at jadx.core.codegen.RegionGen.makeRegion(RegionGen.java:55)
    	at jadx.core.codegen.RegionGen.makeSimpleRegion(RegionGen.java:92)
    	at jadx.core.codegen.RegionGen.makeRegion(RegionGen.java:58)
    	at jadx.core.codegen.MethodGen.addInstructions(MethodGen.java:194)
    	at jadx.core.codegen.ClassGen.addMethod(ClassGen.java:320)
    	at jadx.core.codegen.ClassGen.addMethods(ClassGen.java:258)
    	at jadx.core.codegen.ClassGen.addClassBody(ClassGen.java:220)
    	at jadx.core.codegen.ClassGen.addClassCode(ClassGen.java:110)
    	at jadx.core.codegen.ClassGen.makeClass(ClassGen.java:76)
    	at jadx.core.codegen.CodeGen.visit(CodeGen.java:10)
    	at jadx.core.ProcessClass.process(ProcessClass.java:38)
    	at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:292)
    	at jadx.api.JavaClass.decompile(JavaClass.java:62)
    	at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
    Caused by: jadx.core.utils.exceptions.CodegenException: IF can be used only in fallback mode
    	at jadx.core.codegen.InsnGen.fallbackOnlyInsn(InsnGen.java:530)
    	at jadx.core.codegen.InsnGen.makeInsnBody(InsnGen.java:450)
    	at jadx.core.codegen.InsnGen.makeInsn(InsnGen.java:227)
    	... 16 more
    */
    

    APK: https://drive.google.com/file/d/17tlNt1QC4Zs1ES1_cEYyF8MbxZ9Eo73C/view?usp=sharing

    opened by bagipro 17
  • [core] Decompilation res, the style have no parent info.

    [core] Decompilation res, the style have no parent info.

    Decompilation res, open values/styles.xml, the style have no parent info. Like

    <style name="CustomizableHomeTheme" parent="@android:style/Theme.DeviceDefault">
    

    use apktool_2.4.1.jar to decompilation the apk , the parent is complete, use jadx, only have

    <style name="CustomizableHomeTheme">
    

    I find some drawable by xml is lost.

    bug Core 
    opened by weimings 15
  • [core] Use of incorrect Object type in synthetic methods

    [core] Use of incorrect Object type in synthetic methods

    Hi, I've noticed that many synthetic methods are corrupted. Example in class com.google.android.gms.internal.measurement.Df

    public final class Df implements android.os.Parcelable.Creator<com.google.android.gms.internal.measurement.zzx> {
        public final /* synthetic */ java.lang.Object createFromParcel(android.os.Parcel parcel) {
    
        public final /* synthetic */ java.lang.Object[] newArray(int i) {
    

    Type com.google.android.gms.internal.measurement.zzx should be used instead of java.lang.Object

    APK: https://drive.google.com/file/d/1ICfL4A22K-KhVkw5RwvWdLJA8111iYvG/view?usp=sharing

    bug Core 
    opened by bagipro 15
  • [core] java.lang.IllegalStateException: Zip entries count limit exceeded: 100000

    [core] java.lang.IllegalStateException: Zip entries count limit exceeded: 100000

    I'm trying to decompile a 528 megabyte jar, but it seems like it's too big:

    $ du -sch build/*
    528M    large.jar
    528M    total
    
    $ jadx -d decompiled large.jar
    INFO  - loading ...
    ERROR - Failed to process zip file: large.jar
    java.lang.RuntimeException: Failed to process zip file: large.jar
            at jadx.api.plugins.utils.ZipSecurity.visitZipEntries(ZipSecurity.java:115)
            at jadx.api.plugins.utils.ZipSecurity.readZipEntries(ZipSecurity.java:121)
            at jadx.plugins.input.dex.DexFileLoader.collectDexFromZip(DexFileLoader.java:90)
            at jadx.plugins.input.dex.DexFileLoader.load(DexFileLoader.java:73)
            at jadx.plugins.input.dex.DexFileLoader.loadDexFromFile(DexFileLoader.java:50)
            at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
            at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
            at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
            at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
            at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
            at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
            at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
            at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
            at jadx.plugins.input.dex.DexFileLoader.collectDexFiles(DexFileLoader.java:45)
            at jadx.plugins.input.dex.DexInputPlugin.loadFiles(DexInputPlugin.java:37)
            at jadx.plugins.input.dex.DexInputPlugin.loadFiles(DexInputPlugin.java:33)
            at jadx.api.JadxDecompiler.loadInputFiles(JadxDecompiler.java:133)
            at jadx.api.JadxDecompiler.load(JadxDecompiler.java:117)
            at jadx.cli.JadxCLI.processAndSave(JadxCLI.java:48)
            at jadx.cli.JadxCLI.execute(JadxCLI.java:36)
            at jadx.cli.JadxCLI.main(JadxCLI.java:20)
    Caused by: java.lang.IllegalStateException: Zip entries count limit exceeded: 100000, last entry: com/amazonaws/services/identitymanagement/model/UploadSigningCertificateResult.class
            at jadx.api.plugins.utils.ZipSecurity.visitZipEntries(ZipSecurity.java:110)
            ... 20 common frames omitted
    ERROR - Failed to process zip file: large.jar
    java.lang.RuntimeException: Failed to process zip file: large.jar
            at jadx.api.plugins.utils.ZipSecurity.visitZipEntries(ZipSecurity.java:115)
            at jadx.api.plugins.utils.ZipSecurity.readZipEntries(ZipSecurity.java:121)
            at jadx.plugins.input.java.JavaFileLoader.collectFromZip(JavaFileLoader.java:83)
            at jadx.plugins.input.java.JavaFileLoader.loadReader(JavaFileLoader.java:63)
            at jadx.plugins.input.java.JavaFileLoader.loadFromFile(JavaFileLoader.java:42)
            at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
            at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
            at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
            at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
            at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
            at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
            at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
            at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
            at jadx.plugins.input.java.JavaFileLoader.collectFiles(JavaFileLoader.java:37)
            at jadx.plugins.input.java.JavaInputPlugin.loadClassFiles(JavaInputPlugin.java:32)
            at jadx.plugins.input.java.JavaInputPlugin.loadFiles(JavaInputPlugin.java:28)
            at jadx.api.JadxDecompiler.loadInputFiles(JadxDecompiler.java:133)
            at jadx.api.JadxDecompiler.load(JadxDecompiler.java:117)
            at jadx.cli.JadxCLI.processAndSave(JadxCLI.java:48)
            at jadx.cli.JadxCLI.execute(JadxCLI.java:36)
            at jadx.cli.JadxCLI.main(JadxCLI.java:20)
    Caused by: java.lang.IllegalStateException: Zip entries count limit exceeded: 100000, last entry: com/amazonaws/services/identitymanagement/model/UploadSigningCertificateResult.class
            at jadx.api.plugins.utils.ZipSecurity.visitZipEntries(ZipSecurity.java:110)
            ... 20 common frames omitted
    ERROR - Failed to load class data for file: large.jar:META-INF/native/osx/libjansi.jnilib
    jadx.plugins.input.java.utils.JavaClassParseException: Unknown constant pool tag: 0
            at jadx.plugins.input.java.data.ConstantType.getTypeByTag(ConstantType.java:45)
            at jadx.plugins.input.java.data.ClassOffsets.readConstPool(ClassOffsets.java:27)
            at jadx.plugins.input.java.data.ClassOffsets.<init>(ClassOffsets.java:11)
            at jadx.plugins.input.java.data.JavaClassData.<init>(JavaClassData.java:34)
            at jadx.plugins.input.java.JavaClassReader.loadClassData(JavaClassReader.java:18)
            at jadx.plugins.input.java.JavaLoadResult.visitClasses(JavaLoadResult.java:32)
            at jadx.core.dex.nodes.RootNode.loadClasses(RootNode.java:92)
            at jadx.api.JadxDecompiler.load(JadxDecompiler.java:120)
            at jadx.cli.JadxCLI.processAndSave(JadxCLI.java:48)
            at jadx.cli.JadxCLI.execute(JadxCLI.java:36)
            at jadx.cli.JadxCLI.main(JadxCLI.java:20)
    ERROR - Process error:
    java.lang.RuntimeException: Failed to process zip file: large.jar
            at jadx.api.plugins.utils.ZipSecurity.visitZipEntries(ZipSecurity.java:115)
            at jadx.api.ResourcesLoader.loadFile(ResourcesLoader.java:144)
            at jadx.api.ResourcesLoader.load(ResourcesLoader.java:46)
            at jadx.api.JadxDecompiler.getResources(JadxDecompiler.java:399)
            at jadx.api.JadxDecompiler.load(JadxDecompiler.java:122)
            at jadx.cli.JadxCLI.processAndSave(JadxCLI.java:48)
            at jadx.cli.JadxCLI.execute(JadxCLI.java:36)
            at jadx.cli.JadxCLI.main(JadxCLI.java:20)
    Caused by: java.lang.IllegalStateException: Zip entries count limit exceeded: 100000, last entry: com/amazonaws/services/identitymanagement/model/UploadSigningCertificateResult.class
            at jadx.api.plugins.utils.ZipSecurity.visitZipEntries(ZipSecurity.java:110)
            ... 7 common frames omitted
    
    $
    

    I created a stackoverflow

    bug Core 
    opened by geofflangenderfer 1
  • java.lang.IndexOutOfBoundsException: len=-141

    java.lang.IndexOutOfBoundsException: len=-141

    Please describe what you did before the error occurred. IMPORTANT! If the error occurs with a specific APK file please attach or provide link to apk file!

    • Jadx version: 1.4.5
    • Java version: 1.8.0_291
    • Java VM: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM
    • Platform: Mac OS X (10.16 x86_64)
    • Max heap size: 11470 MB
    • Program args: -Xms128M -XX:MaxRAMPercentage=70.0 -XX:+UseG1GC -Dawt.useSystemAAFontSettings=lcd -Dswing.aatext=true -Djava.util.Arrays.useLegacyMergeSort=true
    java.lang.IndexOutOfBoundsException: len=-141
    	at sun.font.FontDesignMetrics.charsWidth(FontDesignMetrics.java:501)
    	at org.fife.ui.rsyntaxtextarea.TokenImpl.getWidthUpTo(TokenImpl.java:601)
    	at org.fife.ui.rsyntaxtextarea.TokenImpl.getWidth(TokenImpl.java:570)
    	at org.fife.ui.rsyntaxtextarea.TokenUtils.getSubTokenList(TokenUtils.java:122)
    	at org.fife.ui.rsyntaxtextarea.WrappedSyntaxView$WrappedLine.calculateLineCount(WrappedSyntaxView.java:1188)
    	at org.fife.ui.rsyntaxtextarea.WrappedSyntaxView$WrappedLine.getPreferredSpan(WrappedSyntaxView.java:1236)
    	at javax.swing.text.View.getMinimumSpan(View.java:250)
    	at javax.swing.text.BoxView.calculateMajorAxisRequirements(BoxView.java:871)
    	at javax.swing.text.BoxView.checkRequests(BoxView.java:930)
    	at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:329)
    	at javax.swing.text.BoxView.layout(BoxView.java:709)
    	at javax.swing.text.BoxView.setSize(BoxView.java:397)
    	at org.fife.ui.rsyntaxtextarea.WrappedSyntaxView.setSize(WrappedSyntaxView.java:1018)
    	at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1722)
    	at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:912)
    	at javax.swing.plaf.basic.BasicTextAreaUI.getPreferredSize(BasicTextAreaUI.java:120)
    	at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
    	at javax.swing.JTextArea.getPreferredSize(JTextArea.java:618)
    	at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:791)
    	at java.awt.Container.layout(Container.java:1513)
    	at java.awt.Container.doLayout(Container.java:1502)
    	at java.awt.Container.validateTree(Container.java:1698)
    	at java.awt.Container.validateTree(Container.java:1707)
    	at java.awt.Container.validateTree(Container.java:1707)
    	at java.awt.Container.validateTree(Container.java:1707)
    	at java.awt.Container.validateTree(Container.java:1707)
    	at java.awt.Container.validateTree(Container.java:1707)
    	at java.awt.Container.validate(Container.java:1633)
    	at javax.swing.RepaintManager$3.run(RepaintManager.java:711)
    	at javax.swing.RepaintManager$3.run(RepaintManager.java:709)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    	at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:708)
    	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1731)
    	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    	at java.awt.EventQueue.access$500(EventQueue.java:97)
    	at java.awt.EventQueue$3.run(EventQueue.java:709)
    	at java.awt.EventQueue$3.run(EventQueue.java:703)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    
    
    opened by VSavitar 1
  • java.lang.IndexOutOfBoundsException: len=-4

    java.lang.IndexOutOfBoundsException: len=-4

    Please describe what you did before the error occurred. IMPORTANT! If the error occurs with a specific APK file please attach or provide link to apk file!

    • Jadx version: 1.4.5
    • Java version: 17.0.3.1
    • Java VM: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM
    • Platform: Windows 10 (10.0 amd64)
    • Max heap size: 11376 MB
    • Program args: -Xms128M -XX:MaxRAMPercentage=70.0 -XX:+UseG1GC -Dawt.useSystemAAFontSettings=lcd -Dswing.aatext=true -Djava.util.Arrays.useLegacyMergeSort=true
    java.lang.IndexOutOfBoundsException: len=-4
    	at java.desktop/sun.font.FontDesignMetrics.charsWidth(FontDesignMetrics.java:505)
    	at org.fife.ui.rsyntaxtextarea.TokenImpl.getWidthUpTo(TokenImpl.java:601)
    	at org.fife.ui.rsyntaxtextarea.TokenImpl.getWidth(TokenImpl.java:570)
    	at org.fife.ui.rsyntaxtextarea.TokenUtils.getSubTokenList(TokenUtils.java:122)
    	at org.fife.ui.rsyntaxtextarea.WrappedSyntaxView$WrappedLine.calculateLineCount(WrappedSyntaxView.java:1188)
    	at org.fife.ui.rsyntaxtextarea.WrappedSyntaxView$WrappedLine.getPreferredSpan(WrappedSyntaxView.java:1236)
    	at java.desktop/javax.swing.text.View.getMinimumSpan(View.java:248)
    	at java.desktop/javax.swing.text.BoxView.calculateMajorAxisRequirements(BoxView.java:872)
    	at java.desktop/javax.swing.text.BoxView.checkRequests(BoxView.java:931)
    	at java.desktop/javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:330)
    	at java.desktop/javax.swing.text.BoxView.layout(BoxView.java:710)
    	at java.desktop/javax.swing.text.BoxView.setSize(BoxView.java:398)
    	at org.fife.ui.rsyntaxtextarea.WrappedSyntaxView.setSize(WrappedSyntaxView.java:1018)
    	at java.desktop/javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1826)
    	at java.desktop/javax.swing.plaf.basic.BasicTextUI.modelToView(BasicTextUI.java:1107)
    	at java.desktop/javax.swing.plaf.basic.BasicTextUI.modelToView(BasicTextUI.java:1085)
    	at java.desktop/javax.swing.text.DefaultCaret.repaintNewCaret(DefaultCaret.java:1348)
    	at java.desktop/javax.swing.text.DefaultCaret$1.run(DefaultCaret.java:1326)
    	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
    	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
    	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
    	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
    	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
    	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
    
    
    opened by thoinv 1
  • [core]APP parsing error, and the overlay cannot parse

    [core]APP parsing error, and the overlay cannot parse

    INFO  - loading ...
    ERROR - Failed to parse '.arsc' file
    jadx.core.utils.exceptions.JadxException: Error decode: resources.arsc
            at jadx.api.ResourcesLoader.decodeStream(ResourcesLoader.java:78)
            at jadx.core.dex.nodes.RootNode.loadResources(RootNode.java:173)
            at jadx.api.JadxDecompiler.load(JadxDecompiler.java:122)
            at jadx.cli.JadxCLI.processAndSave(JadxCLI.java:48)
            at jadx.cli.JadxCLI.execute(JadxCLI.java:36)
            at jadx.cli.JadxCLI.main(JadxCLI.java:20)
    Caused by: java.io.IOException: Encountered unsupported chunk type TYPE_OVERLAY
    at offset 0x5e0260
            at jadx.core.xmlgen.ResTableParser.parsePackage(ResTableParser.java:172)
            at jadx.core.xmlgen.ResTableParser.decodeTableChunk(ResTableParser.java:110)
            at jadx.core.xmlgen.ResTableParser.decode(ResTableParser.java:86)
            at jadx.core.xmlgen.ResDecoder.decode(ResDecoder.java:28)
            at jadx.core.dex.nodes.RootNode.lambda$loadResources$7(RootNode.java:173)
            at jadx.api.ResourcesLoader.decodeStream(ResourcesLoader.java:73)
            ... 5 common frames omitted
            
            
            and  Overlayable cannot be parsed
    
    bug Core 
    opened by w279287350 2
  • [feature] User can set JADX-GUI Key bindings by themselves

    [feature] User can set JADX-GUI Key bindings by themselves

    Describe your idea:

    jade version: 1.4.5 java version: 19.0.1 Mac OS Version: 13.0.1

    Currently I'm using jadx in Macbook whthout using mouse , and I found in Mac OS , I cannot using keyboard to instrumentation the back and forward options. I do not find any method to modify it.

    Here is my Settings View image

    This is Android Studio View, it can set the hotkey by user. image

    new feature 
    opened by C-starm 0
  • [core] Not deterministic XML parsing error

    [core] Not deterministic XML parsing error

    Hey,

    I've caught a really weird bug that throws the following error:

    Error decode xml
    java.lang.NullPointerException: Cannot read the array length because "this.resourceIds" is null
    	at jadx.core.xmlgen.BinaryXMLParser.getAttributeName(BinaryXMLParser.java:361)
    	at jadx.core.xmlgen.BinaryXMLParser.parseAttribute(BinaryXMLParser.java:304)
    	at jadx.core.xmlgen.BinaryXMLParser.parseElement(BinaryXMLParser.java:282)
    	at jadx.core.xmlgen.BinaryXMLParser.decode(BinaryXMLParser.java:125)
    	at jadx.core.xmlgen.BinaryXMLParser.parse(BinaryXMLParser.java:81)
    

    However, this error is thrown with a ~50% chance (in other cases this.resourceIds isn't null). In case of an error, you will see a stacktrace in output logs.

    It leads to incorrect decoding of AndroidManifest.xml:

    <?xml version="1.0" encoding="utf-8"?>>
    ...
    

    and other XML files aren't decoded too

    Arguments:

    jadx --log-level error --output-dir OUT app.apk
    

    APK: https://drive.google.com/file/d/1Sm0d0I1hYW_93HQUcCvt5nEYfMtRJAi-/view?usp=sharing

    UPD: I found a race condition in https://github.com/skylot/jadx/blob/master/jadx-core/src/main/java/jadx/core/xmlgen/ResourcesSaver.java#L32. If AndroidManifest.xml is processed first, no errors will happen. However, if other XML files are processed first, NullPointerException will be thrown and BinaryXMLParser will remain in a corrupted state and output extra >

    bug Core 
    opened by bagipro 0
Releases(v1.4.5)
  • v1.4.5(Oct 20, 2022)

    Features

    • [gui] Option for search results count per page (#1652)
    • [debugger] Add logcat output (#1411)(PR #1666)

    Bug Fixes

    • Don't rename bridged overridden methods (#1672)
    • Don't mark constructor for inline if anonymous class inline is disabled (#1680)
    • Handle possible concurrent exception in method codegen (#1685)
    • Correct fix for all use places of incompatible primitives (#1688)
    • Improve logging messages for zip security errors (#750)(PR #1698)
    • Improve ternary inline, resolve more enum cases (#1686)
    • Restore enum class with custom code in static init (#1699)
    • Handle empty block at end of else-if chain (#1674)
    • [res] Implemented parsing RES_TABLE_TYPE_LIBRARY chunks (#1663)(PR #1664)
    • [debugger] Migrate to fixed jdwp library fork (#1471)
    • [gui] Multi-threading issue in DebugController fixed (#1701) (PR #1702)
    • [gui] Disable HTML rendering in labels if not needed
    • [gui] Update Korean translation (PR #1650)
    • [gui] Update pt-BR translation (PR #1655)
    • [gui] Update zh-TW translation (PR #1694)
    • [gui] Update zh_CN translation (PR #1700)

    Full Changelog: https://github.com/skylot/jadx/compare/v1.4.4...v1.4.5

    Download files description:

    • jadx-gui-1.4.5-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.4.5-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.4.5.zip - cross-platform cli and gui bundle (system JRE must be installed)

    For system JRE the latest version is always preferred, download at oracle.com

    Source code(tar.gz)
    Source code(zip)
    jadx-1.4.5.zip(27.03 MB)
    jadx-gui-1.4.5-no-jre-win.exe(29.32 MB)
    jadx-gui-1.4.5-with-jre-win.zip(53.39 MB)
  • v1.4.4(Aug 20, 2022)

    Features

    • [gui] Add manual search, stop and sort actions to search dialog (#1600)
    • [gui] Save project search history
    • [gui] Show start page on jadx open
    • [gui] Add Brazilian Portuguese translation (PR #1596)
    • Select better resource name (#1581)
    • Add option to disable finally block extraction (#1592)

    Bug Fixes

    • Resolve inherited method to use correct alias (#1582)
    • Check variables before merge in finally block (#1592)
    • Checks for field init reorder (#1599)
    • Handle empty endless loop (#1611)
    • Improve top block search for try/catch (#1633)
    • UnsupportedOperationException on adding a field (#1645)(PR #1646)
    • Don't inline anonymous in self inner class (#1645)
    • [gui] Improve search dialog performance
    • [gui] Improve resources search (#1648)
    • [gui] Improve log viewer dialog (#1311)(PR #1649)
    • [gui] Add constructors usage into class usage (#1591)
    • [gui] Sort resources by deobfuscated name (#1595)(PR #1598)
    • [gui] Correct Frida snippet for constructor (PR #1605)
    • [gui] Fix broken FileDialog by using legacy sort (#1628)(PR #1630)
    • [gui] Handle possible classes overlap in disk cache (#1633)
    • [gui] Disable actions if files not loaded (#1644)
    • [debugger] Resolve NPE in adb device viewer (#1585) (PR #1586)
    • [res] XML "null" decoding (#1583)(PR #1594)

    Full Changelog: https://github.com/skylot/jadx/compare/v1.4.3...v1.4.4

    Download files description:

    • jadx-gui-1.4.4-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.4.4-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.4.4.zip - cross-platform cli and gui bundle (system JRE must be installed)

    For system JRE the latest version is always preferred, download at oracle.com

    Source code(tar.gz)
    Source code(zip)
    jadx-1.4.4.zip(26.16 MB)
    jadx-gui-1.4.4-no-jre-win.exe(28.39 MB)
    jadx-gui-1.4.4-with-jre-win.zip(52.54 MB)
  • v1.4.3(Jul 20, 2022)

    Bug Fixes

    • [gui] Check user renames (#1557)
    • [gui] Allow to use empty name to reset rename
    • [gui] Ignore/limit waiting of canceled search task (#1568)
    • [gui] Forbid rename method args in fallback mode (#1558)
    • [gui] Set current dir directly in file chooser constructor (#1553)
    • [gui] IndexOutOfBoundsException in JumpManager (#1576) (PR #1577)
    • [gui] QuarkReport data validation added and other minor improvements (PR #1556)
    • [gui] Resolve payload offset for switch insns in debug smali code (#1575)
    • [gui] Ignore errors on code area dispose (#1545)
    • Check synthetic methods before remove/inline (#1560)
    • Correct inline/merge with overriden bridge method (#1580)
    • Add more checks before remove or rename enum methods (#1572)
    • Handle parent of inlined/moved classes (#1578)
    • Update deps and fix proto resource loading (AAB) (#1129)
    • Ignore anonymous classes in enclosing node search (#1580)
    • Save classes with code generation error into cache (#1568)
    • Resolve possible decompilation double execution
    • Better dominators algorithms

    Full Changelog: https://github.com/skylot/jadx/compare/v1.4.2...v1.4.3

    Download files description:

    • jadx-gui-1.4.3-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.4.3-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.4.3.zip - cross-platform cli and gui bundle (system JRE must be installed)

    For system JRE the latest version is always preferred, download at oracle.com

    Source code(tar.gz)
    Source code(zip)
    jadx-1.4.3.zip(26.12 MB)
    jadx-gui-1.4.3-no-jre-win.exe(28.35 MB)
    jadx-gui-1.4.3-with-jre-win.zip(52.36 MB)
  • v1.4.2(Jun 20, 2022)

    Yet another mostly bug fix release to resolve regressions from 1.4.1

    Features

    • [gui] Support export to various deobfuscation mapping file formats (#1491)(PR #1505)
    • [gui] Add reload and live reload actions (#1537)
    • [gui] Allow to disable jump on double click (#1540)

    Bug Fixes

    • [cli] Allow decoding resource-only APKs (#1517)(PR #1530)
    • [cli] Remove deprecated --deobf-rewrite-cfg (#1513)
    • [gui] Try to prevent jadx node leaks in UI objects
    • [gui] Improve restoration of windows saved state (PR #1511)
    • [gui] Add volatile and update sync for decompiler field in wrapper (#1518)
    • [gui] Resolve popup menu action run (#1514, #1529)
    • [gui] Correct set highlighted text in search (#1507)
    • [gui] Allow to select file on mapping export
    • [gui] Reset disk cache on new jadx version
    • [gui] Force jadx new version check by default
    • Improve blocks tree compare for finally extract (#1501)
    • Support all-catch in multi-catch (#1510)
    • Improve class search for super call (#1512)
    • Keep types on duplicate cast remove (#1527)
    • Check class name collisions (#1526)
    • Use wide move for long/double store/load java opcodes

    Full Changelog: https://github.com/skylot/jadx/compare/v1.4.1...v1.4.2

    Download files description:

    • jadx-gui-1.4.2-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.4.2-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.4.2.zip - cross-platform cli and gui bundle (system JRE must be installed)

    For system JRE the latest version is always preferred, download at oracle.com

    Artifacts on maven central repository: list. How to use jadx as a library, read on wiki page.

    Source code(tar.gz)
    Source code(zip)
    jadx-1.4.2.zip(26.00 MB)
    jadx-gui-1.4.2-no-jre-win.exe(28.23 MB)
    jadx-gui-1.4.2-with-jre-win.zip(52.36 MB)
  • v1.4.1(May 31, 2022)

    Bug fix release to resolve regressions from 1.4.0

    Bug Fixes

    • [gui] Correct handle of selected file in save dialog
    • [gui] Improve usage search, refactor java nodes creation (#1489)
    • [gui] Resolve cast exception for variable reference (#1489)
    • [gui] Save variable name to show in tooltip (#1487)
    • [gui] Save full type info in metadata (#1487)
    • [gui] Correct merge for plugin options from command line (#1490)
    • [gui] Complete Chinese Translation (PR #1492)
    • [gui] Correct close and reopen for decompiler and cache
    • [res] Ignore version in AndroidManifest.xml (#1502)(PR #1504)
    • Save cache dir for reuse on project save/reopen
    • Remap class names for store in disk cache (#1503)
    • Check if directory exists before delete (#1493)
    • Use variable length encoding instead short for offsets (can overflow) (#1489)
    • Skip dex files with parsing errors (#1495)

    Features

    • [gui] Add parameters logging in Frida code snippet (#1497)(PR #1498)

    Full Changelog: https://github.com/skylot/jadx/compare/v1.4.0...v1.4.1

    Download files description:

    • jadx-gui-1.4.1-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.4.1-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.4.1.zip - cross-platform cli and gui bundle (system JRE must be installed)

    For system JRE the latest version is always preferred, download at oracle.com

    Artifacts on maven central repository: list. How to use jadx as a library, read on wiki page.

    Source code(tar.gz)
    Source code(zip)
    jadx-1.4.1.zip(25.86 MB)
    jadx-gui-1.4.1-no-jre-win.exe(28.08 MB)
    jadx-gui-1.4.1-with-jre-win.zip(52.23 MB)
  • v1.4.0(May 21, 2022)

    Features

    • [gui] Disk code cache and search rewrite (PR #1483)
    • Allow to load custom input (#1457)
    • Allow to include/exclude dependencies when saving with class filter (#1466)(PR #1467)

    Bug Fixes

    • [cli] Don't ignore critical errors (#1150)
    • [gui] Resolve NPE on project save (#1463)(PR #1464)
    • [gui] Confirm directory loading on file open (#1462)
    • [gui] Fix IndexOutOfBoundsException when switching between tabs via mouse wheel (#1456)(PR #1469)
    • [gui] Editor theme loading and error/fallback handling improved (#1476)(PR #1478)
    • [gui] Ask for project file path on exit (#1474)
    • [gui] Escape class, method and field names in Frida code snippet (PR #1480)
    • [gui] Add missing Use debug info option
    • [gui] Use alias for types in tooltips (#1487)
    • Better code styling for if-else blocks (#1455)
    • Workaround to prevent incorrect order after move inline (#1472)
    • Use alias for variable names (#1487)

    Breaking changes in Jadx API

    • ICodeInfo: lines and code annotations moved to new interface ICodeMetadata with helpful search methods
    • Changes for all code annotations methods to use ICodeAnnotation instead plain Object.

    Full Changelog: https://github.com/skylot/jadx/compare/v1.3.5...v1.4.0

    Download files description:

    • jadx-gui-1.4.0-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.4.0-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.4.0.zip - cross-platform cli and gui bundle (system JRE must be installed)

    For system JRE the latest version is always preferred, download at oracle.com

    Artifacts on maven central repository: list. How to use jadx as a library, read on wiki page.

    Source code(tar.gz)
    Source code(zip)
    jadx-1.4.0.zip(25.85 MB)
    jadx-gui-1.4.0-no-jre-win.exe(28.06 MB)
    jadx-gui-1.4.0-with-jre-win.zip(52.22 MB)
  • v1.3.5(Apr 20, 2022)

    Features

    • Add 'simple' decompilation mode
    • [gui] Add split view for different decompilation modes

    Bug Fixes

    • Handle inlined classes while collecting override related methods (#1422)

    • Use correct reference for replaced bridge constructor (#1441)

    • Handle wildcard in invoke type resolver (#1238)

    • Update class set to Android 32

    • Replace fixed memory limit with -XX:MaxRAMPercentage=70.0 (#1437)

    • Various minor improvements (PR #1418)

    • [cli] Use correct converter for "--decompilation-mode" option (#1434)(PR #1435)

    • [debugger] Resolve IO read problems, proper socket closing (PR #1414)

    • [deobf] Fix writing method mappings as fields entries (#1432)(PR #1433)

    • [gui] Rename class while rename constructor (#1441)

    • [gui] Restore open tabs on project load (regression fix)

    • [gui] Don't highlight whitespaces and special symbols (#1429)

    • [gui] Check free memory after GC attempt

    • [gui] Update Traditional Chinese translation (PR #1452)

    • [res] Ignore resource chunk entries that are located after the resource chunk end (#751)(PR #1436)

    Full Changelog: https://github.com/skylot/jadx/compare/v1.3.4...v1.3.5

    Download files description:

    • jadx-gui-1.3.5-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.3.5-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.3.5.zip - cross-platform cli and gui bundle (system JRE must be installed)

    For system JRE the latest version is always preferred, download at oracle.com

    Artifacts on maven central repository: list. How to use jadx as a library, read on wiki page.

    Source code(tar.gz)
    Source code(zip)
    jadx-1.3.5.zip(25.73 MB)
    jadx-gui-1.3.5-no-jre-win.exe(27.96 MB)
    jadx-gui-1.3.5-with-jre-win.zip(52.13 MB)
  • v1.3.4(Mar 20, 2022)

    Features

    • Support MethodParameters attribute (#1260)
    • Plugin options: add verify checksum option for dex input (#1385), options for java-convert plugin
    • [gui] Dialog for showing exception details and creating an GitHub issue (PR #1399)
    • [gui] Add zoom in/out actions (#1403)

    Bug Fixes

    • Improve class names collision detection (#1406)
    • Allow implicit type cast for array operations (#1407)
    • Allow zero skips for restore new filled array
    • Load files also by extension (#1391)
    • Prevent NPE on 'ignore' deobf map file mode
    • [cli] Resolve regression in applying '-v' and '-q' options
    • [debugger] Handle stream end and partial reads (#1412)
    • [gui] Prevent NPE on open preferences without loaded files (#1385)
    • [gui] IllegalArgumentException when saving project to a different directory than the APK file (#1387)(PR #1388)
    • [gui] Initialize project name with loaded files (shown in Jadx title) (#1386)(PR #1393)
    • [gui] Revert contextual keywords to identifiers (#1394)
    • [gui] Handle package version in update check (#1397)
    • [gui] Don't use hardcoded color for link component (#1398)
    • [gui] Download only latest version info for jadx update (#1397)
    • [gui] Resolve NPE and fix code style in BreakpointManager
    • [gui] Reduce threads count on low memory (#1410)

    Full Changelog: https://github.com/skylot/jadx/compare/v1.3.3...v1.3.4

    Download files description:

    • jadx-gui-1.3.4-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.3.4-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.3.4.zip - cross-platform cli and gui bundle (system JRE must be installed)

    For system JRE the latest version is always preferred, download at oracle.com

    Artifacts on maven central repository: list. How to use jadx as a library, read on wiki page.

    Source code(tar.gz)
    Source code(zip)
    jadx-1.3.4.zip(29.17 MB)
    jadx-gui-1.3.4-no-jre-win.exe(31.93 MB)
    jadx-gui-1.3.4-with-jre-win.zip(55.51 MB)
  • v1.3.3(Feb 20, 2022)

    Features

    • [gui] Add Frida snippet copy action (#1355)(PR #1356)
    • [gui] Add Xposed snippet copy action (PR #1383)
    • [gui] Ctrl+c copy highlighted word in code view (#1292)
    • [gui] Ctrl+c copy node string in search window (#293)
    • [cli] Improve single file mode (#1344)(#1384)
    • [deobf] Do not deobfuscate known top level domains with 2 or 3 characters (PR #1369)
    • Add option for deobfuscation map file handle mode (#1351)
    • Support multi-entry loops (simple case) (#1320)
    • Check dex checksum before parsing (#1343)

    Bug Fixes

    • Support full class name in inner generic types (#1340)
    • Correct use of class names for inner types (#1340)
    • Update field usage on const replace (#1348)
    • Don't inline named variables (#1338)
    • Prevent endless loop in path cross search (#1360)
    • Prevent endless loop in anonymous class analysis (#1382)
    • Check names from Kotlin metadata before use (#1364)
    • Nested try catches with overlap try blocks (#1374)(PR #1375)
    • Correct code reload after rename (#1378)
    • Inline nested anonymous classes (#1379)
    • Remove shadowed catch handlers (#1377)
    • [cli] Fix and add debug log messages in initialization phase (PR #1362)
    • [deobf] Collect missing renames for .jobf file (#1350)(PR #1353)
    • [gui] Find usage for overridden methods (#1349)(PR #1352)
    • [gui] Results in usage search sorted by name (PR #1363)
    • [gui] Missing icons and html decorations in usage dialog
    • [gui] Split decompile and index tasks for correct time counting (#1361)
    • [res] Improved decoding of flag attributes in binary XML files (#1156)(PR #1359)
    • [res] Skip '.9.png' decode if patch data not found (#1112)

    Performance

    • Improve ternary mod on big methods (#1379)

    Full Changelog: https://github.com/skylot/jadx/compare/v1.3.2...v1.3.3

    Download files description:

    • jadx-gui-1.3.3-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.3.3-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.3.3.zip - cross-platform cli and gui bundle (system JRE must be installed)

    For system JRE the latest version is always preferred, download at oracle.com

    Artifacts on maven central repository: list How to use jadx as a library, read on wiki page.

    Source code(tar.gz)
    Source code(zip)
    jadx-1.3.3.zip(29.12 MB)
    jadx-gui-1.3.3-1-no-jre-win.exe(31.88 MB)
    jadx-gui-1.3.3-with-jre-win.zip(55.44 MB)
  • v1.3.2(Jan 20, 2022)

    Core

    • Use Kotlin intrinsic methods for variables rename (#1207)
    • Improve anonymous class inline (#523)
    • Correct literal negate for double and float (#1334)
    • Add explicit type for non-int constants (#1336)
    • Simplify cascading casts (#1336)
    • Wrap negative literals before cast (#1327)
    • Handle method override with several bases (#1234)
    • Precalculate class deps for inline methods (#1339)
    • Skip input file name checks by zip name validator (#1310)
    • Use secure XML parser for process manifest

    GUI

    • Processing threads spinner initialization (#1331)(PR #1332)
    • Correct handling for tree row click (#1324)
    • Reduce tree focus switching
    • Use relative file paths in .jadx project file (#1312) (PR #1313)
    • For Smali debugger: support multiple main <action> and <activity-alias> tags (#1322)(PR #1323)

    Download files description:

    • jadx-gui-1.3.2-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.3.2-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.3.2.zip - cross-platform cli and gui bundle (system JRE must be installed)

    For system JRE the latest version is always preferred, download at oracle.com

    Artifacts on maven central repository: list How to use jadx as a library, read on wiki page.

    Source code(tar.gz)
    Source code(zip)
    jadx-1.3.2.zip(23.53 MB)
    jadx-gui-1.3.2-no-jre-win.exe(25.72 MB)
    jadx-gui-1.3.2-with-jre-win.zip(49.85 MB)
  • v1.3.1(Dec 19, 2021)

    Core

    • Don't unload field init values (#1277)
    • Handle super case for invokespecial opcode (#1300)
    • Improve try/catch bounds detection (#1303)
    • Handle move-result after invoke-custom with string concat
    • Use correct top block for try blocks with same start (#1304)
    • Invoke in nested anonymous classes (#1305)
    • Add merged condition blocks for loop region (#1307)
    • Add option to use dx/d8 for convert java bytecode (#1299)
    • Add comments with option references to improve usability

    GUI

    • Smali code highlighting (PR #1283)
    • Allow to minimize/maximize search windows (#1298)
    • Update Quark report parsing (#1289) (PR #1291)
    • Forward navigation shortcut on macOS (#1297)(PR #1301)
    • Restore usage data after class reload (#1281)
    • Include inlined classes in usage search (#1285)
    • Add Traditional Chinese translation (PR #1306)
    • Update Chinese translation (PR #1284, PR #1287, PR #1296)
    • Update German translation (PR #1290)

    Download files description:

    • jadx-gui-1.3.1-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.3.1-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.3.1.zip - cross-platform cli and gui bundle (system JRE must be installed)

    Also, jadx artifacts now available on maven central repository: view on maven How to use jadx as a library read on wiki page.

    Source code(tar.gz)
    Source code(zip)
    jadx-1.3.1.zip(23.44 MB)
    jadx-gui-1.3.1-no-jre-win.exe(25.59 MB)
    jadx-gui-1.3.1-with-jre-win.zip(49.63 MB)
  • v1.3.0(Nov 20, 2021)

    Core

    • Initial support for 'invoke-custom' instruction (#384)
    • Initial support for java bytecode decompilation
    • Concat constant strings (#1014)
    • Rewrite try-catch processing
    • Support AAR files as input (#1034)
    • Support Android App Bundle (#1129) (PR #1131)
    • Add option to change deobfuscation map file (#1117)
    • Add option to disable methods inline (#1170)
    • Improve decompilation speed (#1269)

    GUI

    • Add a smali debugger (#1136) (PR #1137)
    • Support code comments (#359) (PR #1127)
    • Use FlatLaf for themes support
    • Use SVG icons (PR #1221)
    • Add Quark-Engine integration (#1119) (PR #1135)
    • Allow to use regex in the search dialog (PR #1069)
    • Search in resource files (#347) (#1032) (PR #1108)
    • Improve exclude package feature (#1151) (PR #1152)
    • Add option to change line numbers mode (#1223)
    • Rename without deobfuscation, save renames in project (#1076 #1022)
    • Save open tabs in project file
    • Improve smali printer to show bytecode (#1114) (PR #1126)

    Download files description:

    • jadx-gui-1.3.0-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.3.0-no-jre-win.exe - jadx-gui single exe (system JRE must be installed)
    • jadx-1.3.0.zip - cross-platform cli and gui bundle (system JRE must be installed)
    Source code(tar.gz)
    Source code(zip)
    jadx-1.3.0.zip(17.36 MB)
    jadx-gui-1.3.0.1-no-jre-win.exe(18.95 MB)
    jadx-gui-1.3.0.1-with-jre-win.zip(43.56 MB)
  • v1.2.0(Nov 14, 2020)

    Main changes

    • gui: support for renaming methods, classes and fields
    • gui: allow to load multiple files, button for add files
    • res: fix duplicate entries and deobfuscate file names in XML resources
    • core: improved generics and varargs restore
    All changes

    Features

    • add methods information from standard library, improve generics and varargs restore (#836) (dea7714)
    • deobf: add classname parsing for Kotlin metadata (PR #842, #758) (492a3f6)
    • deobf: improve deobfuscated class names by including class properties and info about super class respectively implemented interfaces (PR #969) (1774dc7)
    • gui: add Messages_de_DE.properties (PR #804) (553f5b0)
    • gui: allow to load multiple files, button for add files (#936) (278c5f6)
    • gui: allow to search for full method/field signature, not only the name (PR #880) (c1f4302)
    • gui: map back and forward mouse keys for navigation (#807) (9ab003d)
    • gui: on mouse hover highlight identifiers with enabled actions (like 'find usage' or 'rename') (94a06d9)
    • gui: rename classes and fields by popup menu in tree panel (PR #993) (9f68493)
    • gui: reopened tabs on file reload (PR #793 #792) (78eed86)
    • gui: support for renaming methods, classes and fields (PR #794 #791) (e3055b9)
    • res: fix duplicate entries and deobfuscate file names in XML resources (PR #995) (71617a1)
    • res: rename resources keys if contains unprintable chars or duplicates (#844) (PR #909) (315c07d)

    Performance Improvements

    • gui: reduce updates count for memory usage bar (#1000) (9277341)
    • res: speed up rename of deobfuscated resources (d1e5186)

    Bug Fixes

    • add cast to exact type on field access (#729) (ae31fee)
    • add methods and fields types into usage info (#729) (e7b00cc)
    • added another enum restore pattern (#926) (aa8fd3c)
    • additional casts at use place to help type inference (#1002) (2b7d7ce)
    • additional checks before insert move to help type inference (#843) (5502d93)
    • additional checks for 'if' blocks inside loops (#809) (04e309a)
    • additional checks for class signature (e09e933)
    • additional patterns to restore enum classes (#830) (62ca30b)
    • additionally show smali code of all inner classes (recursively) (PR #849, #848) (bd0d248)
    • additionally show smali code of inner classes (PR #824) (c97e504)
    • adjust limits to skip processing of large methods (#1012) (e054ea6)
    • adjust types for arithmetic instructions (#921) (60b2353)
    • allow cross-block move inline (#946) (440357d)
    • allow to inline variables around 'monitor-exit' in synchronized block (13609a5)
    • allow to regenerate class code (#791) (1c6e51f)
    • attach method details before OverrideMethodVisitor (d59c99d)
    • bring back smali files support (#961) (558a867)
    • check enum constructor content before removing (#922) (f3cd4e3)
    • checks for casts in field access, move method inline to visitor (#962) (691bf8f)
    • class resolving issues (#867) (5eec8f7)
    • collect class usage and fix class access modifiers (#729) (d720179)
    • concurrent access may cause an java.lang.ClassCastException in JNodeCache (PR #864) (4520747)
    • correct detection of exits in synchronized block (#942) (d6ad21f)
    • correct merge code variables across PHI instructions (#930) (0deafb7)
    • correct method exit blocks collection (#876) (4cdad0e)
    • correct parsing for array-data-payload (bcd6e53)
    • correct skip size for sparse switch payload (7d29c5d)
    • correct type and data merge for filled-array instruction (89b4ae6)
    • correctly process extended enums if class is not inner (#924) (4e3d858)
    • deep reload for inner classes, const values and anonymous classes (9dbffef)
    • do not copy input files as resources to output folder (2a2b83a)
    • don't add @Override for static methods (#976) (6428f29)
    • don't add @Override if super method is private (#976) (cfaa6ab)
    • don't add cast for PHI insn (#1002) (a22efc2)
    • don't apply again already resolved types (#1012) (5f659c8)
    • don't apply const split if not needed (71bf2aa)
    • don't apply types if search failed (#840) (1ce8fa8)
    • don't duplicate result arg with instruction copy (breaks SSA variable assign) (4dc4aa1)
    • don't generate string concatenation without assign to variable (58722d3)
    • don't inline 'null' object to make code compilable (#964) (545cd4e)
    • don't inline constants in synchronized statement (#799) (f5d1f28)
    • don't modify method argument types in MethodInvokeVisitor (#927 #836) (b1d5ed0)
    • don't print commented case value if it is an instruction (#850) (fcb70e6)
    • don't remove synthetic methods from enum (#884) (9d8066f)
    • don't trust type info in signature, check before apply (#858) (2d641bf)
    • don't use FileChannel on ZipFs to avoid creation of temp files (#950) (a83ca1f)
    • don't use OS specific new line chars (#861) (fa0a38d)
    • don't use static vars of mutable LiteralArg class (#1005) (8ca3cd3)
    • exclude directories from dex convertion results (b219ab6)
    • handle method arguments in primitive types conversion (#956) (bfd60b7)
    • handle xor on boolean (#921) (1bbcac2)
    • improve 'out' block detection in switch (#826) (2107da2)
    • improve boolean type handling in type inference (3143418)
    • improve checks for boolean to int conversion (#921) (714b935)
    • improve ClassNode reloading and revert some changes (0c4b807)
    • improve limit calculation for type updates in type inference (#854) (3e9f4a5)
    • improve resource type detection and remove deprecated method (cd006ce)
    • improve type inference for arrays (#837) (519a74e)
    • improve type inference for generics in invoke insn (#927) (404136c)
    • improve type inference of type variables in method invoke (#913) (6192ced)
    • improve wildcard types compare (#857) (e444ecb)
    • inline assignment instruction from same block (#820) (c24a3ed)
    • inline class constants to fix enum transform (#916) (2207cd7)
    • inline move instructions to help process constructors (#927) (e22474e)
    • load .class files (444ea9e)
    • make class public if some method going to be inlined (#729) (15776c4)
    • make correct replacement for synthetic constructor (#808) (0221380)
    • mark override methods and fix return type (#913) (0692464)
    • method info cache error (#868) (49a82c8)
    • more visibility checks for @Override (#984) (4e4c7f7)
    • move class unload to synchronized block (#977) (73ca2e0)
    • preserve code semantics on array-for-each transform (#893) (a5ea560)
    • prevent endless loop in method signature parsing (#1007) (009939f)
    • prevent zipbomb forged headers attacks (#980, PR #982) (9b1761f)
    • record inlined classes and generate Smali code for them (PR #851, #848) (4859629)
    • redone shadowed fields handling (#897) (7f5092c)
    • reload request for correct class in method inline visitor (#999) (aec8ebe)
    • remove enum methods after instructions check (#884) (2f780da)
    • remove move instructions with unused result (#835) (49ce92f)
    • replace constants for arrays in annotations (#831) (26bad4a)
    • replace constants inside annotations (#831) (2921c66)
    • replace type variables in arrays (#913) (85760cc)
    • rerun signature parser on class reload (#981) (14cbfbc)
    • resolve char literal incorrect print as string (#856) (0f808d5)
    • resolve class cast exception introduced in CodeWriter refactoring (#810) (0c55ab9)
    • resolve ClassCastException on encoded value access (#946) (5e62b90)
    • resolve error in SkipMethodArgsAttr if method not yet loaded (#924) (8785232)
    • resolve exception on assign inline (f1e2291)
    • resolve generic types in method arguments (#913) (09e267f)
    • resolve multi-threaded unloading (bb0fad2)
    • resolve NPE while compare outer generic types (89dbae8)
    • resolve several issues with package rename and class reload (#987) (e2b4280)
    • resolve some cases of switch in loop (#876) (2da772d)
    • resolved regression in Kotlin metadata parser (91ee756)
    • restart comment to escape strings in insn fallback dump (f482b8b)
    • restore android R class (#947) (regression) (65553c1)
    • restore enum for java 15 (408201b)
    • restore enum for several blocks in class init method (57c28c6)
    • several improvements for generics and type inference (459f12d), closes #956
    • shrink code if region maker add FORCE_ASSIGN_INLINE to insn (#845) (d0f197e)
    • speed up switch processing by skip not relevant exits (#846) (1336c47)
    • split CONST used in PHI to help type inference (#900) (a7f315f)
    • transform loop to for with branching at end (33f2c3f)
    • try raw types to help type inference (#913) (7cd77ae)
    • use super instead this when super member is shadowed (PR #878) (3c7be5e)
    • use correct class for Throwable, insert catch arg name if not defined (#896) (47dadf0)
    • use internal usage info for rename, fix index refresh (#791) (ae26512)
    • use recursive objects for nested inner generic classes (#869) (f5767dd)
    • workaround for link clicks in RSyntaxTextArea (#929) (45b7304)
    • deobf: resolve NPE when package is empty (if rename is disabled) (e3f388a)
    • gui: add Deutsch to locales list (#804) (8421157)
    • gui: add dots for progress titles (99eb31b)
    • gui: allow to rename packages (#987) (c0a8197)
    • gui: clear jumps history on file close (12dc4fd)
    • gui: correct app close on menu exit action (a2df92d)
    • gui: fix rename dialog pack (#972) (b76c882)
    • gui: improve Deutsch translation (PR #806) (1568008)
    • gui: load file in background thread and show progress indicator (9c88f70)
    • gui: merge plugins service files (#949) (4b18867)
    • gui: only show renaming option for JClass, JField and JMethod (PR #1001) (7353790)
    • gui: RenameDialog: Warn user if deobfuscation settings are invalid (PR #935) (705ceca)
    • gui: resolve --select-class option regression (PR #816) (287275d)
    • gui: resolve exceptions during index (#812) (af6f8b5)
    • gui: run indexJob before rename (PR #910) (8a8b945)
    • gui: search class with --select-class also by not deobfuscated names (55eb86d)
    • gui: search only in short names of methods and fields (#818) (8365855)
    • gui: update Deutsch translation (PR #811) (3b9b103)
    • gui: update Messages_zh_CN.properties (PR #959) (f696dc7)
    • gui: use correct charset when writing mapping file (PR #992) (ff6665c)
    • gui: use env %JAVA_HOME% as the JRE path (PR #895) (c62039f)
    • res: fixes deobfuscated resource text files saving (PR #1004) (804c8ef)
    • res: put deobfuscated files to res/ folder (PR #995) (f0e6c8e)
    • res: resource XML generation for parent attribute added (PR #933, #931) (c7a12ad)
    • res: skip unused bytes in xml attributes parsing (#1013) (82d4099)
    • res: XML parsing: handling of TYPE_DYNAMIC_REFERENCE entries (#919, PR #923) (258ecad)
    • xml: reset nsMap in parse method (PR #798 #796) (ef5da49)

    Download files description:

    • jadx-gui-1.2.0-with-jre-win.zip - jadx-gui with bundled JRE
    • jadx-gui-1.2.0-no-jre-win.exe - jadx-gui single exe, system JRE must be installed
    • jadx-1.2.0.zip - cross-platform cli and gui bundle, system JRE must be installed
    Source code(tar.gz)
    Source code(zip)
    jadx-1.2.0.zip(14.71 MB)
    jadx-gui-1.2.0-no-jre-win.exe(16.22 MB)
    jadx-gui-1.2.0-with-jre-win.zip(41.41 MB)
  • v1.1.0(Dec 7, 2019)

    1.1.0 (2019-12-07)

    Features

    • initial deboxing implementation (#717) (fd7d08c)
    • cli: add options for change log level (#735) (bc7a748)
    • gui: add class links for AndroidManifest.xml and other minor fixes (c8df26f)
    • gui: support APK signature v3 (PR #773) (cf3e17c)

    Performance Improvements

    • gui: speed up line numbers rendering (#714) (3bc9671)

    Bug Fixes

    • add assign for inlined getter methods (ccb8ed1)
    • add dummy class if class loading exception occur (#763) (d3ecc1f)
    • add explicit cast for byte literal in method invoke (#719) (be9dae5)
    • add generic types propagation (#695) (ed8c662)
    • adjust insn reorder check in code shrink visitor (#695) (3eee83c)
    • always cast null objects in overloaded method (#707) (12bb632)
    • check that iteration variable in for-each loop not used outside (#708) (24dc686)
    • comment out instructions also before other constructor call (#685) (533b686)
    • comment out instructions before super call in constructor (#685) (c6c54f9)
    • convert inner enums and fix inner classes reference (#719) (4629043)
    • don't change AST before checks in ternary transform (#710) (b32dc17)
    • don't eliminate StringBuilder if no String arg present (4b314e9)
    • don't override type of method parameter in const deboxing (#723) (ddedb8d)
    • don't run class process from visitors to avoid deadlock (#743) (db892ad)
    • don't stop loading classes in case of an error (PR #764) (902247f)
    • duplicate result arg on instruction copy (11db454)
    • force cast for null args in method invoke (temp fix for #724) (08f9a90)
    • force one branch ternary in constructors (#685) (8410e62)
    • handle incorrect args count in signature (#763) (00f5e83)
    • handle methods with all NOPs (#744) (bd9e109)
    • ignore finally extraction with only one 'if' instruction (#709) (a587ce8)
    • ignore incorrect dex files in apk (#700) (c3f7a04)
    • improve exception handler remove (#703) (3ae8359)
    • improve finally extraction (49e234d)
    • improve StringBuilder elimination (#704) (a530371)
    • incorrect init values of inherited fields (ed9fe8a)
    • increase region iterative traversal limit (#767) (9f06d67)
    • inline assign in complex conditions (#699) (d1a6841)
    • inline constant strings (#685) (424a8ff)
    • instead commenting move constructor call to the top (#704) (c8de7b9)
    • jadx-gui.bat and jadx.bat do not work (#692) (PR #694) (29a137b)
    • make correct class members loading in jadx api (#742) (1cbaad3)
    • make correct hash calculation for GenericObject type (#705) (e4fc677)
    • merge const block before return (#699) (bae36f9)
    • preserve arg type on PHI insn inline (#718) (8321d5e)
    • protect method from second load (6b76a3c)
    • read correct buffer size for string pool parsing (#712) (15d56ab)
    • remove synchronization lock for code generation (#726) (068234f)
    • rename packages with reserved names (#711) (c555cd0)
    • resolve code generation error for interface methods (#775) (a48ce29)
    • resolve error if input file don't has extension (600842a)
    • resolve some multi-thread issues (472aa52)
    • several improvements for multi-variable type search (#720) (1e6b303)
    • sort inner classes and methods by source lines (e4e6f37)
    • support instructions removing in SimplifyVisitor (2dbdd1f)
    • try to resolve generic type variables (#662) (db2b537)
    • unbind unused ssa variable after ternary conversion (#708) (aad2d24)
    • use nice name for 'package-private' in modifiers change message (e842e02)
    • workaround for IntelliJ bug on import line in build.gradle (PR #766) (3249a5e)
    • gui: add default contructor for classes serialized with GSON (#752) (d1ac43d)
    • gui: compare files extension in case insensitive way (9fbf9ef)
    • gui: fix "Go to declaration" and "Find usage" menu actions (ff5f6fc)
    • gui: fix search if class contains not generated inner class (#755) (f228a72)
    • gui: ignore mouse click on empty space in tree (#737) (7bc01dc)
    • gui: update Chinese translation (PR #697) (0f5fd4e)
    • gui: use editor font on tabs (3578f7d)
    • gui: yet another fix for broken find usage action (a71bb7a)
    • res: skip string if parsing failed (#712) (8e8a2fa)
    Source code(tar.gz)
    Source code(zip)
    jadx-1.1.0.zip(14.31 MB)
    jadx-gui-1.1.0-no-jre.exe(15.79 MB)
    jadx-gui-1.1.0-with-jre-windows.zip(43.07 MB)
  • v1.0.0(Jun 20, 2019)

    1.0.0 (2019-06-20)

    BREAKING CHANGES

    • some parts of jadx was rewritten from scratch:
      • type inference
      • variable declaration
      • finally block extraction

    Features

    • output decompilation results in json format (#676) (ed385e8)
    • support smali files (#391) (PR #588) (d23f4ac)
    • add a flag to disable debug info (#276) (PR #502) (d111fd0)
    • add generic method information to .jcst (PR #564) (fe41174)
    • add option to disable anonymous class inline (#633) (e7e7b66)
    • add options to configure "renaming" (#570) (PR #582) (74a72a5)
    • new implementation for type inference approach and variable declaration (e026345)
    • cli: decompile only a single class (PR #657) (6f973ca)
    • gui: add "Go To Declaration" in menu (PR #618) (aa41a4d)
    • gui: save the class tree width and restore it upon jadx-gui start (PR #606) (65818dc)
    • gui: save tree expansions in project (PR #605) (f803973)
    • gui: select a class to open via command-line (PR #658) (fef3e55)
    • gui: show smali (#197) (PR #635) (031582d)

    Bug Fixes

    • add cast for null in overloaded methods (#636) (PR #637) (77cee15)
    • add correct type propagation for check-cast and move instructions (#401) (7bd1752)
    • add labels from NOP instructions in fallback mode (#666) (5efe4bd)
    • add missing import for class generics map (PR #480) (dd2e7e8)
    • add more details for variable with type inference error (2dea6f5)
    • add primitive cast in ternary for byte and short (PR #601) (632cc3e)
    • additional checks for loop exit edges and 'for' conversion (#483) (6e66dc2)
    • additional checks for synthetic methods remove, rename and inline (#452) (28d348b)
    • allow APK files without code (no contained dex files) (PR #455) (91691fb)
    • allow override type with wider one only from debug info (#403) (b9fffa1)
    • always use FileUtils.createTempFile (PR #634) (cab3f5d)
    • avoid ConcurrentModificationException in EliminatePhiNodes pass (e1ca290)
    • avoid local variables collision with full class names (#647) (52ba33c)
    • better String constructor from byte and char arrays (#530) (PR #533) (ec66476)
    • bitwise or/and with non-boolean (#628) (PR #629) (9645f33)
    • byte to number without cast (#596) (PR #638) (e1dfb4e)
    • cast of int-to-(number) when int is boolean (#596) (PR #602) (c134329)
    • change exception to soft warning for getType in RegisterArg (3492ec3)
    • change type update collection to produce deterministic results (68d074a)
    • check block before insert additional move instruction for type inference (cbdc249)
    • check if synthetic class not yet processed but must be removed (#450) (d069928)
    • check variable usage before convert indexed loop to for-each variant (#483) (2c07253)
    • close resource (PR #546) (a6f935e)
    • conditions in ternary if (#449) (PR #558) (eb77aa5)
    • correct arg replace in PHI instruction (#462) (2383c40)
    • don't cast overloaded methods with generics from other class (#448) (008216d)
    • don't reject type update for generics (43de744)
    • don't remove empty default constructor if other constructors exists (#460) (dd13edf)
    • don't rename constructors (554e119)
    • don't rename R class fields alias (PR #492) (5f0dbf8)
    • don't rename R class in deobfuscation (#572) (PR #573) (ab4721a)
    • don't replace resources names with field names (#465) (7243ab5)
    • field increment (PR #550) (bae7f1b)
    • forbid to change types for methods arguments (b689efc)
    • generates XML key names if empty (#394) (PR #615) (c74b7f2)
    • generics constructor types (PR #594) (bcfed5b)
    • handle anonymous class self inlining (#604) (9d5dda1)
    • handle big .jar files (using multi-dex option) (#390) (PR #568) (79ccaad)
    • handle boolean condition with bitwise OR and AND (#202) (PR #522) (b78349a)
    • handle cases with SSA variable used in several PHI's (#667) (6c61ce5)
    • handle NOP instructions in unexpected places (#666) (1830c27)
    • handle NPE for methods with removed instructions (#342) (PR #583) (395cae4)
    • hide debug type inference logs (d553157)
    • hide first argument instead remove for constructor in inner class (653bb2a)
    • ignore NOPs in try-catch (#668) (f02a33a)
    • ignore not generated insns in CodeShrinker visitor (PR #560) (7b18d3a)
    • implement new type inference approach (21e11c1)
    • improve bridge methods renaming (#397) (db1b027)
    • improve class renaming and add checks for class alias usage (#532) (f283ef4)
    • improve errors handling (84b9f11)
    • improve fallback mode dump (add types, remove label after if) (4197365)
    • improve filled array detection (389caf1)
    • improve generated code on errors (dae882d)
    • improve rename checks and show rename reason (#584) (19c5725)
    • inline anonymous classes with not default constructor (#450) (4cb9f23)
    • inline constants in chained move instructions (#399) (95f9ab0)
    • inline desugared lambda classes (#467) (7654661)
    • loading aar/jar files (#631) (PR #632) (db7f2cf)
    • made correct instructions remove in new filled array replacement (#461) (17d8516)
    • merge new-array and fill-array-data with move between (#462) (98e4c4b)
    • move instruction out of try/catch (#468) (52deb48)
    • move test class and rename GUI message (PR #555) (1e55411)
    • NPE if loading local file from CLI (jadx sample.apk) (7bb7527)
    • prevent NPE while processing try/catch regions (#673) (b158858)
    • prevent stack overflow in type inference if update tree is too deep (0ca2789)
    • process field init code in dependency collector (#467) (03ae3bc)
    • produce more deterministic code (89b8090)
    • redone class alias processing (#532) (7ac0b9f)
    • redone finally extract (c892395)
    • redundant byte and short cast (#538) (PR #539) (b5344f4)
    • regenerate method code if unexpected instruction is found (#462) (75a6714)
    • reimplement variable declaration visitor (9b091b7)
    • remove declaration of unused variable (PR #590) (b1b49e6)
    • remove field redundant array type when initialized (PR #567) (513766d)
    • remove generics cast when object types match (#591) (PR #592) (01da127)
    • remove invalid chars from class names (#453) (9856b6d)
    • remove invalid chars from class names (#488) (5169dc5)
    • remove redundant array type when initialized with declaration (PR #566) (ecaa87e)
    • remove redundant cast over similar conditions (PR #612) (05e5c82)
    • remove redundant wrapping for same arith operations (PR #559) (058e4c9)
    • remove static field redundant array type when initialized (PR #580) (a1bfdc6)
    • remove unreachable blocks (#451) (0fa19fb)
    • rename class if all chars not printable (#622) (31a02a7)
    • rename class with reserved java keywords (#485) (PR #488) (d5f4266)
    • rename field if collide with any root package (#647) (f846df5)
    • rename parameters in annotations (#504) (29d3ce1)
    • rename R fields using resource names (#465) (6116a75)
    • replace dot character with underscore in style resource name (PR #466) (a4a8b05)
    • replace recursive analysis algorithms with iterations to avoid StackOverflow on big methods (#441) (710245d)
    • resolve check cast exception in string constructor simplify (41abbb1)
    • resolve mix up in SKIP and DONT_GENERATE flags (21acaa8)
    • resolve NPE due to not yet processed class (#595) (f1539d2)
    • resource qualifiers (PR #487) (650cf31)
    • restore support for AAR files (issue #95) (PR #464) (4353890)
    • safe SSA variables replacement in filled new array instruction (#399) (4e990ae)
    • search in resource classes by original name, not by alias (#562) (PR #571) (23c05bb)
    • search smali class by original name (156c979)
    • show type inference errors as method comments (87c1231)
    • skip duplicated block in complex if (#441) (7f4e641)
    • skip trailing bytes in resource table decoding (#487) (999793c)
    • stack overflow cause lamdba throw BootstrapMethodError in JDK 8 (119709b)
    • store condition blocks in 'if' region for correct blocks list (#669) (f0f5c26)
    • treat filesystem as case insensitive by default, option added for change (699f7f6)
    • UnsupportedOperationException in overloaded method process (#462) (305cf53)
    • use '$' as separator for inner classes in .jobf file (#415) (ee6508e)
    • use alias as a base for class rename if file system is case sensitive (#474) (1bb5332)
    • use multi-variable type search algorithm if type propagation is failed (4ce5cc8)
    • use original call class for invoke inherited methods (#413) (6a1717a)
    • use quantity attribute for plurals (PR #486) (42b7843)
    • use soft checks for objects and arrays in 'if' type listener (#401) (37071db)
    • use types with generics for overloaded method casts (#402) (995cf2a)
    • variable usage with enhanced for loop (#535) (PR #547) (e6e8f63)
    • workaround for primitive values if type resolved incorrectly (#671) (123ba2b)
    • xor with boolean (#409) (PR #516) (eb2a173)
    • gui: add missing translations keys, and ensure all files match (PR #525) (ba6dd08)
    • gui: add scroll to preferences dialog (7e95758)
    • gui: back button was defect since #653 (1c914ff)
    • gui: closing jadx main window terminates JVM (#639) (PR #641) (745c52e)
    • gui: detect if a window is opened inside a visible screen (PR #521) (3537f84)
    • gui: disable all components on saving the settings (PR #586) (ac1d1a5)
    • gui: exclusion disablement should be exact package match (PR #500) (eed762d)
    • gui: fill background before draw line numbers (#404) (5ad0826)
    • gui: NPE if the autosave is enabled and project is initial (PR #565) (0a08d8b)
    • gui: preserve main window maximized state (PR #626) (172f7f7)
    • gui: printUsage for jadx-gui now shows the new gui only parameter(s) (PR #660) (8e0df4c)
    • gui: remove output directories from persistent settings (#447) (f8acc31)
    • gui: remove tree children expansions as well (PR #630) (58365a8)
    • gui: separate SearchBar for Java and Smali code areas (PR #653) (4b73d24)
    • gui: show current font in preferences (d44dd0d)
    • gui: show java version, instead of VM version in about dialog (PR #489) (2e9039d)
    • gui: sort classes by case insensitivity (PR #613) (9d22b3c)
    • gui: sort resources according to their type, then name (PR #479) (9797fe5)
    • gui: update chinese simplified language (PR #508) (b49acfd)
    • gui: use alias for field and method types in tree view (6282633)
    • gui: use command (CMD) button for MacOS (#165) (PR #616) (cfbbd99)
    • gui: use same font loader as code viewer (#584) (336d6ce)
    • gui: use system font as default instead bundled Hack (#442, #445) (bcadc28)
    • res: ignore resource entry with -1 key (#556) (PR #557) (9d257cd)
    • scripts: support spaces in java path for windows scripts (#686) (a051ce6)

    Performance Improvements

    • cache types in dex nodes (aad70c7)
    Source code(tar.gz)
    Source code(zip)
    jadx-1.0.0.zip(14.17 MB)
    jadx-gui-1.0.0-3-with-jre-windows.zip(43.08 MB)
    jadx-gui-1.0.0.exe(15.64 MB)
  • v0.9.0(Feb 12, 2019)

    0.9.0 (2019-02-12)

    Features

    • gui: APK signature check v1/v2 using the apksig library from Google (#431) (d1af751)
    • gui: add a menu to copy class name (#351) (a8febb2)
    • gui: add icons to jadx-gui (#420) (PR #428) (f8c0449)
    • gui: make the import class name clickable (#378) (df9ae29)
    • support multi-exception catch blocks (#421) (aec9864)

    Bug Fixes

    • ArrayIndexOutOfBoundsException in string concatenation visitor (#427) (72b2663)
    • change not allowed access modifiers for methods (#387) (PR #439) (8c7140d), closes #370
    • change resource fields generations in R class (#308) (f6f883b)
    • correct code line number calculation (1d7bb43)
    • don't remove synthetic class with inner classes (850bd96)
    • don't remove synthetic method if args count or name not same (#361) (20b03aa)
    • don't rename constructors and class init methods in deobfuscator (#415) (0f27eba)
    • exports resources first (#376) (87f50ab)
    • Fix for #377 (Jadx in Windows open with list) (#379) (a8a3164)
    • force rename by checks from RenameVisitor (#432) (da41efa)
    • force rename fields and methods with reserved names (#364) (3815d30)
    • generates code of missing R class (#353) (5de4d07)
    • instruction deep equals must check result (1fc92d2)
    • lower regions count limit (#354) (9be62fb)
    • process try/catch without move-exception instruction (#395) (6d59f77)
    • refactor, improve performance and fix some issues in resource processing (82d0d62)
    • rename method wrapped by synthetic only from same class (#430) (618b014)
    • gui: loading of i18n resources as UTF-8 (see #363) (PR #386) (5281eed)
    • gui: allow partial settings sync to not save command line options (557667b)
    • gui: add "use imports" option to preferences (bc62933)
    • gui: add synchronization to SimpleIndex class (#435) (b28eaa1)
    • gui: add synchronizations to search index creation (#433) (9e0cd2e)
    • gui: apply render hints for line numbers (58993b9)
    • gui: don't skip indexing code lines starting with '}' (#426) (1272ae2)
    • gui: fill background before draw line numbers (#404) (7e8435c)
    • gui: limit the spare memory to max. 512MiB (#434) (ffedaea)
    • return type lost after type inference (#396) (3a798cb)
    • saves all resources (#375) (8eef4a9)
    • search exception handler splitter block by offset if jump source unknown (#406) (e9591ef)
    • show method alias in "method not decompiled" messages (#410) (fd3498a)
    • update apksig library to latest version (#431) (b0e3cfe)
    • update dx to version 16 (#369) (bedbf94)
    • use '$' as separator for inner classes in .jobf file (#415) (e0624ce)
    • use '$' for inner classes also in methods and fields (#415) (a841d0e)
    • gui: make correct size truncate for recent files list (2de86b6)
    • gui: various UI improvements (#419) (f60bb6b)
    • gui: make link for full class names (#378) (a3464d7)
    • gui: on settings reset run upgrade method (0abb51c)
    • gui: override settings by cmd options (6b3e8f0)
    • gui: show 'copy name' action only for supported nodes (9e24a5a)
    • gui: unsynchronized search index creation results in NullPointerException upon performing search (#429) (7c353a6)
    • gui: use correct font and style for certificate panel (b587b6d)
    • gui: use editor font in files tree and fix bundled font loading (2931617)
    • gui: use editor font in search node column (be509c7)
    • gui: wait time for background jobs too short (1ac2cdf)
    Source code(tar.gz)
    Source code(zip)
    jadx-0.9.0.zip(9.79 MB)
    jadx-gui-0.9.0-with-jre-windows.zip(35.32 MB)
    jadx-gui-0.9.0.exe(10.72 MB)
  • v0.8.0(Aug 26, 2018)

  • v0.7.1(Mar 25, 2018)

  • v0.6.1(Dec 5, 2016)

    Note: this is just a build of latest dev branch, no new features was added

    Changes from previous release:

    • export sources as android gradle project
    • multidex support for apk & zip
    • 'aar' support
    • fix some 'try/catch/finally' cases
    • fixes for switch blocks
    • jadx-gui:
      • added full text search
      • support images view/unpack
      • added log viewer
    Source code(tar.gz)
    Source code(zip)
    jadx-0.6.1.zip(3.91 MB)
  • v0.6.0(Apr 10, 2015)

    Changes from previous release:

    • decode AndroidManifest.xml and other resources
    • deobfuscation
    • 'finally' block extraction
    • support fall through cases in switch
    • other improvements in try/catch and loop processing
    • jadx-gui:
      • added preferences dialog and font selection dialog
      • show resources tree
    Source code(tar.gz)
    Source code(zip)
    jadx-0.6.0.zip(3.61 MB)
  • v0.5.4(Nov 9, 2014)

    Changes from previous release:

    • improved loops support:
      • indexed loops
      • for-each loop
      • 'break' with label
      • 'continue'
    • decompile ternary operations in conditions
    • restore switch over enums
    • try/catch improvements ('finally' block not yet supported)
    • expand arrays for known vararg arguments
    • sort methods by source line number
    • jadx-gui:
      • add saving preferences (open/save paths, flatten packages)
      • add new version notification
    Source code(tar.gz)
    Source code(zip)
    jadx-0.5.4.zip(3.19 MB)
Owner
null
Smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android's Java VM implementation

About smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android's Java VM implementation. The syntax is loosely based on

Ben Gruver 5.7k Dec 27, 2022
Dex manipulation library

dexterity Description dexterity is a C library intended for manipulation and analysis of DEX files. It has python bindings for all basic DEX structure

Rodrigo Chiossi 93 Nov 25, 2022
A program to flip every private, protected and package-private access flag to public in an Android dex file!

DexExposed A program to flip every private, protected and package-private access flag to public in an Android dex file! Building Simply run gradle mak

John Doe 2 Aug 29, 2021
An advanced DEX editor for Android.

Dexter A WIP DEX editor (hence the name Dexter) for Android that uses Smali. Available decompilers JADX Fernflower CFR JD-Core Procyon TO-DO Implement

Mike Anderson 72 Dec 23, 2022
enjarify 8.6 0.0 L5 Python Enjarify is a tool for translating Dalvik bytecode to equivalent Java bytecode. This allows Java analysis tools to analyze Android applications.

Note: This repository may be out of date. Future development will occur at https://github.com/Storyyeller/enjarify. Introduction Enjarify is a tool fo

Google 2.7k Jan 8, 2023
CLI tool for decompiling Android apps to Java. It does resources! It does Java! Its real easy!

Easy-as-pie Android Decompiler Why One stop shop I got pretty tired of decompiling Android apps with a bunch of steps that I had to remember all the t

Alex Davis 619 Dec 27, 2022
Signal Protocol library for Java/Android

Overview A ratcheting forward secrecy protocol that works in synchronous and asynchronous messaging environments. PreKeys This protocol uses a concept

Signal 1.8k Dec 24, 2022
Grab’n Run, a simple and effective Java Library for Android projects to secure dynamic code loading.

Grab’n Run, a simple and effective Java Library for Android projects to secure dynamic code loading.

Luca Falsina 418 Dec 29, 2022
TweetNaCl in Java - a port of TweetNaCl-js

TweetNacl in Java: port of tweetnacl-js API/Usage Suggest always use TweetNaclFast implementation Public key authenticated encryption get key pair: Bo

AppNet.Link 40 Nov 10, 2022
Analyze any Android/Java based app or game

ClassyShark Introduction ClassyShark is a standalone binary inspection tool for Android developers. It can reliably browse any Android executable and

Google 7.2k Jan 3, 2023
A Java ePub reader and parser framework for Android.

FolioReader-Android is an EPUB reader written in Java and Kotlin. Features Custom Fonts Custom Text Size Themes / Day mode / Night mode Text Highlight

FolioReader 2.1k Jan 3, 2023
A program analysis tool to find cryptographic misuse in Java and Android.

A program analysis tool to find cryptographic misuse in Java and Android.

null 92 Dec 15, 2022
CRYLOGGER: Detecting Crypto Misuses for Android and Java Apps Dynamically

CRYLOGGER: Detecting Crypto Misuses for Android and Java Apps Dynamically

Luca Piccolboni 139 Dec 12, 2022
Java bytecode obfuscator created by x4e.

Binscure Java bytecode obfuscator created by x4e. Usage First, create a config file, (example config here). When you have a config file, run binscure

null 35 Nov 22, 2022
A RSA Cipher implementation for Kotlin/Java

A RSA Cipher implementation for Kotlin/Java.

Lyzev 3 Aug 22, 2022
Soot - A Java optimization framework

Using Soot? Let us know about it! We are regularly applying for funding to help us maintain Soot. You can help us immensely by letting us know about p

Soot Program Analysis Framework 2.5k Jan 2, 2023
Find Security Bugs is the SpotBugs plugin for security audits of Java web applications

The SpotBugs plugin for security audits of Java web applications and Android applications. (Also work with Kotlin, Groovy and Scala projects)

OWASP Find Security Bugs 2k Jan 6, 2023
Catch common Java mistakes as compile-time errors

Error Prone Error Prone is a static analysis tool for Java that catches common programming mistakes at compile-time. public class ShortSet { public

Google 6.3k Dec 23, 2022
Appdbg - make it possible to run android dex file in original Java Virtual Machine

Appdbg - make it possible to run android dex file in original Java Virtual Machine

null 137 Dec 20, 2022
Smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android's Java VM implementation

About smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android's Java VM implementation. The syntax is loosely based on

Ben Gruver 5.7k Dec 27, 2022