package jadx.core.utils.files; import jadx.core.utils.exceptions.JadxException; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import com.android.dx.command.DxConsole; import com.android.dx.command.dexer.Main; import com.android.dx.command.dexer.Main.Arguments; public class JavaToDex { private static final String CHARSET_NAME = "UTF-8"; public static class DxArgs extends Arguments { public DxArgs(String dexFile, String[] input) { outName = dexFile; fileNames = input; jarOutput = false; optimize = true; localInfo = true; coreLibrary = true; } } private String dxErrors; public byte[] convert(String javaFile) throws JadxException { 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 { System.setOut(new PrintStream(baos, true, CHARSET_NAME)); DxArgs args = new DxArgs("-", new String[]{javaFile}); Main.run(args); baos.close(); } catch (Throwable e) { throw new JadxException("dx exception: " + e.getMessage(), e); } finally { System.setOut(oldOut); } try { // errOut also contains warnings dxErrors = errOut.toString(CHARSET_NAME); } catch (UnsupportedEncodingException e) { throw new JadxException("Can't save error output", e); } return baos.toByteArray(); } public String getDxErrors() { return dxErrors; } public boolean isError() { return dxErrors != null && dxErrors.length() > 0; } }