From fb6cd883c03dbabc343fe0625217d84eebbc3e9a Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sun, 13 Aug 2023 13:46:47 -0400 Subject: [PATCH 1/4] refactor: split out string block vs res table string (#3267) --- .../res/decoder/AXmlResourceParser.java | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) 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 a22072b2..a2e01d40 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 @@ -407,28 +407,13 @@ public class AXmlResourceParser implements XmlResourceParser { String stringBlockValue = valueRaw == -1 ? null : ResXmlEncoders.escapeXmlChars(mStringBlock.getString(valueRaw)); String resourceMapValue = null; - // Ensure we only track down obfuscated values for reference/attribute type values. Otherwise we might + // 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 = decodeFromResourceId(valueData); } - String value = stringBlockValue; - - if (stringBlockValue != null && resourceMapValue != null) { - int slashPos = stringBlockValue.lastIndexOf("/"); - int colonPos = stringBlockValue.lastIndexOf(":"); - - // Handle a value with a format of "@yyy/xxx", but avoid "@yyy/zzz:xxx" - if (slashPos != -1) { - if (colonPos == -1) { - String type = stringBlockValue.substring(0, slashPos); - value = type + "/" + resourceMapValue; - } - } else if (! stringBlockValue.equals(resourceMapValue)) { - value = resourceMapValue; - } - } + String value = getPreferredString(stringBlockValue, resourceMapValue); // try to decode from resource table int attrResId = getAttributeNameResource(index); @@ -662,6 +647,26 @@ public class AXmlResourceParser implements XmlResourceParser { return -1; } + private static String getPreferredString(String stringBlockValue, String resourceMapValue) { + String value = stringBlockValue; + + if (stringBlockValue != null && resourceMapValue != null) { + int slashPos = stringBlockValue.lastIndexOf("/"); + int colonPos = stringBlockValue.lastIndexOf(":"); + + // Handle a value with a format of "@yyy/xxx", but avoid "@yyy/zzz:xxx" + if (slashPos != -1) { + if (colonPos == -1) { + String type = stringBlockValue.substring(0, slashPos); + value = type + "/" + resourceMapValue; + } + } else if (! stringBlockValue.equals(resourceMapValue)) { + value = resourceMapValue; + } + } + return value; + } + private void resetEventInfo() { mEvent = -1; mLineNumber = -1; From e99ed1ccbb96d56700417a7710292b3af64a494f Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sun, 13 Aug 2023 14:07:45 -0400 Subject: [PATCH 2/4] refactor: remove unused decodeManifest function (#3268) --- .../brut/androlib/res/decoder/ResFileDecoder.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResFileDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResFileDecoder.java index 75b7fc9e..9bab7c98 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResFileDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResFileDecoder.java @@ -157,18 +157,6 @@ public class ResFileDecoder { } } - public void decodeManifest(Directory inDir, String inFileName, - Directory outDir, String outFileName) throws AndrolibException { - try ( - InputStream in = inDir.getFileInput(inFileName); - OutputStream out = outDir.getFileOutput(outFileName) - ) { - ((XmlPullStreamDecoder) mDecoders.getDecoder("xml")).decodeManifest(in, out); - } catch (DirectoryException | IOException ex) { - throw new AndrolibException(ex); - } - } - private final static Logger LOGGER = Logger.getLogger(ResFileDecoder.class.getName()); private final static String[] RAW_IMAGE_EXTENSIONS = new String[] { From 225c9089d93f0249126456f0c112c46bfdb1c3ac Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sun, 13 Aug 2023 14:25:32 -0400 Subject: [PATCH 3/4] refactor: remove deprecations from test suite (#3269) --- .../src/test/java/brut/androlib/aapt1/SkipAssetTest.java | 4 ++-- .../test/java/brut/androlib/aapt2/BuildAndDecodeTest.java | 4 ---- .../src/test/java/brut/androlib/decode/AndResGuardTest.java | 2 +- .../src/test/java/brut/androlib/decode/DecodeArrayTest.java | 6 +----- .../test/java/brut/androlib/decode/DecodeKotlinTest.java | 2 +- .../test/java/brut/androlib/decode/DuplicateDexTest.java | 1 - .../test/java/brut/androlib/decode/ExternalEntityTest.java | 1 - 7 files changed, 5 insertions(+), 15 deletions(-) diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/SkipAssetTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/SkipAssetTest.java index e810c9f2..f6d02f3b 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/SkipAssetTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/SkipAssetTest.java @@ -77,13 +77,13 @@ public class SkipAssetTest extends BaseTest { checkFileDoesExist("assets" + File.separator + "ranges" + File.separator + "ranges.kotlin_builtins"); } - private void checkFileDoesNotExist(String path) throws BrutException { + private void checkFileDoesNotExist(String path) { File f = new File(sTestOrigDir, path); assertFalse(f.isFile()); } - private void checkFileDoesExist(String path) throws BrutException { + private void checkFileDoesExist(String path) { File f = new File(sTestOrigDir, path); assertTrue(f.isFile()); diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt2/BuildAndDecodeTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt2/BuildAndDecodeTest.java index 7e39ae3e..d5720829 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt2/BuildAndDecodeTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt2/BuildAndDecodeTest.java @@ -22,7 +22,6 @@ import brut.androlib.Config; import brut.common.BrutException; import brut.directory.ExtFile; import brut.util.OS; -import org.custommonkey.xmlunit.XMLUnit; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -34,10 +33,7 @@ import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; import java.io.File; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; import static org.junit.Assert.*; public class BuildAndDecodeTest extends BaseTest { diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/AndResGuardTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/AndResGuardTest.java index a349f71c..fe6d3dc3 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/AndResGuardTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/AndResGuardTest.java @@ -59,7 +59,7 @@ public class AndResGuardTest extends BaseTest { } @Test - public void checkifAndResDecodeRemapsRFolderInRawMode() throws BrutException, IOException { + public void checkIfAndResDecodeRemapsRFolderInRawMode() throws BrutException, IOException { Config config = Config.getDefaultConfig(); config.forceDelete = true; diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DecodeArrayTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DecodeArrayTest.java index 61faaac0..85e1505c 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DecodeArrayTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DecodeArrayTest.java @@ -16,7 +16,6 @@ */ package brut.androlib.decode; -import brut.androlib.ApkDecoder; import brut.androlib.BaseTest; import brut.androlib.Config; import brut.androlib.TestUtils; @@ -32,9 +31,7 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import java.io.File; - -import static junit.framework.Assert.assertTrue; +import static org.junit.Assert.assertTrue; public class DecodeArrayTest extends BaseTest { @@ -54,7 +51,6 @@ public class DecodeArrayTest extends BaseTest { public void decodeStringArray() throws BrutException { ExtFile apkFile = new ExtFile(sTmpDir, "issue1994.apk"); ApkInfo apkInfo = new ApkInfo(apkFile); - //ApkDecoder apkDecoder = new ApkDecoder(apkFile); ResourcesDecoder resourcesDecoder = new ResourcesDecoder(Config.getDefaultConfig(), apkInfo); resourcesDecoder.loadMainPkg(); diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DecodeKotlinTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DecodeKotlinTest.java index ee5e086a..415138e7 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DecodeKotlinTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DecodeKotlinTest.java @@ -67,6 +67,6 @@ public class DecodeKotlinTest extends BaseTest { public void kotlinDecodeTest() throws IOException { File kotlinActivity = new File(sTestNewDir, "smali/org/example/kotlin/mixed/KotlinActivity.smali"); - assertTrue(FileUtils.readFileToString(kotlinActivity).contains("KotlinActivity.kt")); + assertTrue(FileUtils.readFileToString(kotlinActivity, "UTF-8").contains("KotlinActivity.kt")); } } diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DuplicateDexTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DuplicateDexTest.java index bc31789f..9af4216f 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DuplicateDexTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/DuplicateDexTest.java @@ -26,7 +26,6 @@ import org.junit.*; import java.io.File; import java.io.IOException; - public class DuplicateDexTest extends BaseTest { @Before diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ExternalEntityTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ExternalEntityTest.java index 31419377..60232eca 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ExternalEntityTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ExternalEntityTest.java @@ -58,7 +58,6 @@ public class ExternalEntityTest extends BaseTest { @Test public void doctypeTest() throws IOException { - String expected = TestUtils.replaceNewlines("" + " Date: Thu, 17 Aug 2023 07:35:23 -0400 Subject: [PATCH 4/4] refactor: remove unneeded blocks/semicolons (#3273) --- .../main/java/brut/androlib/apk/YamlReader.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/apk/YamlReader.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/apk/YamlReader.java index 33024c6e..75b1017f 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/apk/YamlReader.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/apk/YamlReader.java @@ -196,18 +196,12 @@ public class YamlReader { } public void readStringList(List list) throws AndrolibException { - readList(list, - (items, reader) -> { - items.add(reader.getLine().getValue()); - }); - }; + readList(list, (items, reader) -> items.add(reader.getLine().getValue())); + } public void readIntList(List list) throws AndrolibException { - readList(list, - (items, reader) -> { - items.add(reader.getLine().getValueInt()); - }); - }; + readList(list, (items, reader) -> items.add(reader.getLine().getValueInt())); + } public void readMap(Map map) throws AndrolibException { readObject(map, @@ -216,5 +210,5 @@ public class YamlReader { YamlLine line = reader.getLine(); items.put(line.getKey(), line.getValue()); }); - }; + } }