Make r8 legacy resource shrinker fully compatible with cli

Only consider raw resources for keep rules

Trace xml for transitive references

Add test of us keeping strings referenced from (code referenced) xml

Bug: 287398085
Change-Id: Ieab7851b8cd54b1e3632f16607608914e94a9251
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 9fd4163..87158c9 100644
--- a/src/resourceshrinker/java/com/android/build/shrinker/r8integration/LegacyResourceShrinker.java
+++ b/src/resourceshrinker/java/com/android/build/shrinker/r8integration/LegacyResourceShrinker.java
@@ -20,6 +20,7 @@
 import com.android.build.shrinker.usages.ProtoAndroidManifestUsageRecorderKt;
 import com.android.build.shrinker.usages.R8ResourceShrinker;
 import com.android.build.shrinker.usages.ToolsAttributeUsageRecorderKt;
+import com.android.ide.common.resources.ResourcesUtil;
 import com.android.ide.common.resources.usage.ResourceStore;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -122,7 +123,9 @@
     ProtoAndroidManifestUsageRecorderKt.recordUsagesFromNode(
         XmlNode.parseFrom(manifest.bytes), model);
     for (PathAndBytes xmlInput : xmlInputs) {
-      ToolsAttributeUsageRecorderKt.processRawXml(getUtfReader(xmlInput.getBytes()), model);
+      if (xmlInput.path.startsWith("res/raw")) {
+        ToolsAttributeUsageRecorderKt.processRawXml(getUtfReader(xmlInput.getBytes()), model);
+      }
     }
     new ProtoResourcesGraphBuilder(
             new ResFolderFileTree() {
@@ -146,6 +149,10 @@
     ResourceStore resourceStore = model.getResourceStore();
     resourceStore.processToolsAttributes();
     model.keepPossiblyReferencedResources();
+    // Transitively mark the reachable resources in the model.
+    // Finds unused resources in provided resources collection.
+    // Marks all used resources as 'reachable' in original collection.
+    ResourcesUtil.findUnusedResources(model.getResourceStore().getResources(), x -> {});
     ImmutableSet.Builder<String> resEntriesToKeep = new ImmutableSet.Builder<>();
     for (PathAndBytes xmlInput : Iterables.concat(xmlInputs, resFolderInputs)) {
       if (ResourceShrinkerImplKt.isJarPathReachable(resourceStore, xmlInput.path.toString())) {