perf: improve usage data apply

This commit is contained in:
Skylot
2023-03-21 17:21:59 +00:00
parent 2403d32ae4
commit e8e7028792
5 changed files with 34 additions and 32 deletions
@@ -77,6 +77,7 @@ public class RootNode {
private final TypeUtils typeUtils;
private final Map<ClassInfo, ClassNode> clsMap = new HashMap<>();
private final Map<String, ClassNode> rawClsMap = new HashMap<>();
private List<ClassNode> classes = new ArrayList<>();
private final Map<String, PackageNode> pkgMap = new HashMap<>();
@@ -192,6 +193,7 @@ public class RootNode {
public void addClassNode(ClassNode clsNode) {
classes.add(clsNode);
clsMap.put(clsNode.getClassInfo(), clsNode);
rawClsMap.put(clsNode.getRawName(), clsNode);
}
public void loadResources(List<ResourceFile> resources) {
@@ -462,6 +464,11 @@ public class RootNode {
return resolveClass(clsInfo);
}
@Nullable
public ClassNode resolveRawClass(String rawFullName) {
return rawClsMap.get(rawFullName);
}
/**
* Searches for ClassNode by its full name (original or alias name)
* <br>
@@ -518,7 +525,7 @@ public class RootNode {
}
public @NotNull MethodNode resolveDirectMethod(String rawClsName, String mthShortId) {
ClassNode clsNode = resolveClass(rawClsName);
ClassNode clsNode = resolveRawClass(rawClsName);
if (clsNode == null) {
throw new RuntimeException("Class not found: " + rawClsName);
}
@@ -1,22 +1,16 @@
package jadx.core.utils.exceptions;
import java.util.Arrays;
import jadx.api.ICodeWriter;
import jadx.core.utils.Utils;
public class JadxRuntimeException extends RuntimeException {
private static final long serialVersionUID = -7410848445429898248L;
public JadxRuntimeException() {
super();
}
public JadxRuntimeException(String message) {
super(message);
}
public JadxRuntimeException(String... lines) {
super(Utils.listToString(Arrays.asList(lines), ICodeWriter.NL + " "));
}
public JadxRuntimeException(String message, Throwable cause) {
super(message, cause);
}
@@ -21,6 +21,6 @@ public class ClassNodeAdapter implements DataAdapter<ClassNode> {
@Override
public ClassNode read(DataInput in) throws IOException {
return root.resolveClass(in.readUTF());
return root.resolveRawClass(in.readUTF());
}
}
@@ -27,7 +27,7 @@ public class FieldNodeAdapter implements DataAdapter<FieldNode> {
public FieldNode read(DataInput in) throws IOException {
String cls = in.readUTF();
String sign = in.readUTF();
ClassNode clsNode = root.resolveClass(cls);
ClassNode clsNode = root.resolveRawClass(cls);
if (clsNode == null) {
throw new RuntimeException("Class not found: " + cls);
}
+20 -19
View File
@@ -28,13 +28,13 @@ class UsageData implements IUsageInfoData {
@Override
public void apply() {
for (ClsUsageData clsUsageData : rawUsageData.getClsMap().values()) {
String clsRawName = clsUsageData.getRawName();
ClassNode cls = root.resolveClass(clsRawName);
if (cls == null) {
throw new JadxRuntimeException("Failed to resolve class: " + clsRawName);
Map<String, ClsUsageData> clsMap = rawUsageData.getClsMap();
for (ClassNode cls : root.getClasses()) {
String clsRawName = cls.getRawName();
ClsUsageData clsUsageData = clsMap.get(clsRawName);
if (clsUsageData != null) {
applyForClass(clsUsageData, cls);
}
applyForClass(clsUsageData, clsRawName, cls);
}
}
@@ -46,26 +46,27 @@ class UsageData implements IUsageInfoData {
LOG.debug("No usage data for class: {}", clsRawName);
return;
}
applyForClass(clsUsageData, clsRawName, cls);
applyForClass(clsUsageData, cls);
}
private void applyForClass(ClsUsageData clsUsageData, String clsRawName, ClassNode cls) {
private void applyForClass(ClsUsageData clsUsageData, ClassNode cls) {
cls.setDependencies(resolveClsList(clsUsageData.getClsDeps()));
cls.setUseIn(resolveClsList(clsUsageData.getClsUsage()));
cls.setUseInMth(resolveMthList(clsUsageData.getClsUseInMth()));
for (Map.Entry<String, MthUsageData> entry : clsUsageData.getMthUsage().entrySet()) {
MethodNode mth = cls.searchMethodByShortId(entry.getKey());
if (mth == null) {
throw new JadxRuntimeException("Method not found: " + clsRawName + "." + entry.getKey());
Map<String, MthUsageData> mthUsage = clsUsageData.getMthUsage();
for (MethodNode mth : cls.getMethods()) {
MthUsageData mthUsageData = mthUsage.get(mth.getMethodInfo().getShortId());
if (mthUsageData != null) {
mth.setUseIn(resolveMthList(mthUsageData.getUsage()));
}
mth.setUseIn(resolveMthList(entry.getValue().getUsage()));
}
for (Map.Entry<String, FldUsageData> entry : clsUsageData.getFldUsage().entrySet()) {
FieldNode fld = cls.searchFieldByShortId(entry.getKey());
if (fld == null) {
throw new JadxRuntimeException("Field not found: " + clsRawName + "." + entry.getKey());
Map<String, FldUsageData> fldUsage = clsUsageData.getFldUsage();
for (FieldNode fld : cls.getFields()) {
FldUsageData fldUsageData = fldUsage.get(fld.getFieldInfo().getShortId());
if (fldUsageData != null) {
fld.setUseIn(resolveMthList(fldUsageData.getUsage()));
}
fld.setUseIn(resolveMthList(entry.getValue().getUsage()));
}
}
@@ -75,7 +76,7 @@ class UsageData implements IUsageInfoData {
}
private List<ClassNode> resolveClsList(List<String> clsList) {
return Utils.collectionMap(clsList, root::resolveClass);
return Utils.collectionMap(clsList, root::resolveRawClass);
}
private List<MethodNode> resolveMthList(List<MthRef> mthRefList) {