jadx v1.2.0 Release Notes

Release Date: 2020-11-14 // over 3 years ago
  • 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

Previous changes from v1.1.0

  • 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)