From cfd851a9805314bbca9fb015f6a7dff1cdea944b Mon Sep 17 00:00:00 2001 From: rawer886 Date: Thu, 12 Oct 2023 03:04:03 +0800 Subject: [PATCH] fix: use correct imports for classes from default package (PR #2031) * fix: use fully qualified package names for classes of defpackage * fix: use correct imports for classes from default package (#2027) --------- Co-authored-by: Skylot --- .../main/java/jadx/core/codegen/ClassGen.java | 8 +-- .../integration/names/TestDefPkgRename.java | 67 +++++++++++++++++++ .../test/smali/names/TestDefPkgRename/a.smali | 2 + .../test/smali/names/TestDefPkgRename/b.smali | 4 ++ 4 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/names/TestDefPkgRename.java create mode 100644 jadx-core/src/test/smali/names/TestDefPkgRename/a.smali create mode 100644 jadx-core/src/test/smali/names/TestDefPkgRename/b.smali 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 6c2b8373f..39d0ba4dc 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -657,6 +657,10 @@ public class ClassGen { if (useCls.equals(extClsInfo)) { return shortName; } + if (extClsInfo.getAliasPkg().isEmpty()) { + // omit import for default package + return shortName; + } if (isClassInnerFor(useCls, extClsInfo)) { return shortName; } @@ -678,10 +682,6 @@ public class ClassGen { if (extClsInfo.getPackage().equals(useCls.getPackage()) && !extClsInfo.isInner()) { return shortName; } - // ignore classes from default package - if (extClsInfo.isDefaultPackage()) { - return shortName; - } if (extClsInfo.getAliasPkg().equals(useCls.getAliasPkg())) { fullName = extClsInfo.getAliasNameWithoutPackage(); } diff --git a/jadx-core/src/test/java/jadx/tests/integration/names/TestDefPkgRename.java b/jadx-core/src/test/java/jadx/tests/integration/names/TestDefPkgRename.java new file mode 100644 index 000000000..c4608c73a --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/names/TestDefPkgRename.java @@ -0,0 +1,67 @@ +package jadx.tests.integration.names; + +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.SmaliTest; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestDefPkgRename extends SmaliTest { + + @Test + public void test() { + List clsList = loadFromSmaliFiles(); + // class A moved to 'defpackage' + assertThat(searchCls(clsList, "A")) + .code() + .containsOne("package defpackage;"); + assertThat(searchCls(clsList, "pkg.B")) + .code() + .containsOne("import defpackage.A;") + .containsOne("public A a;"); + } + + @Test + public void testNoImports() { + args.setUseImports(false); + List clsList = loadFromSmaliFiles(); + // class A moved to 'defpackage', but use full names + assertThat(searchCls(clsList, "A")) + .code() + .containsOne("package defpackage;"); + assertThat(searchCls(clsList, "pkg.B")) + .code() + .doesNotContain("import") + .containsOne("public defpackage.A a;"); + } + + @Test + public void testDeobf() { + enableDeobfuscation(); + List clsList = loadFromSmaliFiles(); + // package for class A deobfuscated + assertThat(searchCls(clsList, "pkg.B")) + .code() + .containsOne("import p000.C0000A;") + .containsOne("public C0000A f0a;"); + } + + @Test + public void testRenameDisabled() { + disableCompilation(); + args.setRenameFlags(Collections.emptySet()); + List clsList = loadFromSmaliFiles(); + // no renaming, code will not compile + assertThat(searchCls(clsList, "A")) + .code() + .containsOne("// default package"); + assertThat(searchCls(clsList, "pkg.B")) + .code() + .doesNotContain("import") // omit import + .containsOne("public A a;"); + } +} diff --git a/jadx-core/src/test/smali/names/TestDefPkgRename/a.smali b/jadx-core/src/test/smali/names/TestDefPkgRename/a.smali new file mode 100644 index 000000000..20ee4595f --- /dev/null +++ b/jadx-core/src/test/smali/names/TestDefPkgRename/a.smali @@ -0,0 +1,2 @@ +.class public LA; +.super Ljava/lang/Object; diff --git a/jadx-core/src/test/smali/names/TestDefPkgRename/b.smali b/jadx-core/src/test/smali/names/TestDefPkgRename/b.smali new file mode 100644 index 000000000..272436e8e --- /dev/null +++ b/jadx-core/src/test/smali/names/TestDefPkgRename/b.smali @@ -0,0 +1,4 @@ +.class public Lpkg/B; +.super Ljava/lang/Object; + +.field public a:LA;