From a8f6e40c024c8e819e07e6cd71e31cb3746db3ab Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Mon, 12 Aug 2013 12:28:01 -0500 Subject: [PATCH] update SmaliDecoder to handle jobs / odex files --- .../java/brut/androlib/src/SmaliDecoder.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/src/SmaliDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/src/SmaliDecoder.java index 6f6fe51a..b7a7f6f1 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/src/SmaliDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/src/SmaliDecoder.java @@ -17,10 +17,14 @@ package brut.androlib.src; import brut.androlib.AndrolibException; +import com.google.common.collect.Lists; import org.jf.baksmali.baksmali; import org.jf.baksmali.baksmaliOptions; import org.jf.dexlib2.DexFileFactory; 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.BufferedWriter; @@ -32,6 +36,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; +import java.util.List; /** * @author Ryszard Wiśniewski @@ -67,13 +72,34 @@ public class SmaliDecoder { options.useSequentialLabels = true; options.outputDebugInfo = mBakDeb; options.addCodeOffsets = false; + options.jobs = -1; options.noAccessorComments = false; options.registerInfo = (mDebug ? baksmaliOptions.DIFFPRE : 0); options.ignoreErrors = false; options.inlineResolver = null; 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) { Files.walkFileTree(mOutDir, new SmaliFileVisitor());