From af65dea3194ce50547c255ae833b722f1610be5b Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Tue, 17 Feb 2015 11:48:39 -0600 Subject: [PATCH 1/6] Initial support for BCP47 tags - needs script/variant support - currently only region(s) supported --- .../androlib/res/decoder/ARSCDecoder.java | 22 +++++++++++++++++-- .../brut/androlib/BuildAndDecodeTest.java | 5 +++++ .../testapp/res/values-ast-rES/strings.xml | 4 ++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-ast-rES/strings.xml diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java index 622e9c30..5f1372e4 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java @@ -256,8 +256,8 @@ public class ARSCDecoder { short mcc = mIn.readShort(); short mnc = mIn.readShort(); - char[] language = new char[] { (char) mIn.readByte(), (char) mIn.readByte() }; - char[] country = new char[] { (char) mIn.readByte(), (char) mIn.readByte() }; + char[] language = this.unpackLanguageOrRegion(mIn.readByte(), mIn.readByte(), 'a'); + char[] country = this.unpackLanguageOrRegion(mIn.readByte(), mIn.readByte(), '0'); byte orientation = mIn.readByte(); byte touchscreen = mIn.readByte(); @@ -320,6 +320,24 @@ public class ARSCDecoder { screenHeightDp, isInvalid); } + private char[] unpackLanguageOrRegion(byte in0, byte in1, char base) throws AndrolibException { + if (in0 == 0 && in1 == 0) { + return new char[] {(char) in0, (char) in1}; + } else { + // check high bit, if so we have a packed 3 letter code + if (((in0 >> 7) & 1) == 1) { + int first = in1 & 0x1F; + int second = ((in1 & 0xE0) >> 5) + ((in0 & 0x03) << 3); + int third = (in0 & 0x7C) >> 2; + + // since this function handles languages & regions, we add the value(s) to the base char + // which is usually 'a' or '0' depending on language or region. + return new char[] { (char) (first + base), (char) (second + base), (char) (third + base) }; + } + return new char[] { (char) in0, (char) in1 }; + } + } + private void addMissingResSpecs() throws AndrolibException { int resId = mResId & 0xffff0000; 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 4ee4e694..dbac5bc8 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 @@ -182,6 +182,11 @@ public class BuildAndDecodeTest { compareValuesFiles("values-watch/strings.xml"); } + @Test + public void bcp47tagTest() throws BrutException, IOException { + compareValuesFiles("values-ast-rES/strings.xml"); + } + @Test public void drawableNoDpiTest() throws BrutException, IOException { compareResFolder("drawable-nodpi"); diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-ast-rES/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-ast-rES/strings.xml new file mode 100644 index 00000000..35eaf5ef --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-ast-rES/strings.xml @@ -0,0 +1,4 @@ + + + test1 + \ No newline at end of file From d40710005f1db36f322302aded4540672b84c17d Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 19 Feb 2015 09:05:00 -0600 Subject: [PATCH 2/6] Handle BCP additional fields (script & variant) layoutDirection was being read in error. layoutDirection is read via bit shifting over screenLayout (byte 32, 33) The then removed layoutDirection freed up 2 bytes. This gave us 12 bytes of unknown space from byte 36 to 48. This corresponded to localeScript[4] and localeVariant[8] Adding proper support for those bytes fixed BCP support --- .../androlib/res/decoder/ARSCDecoder.java | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java index 5f1372e4..57caf4ad 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java @@ -291,9 +291,11 @@ public class ARSCDecoder { screenHeightDp = mIn.readShort(); } - short layoutDirection = 0; - if (size >= 38) { - layoutDirection = mIn.readShort(); + char[] localeScript = {'\00'}; + char[] localeVariant = {'\00'}; + if (size >= 48) { + localeScript = this.readScriptOrVariantChar(4).toCharArray(); + localeVariant = this.readScriptOrVariantChar(8).toCharArray(); } int exceedingSize = size - KNOWN_CONFIG_BYTES; @@ -313,29 +315,40 @@ public class ARSCDecoder { } } - return new ResConfigFlags(mcc, mnc, language, country, layoutDirection, + return new ResConfigFlags(mcc, mnc, language, country, orientation, touchscreen, density, keyboard, navigation, inputFlags, screenWidth, screenHeight, sdkVersion, screenLayout, uiMode, smallestScreenWidthDp, screenWidthDp, - screenHeightDp, isInvalid); + screenHeightDp, localeScript, localeVariant, isInvalid); } private char[] unpackLanguageOrRegion(byte in0, byte in1, char base) throws AndrolibException { - if (in0 == 0 && in1 == 0) { - return new char[] {(char) in0, (char) in1}; - } else { - // check high bit, if so we have a packed 3 letter code - if (((in0 >> 7) & 1) == 1) { - int first = in1 & 0x1F; - int second = ((in1 & 0xE0) >> 5) + ((in0 & 0x03) << 3); - int third = (in0 & 0x7C) >> 2; + // check high bit, if so we have a packed 3 letter code + if (((in0 >> 7) & 1) == 1) { + int first = in1 & 0x1F; + int second = ((in1 & 0xE0) >> 5) + ((in0 & 0x03) << 3); + int third = (in0 & 0x7C) >> 2; - // since this function handles languages & regions, we add the value(s) to the base char - // which is usually 'a' or '0' depending on language or region. - return new char[] { (char) (first + base), (char) (second + base), (char) (third + base) }; - } - return new char[] { (char) in0, (char) in1 }; + // since this function handles languages & regions, we add the value(s) to the base char + // which is usually 'a' or '0' depending on language or region. + return new char[] { (char) (first + base), (char) (second + base), (char) (third + base) }; } + return new char[] { (char) in0, (char) in1 }; + } + + private String readScriptOrVariantChar(int length) throws AndrolibException, IOException { + StringBuilder string = new StringBuilder(16); + + while(length-- != 0) { + short ch = mIn.readByte(); + if (ch == 0) { + break; + } + string.append((char) ch); + } + mIn.skipBytes(length); + + return string.toString(); } private void addMissingResSpecs() throws AndrolibException { @@ -434,7 +447,7 @@ public class ARSCDecoder { } private static final Logger LOGGER = Logger.getLogger(ARSCDecoder.class.getName()); - private static final int KNOWN_CONFIG_BYTES = 38; + private static final int KNOWN_CONFIG_BYTES = 48; public static class ARSCData { From db38c217ae782993018093ce40bbe58ea98706f3 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 19 Feb 2015 09:06:08 -0600 Subject: [PATCH 3/6] Update ResConfigFlags for BCP - renamed country to region to match AOSP - added support for values-xxx-rXX - added support for BCP47 - default to BCP47 for values-xxx --- .../androlib/res/data/ResConfigFlags.java | 77 +++++++++++++++---- 1 file changed, 62 insertions(+), 15 deletions(-) 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 05986ae6..6d7b1ff9 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 @@ -16,6 +16,7 @@ package brut.androlib.res.data; +import javax.security.auth.callback.CallbackHandler; import java.util.logging.Logger; /** @@ -26,9 +27,7 @@ public class ResConfigFlags { public final short mnc; public final char[] language; - public final char[] country; - - public final short layoutDirection; + public final char[] region; public final byte orientation; public final byte touchscreen; @@ -50,6 +49,9 @@ public class ResConfigFlags { public final short screenWidthDp; public final short screenHeightDp; + private final char[] localeScript; + private final char[] localeVariant; + public final boolean isInvalid; private final String mQualifiers; @@ -58,8 +60,7 @@ public class ResConfigFlags { mcc = 0; mnc = 0; language = new char[] { '\00', '\00' }; - country = new char[] { '\00', '\00' }; - layoutDirection = SCREENLAYOUT_LAYOUTDIR_ANY; + region = new char[] { '\00', '\00' }; orientation = ORIENTATION_ANY; touchscreen = TOUCHSCREEN_ANY; density = DENSITY_DEFAULT; @@ -74,17 +75,20 @@ public class ResConfigFlags { smallestScreenWidthDp = 0; screenWidthDp = 0; screenHeightDp = 0; + localeScript = new char[] { '\00', '\00', '\00', '\00' }; + localeVariant = new char[] { '\00', '\00', '\00', '\00', '\00', '\00', '\00', '\00' }; isInvalid = false; mQualifiers = ""; } public ResConfigFlags(short mcc, short mnc, char[] language, - char[] country, short layoutDirection, byte orientation, + char[] region, byte orientation, byte touchscreen, int density, byte keyboard, byte navigation, byte inputFlags, short screenWidth, short screenHeight, short sdkVersion, byte screenLayout, byte uiMode, short smallestScreenWidthDp, short screenWidthDp, - short screenHeightDp, boolean isInvalid) { + short screenHeightDp, char[] localeScript, char[] localeVariant, + boolean isInvalid) { if (orientation < 0 || orientation > 3) { LOGGER.warning("Invalid orientation value: " + orientation); orientation = 0; @@ -114,8 +118,7 @@ public class ResConfigFlags { this.mcc = mcc; this.mnc = mnc; this.language = language; - this.country = country; - this.layoutDirection = layoutDirection; + this.region = region; this.orientation = orientation; this.touchscreen = touchscreen; this.density = density; @@ -130,6 +133,8 @@ public class ResConfigFlags { this.smallestScreenWidthDp = smallestScreenWidthDp; this.screenWidthDp = screenWidthDp; this.screenHeightDp = screenHeightDp; + this.localeScript = localeScript; + this.localeVariant = localeVariant; this.isInvalid = isInvalid; mQualifiers = generateQualifiers(); } @@ -155,12 +160,8 @@ public class ResConfigFlags { ret.append("-mnc00"); } } - if (language[0] != '\00') { - ret.append('-').append(language); - if (country[0] != '\00') { - ret.append("-r").append(country); - } - } + ret.append(getLocaleString()); + switch (screenLayout & MASK_LAYOUTDIR) { case SCREENLAYOUT_LAYOUTDIR_RTL: ret.append("-ldrtl"); @@ -369,6 +370,52 @@ public class ResConfigFlags { return 0; } + private String getLocaleString() { + StringBuilder sb = new StringBuilder(); + + // check for old style non BCP47 tags + // allows values-xx-rXX, values-xx, values-xxx-rXX + // denies values-xxx, anything else + if (language[0] != '\00' && localeScript.length == 0 && localeVariant.length == 0 && + (region.length != 3 && language.length != 3) || + (language.length == 3 && region.length == 2 && region[0] != '\00')) { + sb.append("-").append(language); + if (region[0] != '\00') { + sb.append("-r").append(region); + } + } else { // BCP47 + if (language[0] == '\00' && region[0] == '\00') { + return sb.toString(); // early return, no language or region + } + sb.append("-b+"); + if (language[0] != '\00') { + sb.append(language); + } + if (localeScript.length == 4 && region.length == 2) { + sb.append("+").append(localeScript).append("+").append(region); + } + if (region.length == 3) { + sb.append("+").append(region); + } + if (localeVariant.length >= 5) { + if (region.length == 2) { + sb.append("+").append(region); + } + sb.append("+").append(toUpper(localeVariant)); + } + } + return sb.toString(); + } + + private String toUpper(char[] character) { + StringBuilder sb = new StringBuilder(); + for (char ch: character) { + sb.append(Character.toUpperCase(ch)); + } + return sb.toString(); + } + + @Override public String toString() { return !getQualifiers().equals("") ? getQualifiers() : "[DEFAULT]"; From 505790fcfe54bf7893a7b0011fd9c7692394305e Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 19 Feb 2015 09:06:44 -0600 Subject: [PATCH 4/6] First Pass of BCP47 tests - variant test - script test - 3 char packed test - alone LTR test --- .../brut/androlib/BuildAndDecodeTest.java | 27 ++++++++++++++++++- .../testapp/res/values-b+ast/strings.xml | 4 +++ .../res/values-b+en+Latn+US/strings.xml | 4 +++ .../res/values-b+en+US+POSIX/strings.xml | 4 +++ .../testapp/res/values-b+eng+419/strings.xml | 4 +++ .../testapp/res/values-ldrtl/strings.xml | 4 +++ 6 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+ast/strings.xml create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+en+Latn+US/strings.xml create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+en+US+POSIX/strings.xml create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+eng+419/strings.xml create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-ldrtl/strings.xml 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 dbac5bc8..1d430c17 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 @@ -183,10 +183,35 @@ public class BuildAndDecodeTest { } @Test - public void bcp47tagTest() throws BrutException, IOException { + public void packed3CharsTest() throws BrutException, IOException { compareValuesFiles("values-ast-rES/strings.xml"); } + @Test + public void rightToLeftTest() throws BrutException, IOException { + compareValuesFiles("values-ldrtl/strings.xml"); + } + + @Test + public void scriptBcp47Test() throws BrutException, IOException { + compareValuesFiles("values-b+en+Latn+US/strings.xml"); + } + + @Test + public void threeLetterLangBcp47Test() throws BrutException, IOException { + compareValuesFiles("values-b+ast/strings.xml"); + } + + @Test + public void variantBcp47Test() throws BrutException, IOException { + compareValuesFiles("values-b+en+US+POSIX/strings.xml"); + } + + @Test + public void numericalRegionBcp47Test() throws BrutException, IOException { + compareValuesFiles("values-b+eng+419/strings.xml"); + } + @Test public void drawableNoDpiTest() throws BrutException, IOException { compareResFolder("drawable-nodpi"); diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+ast/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+ast/strings.xml new file mode 100644 index 00000000..35eaf5ef --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+ast/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-b+en+Latn+US/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+en+Latn+US/strings.xml new file mode 100644 index 00000000..35eaf5ef --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+en+Latn+US/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-b+en+US+POSIX/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+en+US+POSIX/strings.xml new file mode 100644 index 00000000..35eaf5ef --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+en+US+POSIX/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-b+eng+419/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+eng+419/strings.xml new file mode 100644 index 00000000..35eaf5ef --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+eng+419/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-ldrtl/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-ldrtl/strings.xml new file mode 100644 index 00000000..35eaf5ef --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-ldrtl/strings.xml @@ -0,0 +1,4 @@ + + + test1 + \ No newline at end of file From da347b22ba3df2cbcae09c22e515324fa79f3663 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 19 Feb 2015 11:37:51 -0600 Subject: [PATCH 5/6] [skip] remove unused import --- .../src/main/java/brut/androlib/res/data/ResConfigFlags.java | 1 - 1 file changed, 1 deletion(-) 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 6d7b1ff9..54167936 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 @@ -16,7 +16,6 @@ package brut.androlib.res.data; -import javax.security.auth.callback.CallbackHandler; import java.util.logging.Logger; /** From dc02abcf5123ae7bddc23c0d76ac3f8b924799a6 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sat, 21 Feb 2015 16:48:48 -0600 Subject: [PATCH 6/6] Add support for more BCP combinations - region, variant, script & language combined - 2 char language, 2 char region - 2 char lang, 4 char script, 3 char variant --- .../brut/androlib/res/data/ResConfigFlags.java | 13 ++++++------- .../java/brut/androlib/BuildAndDecodeTest.java | 15 +++++++++++++++ .../res/values-b+ast+Latn+IT+AREVELA/strings.xml | 4 ++++ .../testapp/res/values-b+en+Latn+419/strings.xml | 4 ++++ .../apktool/testapp/res/values-en-rUS/strings.xml | 4 ++++ 5 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+ast+Latn+IT+AREVELA/strings.xml create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+en+Latn+419/strings.xml create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-en-rUS/strings.xml 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 54167936..a56ec464 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 @@ -377,7 +377,9 @@ public class ResConfigFlags { // denies values-xxx, anything else if (language[0] != '\00' && localeScript.length == 0 && localeVariant.length == 0 && (region.length != 3 && language.length != 3) || - (language.length == 3 && region.length == 2 && region[0] != '\00')) { + (language.length == 3 && region.length == 2 && region[0] != '\00' && + localeScript.length == 0 && localeVariant.length == 0)) { + sb.append("-").append(language); if (region[0] != '\00') { sb.append("-r").append(region); @@ -390,16 +392,13 @@ public class ResConfigFlags { if (language[0] != '\00') { sb.append(language); } - if (localeScript.length == 4 && region.length == 2) { - sb.append("+").append(localeScript).append("+").append(region); + if (localeScript.length == 4) { + sb.append("+").append(localeScript); } - if (region.length == 3) { + if ((region.length == 2 || region.length == 3) && region[0] != '\00') { sb.append("+").append(region); } if (localeVariant.length >= 5) { - if (region.length == 2) { - sb.append("+").append(region); - } sb.append("+").append(toUpper(localeVariant)); } } 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 1d430c17..11f7c10a 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 @@ -202,11 +202,26 @@ public class BuildAndDecodeTest { compareValuesFiles("values-b+ast/strings.xml"); } + @Test + public void twoLetterLangBcp47Test() throws BrutException, IOException { + compareValuesFiles("values-en-rUS/strings.xml"); + } + @Test public void variantBcp47Test() throws BrutException, IOException { compareValuesFiles("values-b+en+US+POSIX/strings.xml"); } + @Test + public void fourpartBcp47Test() throws BrutException, IOException { + compareValuesFiles("values-b+ast+Latn+IT+AREVELA/strings.xml"); + } + + @Test + public void RegionLocaleBcp47Test() throws BrutException, IOException { + compareValuesFiles("values-b+en+Latn+419/strings.xml"); + } + @Test public void numericalRegionBcp47Test() throws BrutException, IOException { compareValuesFiles("values-b+eng+419/strings.xml"); diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+ast+Latn+IT+AREVELA/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+ast+Latn+IT+AREVELA/strings.xml new file mode 100644 index 00000000..35eaf5ef --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+ast+Latn+IT+AREVELA/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-b+en+Latn+419/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+en+Latn+419/strings.xml new file mode 100644 index 00000000..35eaf5ef --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-b+en+Latn+419/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-en-rUS/strings.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-en-rUS/strings.xml new file mode 100644 index 00000000..35eaf5ef --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-en-rUS/strings.xml @@ -0,0 +1,4 @@ + + + test1 + \ No newline at end of file