From 3ec4f360ab09782421e47d16f88a95dd7f7d2058 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 28 Sep 2017 08:23:02 -0400 Subject: [PATCH] Add support for shorthand SDK for bounding check - fixes #1630 --- .../src/main/java/brut/androlib/Androlib.java | 15 +--------- .../brut/androlib/res/AndrolibResources.java | 30 +++++++++++++++++-- .../brut/androlib/InvalidSdkBoundingTest.java | 12 ++++++++ 3 files changed, 40 insertions(+), 17 deletions(-) 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 0ca25a3f..5e055236 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 @@ -287,7 +287,7 @@ public class Androlib { if (meta.sdkInfo != null && meta.sdkInfo.get("minSdkVersion") != null) { String minSdkVersion = meta.sdkInfo.get("minSdkVersion"); - mMinSdkVersion = getMinSdkVersionFromAndroidCodename(meta, minSdkVersion); + mMinSdkVersion = mAndRes.getMinSdkVersionFromAndroidCodename(meta, minSdkVersion); } if (outFile == null) { @@ -728,19 +728,6 @@ public class Androlib { return files; } - private int getMinSdkVersionFromAndroidCodename(MetaInfo meta, String sdkVersion) { - switch (sdkVersion) { - case "M": - return ResConfigFlags.SDK_MNC; - case "N": - return ResConfigFlags.SDK_NOUGAT; - case "O": - return ResConfigFlags.SDK_OREO; - default: - return Integer.parseInt(meta.sdkInfo.get("minSdkVersion")); - } - } - private boolean isModified(File working, File stored) { return ! stored.exists() || BrutIO.recursiveModifiedTime(working) > BrutIO .recursiveModifiedTime(stored); } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java index 79e55f5b..9508db01 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java @@ -19,6 +19,7 @@ package brut.androlib.res; import brut.androlib.AndrolibException; import brut.androlib.ApkOptions; import brut.androlib.err.CantFindFrameworkResException; +import brut.androlib.meta.MetaInfo; import brut.androlib.meta.PackageInfo; import brut.androlib.meta.VersionInfo; import brut.androlib.res.data.*; @@ -308,9 +309,10 @@ final public class AndrolibResources { } public String checkTargetSdkVersionBounds() { - int target = Integer.parseInt(mTargetSdkVersion); - int min = (mMinSdkVersion != null) ? Integer.parseInt(mMinSdkVersion) : 0; - int max = (mMaxSdkVersion != null) ? Integer.parseInt(mMaxSdkVersion) : target; + int target = mapSdkShorthandToVersion(mTargetSdkVersion); + + int min = (mMinSdkVersion != null) ? mapSdkShorthandToVersion(mMinSdkVersion) : 0; + int max = (mMaxSdkVersion != null) ? mapSdkShorthandToVersion(mMaxSdkVersion) : target; target = Math.min(max, target); target = Math.max(min, target); @@ -455,6 +457,28 @@ final public class AndrolibResources { } } + public int getMinSdkVersionFromAndroidCodename(MetaInfo meta, String sdkVersion) { + int sdkNumber = mapSdkShorthandToVersion(sdkVersion); + + if (sdkNumber == ResConfigFlags.SDK_BASE) { + return Integer.parseInt(meta.sdkInfo.get("minSdkVersion")); + } + return sdkNumber; + } + + private int mapSdkShorthandToVersion(String sdkVersion) { + switch (sdkVersion) { + case "M": + return ResConfigFlags.SDK_MNC; + case "N": + return ResConfigFlags.SDK_NOUGAT; + case "O": + return ResConfigFlags.SDK_OREO; + default: + return Integer.parseInt(sdkVersion); + } + } + public boolean detectWhetherAppIsFramework(File appDir) throws AndrolibException { File publicXml = new File(appDir, "res/values/public.xml"); diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/InvalidSdkBoundingTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/InvalidSdkBoundingTest.java index 87100dae..e2562ae9 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/InvalidSdkBoundingTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/InvalidSdkBoundingTest.java @@ -75,4 +75,16 @@ public class InvalidSdkBoundingTest { androlibResources.setSdkInfo(sdkInfo); assertEquals("25", androlibResources.checkTargetSdkVersionBounds()); } + + + @Test + public void checkForShortHandSdkTag() throws BrutException, IOException { + AndrolibResources androlibResources = new AndrolibResources(); + + Map sdkInfo = new LinkedHashMap<>(); + sdkInfo.put("targetSdkVersion", "O"); + + androlibResources.setSdkInfo(sdkInfo); + assertEquals("26", androlibResources.checkTargetSdkVersionBounds()); + } } \ No newline at end of file