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 9d3b36610..380862d6b 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -24,6 +24,7 @@ import jadx.core.utils.exceptions.CodegenException; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -39,6 +40,13 @@ import com.android.dx.rop.code.AccessFlags; public class ClassGen { private static final Logger LOG = LoggerFactory.getLogger(ClassGen.class); + public static final Comparator METHOD_LINE_COMPARATOR = new Comparator() { + @Override + public int compare(MethodNode a, MethodNode b) { + return Utils.compare(a.getSourceLine(), b.getSourceLine()); + } + }; + private final ClassNode cls; private final ClassGen parentGen; private final AnnotationGen annotationGen; @@ -239,7 +247,8 @@ public class ClassGen { } private void addMethods(CodeWriter code) { - for (MethodNode mth : cls.getMethods()) { + List methods = sortMethodsByLine(cls.getMethods()); + for (MethodNode mth : methods) { if (mth.contains(AFlag.DONT_GENERATE)) { continue; } @@ -255,6 +264,12 @@ public class ClassGen { } } + private static List sortMethodsByLine(List methods) { + List out = new ArrayList(methods); + Collections.sort(out, METHOD_LINE_COMPARATOR); + return out; + } + private boolean isMethodsPresents() { for (MethodNode mth : cls.getMethods()) { if (!mth.contains(AFlag.DONT_GENERATE)) { diff --git a/jadx-core/src/main/java/jadx/core/utils/Utils.java b/jadx-core/src/main/java/jadx/core/utils/Utils.java index 7d5102af1..94d432906 100644 --- a/jadx-core/src/main/java/jadx/core/utils/Utils.java +++ b/jadx-core/src/main/java/jadx/core/utils/Utils.java @@ -90,4 +90,8 @@ public class Utils { throwable.printStackTrace(pw); return sw.getBuffer().toString(); } + + public static int compare(int x, int y) { + return (x < y) ? -1 : ((x == y) ? 0 : 1); + } }