From 1d81cab4a1d0d3883d72d0ae95d5d8c550b4962a Mon Sep 17 00:00:00 2001 From: Skylot Date: Sun, 29 Mar 2015 14:46:52 +0300 Subject: [PATCH] core: change anonymous class marking --- jadx-core/src/main/java/jadx/core/Consts.java | 2 +- jadx-core/src/main/java/jadx/core/codegen/ClassGen.java | 4 ++-- jadx-core/src/main/java/jadx/core/codegen/InsnGen.java | 2 +- .../src/main/java/jadx/core/dex/attributes/AFlag.java | 1 + jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java | 8 ++++++++ .../src/main/java/jadx/core/dex/nodes/ClassNode.java | 6 +++++- .../main/java/jadx/core/dex/visitors/ClassModifier.java | 8 ++++++++ 7 files changed, 26 insertions(+), 5 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/Consts.java b/jadx-core/src/main/java/jadx/core/Consts.java index 049406746..a63aba92f 100644 --- a/jadx-core/src/main/java/jadx/core/Consts.java +++ b/jadx-core/src/main/java/jadx/core/Consts.java @@ -18,7 +18,7 @@ public class Consts { public static final String DALVIK_ANNOTATION_DEFAULT = "dalvik.annotation.AnnotationDefault"; public static final String DEFAULT_PACKAGE_NAME = "defpackage"; - public static final String ANONYMOUS_CLASS_PREFIX = "AnonymousClass_"; + public static final String ANONYMOUS_CLASS_PREFIX = "AnonymousClass"; public static final String MTH_TOSTRING_SIGNATURE = "toString()Ljava/lang/String;"; } diff --git a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java index f8d240564..b40cb5238 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -231,7 +231,7 @@ public class ClassGen { private void addInnerClasses(CodeWriter code, ClassNode cls) throws CodegenException { for (ClassNode innerCls : cls.getInnerClasses()) { if (innerCls.contains(AFlag.DONT_GENERATE) - || innerCls.isAnonymous()) { + || innerCls.contains(AFlag.ANONYMOUS_CLASS)) { continue; } ClassGen inClGen = new ClassGen(innerCls, getParentGen()); @@ -243,7 +243,7 @@ public class ClassGen { private boolean isInnerClassesPresents() { for (ClassNode innerCls : cls.getInnerClasses()) { - if (!innerCls.isAnonymous()) { + if (!innerCls.contains(AFlag.ANONYMOUS_CLASS)) { return true; } } 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 603fd258d..7c99abc88 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -530,7 +530,7 @@ public class InsnGen { private void makeConstructor(ConstructorInsn insn, CodeWriter code) throws CodegenException { ClassNode cls = mth.dex().resolveClass(insn.getClassType()); - if (cls != null && cls.isAnonymous() && !fallback) { + if (cls != null && cls.contains(AFlag.ANONYMOUS_CLASS) && !fallback) { // anonymous class construction ArgType parent; if (cls.getInterfaces().size() == 1) { diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java index 9093f2896..f1c5f19c8 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java @@ -23,6 +23,7 @@ public enum AFlag { SKIP_FIRST_ARG, ANONYMOUS_CONSTRUCTOR, + ANONYMOUS_CLASS, ELSE_IF_CHAIN, diff --git a/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java b/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java index 1360c1a8e..ae9128b74 100644 --- a/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java +++ b/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java @@ -138,6 +138,14 @@ public final class ClassInfo { return parentClass; } + public ClassInfo getTopParentClass() { + if (parentClass != null) { + ClassInfo topCls = parentClass.getTopParentClass(); + return topCls != null ? topCls : parentClass; + } + return null; + } + public boolean isInner() { return parentClass != null; } 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 8180410c4..6a77ffce2 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 @@ -240,6 +240,10 @@ public class ClassNode extends LineAttrNode implements ILoadable { && fileName.endsWith("$" + name)) { return; } + ClassInfo parentClass = clsInfo.getTopParentClass(); + if (parentClass != null && fileName.equals(parentClass.getShortName())) { + return; + } } this.addAttr(new SourceFileAttr(fileName)); LOG.debug("Class '{}' compiled from '{}'", this, fileName); @@ -434,7 +438,7 @@ public class ClassNode extends LineAttrNode implements ILoadable { public boolean isAnonymous() { return clsInfo.isInner() - && clsInfo.getShortName().startsWith(Consts.ANONYMOUS_CLASS_PREFIX) + && clsInfo.getAlias().getShortName().startsWith(Consts.ANONYMOUS_CLASS_PREFIX) && getDefaultConstructor() != null; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ClassModifier.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ClassModifier.java index 6885194a2..c94eca408 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ClassModifier.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ClassModifier.java @@ -40,9 +40,17 @@ public class ClassModifier extends AbstractVisitor { removeEmptyMethods(cls); checkFieldsInit(cls); + + markAnonymousClass(cls); return false; } + private void markAnonymousClass(ClassNode cls) { + if (cls.isAnonymous()) { + cls.add(AFlag.ANONYMOUS_CLASS); + } + } + private static void removeSyntheticFields(ClassNode cls) { if (!cls.getClassInfo().isInner() || cls.getAccessFlags().isStatic()) { return;