diff --git a/.gitignore b/.gitignore index fab3b96fc..5dcde5a95 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ idea/ .gradle/ gradle.properties +jadx-output/ *-tmp/ *.dex diff --git a/jadx-core/build.gradle b/jadx-core/build.gradle index fa292422d..b863e94d9 100644 --- a/jadx-core/build.gradle +++ b/jadx-core/build.gradle @@ -3,7 +3,7 @@ ext.jadxClasspath = 'clsp-data/android-5.1.jar' dependencies { runtime files(jadxClasspath) - compile files('lib/dx-1.13.jar') + compile files('lib/dx-1.14.jar') compile 'commons-io:commons-io:2.6' compile 'org.ow2.asm:asm:5.0.3' compile 'com.intellij:annotations:12.0' diff --git a/jadx-core/lib/dx-1.13.jar b/jadx-core/lib/dx-1.13.jar deleted file mode 100644 index 37773c811..000000000 Binary files a/jadx-core/lib/dx-1.13.jar and /dev/null differ diff --git a/jadx-core/lib/dx-1.14.jar b/jadx-core/lib/dx-1.14.jar new file mode 100644 index 000000000..023b8da38 Binary files /dev/null and b/jadx-core/lib/dx-1.14.jar differ 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 fd7d8c563..815f5e15c 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 @@ -565,7 +565,7 @@ public class InsnDecoder { InsnArg.reg(insn, 0, ArgType.UNKNOWN_OBJECT)); } - throw new DecodeException("Unknown instruction: " + OpcodeInfo.getName(insn.getOpcode())); + throw new DecodeException("Unknown instruction: '" + OpcodeInfo.getName(insn.getOpcode()) + "'"); } private InsnNode decodeSwitch(DecodedInstruction insn, int offset, boolean packed) { diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java index c2f87cb7a..07c7499a8 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java @@ -113,7 +113,7 @@ public class MethodNode extends LineAttrNode implements ILoadable, IDexNode { load(); noCode = false; } - throw new DecodeException(this, "Load method exception", e); + throw new DecodeException(this, "Load method exception: " + e.getMessage(), e); } } diff --git a/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java b/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java index cb1fb5c49..d1615726e 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java @@ -146,19 +146,20 @@ public class InputFile { } private static Dex loadFromJar(File jarFile) throws DecodeException { + JavaToDex j2d = new JavaToDex(); try { LOG.info("converting to dex: {} ...", jarFile.getName()); - JavaToDex j2d = new JavaToDex(); byte[] ba = j2d.convert(jarFile.getAbsolutePath()); if (ba.length == 0) { - throw new JadxException(j2d.isError() ? j2d.getDxErrors() : "Empty dx output"); - } - if (j2d.isError()) { - LOG.warn("dx message: {}", j2d.getDxErrors()); + throw new JadxException("Empty dx output"); } return new Dex(ba); } catch (Throwable e) { throw new DecodeException("java class to dex conversion error:\n " + e.getMessage(), e); + } finally { + if (j2d.isError()) { + LOG.warn("dx message: {}", j2d.getDxErrors()); + } } } diff --git a/jadx-core/src/main/java/jadx/core/utils/files/JavaToDex.java b/jadx-core/src/main/java/jadx/core/utils/files/JavaToDex.java index 359dbda6d..1636c7e3b 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/JavaToDex.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/JavaToDex.java @@ -1,21 +1,23 @@ package jadx.core.utils.files; -import jadx.core.utils.exceptions.JadxException; - import java.io.ByteArrayOutputStream; import com.android.dx.command.dexer.DxContext; import com.android.dx.command.dexer.Main; import com.android.dx.command.dexer.Main.Arguments; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import static jadx.core.utils.files.FileUtils.close; +import jadx.core.utils.exceptions.JadxException; public class JavaToDex { + private static final Logger LOG = LoggerFactory.getLogger(JavaToDex.class); private static final String CHARSET_NAME = "UTF-8"; public static class DxArgs extends Arguments { - public DxArgs(String dexFile, String[] input) { + public DxArgs(DxContext context, String dexFile, String[] input) { + super(context); outName = dexFile; fileNames = input; jarOutput = false; @@ -25,28 +27,26 @@ public class JavaToDex { coreLibrary = true; debug = true; + warnings = true; + minSdkVersion = 28; } } private String dxErrors; public byte[] convert(String javaFile) throws JadxException { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - ByteArrayOutputStream errOut = new ByteArrayOutputStream(); - try { + try (ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayOutputStream errOut = new ByteArrayOutputStream()) { DxContext context = new DxContext(out, errOut); - DxArgs args = new DxArgs("-", new String[]{javaFile}); + DxArgs args = new DxArgs(context, "-", new String[]{javaFile}); int result = (new Main(context)).runDx(args); + dxErrors = errOut.toString(CHARSET_NAME); if (result != 0) { throw new JadxException("Java to dex conversion error, code: " + result); } - dxErrors = errOut.toString(CHARSET_NAME); return out.toByteArray(); } catch (Exception e) { throw new JadxException("dx exception: " + e.getMessage(), e); - } finally { - close(out); - close(errOut); } }