Don't build one giant string of the mapping file content for resource shrinking.
This instead adds all non comment lines to a list.
This is a minimal fix that should fix the OOM that large mapping files
can cause (b/2147483638 and b/407327481)
A less minimal fix involves only adding lines based on if they are for
a R class or one of support library classes that the resource shrinker
is special casing.
Bug: b/406525499
Change-Id: I22eef5397ecbadbd90ddfd5392a61bd5f7fb58d9
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 0cd3dc3..8ef2201 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -1542,7 +1542,8 @@
private static class ResourceShrinkerMapStringConsumer implements StringConsumer {
private final InternalOptions internal;
- private StringBuilder resultBuilder = new StringBuilder();
+ private List<String> mappingStrings = new ArrayList<>();
+ private StringBuilder current = new StringBuilder();
public ResourceShrinkerMapStringConsumer(InternalOptions internal) {
this.internal = internal;
@@ -1550,13 +1551,30 @@
@Override
public void accept(String string, DiagnosticsHandler handler) {
- resultBuilder.append(string);
+ current.append(string);
+ if (string.endsWith("\n")) {
+ addNoneCommentLinesAndReset();
+ }
+ }
+
+ private void addNoneCommentLinesAndReset() {
+ StringUtils.splitLines(
+ current.toString(),
+ false,
+ line -> {
+ if (!line.startsWith("#")) {
+ mappingStrings.add(line);
+ }
+ });
+ current.setLength(0);
}
@Override
public void finished(DiagnosticsHandler handler) {
- internal.androidResourceProguardMapStrings = StringUtils.splitLines(resultBuilder.toString());
- resultBuilder = null;
+ if (current.length() != 0) {
+ addNoneCommentLinesAndReset();
+ }
+ internal.androidResourceProguardMapStrings = mappingStrings;
}
}
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 082fa95..e657762 100644
--- a/src/main/java/com/android/tools/r8/utils/StringUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/StringUtils.java
@@ -292,7 +292,7 @@
return list;
}
- private static void splitLines(
+ public static void splitLines(
String content, boolean includeTrailingEmptyLine, Consumer<String> consumer) {
int length = content.length();
int start = 0;