Merge branch '4-create-decompiler' into 'master'

Resolve "Create decompiler"

Closes #4

See merge request bartlomiej.pluta/esa-tool!4
This commit is contained in:
Bartłomiej Pluta
2019-03-30 13:51:23 +00:00
4 changed files with 74 additions and 1 deletions

View File

@@ -0,0 +1,50 @@
package com.bartek.esa.decompiler.decompiler;
import com.bartek.esa.error.EsaException;
import com.bartek.esa.file.provider.FileProvider;
import io.vavr.control.Try;
import javax.inject.Inject;
import java.io.File;
public class Decompiler {
private final FileProvider fileProvider;
@Inject
public Decompiler(FileProvider fileProvider) {
this.fileProvider = fileProvider;
}
public File decompile(File inputApk) {
File target = provideTargetDirectory();
Process process = decompile(inputApk, target);
waitForProcess(process);
checkExitValue(process);
return target;
}
private void checkExitValue(Process process) {
if(process.exitValue() != 0) {
throw new EsaException("'apktool' process has finished with non-zero code. Interrupting...");
}
}
private void waitForProcess(Process process) {
Try.run(process::waitFor).getOrElseThrow(EsaException::new);
}
private Process decompile(File inputApk, File target) {
return Try.of(() -> Runtime.getRuntime().exec(provideCommandArray(inputApk, target)))
.getOrElseThrow(EsaException::new);
}
private String[] provideCommandArray(File inputApk, File target) {
return new String[]{"apktool", "d", inputApk.getAbsolutePath(), "-o", target.getAbsolutePath()};
}
private File provideTargetDirectory() {
File tmp = fileProvider.createTemporaryDirectory();
return new File(tmp, "apktool_out");
}
}

View File

@@ -0,0 +1,15 @@
package com.bartek.esa.decompiler.di;
import com.bartek.esa.decompiler.decompiler.Decompiler;
import com.bartek.esa.file.provider.FileProvider;
import dagger.Module;
import dagger.Provides;
@Module
public class DecompilerModule {
@Provides
public Decompiler decompiler(FileProvider fileProvider) {
return new Decompiler(fileProvider);
}
}

View File

@@ -2,6 +2,7 @@ package com.bartek.esa.di;
import com.bartek.esa.EsaMain;
import com.bartek.esa.cli.di.CliModule;
import com.bartek.esa.decompiler.di.DecompilerModule;
import com.bartek.esa.dispatcher.di.DispatcherModule;
import com.bartek.esa.file.di.FileModule;
import dagger.Component;
@@ -9,7 +10,8 @@ import dagger.Component;
@Component(modules = {
CliModule.class,
DispatcherModule.class,
FileModule.class
FileModule.class,
DecompilerModule.class
})
public interface DependencyInjector {
EsaMain esa();

View File

@@ -18,6 +18,12 @@ public class FileProvider {
}
public File createTemporaryDirectory() {
return Try.of(() -> Files.createTempDirectory(null))
.getOrElseThrow(EsaException::new)
.toFile();
}
public String readFile(File file) {
StringBuilder content = new StringBuilder();
Try.run(() -> Files.lines(file.toPath())