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