diff --git a/jadx-core/src/main/java/jadx/core/Jadx.java b/jadx-core/src/main/java/jadx/core/Jadx.java index fea6ac920..3183d3f2c 100644 --- a/jadx-core/src/main/java/jadx/core/Jadx.java +++ b/jadx-core/src/main/java/jadx/core/Jadx.java @@ -102,7 +102,6 @@ public class Jadx { passes.add(new SignatureProcessor()); passes.add(new OverrideMethodVisitor()); passes.add(new AddAndroidConstants()); - passes.add(new CollectConstValues()); // rename and deobfuscation passes.add(new DeobfuscatorVisitor()); @@ -111,6 +110,7 @@ public class Jadx { passes.add(new SaveDeobfMapping()); passes.add(new UsageInfoVisitor()); + passes.add(new CollectConstValues()); passes.add(new ProcessAnonymous()); passes.add(new ProcessMethodsForInline()); return passes; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/prepare/CollectConstValues.java b/jadx-core/src/main/java/jadx/core/dex/visitors/prepare/CollectConstValues.java index 06efe76ad..8b35930f6 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/prepare/CollectConstValues.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/prepare/CollectConstValues.java @@ -11,11 +11,15 @@ import jadx.core.dex.nodes.FieldNode; import jadx.core.dex.nodes.RootNode; import jadx.core.dex.visitors.AbstractVisitor; import jadx.core.dex.visitors.JadxVisitor; +import jadx.core.dex.visitors.usage.UsageInfoVisitor; import jadx.core.utils.exceptions.JadxException; @JadxVisitor( name = "CollectConstValues", - desc = "Collect and store values from static final fields" + desc = "Collect and store values from static final fields", + runAfter = { + UsageInfoVisitor.class // check field usage (do not restore if used somewhere) + } ) public class CollectConstValues extends AbstractVisitor { @@ -44,12 +48,17 @@ public class CollectConstValues extends AbstractVisitor { public static @Nullable Object getFieldConstValue(FieldNode fld) { AccessInfo accFlags = fld.getAccessFlags(); - if (accFlags.isStatic() && accFlags.isFinal()) { - EncodedValue constVal = fld.get(JadxAttrType.CONSTANT_VALUE); - if (constVal != null && constVal != EncodedValue.NULL) { - return constVal.getValue(); - } + if (!accFlags.isStatic() || !accFlags.isFinal()) { + return null; } - return null; + EncodedValue constVal = fld.get(JadxAttrType.CONSTANT_VALUE); + if (constVal == null || constVal == EncodedValue.NULL) { + return null; + } + if (!fld.getUseIn().isEmpty()) { + // field still used somewhere and not inlined by compiler, so we don't need to restore it + return null; + } + return constVal.getValue(); } }