|
11 | 11 | import jadx.core.dex.nodes.RootNode;
|
12 | 12 | import jadx.core.dex.visitors.AbstractVisitor;
|
13 | 13 | import jadx.core.dex.visitors.JadxVisitor;
|
| 14 | +import jadx.core.dex.visitors.usage.UsageInfoVisitor; |
14 | 15 | import jadx.core.utils.exceptions.JadxException;
|
15 | 16 |
|
16 | 17 | @JadxVisitor(
|
17 | 18 | name = "CollectConstValues",
|
18 |
| - desc = "Collect and store values from static final fields" |
| 19 | + desc = "Collect and store values from static final fields", |
| 20 | + runAfter = { |
| 21 | + UsageInfoVisitor.class // check field usage (do not restore if used somewhere) |
| 22 | + } |
19 | 23 | )
|
20 | 24 | public class CollectConstValues extends AbstractVisitor {
|
21 | 25 |
|
@@ -44,12 +48,17 @@ public boolean visit(ClassNode cls) throws JadxException {
|
44 | 48 |
|
45 | 49 | public static @Nullable Object getFieldConstValue(FieldNode fld) {
|
46 | 50 | AccessInfo accFlags = fld.getAccessFlags();
|
47 |
| - if (accFlags.isStatic() && accFlags.isFinal()) { |
48 |
| - EncodedValue constVal = fld.get(JadxAttrType.CONSTANT_VALUE); |
49 |
| - if (constVal != null && constVal != EncodedValue.NULL) { |
50 |
| - return constVal.getValue(); |
51 |
| - } |
| 51 | + if (!accFlags.isStatic() || !accFlags.isFinal()) { |
| 52 | + return null; |
| 53 | + } |
| 54 | + EncodedValue constVal = fld.get(JadxAttrType.CONSTANT_VALUE); |
| 55 | + if (constVal == null || constVal == EncodedValue.NULL) { |
| 56 | + return null; |
| 57 | + } |
| 58 | + if (!fld.getUseIn().isEmpty()) { |
| 59 | + // field still used somewhere and not inlined by compiler, so we don't need to restore it |
| 60 | + return null; |
52 | 61 | }
|
53 |
| - return null; |
| 62 | + return constVal.getValue(); |
54 | 63 | }
|
55 | 64 | }
|
0 commit comments