From 6bc2d3321c03e8abe3355c8e098ac21aecfb98f4 Mon Sep 17 00:00:00 2001 From: Skylot Date: Wed, 25 Sep 2013 18:04:42 +0400 Subject: [PATCH] code refactoring --- build.gradle | 6 +- jadx-cli/src/main/java/jadx/cli/JadxCLI.java | 24 ++++---- .../src/main/java/jadx/cli/JadxCLIArgs.java | 4 +- .../src/main/resources/logback.xml | 2 +- .../main/java/jadx/core/codegen/InsnGen.java | 14 ++--- .../java/jadx/core/dex/info/ClassInfo.java | 2 +- ...onstClassInsn.java => ConstClassNode.java} | 4 +- ...stStringInsn.java => ConstStringNode.java} | 4 +- .../{FillArrayOp.java => FillArrayNode.java} | 4 +- .../core/dex/instructions/InsnDecoder.java | 6 +- .../core/dex/instructions/args/InsnArg.java | 60 ++++++++++--------- .../dex/instructions/args/RegisterArg.java | 8 +-- .../jadx/core/dex/visitors/ModVisitor.java | 8 +-- jadx-samples/build.gradle | 4 +- 14 files changed, 78 insertions(+), 72 deletions(-) rename {jadx-core => jadx-cli}/src/main/resources/logback.xml (79%) rename jadx-core/src/main/java/jadx/core/dex/instructions/{ConstClassInsn.java => ConstClassNode.java} (80%) rename jadx-core/src/main/java/jadx/core/dex/instructions/{ConstStringInsn.java => ConstStringNode.java} (77%) rename jadx-core/src/main/java/jadx/core/dex/instructions/{FillArrayOp.java => FillArrayNode.java} (88%) diff --git a/build.gradle b/build.gradle index 5eb11fdf..bd08e4af 100644 --- a/build.gradle +++ b/build.gradle @@ -35,20 +35,20 @@ subprojects { } } -task copyArtifacts (type: Sync, dependsOn: ['jadx-cli:installApp', 'jadx-gui:installApp']) { +task copyArtifacts(type: Sync, dependsOn: ['jadx-cli:installApp', 'jadx-gui:installApp']) { destinationDir file("$buildDir/jadx") ['jadx-cli', 'jadx-gui'].each { from tasks.getByPath(":${it}:installApp").destinationDir } } -task pack (type: Zip, dependsOn: copyArtifacts) { +task pack(type: Zip, dependsOn: copyArtifacts) { destinationDir buildDir archiveName "jadx-${jadxVersion}.zip" from copyArtifacts.destinationDir } -task build (dependsOn: pack) { +task build(dependsOn: pack) { description = 'Build jadx distribution zip' } diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLI.java b/jadx-cli/src/main/java/jadx/cli/JadxCLI.java index 35205e1f..11dabc01 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLI.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLI.java @@ -2,7 +2,6 @@ package jadx.cli; import jadx.api.Decompiler; import jadx.core.utils.ErrorsCounter; -import jadx.core.utils.exceptions.JadxException; import java.io.File; @@ -17,7 +16,7 @@ public class JadxCLI { JadxCLIArgs jadxArgs = new JadxCLIArgs(args); checkArgs(jadxArgs); processAndSave(jadxArgs); - } catch (JadxException e) { + } catch (Exception e) { LOG.error(e.getMessage()); System.exit(1); } @@ -40,26 +39,29 @@ public class JadxCLI { System.exit(errorsCount); } - private static void checkArgs(JadxCLIArgs jadxArgs) throws JadxException { - if (jadxArgs.getInput().isEmpty()) - throw new JadxException("Please specify input file"); - + private static void checkArgs(JadxCLIArgs jadxArgs) throws Exception { + if (jadxArgs.getInput().isEmpty()) { + LOG.error("Please specify input file"); + jadxArgs.printUsage(); + System.exit(1); + } File outputDir = jadxArgs.getOutDir(); if (outputDir == null) { String outDirName; File file = jadxArgs.getInput().get(0); String name = file.getName(); int pos = name.lastIndexOf('.'); - if (pos != -1) + if (pos != -1) { outDirName = name.substring(0, pos); - else + } else { outDirName = name + "-jadx-out"; - + } LOG.info("output directory: " + outDirName); outputDir = new File(outDirName); jadxArgs.setOutputDir(outputDir); } - if (outputDir.exists() && !outputDir.isDirectory()) - throw new JadxException("Output directory exists as file " + outputDir); + if (outputDir.exists() && !outputDir.isDirectory()) { + throw new Exception("Output directory exists as file " + outputDir); + } } } diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java index 999826ce..065720b0 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java @@ -20,7 +20,7 @@ import com.beust.jcommander.ParameterException; public final class JadxCLIArgs implements IJadxArgs { - @Parameter(description = " (.dex, .apk, .jar or .class)") + @Parameter(description = " (.dex, .apk or .jar)") protected List files; @Parameter(names = {"-d", "--output-dir"}, description = "output directory") @@ -32,7 +32,7 @@ public final class JadxCLIArgs implements IJadxArgs { @Parameter(names = {"-f", "--fallback"}, description = "make simple dump (using goto instead of 'if', 'for', etc)", help = true) protected boolean fallbackMode = false; - @Parameter(names = {"--cfg"}, description = "save methods control flow graph") + @Parameter(names = {"--cfg"}, description = "save methods control flow graph to dot file") protected boolean cfgOutput = false; @Parameter(names = {"--raw-cfg"}, description = "save methods control flow graph (use raw instructions)") diff --git a/jadx-core/src/main/resources/logback.xml b/jadx-cli/src/main/resources/logback.xml similarity index 79% rename from jadx-core/src/main/resources/logback.xml rename to jadx-cli/src/main/resources/logback.xml index ec2224ba..6f8e7d5e 100644 --- a/jadx-core/src/main/resources/logback.xml +++ b/jadx-cli/src/main/resources/logback.xml @@ -2,7 +2,7 @@ - %d{HH:mm:ss} %-5level - %msg%n + %-5level - %msg%n diff --git a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java index 9adfceb3..b8a69646 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -8,9 +8,9 @@ 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.ConstClassInsn; -import jadx.core.dex.instructions.ConstStringInsn; -import jadx.core.dex.instructions.FillArrayOp; +import jadx.core.dex.instructions.ConstClassNode; +import jadx.core.dex.instructions.ConstStringNode; +import jadx.core.dex.instructions.FillArrayNode; import jadx.core.dex.instructions.GotoNode; import jadx.core.dex.instructions.IfNode; import jadx.core.dex.instructions.IndexInsnNode; @@ -209,12 +209,12 @@ public class InsnGen { private void makeInsnBody(CodeWriter code, InsnNode insn, EnumSet state) throws CodegenException { switch (insn.getType()) { case CONST_STR: - String str = ((ConstStringInsn) insn).getString(); + String str = ((ConstStringNode) insn).getString(); code.add(StringUtils.unescapeString(str)); break; case CONST_CLASS: - ArgType clsType = ((ConstClassInsn) insn).getClsType(); + ArgType clsType = ((ConstClassNode) insn).getClsType(); code.add(useType(clsType)).add(".class"); break; @@ -311,7 +311,7 @@ public class InsnGen { break; case FILL_ARRAY: - fillArray((FillArrayOp) insn, code); + fillArray((FillArrayNode) insn, code); break; case FILLED_NEW_ARRAY: @@ -449,7 +449,7 @@ public class InsnGen { code.add('}'); } - private void fillArray(FillArrayOp insn, CodeWriter code) throws CodegenException { + private void fillArray(FillArrayNode insn, CodeWriter code) throws CodegenException { ArgType elType = insn.getResult().getType().getArrayElement(); if (elType.getPrimitiveType() == null) { elType = elType.selectFirst(); diff --git a/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java b/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java index e2e88504..65871518 100644 --- a/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java +++ b/jadx-core/src/main/java/jadx/core/dex/info/ClassInfo.java @@ -80,7 +80,7 @@ public final class ClassInfo { char firstChar = name.charAt(0); if (Character.isDigit(firstChar)) { - name = "InnerClass_" + name; + name = "AnonymousClass_" + name; } else if (firstChar == '$') { name = "_" + name; } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/ConstClassInsn.java b/jadx-core/src/main/java/jadx/core/dex/instructions/ConstClassNode.java similarity index 80% rename from jadx-core/src/main/java/jadx/core/dex/instructions/ConstClassInsn.java rename to jadx-core/src/main/java/jadx/core/dex/instructions/ConstClassNode.java index 6b14ff00..0a2cfb29 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/ConstClassInsn.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/ConstClassNode.java @@ -3,11 +3,11 @@ package jadx.core.dex.instructions; import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.nodes.InsnNode; -public class ConstClassInsn extends InsnNode { +public class ConstClassNode extends InsnNode { private final ArgType clsType; - public ConstClassInsn(ArgType clsType) { + public ConstClassNode(ArgType clsType) { super(InsnType.CONST_CLASS, 0); this.clsType = clsType; } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/ConstStringInsn.java b/jadx-core/src/main/java/jadx/core/dex/instructions/ConstStringNode.java similarity index 77% rename from jadx-core/src/main/java/jadx/core/dex/instructions/ConstStringInsn.java rename to jadx-core/src/main/java/jadx/core/dex/instructions/ConstStringNode.java index a8ffe9d9..0c191017 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/ConstStringInsn.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/ConstStringNode.java @@ -2,11 +2,11 @@ package jadx.core.dex.instructions; import jadx.core.dex.nodes.InsnNode; -public class ConstStringInsn extends InsnNode { +public class ConstStringNode extends InsnNode { private final String str; - public ConstStringInsn(String str) { + public ConstStringNode(String str) { super(InsnType.CONST_STR, 0); this.str = str; } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/FillArrayOp.java b/jadx-core/src/main/java/jadx/core/dex/instructions/FillArrayNode.java similarity index 88% rename from jadx-core/src/main/java/jadx/core/dex/instructions/FillArrayOp.java rename to jadx-core/src/main/java/jadx/core/dex/instructions/FillArrayNode.java index 48959ba7..4b104efa 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/FillArrayOp.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/FillArrayNode.java @@ -7,11 +7,11 @@ import jadx.core.dex.nodes.InsnNode; import com.android.dx.io.instructions.FillArrayDataPayloadDecodedInstruction; -public class FillArrayOp extends InsnNode { +public class FillArrayNode extends InsnNode { private final Object data; - public FillArrayOp(int resReg, FillArrayDataPayloadDecodedInstruction payload) { + public FillArrayNode(int resReg, FillArrayDataPayloadDecodedInstruction payload) { super(InsnType.FILL_ARRAY, 0); this.data = payload.getData(); diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java index b052e8e0..99d038d1 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java @@ -96,13 +96,13 @@ public class InsnDecoder { case Opcodes.CONST_STRING: case Opcodes.CONST_STRING_JUMBO: { - InsnNode node = new ConstStringInsn(dex.getString(insn.getIndex())); + InsnNode node = new ConstStringNode(dex.getString(insn.getIndex())); node.setResult(InsnArg.reg(insn, 0, ArgType.STRING)); return node; } case Opcodes.CONST_CLASS: { - InsnNode node = new ConstClassInsn(dex.getType(insn.getIndex())); + InsnNode node = new ConstClassNode(dex.getType(insn.getIndex())); node.setResult(InsnArg.reg(insn, 0, ArgType.CLASS)); return node; } @@ -595,7 +595,7 @@ public class InsnDecoder { private InsnNode fillArray(DecodedInstruction insn) { DecodedInstruction payload = insnArr[insn.getTarget()]; - return new FillArrayOp(insn.getA(), (FillArrayDataPayloadDecodedInstruction) payload); + return new FillArrayNode(insn.getA(), (FillArrayDataPayloadDecodedInstruction) payload); } private InsnNode filledNewArray(DecodedInstruction insn, int offset, boolean isRange) { diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java index f609d5d6..362bb3bf 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java @@ -1,6 +1,5 @@ package jadx.core.dex.instructions.args; -import jadx.core.dex.instructions.InsnType; import jadx.core.dex.nodes.InsnNode; import jadx.core.utils.InsnUtils; @@ -63,40 +62,45 @@ public abstract class InsnArg extends Typed { } public InsnArg wrapInstruction(InsnNode insn) { - assert parentInsn != insn : "Can't wrap instruction info itself"; - int count = parentInsn.getArgsCount(); + InsnNode parent = parentInsn; + assert parent != insn : "Can't wrap instruction info itself"; + int count = parent.getArgsCount(); for (int i = 0; i < count; i++) { - if (parentInsn.getArg(i) == this) { - InsnArg arg; - InsnType insnType = insn.getType(); - switch (insnType) { - case MOVE: - case CONST: - arg = insn.getArg(0); - String name = insn.getResult().getTypedVar().getName(); - if (name != null) { - arg.getTypedVar().setName(name); - } - break; - case CONST_STR: - arg = wrap(insn); - arg.getTypedVar().forceSetType(ArgType.STRING); - break; - case CONST_CLASS: - arg = wrap(insn); - arg.getTypedVar().forceSetType(ArgType.CLASS); - break; - default: - arg = wrap(insn); - break; - } - parentInsn.setArg(i, arg); + if (parent.getArg(i) == this) { + InsnArg arg = wrapArg(insn); + parent.setArg(i, arg); return arg; } } return null; } + private static InsnArg wrapArg(InsnNode insn) { + InsnArg arg; + switch (insn.getType()) { + case MOVE: + case CONST: + arg = insn.getArg(0); + String name = insn.getResult().getTypedVar().getName(); + if (name != null) { + arg.getTypedVar().setName(name); + } + break; + case CONST_STR: + arg = wrap(insn); + arg.getTypedVar().forceSetType(ArgType.STRING); + break; + case CONST_CLASS: + arg = wrap(insn); + arg.getTypedVar().forceSetType(ArgType.CLASS); + break; + default: + arg = wrap(insn); + break; + } + return arg; + } + public boolean isThis() { // must be implemented in RegisterArg return false; diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java index 70be3f88..bf353903 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java @@ -1,7 +1,7 @@ package jadx.core.dex.instructions.args; -import jadx.core.dex.instructions.ConstClassInsn; -import jadx.core.dex.instructions.ConstStringInsn; +import jadx.core.dex.instructions.ConstClassNode; +import jadx.core.dex.instructions.ConstStringNode; import jadx.core.dex.instructions.InsnType; import jadx.core.dex.nodes.InsnNode; import jadx.core.dex.visitors.InstructionRemover; @@ -53,9 +53,9 @@ public class RegisterArg extends InsnArg { case CONST: return parInsn.getArg(0); case CONST_STR: - return ((ConstStringInsn) parInsn).getString(); + return ((ConstStringNode) parInsn).getString(); case CONST_CLASS: - return ((ConstClassInsn) parInsn).getClsType(); + return ((ConstClassNode) parInsn).getClsType(); } } return null; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java index d5a0b0c8..8abc7d8d 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java @@ -3,8 +3,8 @@ package jadx.core.dex.visitors; import jadx.core.deobf.NameMapper; import jadx.core.dex.attributes.AttributeType; import jadx.core.dex.info.MethodInfo; -import jadx.core.dex.instructions.ConstClassInsn; -import jadx.core.dex.instructions.ConstStringInsn; +import jadx.core.dex.instructions.ConstClassNode; +import jadx.core.dex.instructions.ConstStringNode; import jadx.core.dex.instructions.IndexInsnNode; import jadx.core.dex.instructions.InsnType; import jadx.core.dex.instructions.InvokeNode; @@ -104,10 +104,10 @@ public class ModVisitor extends AbstractVisitor { ClassNode parentClass = mth.getParentClass(); FieldNode f = null; if (insn.getType() == InsnType.CONST_STR) { - String s = ((ConstStringInsn) insn).getString(); + String s = ((ConstStringNode) insn).getString(); f = parentClass.getConstField(s); } else if (insn.getType() == InsnType.CONST_CLASS) { - ArgType t = ((ConstClassInsn) insn).getClsType(); + ArgType t = ((ConstClassNode) insn).getClsType(); f = parentClass.getConstField(t); } else { LiteralArg arg = (LiteralArg) insn.getArg(0); diff --git a/jadx-samples/build.gradle b/jadx-samples/build.gradle index cbc7dbb9..f21e0c07 100644 --- a/jadx-samples/build.gradle +++ b/jadx-samples/build.gradle @@ -40,10 +40,10 @@ task samplesJadxRun(type: JavaExec, dependsOn: samplesJadxCompile) { main = mainSamplesClass } -task samples (dependsOn: samplesJadxRun) { +task samples(dependsOn: samplesJadxRun) { } -task cleanGeneratedFiles (type: Delete) { +task cleanGeneratedFiles(type: Delete) { delete samplesJadxSrcDir delete samplesJadxOutDir } -- GitLab