Commit da94e7b1 authored by Skylot's avatar Skylot

core: update dx to 1.13 for support java 8, build for jdk 8

parent ea346145
......@@ -13,6 +13,7 @@ out/
bin/
target/
build/
classes/
idea/
.gradle/
gradle.properties
......
language: java
jdk:
- oraclejdk8
- oraclejdk7
before_install:
- chmod +x gradlew
......
......@@ -3,7 +3,7 @@ ext.jadxClasspath = 'clsp-data/android-5.1.jar'
dependencies {
runtime files(jadxClasspath)
compile files('lib/dx.jar')
compile files('lib/dx-1.13.jar')
compile 'commons-io:commons-io:2.4'
compile 'org.ow2.asm:asm:5.0.3'
compile 'com.intellij:annotations:12.0'
......
package jadx.core.utils.files;
import jadx.core.utils.exceptions.JadxException;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import com.android.dx.command.DxConsole;
import com.android.dx.command.dexer.DxContext;
import com.android.dx.command.dexer.Main;
import com.android.dx.command.dexer.Main.Arguments;
import static com.android.dx.command.dexer.Main.run;
import jadx.core.utils.exceptions.JadxException;
import static jadx.core.utils.files.FileUtils.close;
import static java.lang.System.setOut;
public class JavaToDex {
......@@ -36,41 +31,22 @@ public class JavaToDex {
private String dxErrors;
public byte[] convert(String javaFile) throws JadxException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayOutputStream errOut = new ByteArrayOutputStream();
try {
DxConsole.err = new PrintStream(errOut, true, CHARSET_NAME);
} catch (UnsupportedEncodingException e) {
throw new JadxException(e.getMessage(), e);
}
PrintStream oldOut = System.out;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
setOut(new PrintStream(baos, true, CHARSET_NAME));
DxContext context = new DxContext(out, errOut);
DxArgs args = new DxArgs("-", new String[]{javaFile});
resetOutDexVar();
run(args);
} catch (Throwable e) {
throw new JadxException("dx exception: " + e.getMessage(), e);
} finally {
close(baos);
System.setOut(oldOut);
}
try {
// errOut also contains warnings
int result = (new Main(context)).runDx(args);
if (result != 0) {
throw new JadxException("Java to dex conversion error, code: " + result);
}
dxErrors = errOut.toString(CHARSET_NAME);
} catch (UnsupportedEncodingException e) {
throw new JadxException("Can't save error output", e);
}
return baos.toByteArray();
}
private void resetOutDexVar() throws JadxException {
try {
Field outputDex = Main.class.getDeclaredField("outputDex");
outputDex.setAccessible(true);
outputDex.set(null, null);
return out.toByteArray();
} catch (Exception e) {
throw new JadxException("Failed to reset outputDex field", e);
throw new JadxException("dx exception: " + e.getMessage(), e);
} finally {
close(out);
close(errOut);
}
}
......
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