diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLI.java b/jadx-cli/src/main/java/jadx/cli/JadxCLI.java index 94cb4719d..fb0882f65 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLI.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLI.java @@ -66,8 +66,14 @@ public class JadxCLI { private static boolean checkForErrors(JadxDecompiler jadx) { if (jadx.getRoot().getClasses().isEmpty()) { - LOG.error("Load failed! No classes for decompile!"); - return true; + if (jadx.getArgs().isSkipResources()) { + LOG.error("Load failed! No classes for decompile!"); + return true; + } + if (!jadx.getArgs().isSkipSources()) { + LOG.warn("No classes to decompile; decoding resources only"); + jadx.getArgs().setSkipSources(true); + } } if (jadx.getErrorsCount() > 0) { LOG.error("Load with errors! Check log for details"); diff --git a/jadx-cli/src/test/java/jadx/cli/TestInput.java b/jadx-cli/src/test/java/jadx/cli/TestInput.java index 31eed72d3..22f180203 100644 --- a/jadx-cli/src/test/java/jadx/cli/TestInput.java +++ b/jadx-cli/src/test/java/jadx/cli/TestInput.java @@ -44,6 +44,33 @@ public class TestInput { decompile("multi", "samples/hello.dex", "samples/HelloWorld.smali"); } + @Test + public void testResourceOnly() throws Exception { + decode("resourceOnly", "samples/resources-only.apk"); + } + + private void decode(String tmpDirName, String apkSample) throws URISyntaxException, IOException { + List args = new ArrayList<>(); + Path tempDir = FileUtils.createTempDir(tmpDirName); + args.add("-v"); + args.add("-d"); + args.add(tempDir.toAbsolutePath().toString()); + + URL resource = getClass().getClassLoader().getResource(apkSample); + assertThat(resource).isNotNull(); + String sampleFile = resource.toURI().getRawPath(); + args.add(sampleFile); + + int result = JadxCLI.execute(args.toArray(new String[0])); + assertThat(result).isEqualTo(0); + List files = Files.find( + tempDir, + 3, + (file, attr) -> file.getFileName().toString().equalsIgnoreCase("AndroidManifest.xml")) + .collect(Collectors.toList()); + assertThat(files.isEmpty()).isFalse(); + } + private void decompile(String tmpDirName, String... inputSamples) throws URISyntaxException, IOException { List args = new ArrayList<>(); Path tempDir = FileUtils.createTempDir(tmpDirName); diff --git a/jadx-cli/src/test/resources/samples/resources-only.apk b/jadx-cli/src/test/resources/samples/resources-only.apk new file mode 100644 index 000000000..abf006845 Binary files /dev/null and b/jadx-cli/src/test/resources/samples/resources-only.apk differ