Untangle optimized resource shrinking from legacy
This moves all optimized shrinking logic to R8ResourceShrinkerState, only initializing this once based on the resource inputs. The parsing of resource tables is now only done at setup time before starting the enqueuer.
This prepares us for tracing the xml files directly.
Also, add support for feature splits in optimized shrinking.
Recursive tracing, i.e., marking of transitively reachable resources
are now done through the trace method when code gives rise to a new
resource.
Bug: b/287398085
Change-Id: I85b20442f472bb02203fdc88ea42c6df47eba584
diff --git a/src/resourceshrinker/java/com/android/build/shrinker/r8integration/LegacyResourceShrinker.java b/src/resourceshrinker/java/com/android/build/shrinker/r8integration/LegacyResourceShrinker.java
index f37d381..7874b5c 100644
--- a/src/resourceshrinker/java/com/android/build/shrinker/r8integration/LegacyResourceShrinker.java
+++ b/src/resourceshrinker/java/com/android/build/shrinker/r8integration/LegacyResourceShrinker.java
@@ -14,7 +14,6 @@
import com.android.build.shrinker.ResourceShrinkerImplKt;
import com.android.build.shrinker.ResourceTableUtilKt;
import com.android.build.shrinker.graph.ProtoResourcesGraphBuilder;
-import com.android.build.shrinker.graph.ResFolderFileTree;
import com.android.build.shrinker.obfuscation.ProguardMappingsRecorder;
import com.android.build.shrinker.r8integration.R8ResourceShrinkerState.R8ResourceShrinkerModel;
import com.android.build.shrinker.usages.DexFileAnalysisCallback;
@@ -134,11 +133,6 @@
ResourceTable loadedResourceTable = ResourceTable.parseFrom(pathAndBytes.bytes);
model.instantiateFromResourceTable(loadedResourceTable, false);
}
- return shrinkModel(model, false);
- }
-
- public ShrinkerResult shrinkModel(
- R8ResourceShrinkerModel model, boolean exactMatchingOfStyleablesAndAttr) throws IOException {
if (proguardMapStrings != null) {
new ProguardMappingsRecorder(proguardMapStrings).recordObfuscationMappings(model);
proguardMapStrings = null;
@@ -171,13 +165,7 @@
for (PathAndBytes pathAndBytes : resourceTables.keySet()) {
ResourceTable resourceTable = ResourceTable.parseFrom(pathAndBytes.bytes);
new ProtoResourcesGraphBuilder(
- new ResFolderFileTree() {
- @Override
- public byte[] getEntryByName(String pathInRes) {
- return resFolderMappings.get(pathInRes).getBytes();
- }
- },
- unused -> resourceTable)
+ pathInRes -> resFolderMappings.get(pathInRes).getBytes(), unused -> resourceTable)
.buildGraph(model);
}
ResourceStore resourceStore = model.getResourceStore();
@@ -194,8 +182,7 @@
resEntriesToKeep.add(xmlInput.path.toString());
}
}
- List<Integer> resourceIdsToRemove =
- getResourceIdsToRemove(unusedResources, model, exactMatchingOfStyleablesAndAttr);
+ List<Integer> resourceIdsToRemove = getResourceIdsToRemove(unusedResources);
Map<FeatureSplit, ResourceTable> shrunkenTables = new HashMap<>();
for (Entry<PathAndBytes, FeatureSplit> entry : resourceTables.entrySet()) {
ResourceTable shrunkenResourceTable =
@@ -206,21 +193,11 @@
return new ShrinkerResult(resEntriesToKeep.build(), shrunkenTables);
}
- private static List<Integer> getResourceIdsToRemove(
- List<Resource> unusedResources,
- R8ResourceShrinkerModel model,
- boolean exactMatchingOfStyleablesAndAttr) {
- if (!exactMatchingOfStyleablesAndAttr) {
+ private static List<Integer> getResourceIdsToRemove(List<Resource> unusedResources) {
return unusedResources.stream()
.filter(s -> s.type != ResourceType.ID)
.map(resource -> resource.value)
.collect(Collectors.toList());
- }
- return model.getResourceStore().getResources().stream()
- .filter(r -> !r.isReachable())
- .filter(r -> r.type != ResourceType.ID)
- .map(r -> r.value)
- .collect(Collectors.toList());
}
// Lifted from com/android/utils/XmlUtils.java which we can't easily update internal dependency