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 {