Support reading proguard configuration files starting with a byte order mark (BOM)
Bug: 135898791
Change-Id: I556be5cbb5561ffc2f8385a46df4104ef5ccfccd
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 8de6b95..882a969 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -26,6 +26,7 @@
import com.android.tools.r8.utils.LongInterval;
import com.android.tools.r8.utils.Reporter;
import com.android.tools.r8.utils.StringDiagnostic;
+import com.android.tools.r8.utils.StringUtils;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
@@ -203,7 +204,7 @@
private final Origin origin;
ProguardConfigurationSourceParser(ProguardConfigurationSource source) throws IOException {
- contents = source.get();
+ contents = StringUtils.stripBOM(source.get());
baseDirectory = source.getBaseDirectory();
name = source.getName();
this.origin = source.getOrigin();
diff --git a/src/main/java/com/android/tools/r8/utils/StringUtils.java b/src/main/java/com/android/tools/r8/utils/StringUtils.java
index 05900cb..98b60e1 100644
--- a/src/main/java/com/android/tools/r8/utils/StringUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/StringUtils.java
@@ -16,6 +16,7 @@
public static char[] EMPTY_CHAR_ARRAY = {};
public static final String[] EMPTY_ARRAY = {};
public static final String LINE_SEPARATOR = System.getProperty("line.separator");
+ public static final char BOM = '\uFEFF';
public enum BraceType {
PARENS,
@@ -261,4 +262,12 @@
}
return builder.toString();
}
+
+ public static String stripBOM(String s) {
+ if (s.length() > 0 && s.charAt(0) == StringUtils.BOM) {
+ return s.substring(1);
+ } else {
+ return s;
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index 821fc86..f2d2ee0 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -33,10 +33,12 @@
import com.android.tools.r8.utils.InternalOptions.PackageObfuscationMode;
import com.android.tools.r8.utils.KeepingDiagnosticHandler;
import com.android.tools.r8.utils.Reporter;
+import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
@@ -2788,4 +2790,21 @@
assertEquals(1, handler.infos.size());
checkDiagnostics(handler.infos, proguardConfig, 1, 7, "Ignoring modifier", "includecode");
}
+
+ @Test
+ public void parseFileStartingWithBOM() throws Exception {
+ // Copied from test 'parseIncludeCode()' and added a BOM.
+ ProguardConfigurationParser parser;
+ parser = new ProguardConfigurationParser(new DexItemFactory(), reporter);
+ Path proguardConfig =
+ writeTextToTempFile(StringUtils.BOM + "-keep,includecode class A { method(); }");
+ byte[] bytes = Files.readAllBytes(proguardConfig);
+ assertEquals(0xef, Byte.toUnsignedLong(bytes[0]));
+ assertEquals(0xbb, Byte.toUnsignedLong(bytes[1]));
+ assertEquals(0xbf, Byte.toUnsignedLong(bytes[2]));
+ parser.parse(proguardConfig);
+ assertEquals(1, parser.getConfig().getRules().size());
+ assertEquals(1, handler.infos.size());
+ checkDiagnostics(handler.infos, proguardConfig, 1, 7, "Ignoring modifier", "includecode");
+ }
}
\ No newline at end of file