From ab660a7fde368f30d88af7e4c864b5489dcd44f3 Mon Sep 17 00:00:00 2001 From: Jake Wharton Date: Fri, 8 Jun 2018 17:56:55 -0400 Subject: [PATCH] Only keep default constructor of manifest items Reflection-based instantiation of manifest-declared types is only done on the default (aka no-argument) constructor. While these types are unlikely to have alternate constructors (unlike the others listed in the bug), there's no reason to generate overly keep-y rules for them. Bug: 37123156 Test: make aapt2_tests Change-Id: Ic83a2671a54ea5dd558bfcacf033a60e9568ab8c --- tools/aapt2/java/ProguardRules.cpp | 2 +- tools/aapt2/java/ProguardRules_test.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/tools/aapt2/java/ProguardRules.cpp b/tools/aapt2/java/ProguardRules.cpp index 2857d5a2d90e0..d7ebd8c1d33ee 100644 --- a/tools/aapt2/java/ProguardRules.cpp +++ b/tools/aapt2/java/ProguardRules.cpp @@ -365,7 +365,7 @@ void WriteKeepSet(const KeepSet& keep_set, OutputStream* out) { 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(" { (); }"); } for (const auto& entry : keep_set.conditional_class_set_) { diff --git a/tools/aapt2/java/ProguardRules_test.cpp b/tools/aapt2/java/ProguardRules_test.cpp index 876c7a76d3f58..bbc6f9f644142 100644 --- a/tools/aapt2/java/ProguardRules_test.cpp +++ b/tools/aapt2/java/ProguardRules_test.cpp @@ -34,6 +34,31 @@ std::string GetKeepSetString(const proguard::KeepSet& set) { return out; } +TEST(ProguardRulesTest, ManifestRuleDefaultConstructorOnly) { + std::unique_ptr manifest = test::BuildXmlDom(R"( + + + + + + + + + )"); + + proguard::KeepSet set; + ASSERT_TRUE(proguard::CollectProguardRulesForManifest(manifest.get(), &set, false)); + + std::string actual = GetKeepSetString(set); + + EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarBackupAgent { (); }")); + EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarActivity { (); }")); + EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarService { (); }")); + EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarReceiver { (); }")); + EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarProvider { (); }")); + EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarInstrumentation { (); }")); +} + TEST(ProguardRulesTest, FragmentNameRuleIsEmitted) { std::unique_ptr context = test::ContextBuilder().Build(); std::unique_ptr layout = test::BuildXmlDom(R"(