Commit dfe97b76 authored by Skylot's avatar Skylot

Refactoring: extract interface for JadxArgs

parent b3fa8dbe
package jadx;
import jadx.utils.files.InputFile;
import java.io.File;
import java.util.List;
public interface IJadxArgs {
File getOutDir();
int getThreadsCount();
boolean isCFGOutput();
boolean isRawCFGOutput();
List<InputFile> getInput();
boolean isFallbackMode();
boolean isNotObfuscated();
boolean isVerbose();
boolean isPrintHelp();
}
...@@ -32,7 +32,7 @@ import java.util.concurrent.TimeUnit; ...@@ -32,7 +32,7 @@ import java.util.concurrent.TimeUnit;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class Jadx { public class Jadx implements Runnable {
private static final Logger LOG = LoggerFactory.getLogger(Jadx.class); private static final Logger LOG = LoggerFactory.getLogger(Jadx.class);
static { static {
...@@ -42,8 +42,14 @@ public class Jadx { ...@@ -42,8 +42,14 @@ public class Jadx {
LOG.info("assertions enabled"); LOG.info("assertions enabled");
} }
public static int run(JadxArgs args) { private final IJadxArgs args;
int errorCount; private int errorsCount;
public Jadx(IJadxArgs args) {
this.args = args;
}
public void run() {
try { try {
RootNode root = new RootNode(args); RootNode root = new RootNode(args);
LOG.info("loading ..."); LOG.info("loading ...");
...@@ -72,8 +78,8 @@ public class Jadx { ...@@ -72,8 +78,8 @@ public class Jadx {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("jadx error:", e); LOG.error("jadx error:", e);
} finally { } finally {
errorCount = ErrorsCounter.getErrorCount(); errorsCount = ErrorsCounter.getErrorCount();
if (errorCount != 0) if (errorsCount != 0)
ErrorsCounter.printReport(); ErrorsCounter.printReport();
// clear resources if we use jadx as a library // clear resources if we use jadx as a library
...@@ -81,10 +87,9 @@ public class Jadx { ...@@ -81,10 +87,9 @@ public class Jadx {
ErrorsCounter.reset(); ErrorsCounter.reset();
} }
LOG.info("done"); LOG.info("done");
return errorCount;
} }
private static List<IDexTreeVisitor> getPassesList(JadxArgs args) { private static List<IDexTreeVisitor> getPassesList(IJadxArgs args) {
List<IDexTreeVisitor> passes = new ArrayList<IDexTreeVisitor>(); List<IDexTreeVisitor> passes = new ArrayList<IDexTreeVisitor>();
if (args.isFallbackMode()) { if (args.isFallbackMode()) {
passes.add(new FallbackModeVisitor()); passes.add(new FallbackModeVisitor());
...@@ -120,4 +125,8 @@ public class Jadx { ...@@ -120,4 +125,8 @@ public class Jadx {
passes.add(new CodeGen(args)); passes.add(new CodeGen(args));
return passes; return passes;
} }
public int getErrorsCount() {
return errorsCount;
}
} }
...@@ -18,34 +18,34 @@ import com.beust.jcommander.Parameter; ...@@ -18,34 +18,34 @@ import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParameterDescription; import com.beust.jcommander.ParameterDescription;
import com.beust.jcommander.ParameterException; import com.beust.jcommander.ParameterException;
public class JadxArgs { public class JadxArgs implements IJadxArgs {
private static final Logger LOG = LoggerFactory.getLogger(JadxArgs.class); private static final Logger LOG = LoggerFactory.getLogger(JadxArgs.class);
@Parameter(description = "<input files> (.dex, .apk, .jar or .class)", required = true) @Parameter(description = "<input files> (.dex, .apk, .jar or .class)", required = true)
protected List<String> files; protected List<String> files;
@Parameter(names = { "-d", "--output-dir" }, description = "output directory") @Parameter(names = {"-d", "--output-dir"}, description = "output directory")
protected String outDirName; protected String outDirName;
@Parameter(names = { "-j", "--threads-count" }, description = "processing threads count") @Parameter(names = {"-j", "--threads-count"}, description = "processing threads count")
protected int threadsCount = Runtime.getRuntime().availableProcessors(); protected int threadsCount = Runtime.getRuntime().availableProcessors();
@Parameter(names = { "-f", "--fallback" }, description = "make simple dump (using goto instead of 'if', 'for', etc)", help = true) @Parameter(names = {"-f", "--fallback"}, description = "make simple dump (using goto instead of 'if', 'for', etc)", help = true)
protected boolean fallbackMode = false; protected boolean fallbackMode = false;
@Parameter(names = { "--not-obfuscated" }, description = "set this flag if code not obfuscated") @Parameter(names = {"--not-obfuscated"}, description = "set this flag if code not obfuscated")
protected boolean notObfuscated = false; protected boolean notObfuscated = false;
@Parameter(names = { "--cfg" }, description = "save methods control flow graph") @Parameter(names = {"--cfg"}, description = "save methods control flow graph")
protected boolean cfgOutput = false; protected boolean cfgOutput = false;
@Parameter(names = { "--raw-cfg" }, description = "save methods control flow graph (use raw instructions)") @Parameter(names = {"--raw-cfg"}, description = "save methods control flow graph (use raw instructions)")
protected boolean rawCfgOutput = false; protected boolean rawCfgOutput = false;
@Parameter(names = { "-v", "--verbose" }, description = "verbose output") @Parameter(names = {"-v", "--verbose"}, description = "verbose output")
protected boolean verbose = false; protected boolean verbose = false;
@Parameter(names = { "-h", "--help" }, description = "print this help", help = true) @Parameter(names = {"-h", "--help"}, description = "print this help", help = true)
protected boolean printHelp = false; protected boolean printHelp = false;
private final List<InputFile> input = new ArrayList<InputFile>(); private final List<InputFile> input = new ArrayList<InputFile>();
...@@ -147,38 +147,47 @@ public class JadxArgs { ...@@ -147,38 +147,47 @@ public class JadxArgs {
str.append(' '); str.append(' ');
} }
@Override
public File getOutDir() { public File getOutDir() {
return outputDir; return outputDir;
} }
@Override
public int getThreadsCount() { public int getThreadsCount() {
return threadsCount; return threadsCount;
} }
@Override
public boolean isCFGOutput() { public boolean isCFGOutput() {
return cfgOutput; return cfgOutput;
} }
@Override
public boolean isRawCFGOutput() { public boolean isRawCFGOutput() {
return rawCfgOutput; return rawCfgOutput;
} }
@Override
public List<InputFile> getInput() { public List<InputFile> getInput() {
return input; return input;
} }
@Override
public boolean isFallbackMode() { public boolean isFallbackMode() {
return fallbackMode; return fallbackMode;
} }
@Override
public boolean isNotObfuscated() { public boolean isNotObfuscated() {
return notObfuscated; return notObfuscated;
} }
@Override
public boolean isVerbose() { public boolean isVerbose() {
return verbose; return verbose;
} }
@Override
public boolean isPrintHelp() { public boolean isPrintHelp() {
return printHelp; return printHelp;
} }
......
package jadx; package jadx;
import jadx.utils.exceptions.JadxException; import jadx.utils.exceptions.JadxException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -29,7 +28,8 @@ public class Main { ...@@ -29,7 +28,8 @@ public class Main {
System.exit(1); System.exit(1);
} }
int result = Jadx.run(jadxArgs); Jadx jadx = new Jadx(jadxArgs);
System.exit(result); jadx.run();
System.exit(jadx.getErrorsCount());
} }
} }
package jadx.codegen; package jadx.codegen;
import jadx.JadxArgs; import jadx.IJadxArgs;
import jadx.dex.nodes.ClassNode; import jadx.dex.nodes.ClassNode;
import jadx.dex.visitors.AbstractVisitor; import jadx.dex.visitors.AbstractVisitor;
import jadx.utils.exceptions.CodegenException; import jadx.utils.exceptions.CodegenException;
...@@ -10,9 +10,9 @@ import java.io.File; ...@@ -10,9 +10,9 @@ import java.io.File;
public class CodeGen extends AbstractVisitor { public class CodeGen extends AbstractVisitor {
private final File dir; private final File dir;
private final JadxArgs args; private final IJadxArgs args;
public CodeGen(JadxArgs args) { public CodeGen(IJadxArgs args) {
this.args = args; this.args = args;
this.dir = args.getOutDir(); this.dir = args.getOutDir();
} }
......
package jadx.dex.nodes; package jadx.dex.nodes;
import jadx.JadxArgs; import jadx.IJadxArgs;
import jadx.dex.info.ClassInfo; import jadx.dex.info.ClassInfo;
import jadx.utils.exceptions.DecodeException; import jadx.utils.exceptions.DecodeException;
import jadx.utils.files.InputFile; import jadx.utils.files.InputFile;
...@@ -16,18 +16,18 @@ import org.slf4j.LoggerFactory; ...@@ -16,18 +16,18 @@ import org.slf4j.LoggerFactory;
public class RootNode { public class RootNode {
private static final Logger LOG = LoggerFactory.getLogger(RootNode.class); private static final Logger LOG = LoggerFactory.getLogger(RootNode.class);
private final JadxArgs jadxArgs; private final IJadxArgs IJadxArgs;
private List<DexNode> dexNodes; private List<DexNode> dexNodes;
private final List<ClassNode> classes = new ArrayList<ClassNode>(); private final List<ClassNode> classes = new ArrayList<ClassNode>();
private final Map<String, ClassNode> names = new HashMap<String, ClassNode>(); private final Map<String, ClassNode> names = new HashMap<String, ClassNode>();
public RootNode(JadxArgs args) { public RootNode(IJadxArgs args) {
this.jadxArgs = args; this.IJadxArgs = args;
} }
public void load() throws DecodeException { public void load() throws DecodeException {
List<InputFile> dexFiles = jadxArgs.getInput(); List<InputFile> dexFiles = IJadxArgs.getInput();
dexNodes = new ArrayList<DexNode>(dexFiles.size()); dexNodes = new ArrayList<DexNode>(dexFiles.size());
for (InputFile dex : dexFiles) { for (InputFile dex : dexFiles) {
DexNode dexNode; DexNode dexNode;
...@@ -86,7 +86,7 @@ public class RootNode { ...@@ -86,7 +86,7 @@ public class RootNode {
return dexNodes; return dexNodes;
} }
public JadxArgs getJadxArgs() { public IJadxArgs getJadxArgs() {
return jadxArgs; return IJadxArgs;
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment