From 22e85fc3ff3d85e8a30fc42438ccb942fc5d80df Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sun, 16 Oct 2016 13:43:34 -0700 Subject: [PATCH] Add a --classes option for disassemble/deodex commands --- .../src/main/java/org/jf/baksmali/Baksmali.java | 16 ++++++++++++++++ .../java/org/jf/baksmali/DisassembleCommand.java | 7 ++++++- 2 files changed, 22 insertions(+), 1 deletion(-) 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 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> tasks = Lists.newArrayList(); + Set classSet = null; + if (classes != null) { + classSet = new HashSet(classes); + } + for (final ClassDef classDef: classDefs) { + if (classSet != null && !classSet.contains(classDef.getType())) { + continue; + } tasks.add(executor.submit(new Callable() { @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 classes = null; + public DisassembleCommand(@Nonnull List 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); } }