diff --git a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java index 30d1616d0..c6c6783c8 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -332,7 +332,7 @@ public class ClassGen { private void insertDecompilationProblems(CodeWriter code, AttrNode node) { List errors = node.getAll(AType.JADX_ERROR); if (!errors.isEmpty()) { - errors.forEach(err -> { + errors.stream().sorted().forEach(err -> { code.startLine("/* JADX ERROR: ").add(err.getError()); Throwable cause = err.getCause(); if (cause != null) { @@ -345,8 +345,8 @@ public class ClassGen { } List warns = node.getAll(AType.JADX_WARN); if (!warns.isEmpty()) { - warns.stream().distinct() - .forEach(warn -> code.startLine("/* JADX WARNING: ").addMultiLine(warn).add(" */")); + warns.stream().distinct().sorted() + .forEach(warn -> code.startLine("/* JADX WARNING: ").addMultiLine(warn).add(" */")); } } diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java index caefb44d6..dfdf5b54b 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java @@ -2,6 +2,7 @@ package jadx.core.dex.attributes; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.EnumSet; import java.util.IdentityHashMap; import java.util.List; @@ -121,6 +122,7 @@ public class AttributeStorage { if (list.isEmpty()) { return ""; } + list.sort(String::compareTo); return "A[" + Utils.listToString(list) + ']'; } } 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 5c7837e61..d182b7305 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 @@ -3,10 +3,8 @@ package jadx.core.dex.nodes; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import com.android.dex.ClassData; import com.android.dex.ClassData.Field; @@ -60,7 +58,7 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { private ClassNode parentClass; private ProcessState state = ProcessState.NOT_LOADED; - private final Set dependencies = new HashSet<>(); + private List dependencies = Collections.emptyList(); // cache maps private Map mthInfoMap = Collections.emptyMap(); @@ -527,10 +525,14 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode { this.state = state; } - public Set getDependencies() { + public List getDependencies() { return dependencies; } + public void setDependencies(List dependencies) { + this.dependencies = dependencies; + } + @Override public int hashCode() { return clsInfo.hashCode(); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/DependencyCollector.java b/jadx-core/src/main/java/jadx/core/dex/visitors/DependencyCollector.java index bc0254389..b1fce3f71 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/DependencyCollector.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/DependencyCollector.java @@ -1,5 +1,9 @@ package jadx.core.dex.visitors; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; import java.util.Set; import jadx.core.dex.attributes.AType; @@ -26,12 +30,16 @@ public class DependencyCollector extends AbstractVisitor { @Override public boolean visit(ClassNode cls) throws JadxException { DexNode dex = cls.dex(); - Set depList = cls.getDependencies(); - processClass(cls, dex, depList); + Set depSet = new HashSet<>(); + processClass(cls, dex, depSet); for (ClassNode inner : cls.getInnerClasses()) { - processClass(inner, dex, depList); + processClass(inner, dex, depSet); } - depList.remove(cls); + depSet.remove(cls); + + List depList = new ArrayList<>(depSet); + depList.sort(Comparator.comparing(c -> c.getClassInfo().getFullName())); + cls.setDependencies(depList); return false; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInferenceVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInferenceVisitor.java index 2162b9d03..a4dedd557 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInferenceVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeinference/TypeInferenceVisitor.java @@ -90,18 +90,15 @@ public final class TypeInferenceVisitor extends AbstractVisitor { } private void runMultiVariableSearch(MethodNode mth) { - long startTime = System.currentTimeMillis(); TypeSearch typeSearch = new TypeSearch(mth); - boolean success; try { - success = typeSearch.run(); + boolean success = typeSearch.run(); + if (!success) { + mth.addWarn("Multi-variable type inference failed"); + } } catch (Exception e) { - success = false; mth.addWarn("Multi-variable type inference failed. Error: " + Utils.getStackTrace(e)); } - long time = System.currentTimeMillis() - startTime; - mth.addComment("JADX DEBUG: Multi-variable type inference result: " + (success ? "success" : "failure") - + ", time: " + time + " ms"); } private boolean setImmutableType(SSAVar ssaVar) {