diff --git a/jadx-core/src/main/java/jadx/core/dex/info/MethodInfo.java b/jadx-core/src/main/java/jadx/core/dex/info/MethodInfo.java index 8f9bb8993..261f9fe49 100644 --- a/jadx-core/src/main/java/jadx/core/dex/info/MethodInfo.java +++ b/jadx-core/src/main/java/jadx/core/dex/info/MethodInfo.java @@ -132,10 +132,7 @@ public final class MethodInfo { if (this == obj) { return true; } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { + if (!(obj instanceof MethodInfo)) { return false; } MethodInfo other = (MethodInfo) obj; diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index 2e0517439..a53a55f26 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -25,6 +25,7 @@ import jadx.core.utils.exceptions.JadxRuntimeException; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; @@ -65,6 +66,9 @@ public class ClassNode extends LineAttrNode implements ILoadable { private ProcessState state = ProcessState.NOT_LOADED; private final Set dependencies = new HashSet(); + // cache maps + private Map mthInfoMap = Collections.emptyMap(); + public ClassNode(DexNode dex, ClassDef cls) throws DecodeException { this.dex = dex; this.clsInfo = ClassInfo.fromDex(dex, cls.getTypeIndex()); @@ -126,6 +130,7 @@ public class ClassNode extends LineAttrNode implements ILoadable { } this.accessFlags = new AccessInfo(accFlagsValue, AFType.CLASS); + buildCache(); } catch (Exception e) { throw new DecodeException("Error decode class: " + clsInfo, e); } @@ -278,6 +283,13 @@ public class ClassNode extends LineAttrNode implements ILoadable { } } + private void buildCache() { + mthInfoMap = new HashMap(methods.size()); + for (MethodNode mth : methods) { + mthInfoMap.put(mth.getMethodInfo(), mth); + } + } + @Nullable public ArgType getSuperClass() { return superClass; @@ -384,12 +396,7 @@ public class ClassNode extends LineAttrNode implements ILoadable { } public MethodNode searchMethod(MethodInfo mth) { - for (MethodNode m : methods) { - if (m.getMethodInfo().equals(mth)) { - return m; - } - } - return null; + return mthInfoMap.get(mth); } public MethodNode searchMethodByName(String shortId) { diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java index ec9042603..d41240966 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java @@ -513,11 +513,11 @@ public class MethodNode extends LineAttrNode implements ILoadable { } String name = getName(); - List methods = parentClass.getMethods(); - for (MethodNode method : methods) { + for (MethodNode method : parentClass.getMethods()) { + MethodInfo otherMthInfo = method.mthInfo; if (this != method - && method.getName().equals(name) - && method.mthInfo.getArgumentsTypes().size() == argsCount) { + && otherMthInfo.getArgumentsTypes().size() == argsCount + && otherMthInfo.getName().equals(name)) { return true; } }