From e20853bbb045c7c0322186b60144916c9a15b98c Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 20 Jul 2023 17:20:07 -0400 Subject: [PATCH 1/2] perf: prefer the shifted resId vs expensive package calls --- .../main/java/brut/androlib/res/decoder/ResAttrDecoder.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResAttrDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResAttrDecoder.java index b30c347e01..8c45021222 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResAttrDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResAttrDecoder.java @@ -46,10 +46,8 @@ public String decodeFromResourceId(int attrResId) throws AndrolibException { if (attrResId != 0) { - ResID resId = new ResID(attrResId); - try { - ResResSpec resResSpec = mResTable.getResSpec(resId); + ResResSpec resResSpec = mResTable.getResSpec(attrResId); if (resResSpec != null) { return resResSpec.getName(); } From 30eff9f1bff45601e33ccc3b280900097aa3a783 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 20 Jul 2023 17:20:20 -0400 Subject: [PATCH 2/2] fix: only lookup values if reference/value --- .../brut/androlib/res/decoder/AXmlResourceParser.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java index c83eb6d518..a335db2349 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java @@ -387,7 +387,14 @@ public String getAttributeValue(int index) { if (mAttrDecoder != null) { try { String stringBlockValue = valueRaw == -1 ? null : ResXmlEncoders.escapeXmlChars(mStringBlock.getString(valueRaw)); - String resourceMapValue = mAttrDecoder.decodeFromResourceId(valueData); + String resourceMapValue = null; + + // Ensure we only track down obfuscated values for reference/attribute type values. Otherwise we might + // spam lookups against resource table for invalid ids. + if (valueType == TypedValue.TYPE_REFERENCE || valueType == TypedValue.TYPE_DYNAMIC_REFERENCE || + valueType == TypedValue.TYPE_ATTRIBUTE || valueType == TypedValue.TYPE_DYNAMIC_ATTRIBUTE) { + resourceMapValue = mAttrDecoder.decodeFromResourceId(valueData); + } String value = stringBlockValue; if (stringBlockValue != null && resourceMapValue != null) {