Trace AndroidManifest.xml in the enqueuer

Bug: 326008763
Bug: 287398085
Change-Id: Id853f29929a6750381a2c3513e5567165a3b9dd2
diff --git a/src/resourceshrinker/java/com/android/build/shrinker/r8integration/R8ResourceShrinkerState.java b/src/resourceshrinker/java/com/android/build/shrinker/r8integration/R8ResourceShrinkerState.java
index d8c98c7..11bb767 100644
--- a/src/resourceshrinker/java/com/android/build/shrinker/r8integration/R8ResourceShrinkerState.java
+++ b/src/resourceshrinker/java/com/android/build/shrinker/r8integration/R8ResourceShrinkerState.java
@@ -38,6 +38,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Paths;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
@@ -54,7 +55,7 @@
   private final R8ResourceShrinkerModel r8ResourceShrinkerModel;
   private final Map<String, Supplier<InputStream>> xmlFileProviders = new HashMap<>();
 
-  private Supplier<InputStream> manifestProvider;
+  private final List<Supplier<InputStream>> manifestProviders = new ArrayList<>();
   private final Map<String, Supplier<InputStream>> resfileProviders = new HashMap<>();
   private final Map<ResourceTable, FeatureSplit> resourceTables = new HashMap<>();
   private ClassReferenceCallback enqueuerCallback;
@@ -82,7 +83,7 @@
       return;
     }
     ResourceUsageModel.markReachable(resource);
-    traceXml(id);
+    traceXmlForResourceId(id);
     if (resource.references != null) {
       for (Resource reference : resource.references) {
         if (!reference.isReachable()) {
@@ -92,6 +93,12 @@
     }
   }
 
+  public void traceManifests() {
+    for (Supplier<InputStream> manifestProvider : manifestProviders) {
+      traceXml("AndroidManifest.xml", manifestProvider.get());
+    }
+  }
+
   public void setEnqueuerCallback(ClassReferenceCallback enqueuerCallback) {
     assert this.enqueuerCallback == null;
     this.enqueuerCallback = enqueuerCallback;
@@ -111,8 +118,8 @@
     return packageNames;
   }
 
-  public void setManifestProvider(Supplier<InputStream> manifestProvider) {
-    this.manifestProvider = manifestProvider;
+  public void addManifestProvider(Supplier<InputStream> manifestProvider) {
+    this.manifestProviders.add(manifestProvider);
   }
 
   public void addXmlFileProvider(Supplier<InputStream> inputStreamSupplier, String location) {
@@ -185,19 +192,24 @@
     return resEntriesToKeep.build();
   }
 
-  private void traceXml(int id) {
+  private void traceXmlForResourceId(int id) {
     String xmlFile = getResourceIdToXmlFiles().get(id);
     if (xmlFile != null) {
       InputStream inputStream = xmlFileProviders.get(xmlFile).get();
-      try {
-        XmlNode xmlNode = XmlNode.parseFrom(inputStream);
-        visitNode(xmlNode, xmlFile);
-      } catch (IOException e) {
-        throw new RuntimeException(e);
-      }
+      traceXml(xmlFile, inputStream);
     }
   }
 
+  private void traceXml(String xmlFile, InputStream inputStream) {
+    try {
+      XmlNode xmlNode = XmlNode.parseFrom(inputStream);
+      visitNode(xmlNode, xmlFile);
+    } catch (IOException e) {
+      errorHandler.apply(e);
+    }
+  }
+
+
   private void tryEnqueuerOnString(String possibleClass, String xmlName) {
     // There are a lot of xml tags and attributes that are evaluated over and over, if it is
     // not a class, ignore it.
@@ -264,11 +276,10 @@
   // Temporary to support updating the reachable entries from the manifest, we need to instead
   // trace these in the enqueuer.
   public void updateModelWithManifestReferences() throws IOException {
-    if (manifestProvider == null) {
-      return;
+    for (Supplier<InputStream> manifestProvider : manifestProviders) {
+      ProtoAndroidManifestUsageRecorderKt.recordUsagesFromNode(
+          XmlNode.parseFrom(manifestProvider.get()), r8ResourceShrinkerModel);
     }
-    ProtoAndroidManifestUsageRecorderKt.recordUsagesFromNode(
-        XmlNode.parseFrom(manifestProvider.get()), r8ResourceShrinkerModel);
   }
 
   public void updateModelWithKeepXmlReferences() throws IOException {