From b4d08bdc5580161c0ec518697dd122115e7b50c0 Mon Sep 17 00:00:00 2001 From: Skylot Date: Thu, 2 May 2013 18:13:35 +0400 Subject: [PATCH] Split Main class --- src/main/java/jadx/Jadx.java | 123 ++++++++++++++++++++++++++++ src/main/java/jadx/JadxArgs.java | 5 +- src/main/java/jadx/Main.java | 136 +++---------------------------- 3 files changed, 137 insertions(+), 127 deletions(-) create mode 100644 src/main/java/jadx/Jadx.java diff --git a/src/main/java/jadx/Jadx.java b/src/main/java/jadx/Jadx.java new file mode 100644 index 000000000..2be5f504e --- /dev/null +++ b/src/main/java/jadx/Jadx.java @@ -0,0 +1,123 @@ +package jadx; + +import jadx.codegen.CodeGen; +import jadx.dex.info.ClassInfo; +import jadx.dex.nodes.ClassNode; +import jadx.dex.nodes.RootNode; +import jadx.dex.visitors.BlockMakerVisitor; +import jadx.dex.visitors.ClassModifier; +import jadx.dex.visitors.CodeShrinker; +import jadx.dex.visitors.ConstInlinerVisitor; +import jadx.dex.visitors.DotGraphVisitor; +import jadx.dex.visitors.EnumVisitor; +import jadx.dex.visitors.FallbackModeVisitor; +import jadx.dex.visitors.IDexTreeVisitor; +import jadx.dex.visitors.MethodInlinerVisitor; +import jadx.dex.visitors.ModVisitor; +import jadx.dex.visitors.regions.CheckRegions; +import jadx.dex.visitors.regions.CleanRegions; +import jadx.dex.visitors.regions.PostRegionVisitor; +import jadx.dex.visitors.regions.ProcessVariables; +import jadx.dex.visitors.regions.RegionMakerVisitor; +import jadx.dex.visitors.typeresolver.FinishTypeResolver; +import jadx.dex.visitors.typeresolver.TypeResolver; +import jadx.utils.ErrorsCounter; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Jadx { + private static final Logger LOG = LoggerFactory.getLogger(Jadx.class); + + static { + if (Consts.DEBUG) + LOG.info("debug enabled"); + if (Jadx.class.desiredAssertionStatus()) + LOG.info("assertions enabled"); + } + + public static int run(JadxArgs args) { + int errorCount; + try { + RootNode root = new RootNode(args); + LOG.info("loading ..."); + root.load(); + LOG.info("processing ..."); + root.init(); + + int threadsCount = args.getThreadsCount(); + LOG.debug("processing threads count: {}", threadsCount); + + List passes = getPassesList(args); + if (threadsCount == 1) { + for (ClassNode cls : root.getClasses()) { + ProcessClass job = new ProcessClass(cls, passes); + job.run(); + } + } else { + ExecutorService executor = Executors.newFixedThreadPool(threadsCount); + for (ClassNode cls : root.getClasses()) { + ProcessClass job = new ProcessClass(cls, passes); + executor.execute(job); + } + executor.shutdown(); + executor.awaitTermination(100, TimeUnit.DAYS); + } + } catch (Throwable e) { + LOG.error("jadx error:", e); + } finally { + errorCount = ErrorsCounter.getErrorCount(); + if (errorCount != 0) + ErrorsCounter.printReport(); + + // clear resources if we use jadx as a library + ClassInfo.clearCache(); + ErrorsCounter.reset(); + } + LOG.info("done"); + return errorCount; + } + + private static List getPassesList(JadxArgs args) { + List passes = new ArrayList(); + if (args.isFallbackMode()) { + passes.add(new FallbackModeVisitor()); + } else { + passes.add(new BlockMakerVisitor()); + + passes.add(new TypeResolver()); + passes.add(new ConstInlinerVisitor()); + passes.add(new FinishTypeResolver()); + + if (args.isRawCFGOutput()) + passes.add(new DotGraphVisitor(args.getOutDir(), false, true)); + + passes.add(new ModVisitor()); + passes.add(new EnumVisitor()); + + if (args.isCFGOutput()) + passes.add(new DotGraphVisitor(args.getOutDir(), false)); + + passes.add(new RegionMakerVisitor()); + passes.add(new PostRegionVisitor()); + + passes.add(new CodeShrinker()); + passes.add(new ProcessVariables()); + passes.add(new CheckRegions()); + if (args.isCFGOutput()) + passes.add(new DotGraphVisitor(args.getOutDir(), true)); + + passes.add(new MethodInlinerVisitor()); + passes.add(new ClassModifier()); + passes.add(new CleanRegions()); + } + passes.add(new CodeGen(args)); + return passes; + } +} diff --git a/src/main/java/jadx/JadxArgs.java b/src/main/java/jadx/JadxArgs.java index b8876fb9d..fd082ea4e 100644 --- a/src/main/java/jadx/JadxArgs.java +++ b/src/main/java/jadx/JadxArgs.java @@ -51,10 +51,9 @@ public class JadxArgs { private final List input = new ArrayList(); private File outputDir; - public void parse(String[] args) throws JadxException { + public void parse(String[] args) { try { new JCommander(this, args); - processArgs(); } catch (ParameterException e) { System.out.println("Arguments parse error: " + e.getMessage()); System.out.println(); @@ -62,7 +61,7 @@ public class JadxArgs { } } - private void processArgs() throws JadxException { + public void processArgs() throws JadxException { if (printHelp) return; diff --git a/src/main/java/jadx/Main.java b/src/main/java/jadx/Main.java index 705b9e0a9..554699b18 100644 --- a/src/main/java/jadx/Main.java +++ b/src/main/java/jadx/Main.java @@ -1,138 +1,19 @@ package jadx; -import jadx.codegen.CodeGen; -import jadx.dex.info.ClassInfo; -import jadx.dex.nodes.ClassNode; -import jadx.dex.nodes.RootNode; -import jadx.dex.visitors.BlockMakerVisitor; -import jadx.dex.visitors.ClassModifier; -import jadx.dex.visitors.CodeShrinker; -import jadx.dex.visitors.ConstInlinerVisitor; -import jadx.dex.visitors.DotGraphVisitor; -import jadx.dex.visitors.EnumVisitor; -import jadx.dex.visitors.FallbackModeVisitor; -import jadx.dex.visitors.IDexTreeVisitor; -import jadx.dex.visitors.MethodInlinerVisitor; -import jadx.dex.visitors.ModVisitor; -import jadx.dex.visitors.regions.CheckRegions; -import jadx.dex.visitors.regions.CleanRegions; -import jadx.dex.visitors.regions.PostRegionVisitor; -import jadx.dex.visitors.regions.ProcessVariables; -import jadx.dex.visitors.regions.RegionMakerVisitor; -import jadx.dex.visitors.typeresolver.FinishTypeResolver; -import jadx.dex.visitors.typeresolver.TypeResolver; -import jadx.utils.ErrorsCounter; import jadx.utils.exceptions.JadxException; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Main { private static final Logger LOG = LoggerFactory.getLogger(Main.class); - static { - if (Consts.DEBUG) - LOG.info("debug enabled"); - if (Main.class.desiredAssertionStatus()) - LOG.info("assertions enabled"); - } - - public static int run(JadxArgs args) { - int errorCount; - try { - RootNode root = new RootNode(args); - LOG.info("loading ..."); - root.load(); - LOG.info("processing ..."); - root.init(); - - int threadsCount = args.getThreadsCount(); - LOG.debug("processing threads count: {}", threadsCount); - - List passes = getPassesList(args); - if (threadsCount == 1) { - for (ClassNode cls : root.getClasses()) { - ProcessClass job = new ProcessClass(cls, passes); - job.run(); - } - } else { - ExecutorService executor = Executors.newFixedThreadPool(threadsCount); - for (ClassNode cls : root.getClasses()) { - ProcessClass job = new ProcessClass(cls, passes); - executor.execute(job); - } - executor.shutdown(); - executor.awaitTermination(100, TimeUnit.DAYS); - } - } catch (Throwable e) { - LOG.error("jadx error:", e); - } finally { - errorCount = ErrorsCounter.getErrorCount(); - if (errorCount != 0) - ErrorsCounter.printReport(); - - // clear resources if we use jadx as a library - ClassInfo.clearCache(); - ErrorsCounter.reset(); - } - LOG.info("done"); - return errorCount; - } - - private static List getPassesList(JadxArgs args) { - List passes = new ArrayList(); - if (args.isFallbackMode()) { - passes.add(new FallbackModeVisitor()); - } else { - passes.add(new BlockMakerVisitor()); - - passes.add(new TypeResolver()); - passes.add(new ConstInlinerVisitor()); - passes.add(new FinishTypeResolver()); - - if (args.isRawCFGOutput()) - passes.add(new DotGraphVisitor(args.getOutDir(), false, true)); - - passes.add(new ModVisitor()); - passes.add(new EnumVisitor()); - - if (args.isCFGOutput()) - passes.add(new DotGraphVisitor(args.getOutDir(), false)); - - passes.add(new RegionMakerVisitor()); - passes.add(new PostRegionVisitor()); - - passes.add(new CodeShrinker()); - passes.add(new ProcessVariables()); - passes.add(new CheckRegions()); - if (args.isCFGOutput()) - passes.add(new DotGraphVisitor(args.getOutDir(), true)); - - passes.add(new MethodInlinerVisitor()); - passes.add(new ClassModifier()); - passes.add(new CleanRegions()); - } - passes.add(new CodeGen(args)); - return passes; - } - public static void main(String[] args) { JadxArgs jadxArgs = new JadxArgs(); - try { - jadxArgs.parse(args); - if (jadxArgs.isPrintHelp()) { - jadxArgs.printUsage(); - System.exit(0); - } - } catch (JadxException e) { - LOG.error("Error: " + e.getMessage()); - System.exit(1); + jadxArgs.parse(args); + if (jadxArgs.isPrintHelp()) { + jadxArgs.printUsage(); + System.exit(0); } if (jadxArgs.isVerbose()) { @@ -141,7 +22,14 @@ public class Main { rootLogger.setLevel(ch.qos.logback.classic.Level.DEBUG); } - int result = run(jadxArgs); + try { + jadxArgs.processArgs(); + } catch (JadxException e) { + LOG.error("Error: " + e.getMessage()); + System.exit(1); + } + + int result = Jadx.run(jadxArgs); System.exit(result); } }