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;