diff --git a/CHANGES b/CHANGES index cf1d628e..77c9419a 100644 --- a/CHANGES +++ b/CHANGES @@ -48,6 +48,8 @@ v2.0.0 (TBA) -Fixed (issue #664) - Fixed issue with apks with large StringPools failing to decode. -Fixed (issue #447) - Fixed bad cast of ResStringValue to ResAtr by handling ResStringValue correctly (Thanks whydoubt) -Fixed (issue #689) - Fixed issue with hard coding extension as PNG. +-Fixed (issue #653) - Added Android Lollipop support. +-Fixed (issue #706) - Added support for TYPE_DYNAMIC_REFERENCE. -Fixed issue with APKs with multiple dex files. -Fixed issue with using Apktool without smali/baksmali for ApktoolProperties (Thanks teprrr) -Fixed issue with non-URI standard characters in apk name (Thanks rover12421) diff --git a/brut.apktool/apktool-lib/src/main/java/android/util/TypedValue.java b/brut.apktool/apktool-lib/src/main/java/android/util/TypedValue.java index 3496aa40..2498e486 100644 --- a/brut.apktool/apktool-lib/src/main/java/android/util/TypedValue.java +++ b/brut.apktool/apktool-lib/src/main/java/android/util/TypedValue.java @@ -51,7 +51,11 @@ public class TypedValue { * container. */ public static final int TYPE_FRACTION = 0x06; - + /** + * The data holds a dynamic res table reference, which needs to be + * resolved before it can be used like TYPE_REFERENCE + */ + public static final int TYPE_DYNAMIC_REFERENCE = 0x07; /** * Identifies the start of plain integer values. Any type value from this to * {@link #TYPE_LAST_INT} means the data field holds a generic diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResConfigFlags.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResConfigFlags.java index c81db478..9a353372 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResConfigFlags.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResConfigFlags.java @@ -144,7 +144,12 @@ public class ResConfigFlags { ret.append("-mcc").append(String.format("%03d", mcc)); if (mcc != MNC_ZERO) { if (mnc != 0 && mnc != -1) { - ret.append("-mnc").append(mnc); + ret.append("-mnc"); + if (mnc > 0 && mnc < 10) { + ret.append(String.format("%02d", mnc)); + } else { + ret.append(String.format("%03d", mnc)); + } } } } @@ -265,6 +270,9 @@ public class ResConfigFlags { case DENSITY_XXXHIGH: ret.append("-xxxhdpi"); break; + case DENSITY_ANY: + ret.append("-anydpi"); + break; case DENSITY_NONE: ret.append("-nodpi"); break; @@ -344,6 +352,9 @@ public class ResConfigFlags { } private short getNaturalSdkVersionRequirement() { + if (density == DENSITY_ANY) { + return SDK_LOLLIPOP; + } if (smallestScreenWidthDp != 0 || screenWidthDp != 0 || screenHeightDp != 0) { return SDK_HONEYCOMB_MR2; } @@ -402,7 +413,8 @@ public class ResConfigFlags { public final static byte SDK_JELLY_BEAN = 16; public final static byte SDK_JELLY_BEAN_MR1 = 17; public final static byte SDK_JELLY_BEAN_MR2 = 18; - public final static byte KITKAT = 19; + public final static byte SDK_KITKAT = 19; + public final static byte SDK_LOLLIPOP = 21; public final static byte ORIENTATION_ANY = 0; public final static byte ORIENTATION_PORT = 1; @@ -423,6 +435,7 @@ public class ResConfigFlags { public final static int DENSITY_XHIGH = 320; public final static int DENSITY_XXHIGH = 480; public final static int DENSITY_XXXHIGH = 640; + public final static int DENSITY_ANY = 0xFFFE; public final static int DENSITY_NONE = 0xFFFF; public final static int MNC_ZERO = 0xFFFF; diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java index 0a1c4f82..fd877636 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java @@ -48,6 +48,8 @@ public class ResValueFactory { return new ResFractionValue(value, rawValue); case TypedValue.TYPE_INT_BOOLEAN: return new ResBoolValue(value != 0, rawValue); + case TypedValue.TYPE_DYNAMIC_REFERENCE: + return newReference(value, rawValue); } if (type >= TypedValue.TYPE_FIRST_COLOR_INT diff --git a/brut.apktool/apktool-lib/src/main/resources/brut/androlib/android-framework.jar b/brut.apktool/apktool-lib/src/main/resources/brut/androlib/android-framework.jar index df1aa9a4..eb309cf6 100644 Binary files a/brut.apktool/apktool-lib/src/main/resources/brut/androlib/android-framework.jar and b/brut.apktool/apktool-lib/src/main/resources/brut/androlib/android-framework.jar differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/linux/aapt b/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/linux/aapt index b85f6fbf..72a97ff6 100755 Binary files a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/linux/aapt and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/linux/aapt differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/macosx/aapt b/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/macosx/aapt old mode 100644 new mode 100755 index 0f2364d5..6f857129 Binary files a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/macosx/aapt and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/macosx/aapt differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/windows/aapt.exe b/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/windows/aapt.exe index a7d51611..bb9bf213 100755 Binary files a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/windows/aapt.exe and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/windows/aapt.exe differ diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java index e738e41f..6620cc7e 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java @@ -162,16 +162,31 @@ public class BuildAndDecodeTest { @Test public void qualifiersTest() throws BrutException { - compareValuesFiles("values-mcc004-mnc4-en-rUS-ldrtl-sw100dp-w200dp-h300dp" + compareValuesFiles("values-mcc004-mnc04-en-rUS-ldrtl-sw100dp-w200dp-h300dp" + "-xlarge-long-land-desk-night-xhdpi-finger-keyssoft-12key" + "-navhidden-dpad/strings.xml"); } + @Test + public void shortendedMncTest() throws BrutException { + compareValuesFiles("values-mcc001-mnc01/strings.xml"); + } + + @Test + public void anyDpiTest() throws BrutException, IOException { + compareValuesFiles("values-watch/strings.xml"); + } + @Test public void drawableNoDpiTest() throws BrutException, IOException { compareResFolder("drawable-nodpi"); } + @Test + public void drawableAnyDpiTest() throws BrutException, IOException { + compareResFolder("drawable-anydpi"); + } + @Test public void drawableNumberedDpiTest() throws BrutException, IOException { compareResFolder("drawable-534dpi"); @@ -202,6 +217,11 @@ public class BuildAndDecodeTest { compareResFolder("drawable-xxhdpi"); } + @Test + public void drawableXxxhdpiTest() throws BrutException, IOException { + compareResFolder("drawable-xxxhdpi"); + } + @Test public void resRawTest() throws BrutException, IOException { compareResFolder("raw"); diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-anydpi/ic_launcher.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-anydpi/ic_launcher.png new file mode 100644 index 00000000..96a442e5 Binary files /dev/null and b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-anydpi/ic_launcher.png differ diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxxhdpi/ic_launcher.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxxhdpi/ic_launcher.png new file mode 100644 index 00000000..96a442e5 Binary files /dev/null and b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxxhdpi/ic_launcher.png differ diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-mcc001-mnc01/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-mcc001-mnc01/strings.xml new file mode 100644 index 00000000..35eaf5ef --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-mcc001-mnc01/strings.xml @@ -0,0 +1,4 @@ + + + test1 + \ No newline at end of file diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-mcc004-mnc4-en-rUS-ldrtl-sw100dp-w200dp-h300dp-xlarge-long-land-desk-night-xhdpi-finger-keyssoft-12key-navhidden-dpad/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-mcc004-mnc04-en-rUS-ldrtl-sw100dp-w200dp-h300dp-xlarge-long-land-desk-night-xhdpi-finger-keyssoft-12key-navhidden-dpad/strings.xml similarity index 100% rename from brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-mcc004-mnc4-en-rUS-ldrtl-sw100dp-w200dp-h300dp-xlarge-long-land-desk-night-xhdpi-finger-keyssoft-12key-navhidden-dpad/strings.xml rename to brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-mcc004-mnc04-en-rUS-ldrtl-sw100dp-w200dp-h300dp-xlarge-long-land-desk-night-xhdpi-finger-keyssoft-12key-navhidden-dpad/strings.xml diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-watch/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-watch/strings.xml new file mode 100644 index 00000000..35eaf5ef --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-watch/strings.xml @@ -0,0 +1,4 @@ + + + test1 + \ No newline at end of file