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