From c1de235289bab888bc1b6043ffbfb489d54e799d Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 6 Apr 2024 21:07:35 +0100 Subject: [PATCH] fix: in anonymous class checks ignore instance fields not used outside --- .../core/dex/visitors/ProcessAnonymous.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessAnonymous.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessAnonymous.java index 88eb5db0a..2e72e4f2a 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessAnonymous.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessAnonymous.java @@ -43,9 +43,7 @@ public class ProcessAnonymous extends AbstractVisitor { if (!inlineAnonymousClasses) { return; } - for (ClassNode cls : root.getClasses()) { - markAnonymousClass(cls); - } + root.getClasses().forEach(ProcessAnonymous::processClass); mergeAnonymousDeps(root); } @@ -59,10 +57,18 @@ public class ProcessAnonymous extends AbstractVisitor { } private void visitClassAndInners(ClassNode cls) { - markAnonymousClass(cls); + processClass(cls); cls.getInnerClasses().forEach(this::visitClassAndInners); } + private static void processClass(ClassNode cls) { + try { + markAnonymousClass(cls); + } catch (Throwable e) { + cls.addError("Anonymous visitor error", e); + } + } + private static void markAnonymousClass(ClassNode cls) { if (!canBeAnonymous(cls)) { return; @@ -273,6 +279,10 @@ public class ProcessAnonymous extends AbstractVisitor { if (!ctrUseMth.getMethodInfo().isClassInit()) { return false; } + if (cls.getUseInMth().isEmpty()) { + // no outside usage, inline not needed + return false; + } FieldNode instFld = ListUtils.filterOnlyOne(cls.getFields(), f -> f.getAccessFlags().containsFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) && f.getFieldInfo().getType().equals(cls.getClassInfo().getType()));