aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gruver <bgruv@google.com>2016-10-16 13:43:34 -0700
committerBen Gruver <bgruv@google.com>2016-10-16 13:43:34 -0700
commit22e85fc3ff3d85e8a30fc42438ccb942fc5d80df (patch)
treef8396deb36c62f5ff4c8b948d603797721b68737
parent43669ecc6e3f5d95ef1653fb7ba0c0445040fd3c (diff)
downloadsmali-22e85fc3ff3d85e8a30fc42438ccb942fc5d80df.tar.gz
Add a --classes option for disassemble/deodex commands
-rw-r--r--baksmali/src/main/java/org/jf/baksmali/Baksmali.java16
-rw-r--r--baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java7
2 files changed, 22 insertions, 1 deletions
diff --git a/baksmali/src/main/java/org/jf/baksmali/Baksmali.java b/baksmali/src/main/java/org/jf/baksmali/Baksmali.java
index a2fc4112..1c0231b5 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Baksmali.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Baksmali.java
@@ -36,12 +36,20 @@ import org.jf.dexlib2.iface.DexFile;
import org.jf.util.ClassFileNameHandler;
import org.jf.util.IndentingWriter;
+import javax.annotation.Nullable;
import java.io.*;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.*;
public class Baksmali {
public static boolean disassembleDexFile(DexFile dexFile, File outputDir, int jobs, final BaksmaliOptions options) {
+ return disassembleDexFile(dexFile, outputDir, jobs, options, null);
+ }
+
+ public static boolean disassembleDexFile(DexFile dexFile, File outputDir, int jobs, final BaksmaliOptions options,
+ @Nullable List<String> classes) {
//sort the classes, so that if we're on a case-insensitive file system and need to handle classes with file
//name collisions, then we'll use the same name for each class, if the dex file goes through multiple
@@ -54,7 +62,15 @@ public class Baksmali {
ExecutorService executor = Executors.newFixedThreadPool(jobs);
List<Future<Boolean>> tasks = Lists.newArrayList();
+ Set<String> classSet = null;
+ if (classes != null) {
+ classSet = new HashSet<String>(classes);
+ }
+
for (final ClassDef classDef: classDefs) {
+ if (classSet != null && !classSet.contains(classDef.getType())) {
+ continue;
+ }
tasks.add(executor.submit(new Callable<Boolean>() {
@Override public Boolean call() throws Exception {
return disassembleClass(classDef, fileNameHandler, options);
diff --git a/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java b/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java
index 1ce49523..06d7c967 100644
--- a/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java
+++ b/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java
@@ -133,6 +133,11 @@ public class DisassembleCommand extends DexInputCommand {
"fields from the current class.")
private boolean implicitReferences = false;
+ @Parameter(names = "--classes",
+ description = "A comma separated list of classes. Only disassemble these classes")
+ @ExtendedParameter(argumentNames = "classes")
+ private List<String> classes = null;
+
public DisassembleCommand(@Nonnull List<JCommander> commandAncestors) {
super(commandAncestors);
}
@@ -170,7 +175,7 @@ public class DisassembleCommand extends DexInputCommand {
analysisArguments.classPathDirectories = Lists.newArrayList(inputFile.getAbsoluteFile().getParent());
}
- if (!Baksmali.disassembleDexFile(dexFile, outputDirectoryFile, jobs, getOptions())) {
+ if (!Baksmali.disassembleDexFile(dexFile, outputDirectoryFile, jobs, getOptions(), classes)) {
System.exit(-1);
}
}