From 6ac7712f220b5871f0ab8a9e2167b18f2f7c1b5b Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sun, 10 Sep 2023 18:52:22 -0400 Subject: [PATCH] fix: prefer res name instead of "guessing" based on ids --- .../brut/androlib/res/data/ResTypeSpec.java | 6 ++- .../res/data/value/ResArrayValue.java | 2 - .../res/data/value/ResPluralsValue.java | 1 - .../res/data/value/ResValueFactory.java | 40 +++++++------------ 4 files changed, 19 insertions(+), 30 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java index 72a97d508d..f1b0cd243d 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java @@ -23,9 +23,11 @@ public final class ResTypeSpec { public static final String RES_TYPE_NAME_ARRAY = "array"; + public static final String RES_TYPE_NAME_ATTR = "attr"; + public static final String RES_TYPE_NAME_ATTR_PRIVATE = "^attr-private"; public static final String RES_TYPE_NAME_PLURALS = "plurals"; + public static final String RES_TYPE_NAME_STRING = "string"; public static final String RES_TYPE_NAME_STYLES = "style"; - public static final String RES_TYPE_NAME_ATTR = "attr"; private final String mName; private final Map mResSpecs = new LinkedHashMap<>(); @@ -46,7 +48,7 @@ public int getId() { } public boolean isString() { - return mName.equalsIgnoreCase("string"); + return mName.equalsIgnoreCase(RES_TYPE_NAME_STRING); } public ResResSpec getResSpec(String name) throws AndrolibException { diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResArrayValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResArrayValue.java index 732d2e2d72..2b1e2046b3 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResArrayValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResArrayValue.java @@ -91,6 +91,4 @@ public String getType() throws AndrolibException { private final ResScalarValue[] mItems; private final String[] AllowedArrayTypes = {"string", "integer"}; - - public static final int BAG_KEY_ARRAY_START = 0x02000000; } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java index 50b3cda516..3be81bdd12 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java @@ -59,6 +59,5 @@ public void serializeToResValuesXml(XmlSerializer serializer, private final ResScalarValue[] mItems; public static final int BAG_KEY_PLURALS_START = 0x01000004; - public static final int BAG_KEY_PLURALS_END = 0x01000009; private static final String[] QUANTITY_MAP = new String[] { "other", "zero", "one", "two", "few", "many" }; } 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 99e6811c65..052621e0f4 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 @@ -80,39 +80,29 @@ public ResIntBasedValue factory(String value, int rawValue) { return new ResStringValue(value, rawValue); } - public ResBagValue bagFactory(int parent, Duo[] items, ResTypeSpec resTypeSpec) throws AndrolibException { + public ResBagValue bagFactory(int parent, Duo[] items, ResTypeSpec resTypeSpec) + throws AndrolibException { ResReferenceValue parentVal = newReference(parent, null); if (items.length == 0) { return new ResBagValue(parentVal); } - int key = items[0].m1; - if (key == ResAttr.BAG_KEY_ATTR_TYPE) { - return ResAttr.factory(parentVal, items, this, mPackage); - } - String resTypeName = resTypeSpec.getName(); - // Android O Preview added an unknown enum for c. This is hardcoded as 0 for now. - if (ResTypeSpec.RES_TYPE_NAME_ARRAY.equals(resTypeName) - || key == ResArrayValue.BAG_KEY_ARRAY_START || key == 0) { - return new ResArrayValue(parentVal, items); - } - - if (ResTypeSpec.RES_TYPE_NAME_PLURALS.equals(resTypeName) || - (key >= ResPluralsValue.BAG_KEY_PLURALS_START && key <= ResPluralsValue.BAG_KEY_PLURALS_END)) { - return new ResPluralsValue(parentVal, items); - } - - if (ResTypeSpec.RES_TYPE_NAME_ATTR.equals(resTypeName)) { - return new ResAttr(parentVal, 0, null, null, null); - } - - if (resTypeName.startsWith(ResTypeSpec.RES_TYPE_NAME_STYLES)) { - return new ResStyleValue(parentVal, items, this); + switch (resTypeName) { + case ResTypeSpec.RES_TYPE_NAME_ATTR: + case ResTypeSpec.RES_TYPE_NAME_ATTR_PRIVATE: + return ResAttr.factory(parentVal, items, this, mPackage); + case ResTypeSpec.RES_TYPE_NAME_ARRAY: + return new ResArrayValue(parentVal, items); + case ResTypeSpec.RES_TYPE_NAME_PLURALS: + return new ResPluralsValue(parentVal, items); + default: + if (resTypeName.startsWith(ResTypeSpec.RES_TYPE_NAME_STYLES)) { + return new ResStyleValue(parentVal, items, this); + } + throw new AndrolibException("unsupported res type name for bags. Found: " + resTypeName); } - - throw new AndrolibException("unsupported res type name for bags. Found: " + resTypeName); } public ResReferenceValue newReference(int resID, String rawValue) {