diff --git a/src/main/java/jadx/JadxArgs.java b/jadx-cli/src/main/java/jadx/cli/JadxArgs.java
similarity index 75%
rename from src/main/java/jadx/JadxArgs.java
rename to jadx-cli/src/main/java/jadx/cli/JadxArgs.java
index 90aa79d25..dd2624073 100644
--- a/src/main/java/jadx/JadxArgs.java
+++ b/jadx-cli/src/main/java/jadx/cli/JadxArgs.java
@@ -1,10 +1,10 @@
-package jadx;
+package jadx.cli;
-import jadx.utils.exceptions.JadxException;
-import jadx.utils.files.InputFile;
+import jadx.core.Consts;
+import jadx.api.IJadxArgs;
+import jadx.core.utils.exceptions.JadxException;
import java.io.File;
-import java.io.IOException;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
@@ -21,7 +21,7 @@ import com.beust.jcommander.ParameterException;
public class JadxArgs implements IJadxArgs {
private static final Logger LOG = LoggerFactory.getLogger(JadxArgs.class);
- @Parameter(description = " (.dex, .apk, .jar or .class)", required = true)
+ @Parameter(description = " (.dex, .apk, .jar or .class)")
protected List files;
@Parameter(names = {"-d", "--output-dir"}, description = "output directory")
@@ -45,10 +45,18 @@ public class JadxArgs implements IJadxArgs {
@Parameter(names = {"-h", "--help"}, description = "print this help", help = true)
protected boolean printHelp = false;
- private final List input = new ArrayList();
+ private final List input = new ArrayList();
private File outputDir;
- public void parse(String[] args) {
+ private final boolean inputRequired;
+
+ public JadxArgs(String[] args, boolean inputRequired) {
+ this.inputRequired = inputRequired;
+ parse(args);
+ checkArguments();
+ }
+
+ private void parse(String[] args) {
try {
new JCommander(this, args);
} catch (ParameterException e) {
@@ -58,30 +66,47 @@ public class JadxArgs implements IJadxArgs {
}
}
+ private void checkArguments() {
+ if (isPrintHelp()) {
+ printUsage();
+ System.exit(0);
+ }
+ if (isVerbose()) {
+ ch.qos.logback.classic.Logger rootLogger =
+ (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+ rootLogger.setLevel(ch.qos.logback.classic.Level.DEBUG);
+ }
+ try {
+ processArgs();
+ } catch (JadxException e) {
+ LOG.error(e.getMessage());
+ System.exit(1);
+ }
+ }
+
public void processArgs() throws JadxException {
if (printHelp)
return;
- if (files == null || files.isEmpty())
- throw new JadxException("Please specify at least one input file");
+ if (threadsCount <= 0)
+ throw new JadxException("Threads count must be positive");
- for (String fileName : files) {
- File file = new File(fileName);
- if (!file.exists())
- throw new JadxException("File not found: " + file);
-
- try {
- input.add(new InputFile(file));
- } catch (IOException e) {
- throw new JadxException("File processing error: " + file, e);
+ if (files != null) {
+ for (String fileName : files) {
+ File file = new File(fileName);
+ if (file.exists())
+ input.add(file);
+ else
+ throw new JadxException("File not found: " + file);
}
}
- if (input.isEmpty())
- throw new JadxException("No files with correct extension (must be '.dex', '.class' or '.jar')");
-
- if (threadsCount <= 0)
- throw new JadxException("Threads count must be positive");
+ if (input.isEmpty()) {
+ if (inputRequired)
+ throw new JadxException("Please specify at least one input file");
+ else
+ return;
+ }
if (outDirName == null) {
File file = new File(files.get(0));
@@ -123,13 +148,15 @@ public class JadxArgs implements IJadxArgs {
Field[] fields = this.getClass().getDeclaredFields();
for (Field f : fields) {
for (ParameterDescription p : params) {
- if (f.getName().equals(p.getParameterized().getName())) {
+ String name = f.getName();
+ if (name.equals(p.getParameterized().getName())) {
StringBuilder opt = new StringBuilder();
opt.append(' ').append(p.getNames());
addSpaces(opt, maxNamesLen - opt.length() + 2);
opt.append("- ").append(p.getDescription());
- if (p.getParameter().required())
+ if (inputRequired && name.equals("files")) {
opt.append(" [required]");
+ }
out.println(opt.toString());
break;
}
@@ -165,7 +192,7 @@ public class JadxArgs implements IJadxArgs {
}
@Override
- public List getInput() {
+ public List getInput() {
return input;
}
diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLI.java b/jadx-cli/src/main/java/jadx/cli/JadxCLI.java
new file mode 100644
index 000000000..7e34da717
--- /dev/null
+++ b/jadx-cli/src/main/java/jadx/cli/JadxCLI.java
@@ -0,0 +1,18 @@
+package jadx.cli;
+
+import jadx.api.Decompiler;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JadxCLI {
+ private static final Logger LOG = LoggerFactory.getLogger(JadxCLI.class);
+
+ public static void main(String[] args) {
+ JadxArgs jadxArgs = new JadxArgs(args, true);
+ Decompiler jadx = new Decompiler(jadxArgs);
+ jadx.processAndSaveAll();
+ LOG.info("done");
+ System.exit(jadx.getErrorsCount());
+ }
+}
diff --git a/jadx-core/src/main/java/jadx/api/Decompiler.java b/jadx-core/src/main/java/jadx/api/Decompiler.java
new file mode 100644
index 000000000..986ab0f79
--- /dev/null
+++ b/jadx-core/src/main/java/jadx/api/Decompiler.java
@@ -0,0 +1,150 @@
+package jadx.api;
+
+import jadx.core.Jadx;
+import jadx.core.ProcessClass;
+import jadx.core.dex.info.ClassInfo;
+import jadx.core.dex.nodes.ClassNode;
+import jadx.core.dex.nodes.RootNode;
+import jadx.core.dex.visitors.IDexTreeVisitor;
+import jadx.core.dex.visitors.SaveCode;
+import jadx.core.utils.ErrorsCounter;
+import jadx.core.utils.exceptions.CodegenException;
+import jadx.core.utils.exceptions.DecodeException;
+import jadx.core.utils.files.InputFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class Decompiler {
+ private static final Logger LOG = LoggerFactory.getLogger(Decompiler.class);
+
+ private final IJadxArgs args;
+ private final List inputFiles = new ArrayList();
+
+ private RootNode root;
+ private List passes;
+ private int errorsCount;
+
+ public Decompiler(IJadxArgs jadxArgs) {
+ this.args = jadxArgs;
+ this.passes = Jadx.getPassesList(args);
+ }
+
+ public void processAndSaveAll() {
+ try {
+ loadInput();
+ parseDex();
+ saveAll();
+ } catch (Throwable e) {
+ LOG.error("jadx error:", e);
+ } finally {
+ errorsCount = ErrorsCounter.getErrorCount();
+ if (errorsCount != 0)
+ ErrorsCounter.printReport();
+ }
+ }
+
+ public void loadFile(File file) throws IOException, DecodeException {
+ List files = args.getInput();
+ files.clear();
+ files.add(file);
+
+ loadInput();
+ parseDex();
+ }
+
+ public List getClasses() {
+ List classes = new ArrayList(root.getClasses().size());
+ for (ClassNode classNode : root.getClasses()) {
+ classes.add(new JavaClass(this, classNode));
+ }
+ return classes;
+ }
+
+ public List getPackages() {
+ List classes = getClasses();
+ Map> map = new HashMap>();
+ for (JavaClass javaClass : classes) {
+ String pkg = javaClass.getPackage();
+ List clsList = map.get(pkg);
+ if (clsList == null) {
+ clsList = new ArrayList();
+ map.put(pkg, clsList);
+ }
+ clsList.add(javaClass);
+ }
+ List packages = new ArrayList(map.size());
+ for (Map.Entry> entry : map.entrySet()) {
+ packages.add(new JavaPackage(entry.getKey(), entry.getValue()));
+ }
+ Collections.sort(packages);
+ return packages;
+ }
+
+ public void saveAll() throws InterruptedException {
+ int threadsCount = args.getThreadsCount();
+ LOG.debug("processing threads count: {}", threadsCount);
+
+ ArrayList passList = new ArrayList(passes);
+ SaveCode savePass = new SaveCode(args);
+ passList.add(savePass);
+
+ LOG.info("processing ...");
+ ExecutorService executor = Executors.newFixedThreadPool(threadsCount);
+ for (ClassNode cls : root.getClasses()) {
+ if (cls.getCode() == null) {
+ ProcessClass job = new ProcessClass(cls, passList);
+ executor.execute(job);
+ } else {
+ try {
+ savePass.visit(cls);
+ } catch (CodegenException e) {
+ LOG.error("Can't save class {}", cls, e);
+ }
+ }
+ }
+ executor.shutdown();
+ executor.awaitTermination(100, TimeUnit.DAYS);
+ }
+
+ private void loadInput() throws IOException, DecodeException {
+ for (File file : args.getInput()) {
+ inputFiles.add(new InputFile(file));
+ }
+ }
+
+ private void parseDex() throws DecodeException {
+ ClassInfo.clearCache();
+ ErrorsCounter.reset();
+
+ root = new RootNode(args, inputFiles);
+ LOG.info("loading ...");
+ root.load();
+ root.init();
+ }
+
+ void processClass(ClassNode cls) {
+ try {
+ ProcessClass job = new ProcessClass(cls, passes);
+ LOG.info("processing class {} ...", cls);
+ job.run();
+ } catch (Throwable e) {
+ LOG.error("Process class error", e);
+ }
+ }
+
+ public int getErrorsCount() {
+ return errorsCount;
+ }
+}
diff --git a/src/main/java/jadx/IJadxArgs.java b/jadx-core/src/main/java/jadx/api/IJadxArgs.java
similarity index 76%
rename from src/main/java/jadx/IJadxArgs.java
rename to jadx-core/src/main/java/jadx/api/IJadxArgs.java
index 4f2d6667f..a21f38a0c 100644
--- a/src/main/java/jadx/IJadxArgs.java
+++ b/jadx-core/src/main/java/jadx/api/IJadxArgs.java
@@ -1,11 +1,11 @@
-package jadx;
-
-import jadx.utils.files.InputFile;
+package jadx.api;
import java.io.File;
import java.util.List;
public interface IJadxArgs {
+ List getInput();
+
File getOutDir();
int getThreadsCount();
@@ -14,8 +14,6 @@ public interface IJadxArgs {
boolean isRawCFGOutput();
- List getInput();
-
boolean isFallbackMode();
boolean isVerbose();
diff --git a/jadx-core/src/main/java/jadx/api/JavaClass.java b/jadx-core/src/main/java/jadx/api/JavaClass.java
new file mode 100644
index 000000000..4a986db87
--- /dev/null
+++ b/jadx-core/src/main/java/jadx/api/JavaClass.java
@@ -0,0 +1,41 @@
+package jadx.api;
+
+import jadx.core.codegen.CodeWriter;
+import jadx.core.dex.nodes.ClassNode;
+
+public final class JavaClass {
+
+ private final Decompiler decompiler;
+ private final ClassNode cls;
+
+ JavaClass(Decompiler decompiler, ClassNode classNode) {
+ this.decompiler = decompiler;
+ this.cls = classNode;
+ }
+
+ public String getCode() {
+ CodeWriter code = cls.getCode();
+ if(code == null) {
+ decompiler.processClass(cls);
+ code = cls.getCode();
+ }
+ return code != null ? code.toString() : "error processing class";
+ }
+
+ public String getFullName() {
+ return cls.getFullName();
+ }
+
+ public String getShortName() {
+ return cls.getShortName();
+ }
+
+ public String getPackage() {
+ return cls.getPackage();
+ }
+
+ @Override
+ public String toString() {
+ return getFullName();
+ }
+}
diff --git a/jadx-core/src/main/java/jadx/api/JavaPackage.java b/jadx-core/src/main/java/jadx/api/JavaPackage.java
new file mode 100644
index 000000000..5b534c8f0
--- /dev/null
+++ b/jadx-core/src/main/java/jadx/api/JavaPackage.java
@@ -0,0 +1,31 @@
+package jadx.api;
+
+import java.util.List;
+
+public final class JavaPackage implements Comparable {
+ private final String name;
+ private final List classes;
+
+ JavaPackage(String name, List classes) {
+ this.name = name;
+ this.classes = classes;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public List getClasses() {
+ return classes;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ @Override
+ public int compareTo(JavaPackage o) {
+ return name.compareTo(o.name);
+ }
+}
diff --git a/src/main/java/jadx/Consts.java b/jadx-core/src/main/java/jadx/core/Consts.java
similarity index 95%
rename from src/main/java/jadx/Consts.java
rename to jadx-core/src/main/java/jadx/core/Consts.java
index acf8ea0aa..3b61400b5 100644
--- a/src/main/java/jadx/Consts.java
+++ b/jadx-core/src/main/java/jadx/core/Consts.java
@@ -1,6 +1,6 @@
-package jadx;
+package jadx.core;
-import jadx.utils.Utils;
+import jadx.core.utils.Utils;
public class Consts {
public static final String JADX_VERSION = Utils.getJadxVersion();
diff --git a/jadx-core/src/main/java/jadx/core/Jadx.java b/jadx-core/src/main/java/jadx/core/Jadx.java
new file mode 100644
index 000000000..27ead0533
--- /dev/null
+++ b/jadx-core/src/main/java/jadx/core/Jadx.java
@@ -0,0 +1,75 @@
+package jadx.core;
+
+import jadx.api.IJadxArgs;
+import jadx.core.codegen.CodeGen;
+import jadx.core.dex.visitors.BlockMakerVisitor;
+import jadx.core.dex.visitors.ClassModifier;
+import jadx.core.dex.visitors.CodeShrinker;
+import jadx.core.dex.visitors.ConstInlinerVisitor;
+import jadx.core.dex.visitors.DotGraphVisitor;
+import jadx.core.dex.visitors.EnumVisitor;
+import jadx.core.dex.visitors.FallbackModeVisitor;
+import jadx.core.dex.visitors.IDexTreeVisitor;
+import jadx.core.dex.visitors.MethodInlinerVisitor;
+import jadx.core.dex.visitors.ModVisitor;
+import jadx.core.dex.visitors.regions.CheckRegions;
+import jadx.core.dex.visitors.regions.CleanRegions;
+import jadx.core.dex.visitors.regions.PostRegionVisitor;
+import jadx.core.dex.visitors.regions.ProcessVariables;
+import jadx.core.dex.visitors.regions.RegionMakerVisitor;
+import jadx.core.dex.visitors.typeresolver.FinishTypeResolver;
+import jadx.core.dex.visitors.typeresolver.TypeResolver;
+
+import java.util.ArrayList;
+import java.util.List;
+
+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 List getPassesList(IJadxArgs 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/ProcessClass.java b/jadx-core/src/main/java/jadx/core/ProcessClass.java
similarity index 62%
rename from src/main/java/jadx/ProcessClass.java
rename to jadx-core/src/main/java/jadx/core/ProcessClass.java
index e12f48b1e..4f53a59fa 100644
--- a/src/main/java/jadx/ProcessClass.java
+++ b/jadx-core/src/main/java/jadx/core/ProcessClass.java
@@ -1,22 +1,22 @@
-package jadx;
+package jadx.core;
-import jadx.dex.nodes.ClassNode;
-import jadx.dex.visitors.DepthTraverser;
-import jadx.dex.visitors.IDexTreeVisitor;
-import jadx.utils.exceptions.DecodeException;
+import jadx.core.dex.nodes.ClassNode;
+import jadx.core.dex.visitors.DepthTraverser;
+import jadx.core.dex.visitors.IDexTreeVisitor;
+import jadx.core.utils.exceptions.DecodeException;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-class ProcessClass implements Runnable {
+public final class ProcessClass implements Runnable {
private static final Logger LOG = LoggerFactory.getLogger(ProcessClass.class);
private final ClassNode cls;
private final List passes;
- ProcessClass(ClassNode cls, List passes) {
+ public ProcessClass(ClassNode cls, List passes) {
this.cls = cls;
this.passes = passes;
}
diff --git a/src/main/java/jadx/codegen/AnnotationGen.java b/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java
similarity index 88%
rename from src/main/java/jadx/codegen/AnnotationGen.java
rename to jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java
index fcb0597a6..ea78487d1 100644
--- a/src/main/java/jadx/codegen/AnnotationGen.java
+++ b/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java
@@ -1,18 +1,18 @@
-package jadx.codegen;
+package jadx.core.codegen;
-import jadx.Consts;
-import jadx.dex.attributes.AttributeType;
-import jadx.dex.attributes.IAttributeNode;
-import jadx.dex.attributes.annotations.Annotation;
-import jadx.dex.attributes.annotations.AnnotationsList;
-import jadx.dex.attributes.annotations.MethodParameters;
-import jadx.dex.info.FieldInfo;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.nodes.ClassNode;
-import jadx.dex.nodes.FieldNode;
-import jadx.dex.nodes.MethodNode;
-import jadx.utils.StringUtils;
-import jadx.utils.exceptions.JadxRuntimeException;
+import jadx.core.Consts;
+import jadx.core.dex.attributes.AttributeType;
+import jadx.core.dex.attributes.IAttributeNode;
+import jadx.core.dex.attributes.annotations.Annotation;
+import jadx.core.dex.attributes.annotations.AnnotationsList;
+import jadx.core.dex.attributes.annotations.MethodParameters;
+import jadx.core.dex.info.FieldInfo;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.nodes.ClassNode;
+import jadx.core.dex.nodes.FieldNode;
+import jadx.core.dex.nodes.MethodNode;
+import jadx.core.utils.StringUtils;
+import jadx.core.utils.exceptions.JadxRuntimeException;
import java.util.Iterator;
import java.util.List;
diff --git a/src/main/java/jadx/codegen/ClassGen.java b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java
similarity index 92%
rename from src/main/java/jadx/codegen/ClassGen.java
rename to jadx-core/src/main/java/jadx/core/codegen/ClassGen.java
index 5d69861e1..58754e6bf 100644
--- a/src/main/java/jadx/codegen/ClassGen.java
+++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java
@@ -1,24 +1,24 @@
-package jadx.codegen;
+package jadx.core.codegen;
-import jadx.Consts;
-import jadx.dex.attributes.AttrNode;
-import jadx.dex.attributes.AttributeFlag;
-import jadx.dex.attributes.AttributeType;
-import jadx.dex.attributes.EnumClassAttr;
-import jadx.dex.attributes.EnumClassAttr.EnumField;
-import jadx.dex.attributes.IAttribute;
-import jadx.dex.attributes.SourceFileAttr;
-import jadx.dex.info.AccessInfo;
-import jadx.dex.info.ClassInfo;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.instructions.args.InsnArg;
-import jadx.dex.nodes.ClassNode;
-import jadx.dex.nodes.FieldNode;
-import jadx.dex.nodes.MethodNode;
-import jadx.dex.nodes.parser.FieldValueAttr;
-import jadx.utils.ErrorsCounter;
-import jadx.utils.Utils;
-import jadx.utils.exceptions.CodegenException;
+import jadx.core.Consts;
+import jadx.core.dex.attributes.AttrNode;
+import jadx.core.dex.attributes.AttributeFlag;
+import jadx.core.dex.attributes.AttributeType;
+import jadx.core.dex.attributes.EnumClassAttr;
+import jadx.core.dex.attributes.EnumClassAttr.EnumField;
+import jadx.core.dex.attributes.IAttribute;
+import jadx.core.dex.attributes.SourceFileAttr;
+import jadx.core.dex.info.AccessInfo;
+import jadx.core.dex.info.ClassInfo;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.instructions.args.InsnArg;
+import jadx.core.dex.nodes.ClassNode;
+import jadx.core.dex.nodes.FieldNode;
+import jadx.core.dex.nodes.MethodNode;
+import jadx.core.dex.nodes.parser.FieldValueAttr;
+import jadx.core.utils.ErrorsCounter;
+import jadx.core.utils.Utils;
+import jadx.core.utils.exceptions.CodegenException;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/src/main/java/jadx/codegen/CodeGen.java b/jadx-core/src/main/java/jadx/core/codegen/CodeGen.java
similarity index 57%
rename from src/main/java/jadx/codegen/CodeGen.java
rename to jadx-core/src/main/java/jadx/core/codegen/CodeGen.java
index 833060ceb..aeb4fc813 100644
--- a/src/main/java/jadx/codegen/CodeGen.java
+++ b/jadx-core/src/main/java/jadx/core/codegen/CodeGen.java
@@ -1,9 +1,9 @@
-package jadx.codegen;
+package jadx.core.codegen;
-import jadx.IJadxArgs;
-import jadx.dex.nodes.ClassNode;
-import jadx.dex.visitors.AbstractVisitor;
-import jadx.utils.exceptions.CodegenException;
+import jadx.api.IJadxArgs;
+import jadx.core.dex.nodes.ClassNode;
+import jadx.core.dex.visitors.AbstractVisitor;
+import jadx.core.utils.exceptions.CodegenException;
import java.io.File;
@@ -21,10 +21,14 @@ public class CodeGen extends AbstractVisitor {
public boolean visit(ClassNode cls) throws CodegenException {
ClassGen clsGen = new ClassGen(cls, null, isFallbackMode());
CodeWriter clsCode = clsGen.makeClass();
- String fileName = cls.getClassInfo().getFullPath() + ".java";
- if (isFallbackMode())
- fileName += ".jadx";
- clsCode.save(dir, fileName);
+
+ cls.setCode(clsCode);
+
+// String fileName = cls.getClassInfo().getFullPath() + ".java";
+// if (isFallbackMode())
+// fileName += ".jadx";
+// clsCode.save(dir, fileName);
+
return false;
}
diff --git a/src/main/java/jadx/codegen/CodeWriter.java b/jadx-core/src/main/java/jadx/core/codegen/CodeWriter.java
similarity index 97%
rename from src/main/java/jadx/codegen/CodeWriter.java
rename to jadx-core/src/main/java/jadx/core/codegen/CodeWriter.java
index 319b1dfa7..cda2a444e 100644
--- a/src/main/java/jadx/codegen/CodeWriter.java
+++ b/jadx-core/src/main/java/jadx/core/codegen/CodeWriter.java
@@ -1,6 +1,6 @@
-package jadx.codegen;
+package jadx.core.codegen;
-import jadx.utils.exceptions.JadxRuntimeException;
+import jadx.core.utils.exceptions.JadxRuntimeException;
import java.io.File;
import java.io.PrintWriter;
diff --git a/src/main/java/jadx/codegen/InsnGen.java b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java
similarity index 92%
rename from src/main/java/jadx/codegen/InsnGen.java
rename to jadx-core/src/main/java/jadx/core/codegen/InsnGen.java
index 71b077136..2d1d0973b 100644
--- a/src/main/java/jadx/codegen/InsnGen.java
+++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java
@@ -1,33 +1,33 @@
-package jadx.codegen;
+package jadx.core.codegen;
-import jadx.dex.attributes.AttributeType;
-import jadx.dex.attributes.IAttribute;
-import jadx.dex.attributes.MethodInlineAttr;
-import jadx.dex.info.ClassInfo;
-import jadx.dex.info.FieldInfo;
-import jadx.dex.info.MethodInfo;
-import jadx.dex.instructions.ArithNode;
-import jadx.dex.instructions.ArithOp;
-import jadx.dex.instructions.FillArrayOp;
-import jadx.dex.instructions.GotoNode;
-import jadx.dex.instructions.IfNode;
-import jadx.dex.instructions.IndexInsnNode;
-import jadx.dex.instructions.InvokeNode;
-import jadx.dex.instructions.InvokeType;
-import jadx.dex.instructions.SwitchNode;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.instructions.args.InsnArg;
-import jadx.dex.instructions.args.InsnWrapArg;
-import jadx.dex.instructions.args.LiteralArg;
-import jadx.dex.instructions.args.RegisterArg;
-import jadx.dex.instructions.mods.ConstructorInsn;
-import jadx.dex.nodes.ClassNode;
-import jadx.dex.nodes.FieldNode;
-import jadx.dex.nodes.InsnNode;
-import jadx.dex.nodes.MethodNode;
-import jadx.dex.nodes.RootNode;
-import jadx.utils.StringUtils;
-import jadx.utils.exceptions.CodegenException;
+import jadx.core.dex.attributes.AttributeType;
+import jadx.core.dex.attributes.IAttribute;
+import jadx.core.dex.attributes.MethodInlineAttr;
+import jadx.core.dex.info.ClassInfo;
+import jadx.core.dex.info.FieldInfo;
+import jadx.core.dex.info.MethodInfo;
+import jadx.core.dex.instructions.ArithNode;
+import jadx.core.dex.instructions.ArithOp;
+import jadx.core.dex.instructions.FillArrayOp;
+import jadx.core.dex.instructions.GotoNode;
+import jadx.core.dex.instructions.IfNode;
+import jadx.core.dex.instructions.IndexInsnNode;
+import jadx.core.dex.instructions.InvokeNode;
+import jadx.core.dex.instructions.InvokeType;
+import jadx.core.dex.instructions.SwitchNode;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.instructions.args.InsnArg;
+import jadx.core.dex.instructions.args.InsnWrapArg;
+import jadx.core.dex.instructions.args.LiteralArg;
+import jadx.core.dex.instructions.args.RegisterArg;
+import jadx.core.dex.instructions.mods.ConstructorInsn;
+import jadx.core.dex.nodes.ClassNode;
+import jadx.core.dex.nodes.FieldNode;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.dex.nodes.MethodNode;
+import jadx.core.dex.nodes.RootNode;
+import jadx.core.utils.StringUtils;
+import jadx.core.utils.exceptions.CodegenException;
import java.util.ArrayList;
import java.util.EnumSet;
diff --git a/src/main/java/jadx/codegen/MethodGen.java b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java
similarity index 89%
rename from src/main/java/jadx/codegen/MethodGen.java
rename to jadx-core/src/main/java/jadx/core/codegen/MethodGen.java
index 86edd44ba..c1d7d8315 100644
--- a/src/main/java/jadx/codegen/MethodGen.java
+++ b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java
@@ -1,24 +1,24 @@
-package jadx.codegen;
+package jadx.core.codegen;
-import jadx.Consts;
-import jadx.dex.attributes.AttributeFlag;
-import jadx.dex.attributes.AttributeType;
-import jadx.dex.attributes.AttributesList;
-import jadx.dex.attributes.JadxErrorAttr;
-import jadx.dex.attributes.annotations.MethodParameters;
-import jadx.dex.info.AccessInfo;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.instructions.args.RegisterArg;
-import jadx.dex.nodes.InsnNode;
-import jadx.dex.nodes.MethodNode;
-import jadx.dex.trycatch.CatchAttr;
-import jadx.dex.visitors.DepthTraverser;
-import jadx.dex.visitors.FallbackModeVisitor;
-import jadx.utils.ErrorsCounter;
-import jadx.utils.InsnUtils;
-import jadx.utils.Utils;
-import jadx.utils.exceptions.CodegenException;
-import jadx.utils.exceptions.DecodeException;
+import jadx.core.Consts;
+import jadx.core.dex.attributes.AttributeFlag;
+import jadx.core.dex.attributes.AttributeType;
+import jadx.core.dex.attributes.AttributesList;
+import jadx.core.dex.attributes.JadxErrorAttr;
+import jadx.core.dex.attributes.annotations.MethodParameters;
+import jadx.core.dex.info.AccessInfo;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.instructions.args.RegisterArg;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.dex.nodes.MethodNode;
+import jadx.core.dex.trycatch.CatchAttr;
+import jadx.core.dex.visitors.DepthTraverser;
+import jadx.core.dex.visitors.FallbackModeVisitor;
+import jadx.core.utils.ErrorsCounter;
+import jadx.core.utils.InsnUtils;
+import jadx.core.utils.Utils;
+import jadx.core.utils.exceptions.CodegenException;
+import jadx.core.utils.exceptions.DecodeException;
import java.util.HashSet;
import java.util.Iterator;
@@ -177,7 +177,7 @@ public class MethodGen {
/**
* Put variable declaration and return variable name (used for assignments)
- *
+ *
* @param arg
* register variable
* @return variable name
@@ -264,13 +264,13 @@ public class MethodGen {
private void makeFallbackMethod(CodeWriter code, MethodNode mth) {
if (mth.getInstructions() == null) {
- // load original instructions
+ // loadFile original instructions
try {
mth.load();
DepthTraverser.visit(new FallbackModeVisitor(), mth);
} catch (DecodeException e) {
// ignore
- code.startLine("Can't load method instructions");
+ code.startLine("Can't loadFile method instructions");
return;
}
}
diff --git a/src/main/java/jadx/codegen/RegionGen.java b/jadx-core/src/main/java/jadx/core/codegen/RegionGen.java
similarity index 85%
rename from src/main/java/jadx/codegen/RegionGen.java
rename to jadx-core/src/main/java/jadx/core/codegen/RegionGen.java
index 7fc582638..5b0a75e5a 100644
--- a/src/main/java/jadx/codegen/RegionGen.java
+++ b/jadx-core/src/main/java/jadx/core/codegen/RegionGen.java
@@ -1,33 +1,33 @@
-package jadx.codegen;
+package jadx.core.codegen;
-import jadx.dex.attributes.AttributeFlag;
-import jadx.dex.attributes.AttributeType;
-import jadx.dex.attributes.DeclareVariableAttr;
-import jadx.dex.attributes.ForceReturnAttr;
-import jadx.dex.attributes.IAttribute;
-import jadx.dex.instructions.IfOp;
-import jadx.dex.instructions.SwitchNode;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.instructions.args.InsnArg;
-import jadx.dex.instructions.args.LiteralArg;
-import jadx.dex.instructions.args.RegisterArg;
-import jadx.dex.nodes.IBlock;
-import jadx.dex.nodes.IContainer;
-import jadx.dex.nodes.IRegion;
-import jadx.dex.nodes.InsnNode;
-import jadx.dex.nodes.MethodNode;
-import jadx.dex.regions.IfCondition;
-import jadx.dex.regions.IfRegion;
-import jadx.dex.regions.LoopRegion;
-import jadx.dex.regions.Region;
-import jadx.dex.regions.SwitchRegion;
-import jadx.dex.regions.SynchronizedRegion;
-import jadx.dex.trycatch.CatchAttr;
-import jadx.dex.trycatch.ExceptionHandler;
-import jadx.dex.trycatch.TryCatchBlock;
-import jadx.utils.ErrorsCounter;
-import jadx.utils.RegionUtils;
-import jadx.utils.exceptions.CodegenException;
+import jadx.core.dex.attributes.AttributeFlag;
+import jadx.core.dex.attributes.AttributeType;
+import jadx.core.dex.attributes.DeclareVariableAttr;
+import jadx.core.dex.attributes.ForceReturnAttr;
+import jadx.core.dex.attributes.IAttribute;
+import jadx.core.dex.instructions.IfOp;
+import jadx.core.dex.instructions.SwitchNode;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.instructions.args.InsnArg;
+import jadx.core.dex.instructions.args.LiteralArg;
+import jadx.core.dex.instructions.args.RegisterArg;
+import jadx.core.dex.nodes.IBlock;
+import jadx.core.dex.nodes.IContainer;
+import jadx.core.dex.nodes.IRegion;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.dex.nodes.MethodNode;
+import jadx.core.dex.regions.IfCondition;
+import jadx.core.dex.regions.IfRegion;
+import jadx.core.dex.regions.LoopRegion;
+import jadx.core.dex.regions.Region;
+import jadx.core.dex.regions.SwitchRegion;
+import jadx.core.dex.regions.SynchronizedRegion;
+import jadx.core.dex.trycatch.CatchAttr;
+import jadx.core.dex.trycatch.ExceptionHandler;
+import jadx.core.dex.trycatch.TryCatchBlock;
+import jadx.core.utils.ErrorsCounter;
+import jadx.core.utils.RegionUtils;
+import jadx.core.utils.exceptions.CodegenException;
import java.util.List;
diff --git a/src/main/java/jadx/codegen/TypeGen.java b/jadx-core/src/main/java/jadx/core/codegen/TypeGen.java
similarity index 91%
rename from src/main/java/jadx/codegen/TypeGen.java
rename to jadx-core/src/main/java/jadx/core/codegen/TypeGen.java
index 45a8f0371..5e02b4f39 100644
--- a/src/main/java/jadx/codegen/TypeGen.java
+++ b/jadx-core/src/main/java/jadx/core/codegen/TypeGen.java
@@ -1,10 +1,10 @@
-package jadx.codegen;
+package jadx.core.codegen;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.instructions.args.PrimitiveType;
-import jadx.utils.StringUtils;
-import jadx.utils.Utils;
-import jadx.utils.exceptions.JadxRuntimeException;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.instructions.args.PrimitiveType;
+import jadx.core.utils.StringUtils;
+import jadx.core.utils.Utils;
+import jadx.core.utils.exceptions.JadxRuntimeException;
public class TypeGen {
@@ -35,7 +35,7 @@ public class TypeGen {
/**
* Convert literal value to string according to value type
- *
+ *
* @throws JadxRuntimeException
* for incorrect type or literal value
*/
diff --git a/src/main/java/jadx/deobf/NameMapper.java b/jadx-core/src/main/java/jadx/core/deobf/NameMapper.java
similarity index 97%
rename from src/main/java/jadx/deobf/NameMapper.java
rename to jadx-core/src/main/java/jadx/core/deobf/NameMapper.java
index 365dd7074..37d29fcee 100644
--- a/src/main/java/jadx/deobf/NameMapper.java
+++ b/jadx-core/src/main/java/jadx/core/deobf/NameMapper.java
@@ -1,4 +1,4 @@
-package jadx.deobf;
+package jadx.core.deobf;
import java.util.Arrays;
import java.util.HashSet;
diff --git a/src/main/java/jadx/dex/attributes/AttrNode.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AttrNode.java
similarity index 88%
rename from src/main/java/jadx/dex/attributes/AttrNode.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/AttrNode.java
index 27e03600c..47e134d9a 100644
--- a/src/main/java/jadx/dex/attributes/AttrNode.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AttrNode.java
@@ -1,4 +1,4 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
public abstract class AttrNode implements IAttributeNode {
diff --git a/src/main/java/jadx/dex/attributes/AttributeFlag.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeFlag.java
similarity index 88%
rename from src/main/java/jadx/dex/attributes/AttributeFlag.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/AttributeFlag.java
index ffadfe840..a06bee1e0 100644
--- a/src/main/java/jadx/dex/attributes/AttributeFlag.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeFlag.java
@@ -1,4 +1,4 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
public enum AttributeFlag {
TRY_ENTER,
diff --git a/src/main/java/jadx/dex/attributes/AttributeType.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeType.java
similarity index 96%
rename from src/main/java/jadx/dex/attributes/AttributeType.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/AttributeType.java
index 4717e4c3d..dfea207c7 100644
--- a/src/main/java/jadx/dex/attributes/AttributeType.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeType.java
@@ -1,4 +1,4 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
public enum AttributeType {
diff --git a/src/main/java/jadx/dex/attributes/AttributesList.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributesList.java
similarity index 96%
rename from src/main/java/jadx/dex/attributes/AttributesList.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/AttributesList.java
index 825ff0c75..666120662 100644
--- a/src/main/java/jadx/dex/attributes/AttributesList.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributesList.java
@@ -1,8 +1,8 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
-import jadx.dex.attributes.annotations.Annotation;
-import jadx.dex.attributes.annotations.AnnotationsList;
-import jadx.utils.Utils;
+import jadx.core.dex.attributes.annotations.Annotation;
+import jadx.core.dex.attributes.annotations.AnnotationsList;
+import jadx.core.utils.Utils;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/src/main/java/jadx/dex/attributes/BlockRegState.java b/jadx-core/src/main/java/jadx/core/dex/attributes/BlockRegState.java
similarity index 86%
rename from src/main/java/jadx/dex/attributes/BlockRegState.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/BlockRegState.java
index 35729c56d..8b01f0643 100644
--- a/src/main/java/jadx/dex/attributes/BlockRegState.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/BlockRegState.java
@@ -1,8 +1,8 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
-import jadx.dex.instructions.args.RegisterArg;
-import jadx.dex.instructions.args.TypedVar;
-import jadx.dex.nodes.MethodNode;
+import jadx.core.dex.instructions.args.RegisterArg;
+import jadx.core.dex.instructions.args.TypedVar;
+import jadx.core.dex.nodes.MethodNode;
public final class BlockRegState {
diff --git a/src/main/java/jadx/dex/attributes/DeclareVariableAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/DeclareVariableAttr.java
similarity index 86%
rename from src/main/java/jadx/dex/attributes/DeclareVariableAttr.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/DeclareVariableAttr.java
index 0f26fb2cb..2a500d455 100644
--- a/src/main/java/jadx/dex/attributes/DeclareVariableAttr.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/DeclareVariableAttr.java
@@ -1,7 +1,7 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
-import jadx.dex.instructions.args.RegisterArg;
-import jadx.utils.Utils;
+import jadx.core.dex.instructions.args.RegisterArg;
+import jadx.core.utils.Utils;
import java.util.List;
diff --git a/src/main/java/jadx/dex/attributes/EnumClassAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/EnumClassAttr.java
similarity index 87%
rename from src/main/java/jadx/dex/attributes/EnumClassAttr.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/EnumClassAttr.java
index b5cf0224d..353fc5115 100644
--- a/src/main/java/jadx/dex/attributes/EnumClassAttr.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/EnumClassAttr.java
@@ -1,9 +1,9 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
-import jadx.dex.instructions.args.InsnArg;
-import jadx.dex.nodes.ClassNode;
-import jadx.dex.nodes.MethodNode;
-import jadx.utils.Utils;
+import jadx.core.dex.instructions.args.InsnArg;
+import jadx.core.dex.nodes.ClassNode;
+import jadx.core.dex.nodes.MethodNode;
+import jadx.core.utils.Utils;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/src/main/java/jadx/dex/attributes/ForceReturnAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/ForceReturnAttr.java
similarity index 81%
rename from src/main/java/jadx/dex/attributes/ForceReturnAttr.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/ForceReturnAttr.java
index 516aa3396..b0579368f 100644
--- a/src/main/java/jadx/dex/attributes/ForceReturnAttr.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/ForceReturnAttr.java
@@ -1,7 +1,7 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
-import jadx.dex.nodes.InsnNode;
-import jadx.utils.Utils;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.utils.Utils;
public class ForceReturnAttr implements IAttribute {
diff --git a/src/main/java/jadx/dex/attributes/IAttribute.java b/jadx-core/src/main/java/jadx/core/dex/attributes/IAttribute.java
similarity index 64%
rename from src/main/java/jadx/dex/attributes/IAttribute.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/IAttribute.java
index c70aede31..a968d723e 100644
--- a/src/main/java/jadx/dex/attributes/IAttribute.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/IAttribute.java
@@ -1,4 +1,4 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
public interface IAttribute {
diff --git a/src/main/java/jadx/dex/attributes/IAttributeNode.java b/jadx-core/src/main/java/jadx/core/dex/attributes/IAttributeNode.java
similarity index 67%
rename from src/main/java/jadx/dex/attributes/IAttributeNode.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/IAttributeNode.java
index a04f4116b..885e19f76 100644
--- a/src/main/java/jadx/dex/attributes/IAttributeNode.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/IAttributeNode.java
@@ -1,4 +1,4 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
public interface IAttributeNode {
diff --git a/src/main/java/jadx/dex/attributes/JadxErrorAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/JadxErrorAttr.java
similarity index 91%
rename from src/main/java/jadx/dex/attributes/JadxErrorAttr.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/JadxErrorAttr.java
index 222aee99e..69d6f7de5 100644
--- a/src/main/java/jadx/dex/attributes/JadxErrorAttr.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/JadxErrorAttr.java
@@ -1,6 +1,6 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
-import jadx.utils.Utils;
+import jadx.core.utils.Utils;
public class JadxErrorAttr implements IAttribute {
diff --git a/src/main/java/jadx/dex/attributes/JumpAttribute.java b/jadx-core/src/main/java/jadx/core/dex/attributes/JumpAttribute.java
similarity index 93%
rename from src/main/java/jadx/dex/attributes/JumpAttribute.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/JumpAttribute.java
index 147988bfe..ff9fb0e81 100644
--- a/src/main/java/jadx/dex/attributes/JumpAttribute.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/JumpAttribute.java
@@ -1,6 +1,6 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
-import jadx.utils.InsnUtils;
+import jadx.core.utils.InsnUtils;
public class JumpAttribute implements IAttribute {
diff --git a/src/main/java/jadx/dex/attributes/LoopAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/LoopAttr.java
similarity index 92%
rename from src/main/java/jadx/dex/attributes/LoopAttr.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/LoopAttr.java
index 515f92930..fe1e60398 100644
--- a/src/main/java/jadx/dex/attributes/LoopAttr.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/LoopAttr.java
@@ -1,7 +1,7 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
-import jadx.dex.nodes.BlockNode;
-import jadx.utils.BlockUtils;
+import jadx.core.dex.nodes.BlockNode;
+import jadx.core.utils.BlockUtils;
import java.util.Collections;
import java.util.HashSet;
diff --git a/src/main/java/jadx/dex/attributes/MethodInlineAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/MethodInlineAttr.java
similarity index 83%
rename from src/main/java/jadx/dex/attributes/MethodInlineAttr.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/MethodInlineAttr.java
index d91c95cf0..32939b91d 100644
--- a/src/main/java/jadx/dex/attributes/MethodInlineAttr.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/MethodInlineAttr.java
@@ -1,6 +1,6 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
-import jadx.dex.nodes.InsnNode;
+import jadx.core.dex.nodes.InsnNode;
public class MethodInlineAttr implements IAttribute {
diff --git a/src/main/java/jadx/dex/attributes/SourceFileAttr.java b/jadx-core/src/main/java/jadx/core/dex/attributes/SourceFileAttr.java
similarity index 91%
rename from src/main/java/jadx/dex/attributes/SourceFileAttr.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/SourceFileAttr.java
index 7fa052421..0eace7489 100644
--- a/src/main/java/jadx/dex/attributes/SourceFileAttr.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/SourceFileAttr.java
@@ -1,4 +1,4 @@
-package jadx.dex.attributes;
+package jadx.core.dex.attributes;
public class SourceFileAttr implements IAttribute {
diff --git a/src/main/java/jadx/dex/attributes/annotations/Annotation.java b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/Annotation.java
similarity index 89%
rename from src/main/java/jadx/dex/attributes/annotations/Annotation.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/annotations/Annotation.java
index 68bd291cb..20e0a2033 100644
--- a/src/main/java/jadx/dex/attributes/annotations/Annotation.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/Annotation.java
@@ -1,6 +1,6 @@
-package jadx.dex.attributes.annotations;
+package jadx.core.dex.attributes.annotations;
-import jadx.dex.instructions.args.ArgType;
+import jadx.core.dex.instructions.args.ArgType;
import java.util.Map;
diff --git a/src/main/java/jadx/dex/attributes/annotations/AnnotationsList.java b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/AnnotationsList.java
similarity index 81%
rename from src/main/java/jadx/dex/attributes/annotations/AnnotationsList.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/annotations/AnnotationsList.java
index 70113be27..02a77ed78 100644
--- a/src/main/java/jadx/dex/attributes/annotations/AnnotationsList.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/AnnotationsList.java
@@ -1,8 +1,8 @@
-package jadx.dex.attributes.annotations;
+package jadx.core.dex.attributes.annotations;
-import jadx.dex.attributes.AttributeType;
-import jadx.dex.attributes.IAttribute;
-import jadx.utils.Utils;
+import jadx.core.dex.attributes.AttributeType;
+import jadx.core.dex.attributes.IAttribute;
+import jadx.core.utils.Utils;
import java.util.Collection;
import java.util.HashMap;
diff --git a/src/main/java/jadx/dex/attributes/annotations/MethodParameters.java b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/MethodParameters.java
similarity index 75%
rename from src/main/java/jadx/dex/attributes/annotations/MethodParameters.java
rename to jadx-core/src/main/java/jadx/core/dex/attributes/annotations/MethodParameters.java
index 514de8770..4624f8fb8 100644
--- a/src/main/java/jadx/dex/attributes/annotations/MethodParameters.java
+++ b/jadx-core/src/main/java/jadx/core/dex/attributes/annotations/MethodParameters.java
@@ -1,8 +1,8 @@
-package jadx.dex.attributes.annotations;
+package jadx.core.dex.attributes.annotations;
-import jadx.dex.attributes.AttributeType;
-import jadx.dex.attributes.IAttribute;
-import jadx.utils.Utils;
+import jadx.core.dex.attributes.AttributeType;
+import jadx.core.dex.attributes.IAttribute;
+import jadx.core.utils.Utils;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/jadx/dex/info/AccessInfo.java b/jadx-core/src/main/java/jadx/core/dex/info/AccessInfo.java
similarity index 98%
rename from src/main/java/jadx/dex/info/AccessInfo.java
rename to jadx-core/src/main/java/jadx/core/dex/info/AccessInfo.java
index a3196e418..1935bd39f 100644
--- a/src/main/java/jadx/dex/info/AccessInfo.java
+++ b/jadx-core/src/main/java/jadx/core/dex/info/AccessInfo.java
@@ -1,6 +1,6 @@
-package jadx.dex.info;
+package jadx.core.dex.info;
-import jadx.Consts;
+import jadx.core.Consts;
import com.android.dx.rop.code.AccessFlags;
diff --git a/src/main/java/jadx/dex/info/ClassInfo.java b/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java
similarity index 95%
rename from src/main/java/jadx/dex/info/ClassInfo.java
rename to jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java
index 9f9d08ba1..3ae67143f 100644
--- a/src/main/java/jadx/dex/info/ClassInfo.java
+++ b/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java
@@ -1,9 +1,9 @@
-package jadx.dex.info;
+package jadx.core.dex.info;
-import jadx.Consts;
-import jadx.deobf.NameMapper;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.nodes.DexNode;
+import jadx.core.Consts;
+import jadx.core.deobf.NameMapper;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.nodes.DexNode;
import java.io.File;
import java.util.Map;
diff --git a/src/main/java/jadx/dex/info/FieldInfo.java b/jadx-core/src/main/java/jadx/core/dex/info/FieldInfo.java
similarity index 88%
rename from src/main/java/jadx/dex/info/FieldInfo.java
rename to jadx-core/src/main/java/jadx/core/dex/info/FieldInfo.java
index 26b0f6fae..2bf4a9ac8 100644
--- a/src/main/java/jadx/dex/info/FieldInfo.java
+++ b/jadx-core/src/main/java/jadx/core/dex/info/FieldInfo.java
@@ -1,7 +1,7 @@
-package jadx.dex.info;
+package jadx.core.dex.info;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.nodes.DexNode;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.nodes.DexNode;
import com.android.dx.io.FieldId;
diff --git a/src/main/java/jadx/dex/info/MethodInfo.java b/jadx-core/src/main/java/jadx/core/dex/info/MethodInfo.java
similarity index 93%
rename from src/main/java/jadx/dex/info/MethodInfo.java
rename to jadx-core/src/main/java/jadx/core/dex/info/MethodInfo.java
index ee8831b95..010c852b2 100644
--- a/src/main/java/jadx/dex/info/MethodInfo.java
+++ b/jadx-core/src/main/java/jadx/core/dex/info/MethodInfo.java
@@ -1,9 +1,9 @@
-package jadx.dex.info;
+package jadx.core.dex.info;
-import jadx.codegen.TypeGen;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.nodes.DexNode;
-import jadx.utils.Utils;
+import jadx.core.codegen.TypeGen;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.nodes.DexNode;
+import jadx.core.utils.Utils;
import java.util.List;
diff --git a/src/main/java/jadx/dex/instructions/ArithNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/ArithNode.java
similarity index 84%
rename from src/main/java/jadx/dex/instructions/ArithNode.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/ArithNode.java
index faa8d00a3..e24af8762 100644
--- a/src/main/java/jadx/dex/instructions/ArithNode.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/ArithNode.java
@@ -1,10 +1,10 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.instructions.args.InsnArg;
-import jadx.dex.instructions.args.RegisterArg;
-import jadx.dex.nodes.InsnNode;
-import jadx.utils.InsnUtils;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.instructions.args.InsnArg;
+import jadx.core.dex.instructions.args.RegisterArg;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.utils.InsnUtils;
import com.android.dx.io.instructions.DecodedInstruction;
diff --git a/src/main/java/jadx/dex/instructions/ArithOp.java b/jadx-core/src/main/java/jadx/core/dex/instructions/ArithOp.java
similarity index 89%
rename from src/main/java/jadx/dex/instructions/ArithOp.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/ArithOp.java
index efd40c27d..fab5fb6bf 100644
--- a/src/main/java/jadx/dex/instructions/ArithOp.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/ArithOp.java
@@ -1,4 +1,4 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
public enum ArithOp {
ADD("+"),
diff --git a/src/main/java/jadx/dex/instructions/FillArrayOp.java b/jadx-core/src/main/java/jadx/core/dex/instructions/FillArrayOp.java
similarity index 80%
rename from src/main/java/jadx/dex/instructions/FillArrayOp.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/FillArrayOp.java
index 34dd18704..48959ba79 100644
--- a/src/main/java/jadx/dex/instructions/FillArrayOp.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/FillArrayOp.java
@@ -1,9 +1,9 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.instructions.args.InsnArg;
-import jadx.dex.instructions.args.PrimitiveType;
-import jadx.dex.nodes.InsnNode;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.instructions.args.InsnArg;
+import jadx.core.dex.instructions.args.PrimitiveType;
+import jadx.core.dex.nodes.InsnNode;
import com.android.dx.io.instructions.FillArrayDataPayloadDecodedInstruction;
diff --git a/src/main/java/jadx/dex/instructions/GotoNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/GotoNode.java
similarity index 78%
rename from src/main/java/jadx/dex/instructions/GotoNode.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/GotoNode.java
index 883d0c1e4..9a0f3f13d 100644
--- a/src/main/java/jadx/dex/instructions/GotoNode.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/GotoNode.java
@@ -1,7 +1,7 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
-import jadx.dex.nodes.InsnNode;
-import jadx.utils.InsnUtils;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.utils.InsnUtils;
public class GotoNode extends InsnNode {
diff --git a/src/main/java/jadx/dex/instructions/IfNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java
similarity index 84%
rename from src/main/java/jadx/dex/instructions/IfNode.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java
index 66b63e88c..b8f812b2c 100644
--- a/src/main/java/jadx/dex/instructions/IfNode.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java
@@ -1,10 +1,10 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.instructions.args.InsnArg;
-import jadx.dex.instructions.args.LiteralArg;
-import jadx.dex.instructions.args.PrimitiveType;
-import jadx.utils.InsnUtils;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.instructions.args.InsnArg;
+import jadx.core.dex.instructions.args.LiteralArg;
+import jadx.core.dex.instructions.args.PrimitiveType;
+import jadx.core.utils.InsnUtils;
import com.android.dx.io.instructions.DecodedInstruction;
diff --git a/src/main/java/jadx/dex/instructions/IfOp.java b/jadx-core/src/main/java/jadx/core/dex/instructions/IfOp.java
similarity index 85%
rename from src/main/java/jadx/dex/instructions/IfOp.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/IfOp.java
index 55372c3b2..12aff8644 100644
--- a/src/main/java/jadx/dex/instructions/IfOp.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/IfOp.java
@@ -1,6 +1,6 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
-import jadx.utils.exceptions.JadxRuntimeException;
+import jadx.core.utils.exceptions.JadxRuntimeException;
public enum IfOp {
EQ("=="),
diff --git a/src/main/java/jadx/dex/instructions/IndexInsnNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/IndexInsnNode.java
similarity index 76%
rename from src/main/java/jadx/dex/instructions/IndexInsnNode.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/IndexInsnNode.java
index 62ee6c38d..a6a3f74c5 100644
--- a/src/main/java/jadx/dex/instructions/IndexInsnNode.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/IndexInsnNode.java
@@ -1,7 +1,7 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
-import jadx.dex.nodes.InsnNode;
-import jadx.utils.InsnUtils;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.utils.InsnUtils;
public class IndexInsnNode extends InsnNode {
diff --git a/src/main/java/jadx/dex/instructions/InsnDecoder.java b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java
similarity index 97%
rename from src/main/java/jadx/dex/instructions/InsnDecoder.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java
index b387ee48b..5afabc4b8 100644
--- a/src/main/java/jadx/dex/instructions/InsnDecoder.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java
@@ -1,15 +1,15 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
-import jadx.dex.info.FieldInfo;
-import jadx.dex.info.MethodInfo;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.instructions.args.InsnArg;
-import jadx.dex.instructions.args.PrimitiveType;
-import jadx.dex.instructions.args.RegisterArg;
-import jadx.dex.nodes.DexNode;
-import jadx.dex.nodes.InsnNode;
-import jadx.dex.nodes.MethodNode;
-import jadx.utils.exceptions.DecodeException;
+import jadx.core.dex.info.FieldInfo;
+import jadx.core.dex.info.MethodInfo;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.instructions.args.InsnArg;
+import jadx.core.dex.instructions.args.PrimitiveType;
+import jadx.core.dex.instructions.args.RegisterArg;
+import jadx.core.dex.nodes.DexNode;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.dex.nodes.MethodNode;
+import jadx.core.utils.exceptions.DecodeException;
import com.android.dx.io.Code;
import com.android.dx.io.OpcodeInfo;
diff --git a/src/main/java/jadx/dex/instructions/InsnType.java b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnType.java
similarity index 94%
rename from src/main/java/jadx/dex/instructions/InsnType.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/InsnType.java
index 4684c8519..8331b834e 100644
--- a/src/main/java/jadx/dex/instructions/InsnType.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnType.java
@@ -1,4 +1,4 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
public enum InsnType {
NOP, // replacement for removed instructions
diff --git a/src/main/java/jadx/dex/instructions/InvokeNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/InvokeNode.java
similarity index 81%
rename from src/main/java/jadx/dex/instructions/InvokeNode.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/InvokeNode.java
index f9d5822ef..0339dab7b 100644
--- a/src/main/java/jadx/dex/instructions/InvokeNode.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/InvokeNode.java
@@ -1,11 +1,11 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
-import jadx.dex.info.MethodInfo;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.instructions.args.InsnArg;
-import jadx.dex.nodes.InsnNode;
-import jadx.utils.InsnUtils;
-import jadx.utils.Utils;
+import jadx.core.dex.info.MethodInfo;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.instructions.args.InsnArg;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.utils.InsnUtils;
+import jadx.core.utils.Utils;
import com.android.dx.io.instructions.DecodedInstruction;
diff --git a/src/main/java/jadx/dex/instructions/InvokeType.java b/jadx-core/src/main/java/jadx/core/dex/instructions/InvokeType.java
similarity index 67%
rename from src/main/java/jadx/dex/instructions/InvokeType.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/InvokeType.java
index 726d491ee..44ac02514 100644
--- a/src/main/java/jadx/dex/instructions/InvokeType.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/InvokeType.java
@@ -1,4 +1,4 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
public enum InvokeType {
STATIC,
diff --git a/src/main/java/jadx/dex/instructions/SwitchNode.java b/jadx-core/src/main/java/jadx/core/dex/instructions/SwitchNode.java
similarity index 85%
rename from src/main/java/jadx/dex/instructions/SwitchNode.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/SwitchNode.java
index febfbbc09..82cd9b648 100644
--- a/src/main/java/jadx/dex/instructions/SwitchNode.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/SwitchNode.java
@@ -1,8 +1,8 @@
-package jadx.dex.instructions;
+package jadx.core.dex.instructions;
-import jadx.dex.instructions.args.InsnArg;
-import jadx.dex.nodes.InsnNode;
-import jadx.utils.InsnUtils;
+import jadx.core.dex.instructions.args.InsnArg;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.utils.InsnUtils;
import java.util.Arrays;
diff --git a/src/main/java/jadx/dex/instructions/args/ArgType.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java
similarity index 99%
rename from src/main/java/jadx/dex/instructions/args/ArgType.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java
index ab3838d63..795b87138 100644
--- a/src/main/java/jadx/dex/instructions/args/ArgType.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java
@@ -1,7 +1,7 @@
-package jadx.dex.instructions.args;
+package jadx.core.dex.instructions.args;
-import jadx.Consts;
-import jadx.utils.Utils;
+import jadx.core.Consts;
+import jadx.core.utils.Utils;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/src/main/java/jadx/dex/instructions/args/InsnArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java
similarity index 93%
rename from src/main/java/jadx/dex/instructions/args/InsnArg.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java
index 1ad168aa2..f47eb74f1 100644
--- a/src/main/java/jadx/dex/instructions/args/InsnArg.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java
@@ -1,7 +1,7 @@
-package jadx.dex.instructions.args;
+package jadx.core.dex.instructions.args;
-import jadx.dex.nodes.InsnNode;
-import jadx.utils.InsnUtils;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.utils.InsnUtils;
import com.android.dx.io.instructions.DecodedInstruction;
diff --git a/src/main/java/jadx/dex/instructions/args/InsnWrapArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnWrapArg.java
similarity index 89%
rename from src/main/java/jadx/dex/instructions/args/InsnWrapArg.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnWrapArg.java
index 1c38e01e7..d1a615644 100644
--- a/src/main/java/jadx/dex/instructions/args/InsnWrapArg.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnWrapArg.java
@@ -1,6 +1,6 @@
-package jadx.dex.instructions.args;
+package jadx.core.dex.instructions.args;
-import jadx.dex.nodes.InsnNode;
+import jadx.core.dex.nodes.InsnNode;
public class InsnWrapArg extends InsnArg {
diff --git a/src/main/java/jadx/dex/instructions/args/LiteralArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/LiteralArg.java
similarity index 87%
rename from src/main/java/jadx/dex/instructions/args/LiteralArg.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/args/LiteralArg.java
index 1ced310dd..5ef70ffbe 100644
--- a/src/main/java/jadx/dex/instructions/args/LiteralArg.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/LiteralArg.java
@@ -1,7 +1,7 @@
-package jadx.dex.instructions.args;
+package jadx.core.dex.instructions.args;
-import jadx.codegen.TypeGen;
-import jadx.utils.exceptions.JadxRuntimeException;
+import jadx.core.codegen.TypeGen;
+import jadx.core.utils.exceptions.JadxRuntimeException;
public class LiteralArg extends InsnArg {
diff --git a/src/main/java/jadx/dex/instructions/args/PrimitiveType.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/PrimitiveType.java
similarity index 95%
rename from src/main/java/jadx/dex/instructions/args/PrimitiveType.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/args/PrimitiveType.java
index dca48f734..a43549bfd 100644
--- a/src/main/java/jadx/dex/instructions/args/PrimitiveType.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/PrimitiveType.java
@@ -1,4 +1,4 @@
-package jadx.dex.instructions.args;
+package jadx.core.dex.instructions.args;
public enum PrimitiveType {
BOOLEAN("Z", "boolean"),
diff --git a/src/main/java/jadx/dex/instructions/args/RegisterArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java
similarity index 90%
rename from src/main/java/jadx/dex/instructions/args/RegisterArg.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java
index 51b603ec3..4e8585859 100644
--- a/src/main/java/jadx/dex/instructions/args/RegisterArg.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java
@@ -1,9 +1,9 @@
-package jadx.dex.instructions.args;
+package jadx.core.dex.instructions.args;
-import jadx.dex.instructions.IndexInsnNode;
-import jadx.dex.instructions.InsnType;
-import jadx.dex.nodes.InsnNode;
-import jadx.dex.visitors.InstructionRemover;
+import jadx.core.dex.instructions.IndexInsnNode;
+import jadx.core.dex.instructions.InsnType;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.dex.visitors.InstructionRemover;
public class RegisterArg extends InsnArg {
protected final int regNum;
@@ -42,7 +42,7 @@ public class RegisterArg extends InsnArg {
/**
* Return constant value from register assign or null if not constant
- *
+ *
* @return LiteralArg, String or ArgType
*/
public Object getConstValue() {
diff --git a/src/main/java/jadx/dex/instructions/args/Typed.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/Typed.java
similarity index 95%
rename from src/main/java/jadx/dex/instructions/args/Typed.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/args/Typed.java
index 8496d82e9..bc6815fcd 100644
--- a/src/main/java/jadx/dex/instructions/args/Typed.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/Typed.java
@@ -1,4 +1,4 @@
-package jadx.dex.instructions.args;
+package jadx.core.dex.instructions.args;
public abstract class Typed {
diff --git a/src/main/java/jadx/dex/instructions/args/TypedVar.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/TypedVar.java
similarity index 97%
rename from src/main/java/jadx/dex/instructions/args/TypedVar.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/args/TypedVar.java
index 60e65c639..fb44d42a9 100644
--- a/src/main/java/jadx/dex/instructions/args/TypedVar.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/TypedVar.java
@@ -1,4 +1,4 @@
-package jadx.dex.instructions.args;
+package jadx.core.dex.instructions.args;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/jadx/dex/instructions/mods/ConstructorInsn.java b/jadx-core/src/main/java/jadx/core/dex/instructions/mods/ConstructorInsn.java
similarity index 82%
rename from src/main/java/jadx/dex/instructions/mods/ConstructorInsn.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/mods/ConstructorInsn.java
index 3b9d9fb3e..aff9d8cda 100644
--- a/src/main/java/jadx/dex/instructions/mods/ConstructorInsn.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/mods/ConstructorInsn.java
@@ -1,12 +1,12 @@
-package jadx.dex.instructions.mods;
+package jadx.core.dex.instructions.mods;
-import jadx.dex.info.ClassInfo;
-import jadx.dex.info.MethodInfo;
-import jadx.dex.instructions.InsnType;
-import jadx.dex.instructions.InvokeNode;
-import jadx.dex.instructions.args.RegisterArg;
-import jadx.dex.nodes.InsnNode;
-import jadx.dex.nodes.MethodNode;
+import jadx.core.dex.info.ClassInfo;
+import jadx.core.dex.info.MethodInfo;
+import jadx.core.dex.instructions.InsnType;
+import jadx.core.dex.instructions.InvokeNode;
+import jadx.core.dex.instructions.args.RegisterArg;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.dex.nodes.MethodNode;
public class ConstructorInsn extends InsnNode {
diff --git a/src/main/java/jadx/dex/instructions/mods/TernaryInsn.java b/jadx-core/src/main/java/jadx/core/dex/instructions/mods/TernaryInsn.java
similarity index 58%
rename from src/main/java/jadx/dex/instructions/mods/TernaryInsn.java
rename to jadx-core/src/main/java/jadx/core/dex/instructions/mods/TernaryInsn.java
index b24c77d2c..05d41fe86 100644
--- a/src/main/java/jadx/dex/instructions/mods/TernaryInsn.java
+++ b/jadx-core/src/main/java/jadx/core/dex/instructions/mods/TernaryInsn.java
@@ -1,12 +1,12 @@
-package jadx.dex.instructions.mods;
+package jadx.core.dex.instructions.mods;
-import jadx.dex.instructions.IfNode;
-import jadx.dex.instructions.IfOp;
-import jadx.dex.instructions.InsnType;
-import jadx.dex.instructions.args.InsnArg;
-import jadx.dex.nodes.InsnNode;
-import jadx.utils.InsnUtils;
-import jadx.utils.Utils;
+import jadx.core.dex.instructions.IfNode;
+import jadx.core.dex.instructions.IfOp;
+import jadx.core.dex.instructions.InsnType;
+import jadx.core.dex.instructions.args.InsnArg;
+import jadx.core.dex.nodes.InsnNode;
+import jadx.core.utils.InsnUtils;
+import jadx.core.utils.Utils;
public class TernaryInsn extends IfNode {
diff --git a/src/main/java/jadx/dex/nodes/BlockNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java
similarity index 93%
rename from src/main/java/jadx/dex/nodes/BlockNode.java
rename to jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java
index 8943d8956..4e69512cf 100644
--- a/src/main/java/jadx/dex/nodes/BlockNode.java
+++ b/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java
@@ -1,10 +1,10 @@
-package jadx.dex.nodes;
+package jadx.core.dex.nodes;
-import jadx.dex.attributes.AttrNode;
-import jadx.dex.attributes.AttributeType;
-import jadx.dex.attributes.BlockRegState;
-import jadx.dex.attributes.LoopAttr;
-import jadx.utils.InsnUtils;
+import jadx.core.dex.attributes.AttrNode;
+import jadx.core.dex.attributes.AttributeType;
+import jadx.core.dex.attributes.BlockRegState;
+import jadx.core.dex.attributes.LoopAttr;
+import jadx.core.utils.InsnUtils;
import java.util.ArrayList;
import java.util.BitSet;
diff --git a/src/main/java/jadx/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java
similarity index 89%
rename from src/main/java/jadx/dex/nodes/ClassNode.java
rename to jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java
index 2e0932635..b219be44b 100644
--- a/src/main/java/jadx/dex/nodes/ClassNode.java
+++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java
@@ -1,21 +1,22 @@
-package jadx.dex.nodes;
+package jadx.core.dex.nodes;
-import jadx.Consts;
-import jadx.dex.attributes.AttrNode;
-import jadx.dex.attributes.AttributeType;
-import jadx.dex.attributes.SourceFileAttr;
-import jadx.dex.attributes.annotations.Annotation;
-import jadx.dex.info.AccessInfo;
-import jadx.dex.info.AccessInfo.AFType;
-import jadx.dex.info.ClassInfo;
-import jadx.dex.info.FieldInfo;
-import jadx.dex.info.MethodInfo;
-import jadx.dex.instructions.args.ArgType;
-import jadx.dex.nodes.parser.AnnotationsParser;
-import jadx.dex.nodes.parser.FieldValueAttr;
-import jadx.dex.nodes.parser.StaticValuesParser;
-import jadx.utils.Utils;
-import jadx.utils.exceptions.DecodeException;
+import jadx.core.Consts;
+import jadx.core.codegen.CodeWriter;
+import jadx.core.dex.attributes.AttrNode;
+import jadx.core.dex.attributes.AttributeType;
+import jadx.core.dex.attributes.SourceFileAttr;
+import jadx.core.dex.attributes.annotations.Annotation;
+import jadx.core.dex.info.AccessInfo;
+import jadx.core.dex.info.AccessInfo.AFType;
+import jadx.core.dex.info.ClassInfo;
+import jadx.core.dex.info.FieldInfo;
+import jadx.core.dex.info.MethodInfo;
+import jadx.core.dex.instructions.args.ArgType;
+import jadx.core.dex.nodes.parser.AnnotationsParser;
+import jadx.core.dex.nodes.parser.FieldValueAttr;
+import jadx.core.dex.nodes.parser.StaticValuesParser;
+import jadx.core.utils.Utils;
+import jadx.core.utils.exceptions.DecodeException;
import java.util.ArrayList;
import java.util.Collections;
@@ -48,6 +49,8 @@ public class ClassNode extends AttrNode implements ILoadable {
private final Map