Always unconditionally keep id resources
Add regression test that we always keep ids.
We can consider if we want to relax this for optimized shrinking (but
there are libraries relying on these)
Bug: 307987906
Change-Id: Ie1070d1e3cb59dc16e7139dfcae53c26a9ece8f5
diff --git a/src/resourceshrinker/java/com/android/build/shrinker/ResourceShrinkerImpl.kt b/src/resourceshrinker/java/com/android/build/shrinker/ResourceShrinkerImpl.kt
index d8f6fa2..d404e2e6 100644
--- a/src/resourceshrinker/java/com/android/build/shrinker/ResourceShrinkerImpl.kt
+++ b/src/resourceshrinker/java/com/android/build/shrinker/ResourceShrinkerImpl.kt
@@ -171,7 +171,9 @@
private fun removeResourceUnusedTableEntries(zis: InputStream,
zos: JarOutputStream,
srcEntry: ZipEntry) {
- val resourceIdsToRemove = unused.map { resource -> resource.value }
+ val resourceIdsToRemove = unused
+ .filterNot { it.type == ResourceType.ID }
+ .map { resource -> resource.value }
val shrunkenResourceTable = Resources.ResourceTable.parseFrom(zis)
.nullOutEntriesWithIds(resourceIdsToRemove)
val bytes = shrunkenResourceTable.toByteArray()
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 ab97ce2..f37d381 100644
--- a/src/resourceshrinker/java/com/android/build/shrinker/r8integration/LegacyResourceShrinker.java
+++ b/src/resourceshrinker/java/com/android/build/shrinker/r8integration/LegacyResourceShrinker.java
@@ -24,6 +24,7 @@
import com.android.ide.common.resources.ResourcesUtil;
import com.android.ide.common.resources.usage.ResourceStore;
import com.android.ide.common.resources.usage.ResourceUsageModel.Resource;
+import com.android.resources.ResourceType;
import com.android.tools.r8.FeatureSplit;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
@@ -210,10 +211,14 @@
R8ResourceShrinkerModel model,
boolean exactMatchingOfStyleablesAndAttr) {
if (!exactMatchingOfStyleablesAndAttr) {
- return unusedResources.stream().map(resource -> resource.value).collect(Collectors.toList());
+ 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());
}