diff --git a/src/main/java/com/bartek/esa/decompiler/decompiler/Decompiler.java b/src/main/java/com/bartek/esa/decompiler/decompiler/Decompiler.java new file mode 100644 index 0000000..7654e5e --- /dev/null +++ b/src/main/java/com/bartek/esa/decompiler/decompiler/Decompiler.java @@ -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"); + } +} diff --git a/src/main/java/com/bartek/esa/decompiler/di/DecompilerModule.java b/src/main/java/com/bartek/esa/decompiler/di/DecompilerModule.java new file mode 100644 index 0000000..eac8e30 --- /dev/null +++ b/src/main/java/com/bartek/esa/decompiler/di/DecompilerModule.java @@ -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); + } +} diff --git a/src/main/java/com/bartek/esa/di/DependencyInjector.java b/src/main/java/com/bartek/esa/di/DependencyInjector.java index c005aa6..e3c449e 100644 --- a/src/main/java/com/bartek/esa/di/DependencyInjector.java +++ b/src/main/java/com/bartek/esa/di/DependencyInjector.java @@ -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(); diff --git a/src/main/java/com/bartek/esa/file/provider/FileProvider.java b/src/main/java/com/bartek/esa/file/provider/FileProvider.java index 47997e9..b3cbd3e 100644 --- a/src/main/java/com/bartek/esa/file/provider/FileProvider.java +++ b/src/main/java/com/bartek/esa/file/provider/FileProvider.java @@ -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())