perf: improve usage data apply
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
+1
-1
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user