From ea4d83a5480db7d749700ab4a2e62cc12f43468a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sat, 30 Mar 2019 12:46:33 +0100 Subject: [PATCH 1/2] 4: Add Decompiler to DI container --- .../esa/decompiler/decompiler/Decompiler.java | 11 +++++++++++ .../bartek/esa/decompiler/di/DecompilerModule.java | 14 ++++++++++++++ .../java/com/bartek/esa/di/DependencyInjector.java | 4 +++- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/bartek/esa/decompiler/decompiler/Decompiler.java create mode 100644 src/main/java/com/bartek/esa/decompiler/di/DecompilerModule.java 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..8a8e092 --- /dev/null +++ b/src/main/java/com/bartek/esa/decompiler/decompiler/Decompiler.java @@ -0,0 +1,11 @@ +package com.bartek.esa.decompiler.decompiler; + +import javax.inject.Inject; + +public class Decompiler { + + @Inject + public Decompiler() { + + } +} 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..63edac6 --- /dev/null +++ b/src/main/java/com/bartek/esa/decompiler/di/DecompilerModule.java @@ -0,0 +1,14 @@ +package com.bartek.esa.decompiler.di; + +import com.bartek.esa.decompiler.decompiler.Decompiler; +import dagger.Module; +import dagger.Provides; + +@Module +public class DecompilerModule { + + @Provides + public Decompiler decompiler() { + return new Decompiler(); + } +} 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(); From d544df86fa01a1a4ddf9694f1e160c3b1ecff0a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sat, 30 Mar 2019 13:08:04 +0100 Subject: [PATCH 2/2] 4: Create decompiler --- .../esa/decompiler/decompiler/Decompiler.java | 41 ++++++++++++++++++- .../esa/decompiler/di/DecompilerModule.java | 5 ++- .../esa/file/provider/FileProvider.java | 6 +++ 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/bartek/esa/decompiler/decompiler/Decompiler.java b/src/main/java/com/bartek/esa/decompiler/decompiler/Decompiler.java index 8a8e092..7654e5e 100644 --- a/src/main/java/com/bartek/esa/decompiler/decompiler/Decompiler.java +++ b/src/main/java/com/bartek/esa/decompiler/decompiler/Decompiler.java @@ -1,11 +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() { + 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 index 63edac6..eac8e30 100644 --- a/src/main/java/com/bartek/esa/decompiler/di/DecompilerModule.java +++ b/src/main/java/com/bartek/esa/decompiler/di/DecompilerModule.java @@ -1,6 +1,7 @@ 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; @@ -8,7 +9,7 @@ import dagger.Provides; public class DecompilerModule { @Provides - public Decompiler decompiler() { - return new Decompiler(); + public Decompiler decompiler(FileProvider fileProvider) { + return new Decompiler(fileProvider); } } 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())