fix: improve rename using source class name (#2397)

This commit is contained in:
Skylot
2025-01-20 21:55:46 +00:00
parent bc4bb0dc41
commit a43b475be7
15 changed files with 67 additions and 13 deletions
+11 -1
View File
@@ -106,6 +106,7 @@ public class JadxArgs implements Closeable {
private boolean deobfuscationOn = false;
private UseSourceNameAsClassNameAlias useSourceNameAsClassNameAlias = UseSourceNameAsClassNameAlias.getDefault();
private int sourceNameRepeatLimit = 10;
private File generatedRenamesMappingFile = null;
private GeneratedRenamesMappingFileMode generatedRenamesMappingFileMode = GeneratedRenamesMappingFileMode.getDefault();
@@ -460,6 +461,14 @@ public class JadxArgs implements Closeable {
this.useSourceNameAsClassNameAlias = useSourceNameAsClassNameAlias;
}
public int getSourceNameRepeatLimit() {
return sourceNameRepeatLimit;
}
public void setSourceNameRepeatLimit(int sourceNameRepeatLimit) {
this.sourceNameRepeatLimit = sourceNameRepeatLimit;
}
/**
* @deprecated Use {@link #getUseSourceNameAsClassNameAlias()} instead.
*/
@@ -800,7 +809,7 @@ public class JadxArgs implements Closeable {
String argStr = "args:" + decompilationMode + useImports + showInconsistentCode
+ inlineAnonymousClasses + inlineMethods + moveInnerClasses + allowInlineKotlinLambda
+ deobfuscationOn + deobfuscationMinLength + deobfuscationMaxLength + deobfuscationWhitelist
+ useSourceNameAsClassNameAlias
+ useSourceNameAsClassNameAlias + sourceNameRepeatLimit
+ resourceNameSource
+ useKotlinMethodsForVarNames
+ insertDebugLines + extractFinally
@@ -841,6 +850,7 @@ public class JadxArgs implements Closeable {
+ ", generatedRenamesMappingFileMode=" + generatedRenamesMappingFileMode
+ ", resourceNameSource=" + resourceNameSource
+ ", useSourceNameAsClassNameAlias=" + useSourceNameAsClassNameAlias
+ ", sourceNameRepeatLimit=" + sourceNameRepeatLimit
+ ", useKotlinMethodsForVarNames=" + useKotlinMethodsForVarNames
+ ", insertDebugLines=" + insertDebugLines
+ ", extractFinally=" + extractFinally
@@ -34,11 +34,15 @@ public class SourceFileRename extends AbstractVisitor {
if (useSourceName == UseSourceNameAsClassNameAlias.NEVER) {
return;
}
int repeatLimit = root.getArgs().getSourceNameRepeatLimit();
if (repeatLimit <= 1) {
return;
}
List<ClassNode> classes = root.getClasses();
Map<String, Boolean> canUseAlias = new HashMap<>();
Map<String, Integer> aliasUseCount = new HashMap<>();
for (ClassNode cls : classes) {
canUseAlias.put(cls.getClassInfo().getShortName(), Boolean.FALSE);
aliasUseCount.put(cls.getClassInfo().getShortName(), 1);
}
List<ClsRename> renames = new ArrayList<>();
for (ClassNode cls : classes) {
@@ -47,19 +51,17 @@ public class SourceFileRename extends AbstractVisitor {
}
String alias = getAliasFromSourceFile(cls);
if (alias != null) {
Boolean prev = canUseAlias.get(alias);
if (prev == null) {
canUseAlias.put(alias, Boolean.TRUE);
renames.add(new ClsRename(cls, alias));
} else if (prev == Boolean.TRUE) {
canUseAlias.put(alias, Boolean.FALSE);
int count = aliasUseCount.merge(alias, 1, Integer::sum);
if (count < repeatLimit) {
renames.add(new ClsRename(cls, alias, count));
}
}
}
for (ClsRename clsRename : renames) {
String alias = clsRename.getAlias();
if (canUseAlias.get(alias) == Boolean.TRUE) {
applyRename(clsRename.getCls(), alias, useSourceName);
Integer count = aliasUseCount.get(alias);
if (count < repeatLimit) {
applyRename(clsRename.getCls(), clsRename.buildAlias(), useSourceName);
}
}
}
@@ -112,10 +114,12 @@ public class SourceFileRename extends AbstractVisitor {
private static final class ClsRename {
private final ClassNode cls;
private final String alias;
private final int suffix;
private ClsRename(ClassNode cls, String alias) {
private ClsRename(ClassNode cls, String alias, int suffix) {
this.cls = cls;
this.alias = alias;
this.suffix = suffix;
}
public ClassNode getCls() {
@@ -126,9 +130,17 @@ public class SourceFileRename extends AbstractVisitor {
return alias;
}
public int getSuffix() {
return suffix;
}
public String buildAlias() {
return suffix < 2 ? alias : alias + suffix;
}
@Override
public String toString() {
return "ClsRename{" + cls + " -> '" + alias + "'}";
return "ClsRename{" + cls + " -> '" + alias + suffix + "'}";
}
}
}