WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 1d831d8

Browse files
histausseJean-Marie 'Histausse' Mineau
andauthored
feat: select better class from duplicates (#2701)(PR #2702)
* select the right class in in case of duplicate * select correct class in gui in case of duplication * fix code format --------- Co-authored-by: Jean-Marie 'Histausse' Mineau <[email protected]>
1 parent 4c760f1 commit 1d831d8

File tree

5 files changed

+59
-4
lines changed

5 files changed

+59
-4
lines changed

jadx-core/src/main/java/jadx/api/JadxDecompiler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,9 +543,10 @@ synchronized JavaPackage convertPackageNode(PackageNode pkg) {
543543
return foundPkg;
544544
}
545545
List<JavaClass> clsList = Utils.collectionMap(pkg.getClasses(), this::convertClassNode);
546+
List<JavaClass> clsListNoDup = Utils.collectionMap(pkg.getClassesNoDup(), this::convertClassNode);
546547
int subPkgsCount = pkg.getSubPackages().size();
547548
List<JavaPackage> subPkgs = subPkgsCount == 0 ? Collections.emptyList() : new ArrayList<>(subPkgsCount);
548-
JavaPackage javaPkg = new JavaPackage(pkg, clsList, subPkgs);
549+
JavaPackage javaPkg = new JavaPackage(pkg, clsList, clsListNoDup, subPkgs);
549550
if (subPkgsCount != 0) {
550551
// add subpackages after parent to avoid endless recursion
551552
for (PackageNode subPackage : pkg.getSubPackages()) {

jadx-core/src/main/java/jadx/api/JavaPackage.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,17 @@
1515
public final class JavaPackage implements JavaNode, Comparable<JavaPackage> {
1616
private final PackageNode pkgNode;
1717
private final List<JavaClass> classes;
18+
private final List<JavaClass> clsListNoDup;
1819
private final List<JavaPackage> subPkgs;
1920

2021
JavaPackage(PackageNode pkgNode, List<JavaClass> classes, List<JavaPackage> subPkgs) {
22+
this(pkgNode, classes, classes, subPkgs);
23+
}
24+
25+
JavaPackage(PackageNode pkgNode, List<JavaClass> classes, List<JavaClass> clsListNoDup, List<JavaPackage> subPkgs) {
2126
this.pkgNode = pkgNode;
2227
this.classes = classes;
28+
this.clsListNoDup = clsListNoDup;
2329
this.subPkgs = subPkgs;
2430
}
2531

@@ -49,6 +55,10 @@ public List<JavaClass> getClasses() {
4955
return classes;
5056
}
5157

58+
public List<JavaClass> getClassesNoDup() {
59+
return clsListNoDup;
60+
}
61+
5262
public boolean isRoot() {
5363
return pkgNode.isRoot();
5464
}

jadx-core/src/main/java/jadx/core/dex/nodes/PackageNode.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.ArrayList;
44
import java.util.List;
55
import java.util.Objects;
6+
import java.util.stream.Collectors;
67

78
import org.jetbrains.annotations.NotNull;
89
import org.jetbrains.annotations.Nullable;
@@ -188,6 +189,14 @@ public List<ClassNode> getClasses() {
188189
return classes;
189190
}
190191

192+
public List<ClassNode> getClassesNoDup() {
193+
return classes.stream()
194+
.map(ClassNode::getClassInfo)
195+
.collect(Collectors.toSet())
196+
.stream()
197+
.map(e -> root.resolveClass(e)).collect(Collectors.toList());
198+
}
199+
191200
public JavaPackage getJavaNode() {
192201
return javaNode;
193202
}

jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,43 @@ private static void markDuplicatedClasses(List<ClassNode> classes) {
217217

218218
public void addClassNode(ClassNode clsNode) {
219219
classes.add(clsNode);
220-
clsMap.put(clsNode.getClassInfo(), clsNode);
221-
rawClsMap.put(clsNode.getRawName(), clsNode);
220+
ClassNode prevClsNode = clsMap.get(clsNode.getClassInfo());
221+
if (prevClsNode == null) {
222+
clsMap.put(clsNode.getClassInfo(), clsNode);
223+
rawClsMap.put(clsNode.getRawName(), clsNode);
224+
} else {
225+
String prevFileName = prevClsNode.getInputFileName();
226+
String fileName = clsNode.getInputFileName();
227+
228+
boolean prevFileNameIsValid = prevFileName.matches("classes[1-9]\\d*.dex") && !prevFileName.equals("classes1.dex");
229+
boolean fileNameIsValid = fileName.matches("classes[1-9]\\d*.dex") && !fileName.equals("classes1.dex");
230+
231+
ClassNode newClsNode = clsNode;
232+
// classes.dex has precedence
233+
if (fileName.equals("classes.dex")) {
234+
newClsNode = clsNode;
235+
} else if (prevFileName.equals("classes.dex")) {
236+
newClsNode = prevClsNode;
237+
} else if (prevFileNameIsValid && !fileNameIsValid) {
238+
// valid dex names have precedence
239+
newClsNode = prevClsNode;
240+
} else if (!prevFileNameIsValid && fileNameIsValid) {
241+
newClsNode = clsNode;
242+
} else if (prevFileNameIsValid && fileNameIsValid) {
243+
// if both are valid, the lower index has precedence
244+
long index = Long.parseLong(fileName.substring(7, fileName.length() - 4));
245+
long prevIndex = Long.parseLong(prevFileName.substring(7, prevFileName.length() - 4));
246+
247+
if (index < prevIndex) {
248+
newClsNode = clsNode;
249+
} else {
250+
newClsNode = prevClsNode;
251+
}
252+
}
253+
254+
clsMap.put(newClsNode.getClassInfo(), newClsNode);
255+
rawClsMap.put(newClsNode.getRawName(), newClsNode);
256+
}
222257
}
223258

224259
public void loadResources(ResourcesLoader resLoader, List<ResourceFile> resources) {

jadx-gui/src/main/java/jadx/gui/utils/pkgs/PackageHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ private JPackage buildJPackage(JavaPackage javaPkg, boolean synthetic) {
174174
if (synthetic) {
175175
classes = Collections.emptyList();
176176
} else {
177-
classes = Utils.collectionMap(javaPkg.getClasses(), nodeCache::makeFrom);
177+
classes = Utils.collectionMap(javaPkg.getClassesNoDup(), nodeCache::makeFrom);
178178
classes.sort(CLASS_COMPARATOR);
179179
}
180180
return nodeCache.newJPackage(javaPkg, synthetic, pkgEnabled, classes);

0 commit comments

Comments
 (0)