jadx v1.1.0 Release Notes

Release Date: 2019-12-07 // 8 days ago
  • 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)

Previous changes from v1.0.0

  • 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)
    • 0️⃣ 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)
    • 0️⃣ 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)