From f85eec8403226be8cb7584b95ea185616d2e017b Mon Sep 17 00:00:00 2001 From: Adam Koski Date: Wed, 15 Nov 2017 12:48:49 -0800 Subject: 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 --- tools/aapt2/java/ProguardRules.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) (limited to 'tools/aapt2/java') diff --git a/tools/aapt2/java/ProguardRules.cpp b/tools/aapt2/java/ProguardRules.cpp index 132b234ab1e4..ffcef8966654 100644 --- a/tools/aapt2/java/ProguardRules.cpp +++ b/tools/aapt2/java/ProguardRules.cpp @@ -346,22 +346,20 @@ void WriteKeepSet(const KeepSet& keep_set, OutputStream* out) { 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(" { (...); }"); } - 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(" { (...); }"); } - printer.Print("-keep class ").Print(entry.first).Println(" { (...); }"); printer.Println(); } -- cgit v1.2.3-59-g8ed1b