diff --git a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java index 92219107a..8de03f0b3 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -607,6 +607,7 @@ public class InsnGen { if (cls != null && cls.isAnonymous() && !fallback) { cls.ensureProcessed(); inlineAnonymousConstructor(code, cls, insn); + mth.getParentClass().addInlinedClass(cls); return; } if (insn.isSelf()) { 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 9d51039b1..84d61466b 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 @@ -2,11 +2,12 @@ package jadx.core.dex.nodes; import java.io.StringWriter; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -59,6 +60,8 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { private final List fields; private List innerClasses = Collections.emptyList(); + private List inlinedClasses = Collections.emptyList(); + // store smali private String smali; // store parent for inner classes or 'this' otherwise @@ -453,14 +456,20 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { } /** - * Get all inner classes recursively + * Get all inner and inlined classes recursively * - * @param innerClassesColl all identified inner classes are added to this collection + * @param resultClassesSet all identified inner and inlined classes are added to this set */ - public void getInnerClassesRecursive(Collection innerClassesColl) { - for (ClassNode innerClass : innerClasses) { - innerClassesColl.add(innerClass); - innerClass.getInnerClassesRecursive(innerClassesColl); + public void getInnerAndInlinedClassesRecursive(Set resultClassesSet) { + for (ClassNode innerCls : innerClasses) { + if (resultClassesSet.add(innerCls)) { + innerCls.getInnerAndInlinedClassesRecursive(resultClassesSet); + } + } + for (ClassNode inlinedCls : inlinedClasses) { + if (resultClassesSet.add(inlinedCls)) { + inlinedCls.getInnerAndInlinedClassesRecursive(resultClassesSet); + } } } @@ -472,6 +481,13 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { cls.parentClass = this; } + public void addInlinedClass(ClassNode cls) { + if (inlinedClasses.isEmpty()) { + inlinedClasses = new ArrayList<>(5); + } + inlinedClasses.add(cls); + } + public boolean isEnum() { return getAccessFlags().isEnum() && getSuperClass() != null @@ -550,9 +566,9 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { StringWriter stringWriter = new StringWriter(4096); getSmali(this, stringWriter); stringWriter.append(System.lineSeparator()); - List allInnerClasses = new ArrayList<>(); - getInnerClassesRecursive(allInnerClasses); - for (ClassNode innerClass : allInnerClasses) { + Set allInlinedClasses = new LinkedHashSet<>(); + getInnerAndInlinedClassesRecursive(allInlinedClasses); + for (ClassNode innerClass : allInlinedClasses) { getSmali(innerClass, stringWriter); stringWriter.append(System.lineSeparator()); }