From f90fc1d5ec8413cb9a4bcca03930e6c721fe4161 Mon Sep 17 00:00:00 2001 From: S-trace Date: Wed, 25 Dec 2019 20:24:58 +0300 Subject: [PATCH] core: ClassNode: Load recursively missing information on refresh() Fixes loss of static identifiers, comments, annotations and source file name after rename. --- .../java/jadx/core/dex/attributes/AType.java | 4 +++ .../java/jadx/core/dex/nodes/ClassNode.java | 30 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/AType.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AType.java index 2cdab5b73..a18d953ab 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/AType.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AType.java @@ -86,5 +86,9 @@ public class AType { public static final Set> SKIP_ON_UNLOAD = new HashSet<>(Arrays.asList( FIELD_REPLACE, METHOD_INLINE, + COMMENTS, + RENAME_REASON, + JADX_WARN, + JADX_ERROR, SKIP_MTH_ARGS)); } diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index 034f0dbec..5615e858a 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -46,6 +46,7 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { private static final Logger LOG = LoggerFactory.getLogger(ClassNode.class); private final DexNode dex; + private final ClassDef cls; private final int clsDefOffset; private final ClassInfo clsInfo; private AccessInfo accessFlags; @@ -70,6 +71,7 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { public ClassNode(DexNode dex, ClassDef cls) { this.dex = dex; + this.cls = cls; this.clsDefOffset = cls.getOffset(); this.clsInfo = ClassInfo.fromDex(dex, cls.getTypeIndex()); try { @@ -151,6 +153,7 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { this.fields = new ArrayList<>(); this.accessFlags = new AccessInfo(accessFlags, AFType.CLASS); this.parentClass = this; + this.cls = null; dex.addClassNode(this); } @@ -290,10 +293,35 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { } public synchronized ICodeInfo refresh() { - load(); + reloadRecursive(); return decompile(false); } + private void reloadRecursive() { + load(); + int sfIdx = cls.getSourceFileIndex(); + if (sfIdx != DexNode.NO_INDEX) { + String fileName = dex.getString(sfIdx); + addSourceFilenameAttr(fileName); + } + for (ClassNode innerCls : getInnerClasses()) { + innerCls.reloadRecursive(); + } + loadStaticInfo(); + loadAnnotations(cls); + } + + private void loadStaticInfo() { + try { + if (cls != null) { + loadStaticValues(cls, fields); + } + } catch (DecodeException e) { + LOG.error("Got DecodeException in loadStaticValues() for class {}", getRawName()); + e.printStackTrace(); + } + } + @Override public void load() { for (MethodNode mth : getMethods()) {