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 <skylot@gmail.com>
This commit is contained in:
rawer886
2023-10-12 03:04:03 +08:00
committed by GitHub
parent d129be7e86
commit cfd851a980
4 changed files with 77 additions and 4 deletions
@@ -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();
}
@@ -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<ClassNode> 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<ClassNode> 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<ClassNode> 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<ClassNode> 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;");
}
}
@@ -0,0 +1,2 @@
.class public LA;
.super Ljava/lang/Object;
@@ -0,0 +1,4 @@
.class public Lpkg/B;
.super Ljava/lang/Object;
.field public a:LA;