update SmaliDecoder to handle jobs / odex files

This commit is contained in:
Connor Tumbleson 2013-08-12 12:28:01 -05:00
parent 1de4525534
commit a8f6e40c02

View File

@ -17,10 +17,14 @@
package brut.androlib.src; package brut.androlib.src;
import brut.androlib.AndrolibException; import brut.androlib.AndrolibException;
import com.google.common.collect.Lists;
import org.jf.baksmali.baksmali; import org.jf.baksmali.baksmali;
import org.jf.baksmali.baksmaliOptions; import org.jf.baksmali.baksmaliOptions;
import org.jf.dexlib2.DexFileFactory; import org.jf.dexlib2.DexFileFactory;
import org.jf.dexlib2.analysis.ClassPath; import org.jf.dexlib2.analysis.ClassPath;
import org.jf.dexlib2.dexbacked.DexBackedDexFile;
import org.jf.dexlib2.dexbacked.DexBackedOdexFile;
import org.jf.dexlib2.analysis.InlineMethodResolver;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.BufferedWriter; import java.io.BufferedWriter;
@ -32,6 +36,7 @@ import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor; import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;
/** /**
* @author Ryszard Wiśniewski <brut.alll@gmail.com> * @author Ryszard Wiśniewski <brut.alll@gmail.com>
@ -67,13 +72,34 @@ public class SmaliDecoder {
options.useSequentialLabels = true; options.useSequentialLabels = true;
options.outputDebugInfo = mBakDeb; options.outputDebugInfo = mBakDeb;
options.addCodeOffsets = false; options.addCodeOffsets = false;
options.jobs = -1;
options.noAccessorComments = false; options.noAccessorComments = false;
options.registerInfo = (mDebug ? baksmaliOptions.DIFFPRE : 0); options.registerInfo = (mDebug ? baksmaliOptions.DIFFPRE : 0);
options.ignoreErrors = false; options.ignoreErrors = false;
options.inlineResolver = null; options.inlineResolver = null;
options.checkPackagePrivateAccess = false; options.checkPackagePrivateAccess = false;
baksmali.disassembleDexFile(DexFileFactory.loadDexFile(mApkFile, mApi), options); // set jobs automatically
if (options.jobs <= 0) {
options.jobs = Runtime.getRuntime().availableProcessors();
if (options.jobs > 6) {
options.jobs = 6;
}
}
// create the dex
DexBackedDexFile dexFile = DexFileFactory.loadDexFile(mApkFile, mApi);
if (dexFile.isOdexFile()) {
throw new AndrolibException("Warning: You are disassembling an odex file without deodexing it.");
}
if (options.inlineResolver == null && dexFile instanceof DexBackedOdexFile) {
options.inlineResolver =
InlineMethodResolver.createInlineMethodResolver(((DexBackedOdexFile)dexFile).getOdexVersion());
}
baksmali.disassembleDexFile(dexFile,options);
if (mDebug) { if (mDebug) {
Files.walkFileTree(mOutDir, new SmaliFileVisitor()); Files.walkFileTree(mOutDir, new SmaliFileVisitor());