Fix conditional keep rules for new semantics

New conditional syntax is a logical AND, not OR. This means if a
resource should be conditionally kept by multiple ids, we need to
generate a separate rule for each condition (which will be interpreted
as OR).

Test: unit tests
Bug: 69341430
Change-Id: I0786c65561d36fbf43d181a2dfd0c7eaf1d96b8c
diff --git a/tools/aapt2/java/ProguardRules.cpp b/tools/aapt2/java/ProguardRules.cpp
index 132b234..ffcef89 100644
--- a/tools/aapt2/java/ProguardRules.cpp
+++ b/tools/aapt2/java/ProguardRules.cpp
@@ -346,22 +346,20 @@
       can_be_conditional &= CollectLocations(location, keep_set, &locations);
     }
 
-    for (const UsageLocation& location : entry.second) {
-      printer.Print("# Referenced at ").Println(location.source.to_string());
-    }
     if (keep_set.conditional_keep_rules_ && can_be_conditional) {
-      printer.Println("-if class **.R$layout {");
-      printer.Indent();
       for (const UsageLocation& location : locations) {
-        printer.Print("int ")
+        printer.Print("# Referenced at ").Println(location.source.to_string());
+        printer.Print("-if class **.R$layout { int ")
             .Print(JavaClassGenerator::TransformToFieldName(location.name.entry))
-            .Println(";");
+            .Println("; }");
+        printer.Print("-keep class ").Print(entry.first).Println(" { <init>(...); }");
       }
-      printer.Undent();
-      printer.Println("}");
-      printer.Println();
+    } else {
+      for (const UsageLocation& location : entry.second) {
+        printer.Print("# Referenced at ").Println(location.source.to_string());
+      }
+      printer.Print("-keep class ").Print(entry.first).Println(" { <init>(...); }");
     }
-    printer.Print("-keep class ").Print(entry.first).Println(" { <init>(...); }");
     printer.Println();
   }