From e8e702879247f5c9c3a0fbc8a4ade26c8c60f8f2 Mon Sep 17 00:00:00 2001 From: Skylot Date: Tue, 21 Mar 2023 17:21:59 +0000 Subject: [PATCH] perf: improve usage data apply --- .../java/jadx/core/dex/nodes/RootNode.java | 9 ++++- .../exceptions/JadxRuntimeException.java | 14 ++----- .../code/disk/adapters/ClassNodeAdapter.java | 2 +- .../code/disk/adapters/FieldNodeAdapter.java | 2 +- .../java/jadx/gui/cache/usage/UsageData.java | 39 ++++++++++--------- 5 files changed, 34 insertions(+), 32 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java index 344b43a5a..bbab9557a 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java @@ -77,6 +77,7 @@ public class RootNode { private final TypeUtils typeUtils; private final Map clsMap = new HashMap<>(); + private final Map rawClsMap = new HashMap<>(); private List classes = new ArrayList<>(); private final Map 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 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) *
@@ -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); } diff --git a/jadx-core/src/main/java/jadx/core/utils/exceptions/JadxRuntimeException.java b/jadx-core/src/main/java/jadx/core/utils/exceptions/JadxRuntimeException.java index 69d8b0e6c..e2e47b258 100644 --- a/jadx-core/src/main/java/jadx/core/utils/exceptions/JadxRuntimeException.java +++ b/jadx-core/src/main/java/jadx/core/utils/exceptions/JadxRuntimeException.java @@ -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); } diff --git a/jadx-gui/src/main/java/jadx/gui/cache/code/disk/adapters/ClassNodeAdapter.java b/jadx-gui/src/main/java/jadx/gui/cache/code/disk/adapters/ClassNodeAdapter.java index 51f004482..a658e70a5 100644 --- a/jadx-gui/src/main/java/jadx/gui/cache/code/disk/adapters/ClassNodeAdapter.java +++ b/jadx-gui/src/main/java/jadx/gui/cache/code/disk/adapters/ClassNodeAdapter.java @@ -21,6 +21,6 @@ public class ClassNodeAdapter implements DataAdapter { @Override public ClassNode read(DataInput in) throws IOException { - return root.resolveClass(in.readUTF()); + return root.resolveRawClass(in.readUTF()); } } diff --git a/jadx-gui/src/main/java/jadx/gui/cache/code/disk/adapters/FieldNodeAdapter.java b/jadx-gui/src/main/java/jadx/gui/cache/code/disk/adapters/FieldNodeAdapter.java index f47274cd4..b5e7aa4d1 100644 --- a/jadx-gui/src/main/java/jadx/gui/cache/code/disk/adapters/FieldNodeAdapter.java +++ b/jadx-gui/src/main/java/jadx/gui/cache/code/disk/adapters/FieldNodeAdapter.java @@ -27,7 +27,7 @@ public class FieldNodeAdapter implements DataAdapter { 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); } diff --git a/jadx-gui/src/main/java/jadx/gui/cache/usage/UsageData.java b/jadx-gui/src/main/java/jadx/gui/cache/usage/UsageData.java index f8f97e50d..e34be77bf 100644 --- a/jadx-gui/src/main/java/jadx/gui/cache/usage/UsageData.java +++ b/jadx-gui/src/main/java/jadx/gui/cache/usage/UsageData.java @@ -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 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 entry : clsUsageData.getMthUsage().entrySet()) { - MethodNode mth = cls.searchMethodByShortId(entry.getKey()); - if (mth == null) { - throw new JadxRuntimeException("Method not found: " + clsRawName + "." + entry.getKey()); + + Map 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 entry : clsUsageData.getFldUsage().entrySet()) { - FieldNode fld = cls.searchFieldByShortId(entry.getKey()); - if (fld == null) { - throw new JadxRuntimeException("Field not found: " + clsRawName + "." + entry.getKey()); + Map 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 resolveClsList(List clsList) { - return Utils.collectionMap(clsList, root::resolveClass); + return Utils.collectionMap(clsList, root::resolveRawClass); } private List resolveMthList(List mthRefList) {