diff --git a/jadx-core/build.gradle b/jadx-core/build.gradle index 037d9b9cbdb375727dce4d50fee163f5ca5d3cf0..ae71c998e8bbed6968d0d1ccdc2d8488774c2b8a 100644 --- a/jadx-core/build.gradle +++ b/jadx-core/build.gradle @@ -8,8 +8,11 @@ dependencies { compile 'org.ow2.asm:asm:7.1' compile 'org.jetbrains:annotations:17.0.0' compile 'uk.com.robust-it:cloning:1.9.12' + compile('org.smali:smali:2.2.6') { + exclude group: 'com.google.guava' + } + compile 'com.google.guava:guava:27.1-jre' - testCompile 'org.smali:smali:2.2.6' testCompile 'org.smali:baksmali:2.2.6' testCompile 'org.apache.commons:commons-lang3:3.8.1' diff --git a/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java b/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java index 016557a96c713d00a96f878c8d4cecbce4fd5d2b..23fcc03d7f4a8a27614269347d50807b7e21cc83 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java @@ -18,6 +18,8 @@ import java.util.zip.ZipFile; import org.apache.commons.io.IOUtils; import org.jetbrains.annotations.Nullable; +import org.jf.smali.Smali; +import org.jf.smali.SmaliOptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,6 +56,14 @@ public class InputFile { addDexFile(new Dex(file)); return; } + if (fileName.endsWith(".smali")) { + Path output = Files.createTempFile("jadx", ".dex"); + SmaliOptions options = new SmaliOptions(); + options.outputDexFile = output.toAbsolutePath().toString(); + Smali.assemble(options, file.getAbsolutePath()); + addDexFile(new Dex(output.toFile())); + return; + } if (fileName.endsWith(".class")) { for (Dex dex : loadFromClassFile(file)) { addDexFile(dex); diff --git a/jadx-core/src/test/java/jadx/tests/api/SmaliTest.java b/jadx-core/src/test/java/jadx/tests/api/SmaliTest.java index adada4db4c02bc875fdf70313b129ec6379bb4c5..79875d7c511ac0ff039092039593b59e84a0ddf4 100644 --- a/jadx-core/src/test/java/jadx/tests/api/SmaliTest.java +++ b/jadx-core/src/test/java/jadx/tests/api/SmaliTest.java @@ -91,10 +91,10 @@ public abstract class SmaliTest extends IntegrationTest { private static boolean compileSmali(File output, List inputFiles) { try { - SmaliOptions params = new SmaliOptions(); - params.outputDexFile = output.getAbsolutePath(); + SmaliOptions options = new SmaliOptions(); + options.outputDexFile = output.getAbsolutePath(); List inputFileNames = inputFiles.stream().map(File::getAbsolutePath).collect(Collectors.toList()); - Smali.assemble(params, inputFileNames); + Smali.assemble(options, inputFileNames); } catch (Exception e) { throw new AssertionError("Smali assemble error", e); } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java index c89d7a51f558ec931f89ef92db7bc00698c8f67b..c34f542b7be31e98a965b19cdfc9c673c99a766c 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -197,7 +197,7 @@ public class MainWindow extends JFrame { public void openFileOrProject() { JFileChooser fileChooser = new JFileChooser(); fileChooser.setAcceptAllFileFilterUsed(true); - String[] exts = {JadxProject.PROJECT_EXTENSION, "apk", "dex", "jar", "class", "zip", "aar", "arsc"}; + String[] exts = {JadxProject.PROJECT_EXTENSION, "apk", "dex", "jar", "class", "zip", "aar", "arsc", "smali"}; String description = "supported files: " + Arrays.toString(exts).replace('[', '(').replace(']', ')'); fileChooser.setFileFilter(new FileNameExtensionFilter(description, exts)); fileChooser.setToolTipText(NLS.str("file.open_action"));