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 b40cb5238..92dff385d 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -462,44 +462,44 @@ public class ClassGen { if (fallback) { return fullName; } - fullName = extClsInfo.getFullName(); String shortName = extClsInfo.getShortName(); if (extClsInfo.getPackage().equals("java.lang") && extClsInfo.getParentClass() == null) { return shortName; - } else { - // don't add import if this class inner for current class - if (isClassInnerFor(extClsInfo, useCls)) { - return shortName; - } - // don't add import if this class from same package - if (extClsInfo.getPackage().equals(useCls.getPackage()) && !extClsInfo.isInner()) { - return shortName; - } - // don't add import if class not public (must be accessed using inheritance) - ClassNode classNode = cls.dex().resolveClass(extClsInfo); - if (classNode != null && !classNode.getAccessFlags().isPublic()) { - return shortName; - } - if (searchCollision(cls.dex(), useCls, extClsInfo)) { - return fullName; - } - if (extClsInfo.getPackage().equals(useCls.getPackage())) { - fullName = extClsInfo.getNameWithoutPackage(); - } - for (ClassInfo importCls : getImports()) { - if (!importCls.equals(extClsInfo) - && importCls.getShortName().equals(shortName)) { - if (extClsInfo.isInner()) { - String parent = useClassInternal(useCls, extClsInfo.getParentClass().getAlias()); - return parent + "." + shortName; - } else { - return fullName; - } - } - } - addImport(extClsInfo); + } + if (isClassInnerFor(useCls, extClsInfo)) { return shortName; } + if (isBothClassesInOneTopClass(useCls, extClsInfo)) { + return shortName; + } + // don't add import if this class from same package + if (extClsInfo.getPackage().equals(useCls.getPackage()) && !extClsInfo.isInner()) { + return shortName; + } + // don't add import if class not public (must be accessed using inheritance) + ClassNode classNode = cls.dex().resolveClass(extClsInfo); + if (classNode != null && !classNode.getAccessFlags().isPublic()) { + return shortName; + } + if (searchCollision(cls.dex(), useCls, extClsInfo)) { + return fullName; + } + if (extClsInfo.getPackage().equals(useCls.getPackage())) { + fullName = extClsInfo.getNameWithoutPackage(); + } + for (ClassInfo importCls : getImports()) { + if (!importCls.equals(extClsInfo) + && importCls.getShortName().equals(shortName)) { + if (extClsInfo.isInner()) { + String parent = useClassInternal(useCls, extClsInfo.getParentClass().getAlias()); + return parent + "." + shortName; + } else { + return fullName; + } + } + } + addImport(extClsInfo); + return shortName; } private void addImport(ClassInfo classInfo) { @@ -518,6 +518,16 @@ public class ClassGen { } } + private static boolean isBothClassesInOneTopClass(ClassInfo useCls, ClassInfo extClsInfo) { + ClassInfo a = useCls.getTopParentClass(); + ClassInfo b = extClsInfo.getTopParentClass(); + if (a != null) { + return a.equals(b); + } + // useCls - is a top class + return useCls.equals(b); + } + private static boolean isClassInnerFor(ClassInfo inner, ClassInfo parent) { if (inner.isInner()) { ClassInfo p = inner.getParentClass(); 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 ae9128b74..275245184 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 @@ -95,12 +95,13 @@ public final class ClassInfo { parentClass = null; } this.name = clsName; - this.fullName = makeFullClsName(clsName); + this.fullName = makeFullClsName(clsName, false); } - public String makeFullClsName(String shortName) { + public String makeFullClsName(String shortName, boolean raw) { if (parentClass != null) { - return parentClass.fullName + "." + shortName; + String innerSep = raw ? "$" : "."; + return parentClass.makeFullClsName(parentClass.getShortName(), raw) + innerSep + shortName; } return pkg.isEmpty() ? shortName : pkg + "." + shortName; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java index 24b9463f9..000746566 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java @@ -32,10 +32,9 @@ public class RenameVisitor extends AbstractVisitor { if (deobfuscationOn) { // TODO: check classes for case sensitive names (issue #24) deobfuscator.execute(); - } else { - for (ClassNode classNode : root.getClasses(true)) { - checkClassName(classNode); - } + } + for (ClassNode classNode : root.getClasses(true)) { + checkClassName(classNode); } } @@ -60,7 +59,7 @@ public class RenameVisitor extends AbstractVisitor { newShortName = "C" + clsName; } if (newShortName != null) { - classInfo.rename(cls.dex(), classInfo.makeFullClsName(newShortName)); + classInfo.rename(cls.dex(), classInfo.makeFullClsName(newShortName, true)); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass2.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass2.java index 1328c02a1..00f8f646e 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass2.java @@ -3,7 +3,6 @@ package jadx.tests.integration.inner; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; -import org.junit.Ignore; import org.junit.Test; import static org.hamcrest.CoreMatchers.containsString; @@ -48,7 +47,6 @@ public class TestAnonymousClass2 extends IntegrationTest { } @Test - @Ignore public void test() { ClassNode cls = getClassNode(TestCls.class); String code = cls.getCode().toString(); diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass4.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass4.java index 5ded546bb..d2032cd95 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass4.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass4.java @@ -3,7 +3,6 @@ package jadx.tests.integration.inner; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; -import org.junit.Ignore; import org.junit.Test; import static jadx.tests.api.utils.JadxMatchers.containsOne; @@ -33,7 +32,6 @@ public class TestAnonymousClass4 extends IntegrationTest { } @Test - @Ignore public void test() { ClassNode cls = getClassNode(TestCls.class); String code = cls.getCode().toString();