diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java index b4ff0480..695e889c 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java @@ -66,13 +66,13 @@ public class Androlib { } public void decodeSourcesSmali(File apkFile, File outDir, boolean debug, String debugLinePrefix, - boolean bakdeb) throws AndrolibException { + boolean bakdeb, int api) throws AndrolibException { try { File smaliDir = new File(outDir, SMALI_DIRNAME); OS.rmdir(smaliDir); smaliDir.mkdirs(); LOGGER.info("Baksmaling..."); - SmaliDecoder.decode(apkFile, smaliDir, debug, debugLinePrefix, bakdeb); + SmaliDecoder.decode(apkFile, smaliDir, debug, debugLinePrefix, bakdeb, api); } catch (BrutException ex) { throw new AndrolibException(ex); } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java index a39e6dd6..29a8ab61 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java @@ -119,13 +119,16 @@ public class ApkDecoder { } } + Map sdkInfo = mAndrolib.getResTable(mApkFile).getSdkInfo(); + int api = (sdkInfo.get("targetSdkVersion") != null) ? Integer.parseInt(sdkInfo.get("targetSdkVersion")) : mDefaultApi; + if (hasSources()) { switch (mDecodeSources) { case DECODE_SOURCES_NONE: mAndrolib.decodeSourcesRaw(mApkFile, outDir, mDebug); break; case DECODE_SOURCES_SMALI: - mAndrolib.decodeSourcesSmali(mApkFile, outDir, mDebug, mDebugLinePrefix, mBakDeb); + mAndrolib.decodeSourcesSmali(mApkFile, outDir, mDebug, mDebugLinePrefix, mBakDeb, api); break; case DECODE_SOURCES_JAVA: mAndrolib.decodeSourcesJava(mApkFile, outDir, mDebug); @@ -350,6 +353,7 @@ public class ApkDecoder { private String mFrameTag; private boolean mKeepBrokenResources = false; private String mFrameworkDir = null; + private int mDefaultApi = 15; private boolean mBakDeb = true; private boolean mCompressResources = false; private boolean mAnalysisMode = false; 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 f8efaa95..d8c0b757 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 @@ -40,17 +40,18 @@ import java.nio.file.attribute.BasicFileAttributes; public class SmaliDecoder { public static void decode(File apkFile, File outDir, boolean debug, String debugLinePrefix, - boolean bakdeb) throws AndrolibException { - new SmaliDecoder(apkFile, outDir, debug, debugLinePrefix, bakdeb).decode(); + boolean bakdeb, int api) throws AndrolibException { + new SmaliDecoder(apkFile, outDir, debug, debugLinePrefix, bakdeb, api).decode(); } private SmaliDecoder(File apkFile, File outDir, boolean debug, String debugLinePrefix, - boolean bakdeb) { + boolean bakdeb, int api) { mApkFile = apkFile; mOutDir = outDir.toPath(); mDebug = debug; mDebugLinePrefix = debugLinePrefix; mBakDeb = bakdeb; + mApi = api; } private void decode() throws AndrolibException { @@ -73,7 +74,7 @@ public class SmaliDecoder { options.inlineResolver = null; options.checkPackagePrivateAccess = false; - baksmali.disassembleDexFile(DexFileFactory.loadDexFile(mApkFile, 0), options); + baksmali.disassembleDexFile(DexFileFactory.loadDexFile(mApkFile, mApi), options); if (mDebug) { Files.walkFileTree(mOutDir, new SmaliFileVisitor()); @@ -88,6 +89,7 @@ public class SmaliDecoder { private final boolean mDebug; private final String mDebugLinePrefix; private final boolean mBakDeb; + private final int mApi; private class SmaliFileVisitor extends SimpleFileVisitor {