Loading tools/aapt2/cmd/Link.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -1260,7 +1260,7 @@ class Linker { return false; return false; } } proguard::WriteKeepSet(keep_set, &fout); proguard::WriteKeepSet(keep_set, &fout, options_.generate_minimal_proguard_rules); fout.Flush(); fout.Flush(); if (fout.HadError()) { if (fout.HadError()) { Loading tools/aapt2/cmd/Link.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,7 @@ struct LinkOptions { Maybe<std::string> generate_proguard_rules_path; Maybe<std::string> generate_proguard_rules_path; Maybe<std::string> generate_main_dex_proguard_rules_path; Maybe<std::string> generate_main_dex_proguard_rules_path; bool generate_conditional_proguard_rules = false; bool generate_conditional_proguard_rules = false; bool generate_minimal_proguard_rules = false; bool generate_non_final_ids = false; bool generate_non_final_ids = false; std::vector<std::string> javadoc_annotations; std::vector<std::string> javadoc_annotations; Maybe<std::string> private_symbols; Maybe<std::string> private_symbols; Loading Loading @@ -119,6 +120,9 @@ class LinkCommand : public Command { AddOptionalSwitch("--proguard-conditional-keep-rules", AddOptionalSwitch("--proguard-conditional-keep-rules", "Generate conditional Proguard keep rules.", "Generate conditional Proguard keep rules.", &options_.generate_conditional_proguard_rules); &options_.generate_conditional_proguard_rules); AddOptionalSwitch("--proguard-minimal-keep-rules", "Generate a minimal set of Proguard keep rules.", &options_.generate_minimal_proguard_rules); AddOptionalSwitch("--no-auto-version", "Disables automatic style and layout SDK versioning.", AddOptionalSwitch("--no-auto-version", "Disables automatic style and layout SDK versioning.", &options_.no_auto_version); &options_.no_auto_version); AddOptionalSwitch("--no-version-vectors", AddOptionalSwitch("--no-version-vectors", Loading tools/aapt2/java/ProguardRules.cpp +9 −5 Original line number Original line Diff line number Diff line Loading @@ -384,7 +384,7 @@ bool CollectProguardRules(IAaptContext* context_, xml::XmlResource* res, KeepSet return true; return true; } } void WriteKeepSet(const KeepSet& keep_set, OutputStream* out) { void WriteKeepSet(const KeepSet& keep_set, OutputStream* out, bool minimal_keep) { Printer printer(out); Printer printer(out); for (const auto& entry : keep_set.manifest_class_set_) { for (const auto& entry : keep_set.manifest_class_set_) { for (const UsageLocation& location : entry.second) { for (const UsageLocation& location : entry.second) { Loading @@ -406,15 +406,19 @@ void WriteKeepSet(const KeepSet& keep_set, OutputStream* out) { printer.Print("-if class **.R$layout { int ") printer.Print("-if class **.R$layout { int ") .Print(JavaClassGenerator::TransformToFieldName(location.name.entry)) .Print(JavaClassGenerator::TransformToFieldName(location.name.entry)) .Println("; }"); .Println("; }"); printer.Print("-keep class ").Print(entry.first.name).Print(" { <init>(") .Print(entry.first.signature).Println("); }"); printer.Print("-keep class ").Print(entry.first.name).Print(" { <init>("); printer.Print((minimal_keep) ? entry.first.signature : "..."); printer.Println("); }"); } } } else { } else { for (const UsageLocation& location : entry.second) { for (const UsageLocation& location : entry.second) { printer.Print("# Referenced at ").Println(location.source.to_string()); printer.Print("# Referenced at ").Println(location.source.to_string()); } } printer.Print("-keep class ").Print(entry.first.name).Print(" { <init>(") .Print(entry.first.signature).Println("); }"); printer.Print("-keep class ").Print(entry.first.name).Print(" { <init>("); printer.Print((minimal_keep) ? entry.first.signature : "..."); printer.Println("); }"); } } printer.Println(); printer.Println(); } } Loading tools/aapt2/java/ProguardRules.h +2 −2 Original line number Original line Diff line number Diff line Loading @@ -70,7 +70,7 @@ class KeepSet { } } private: private: friend void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out); friend void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out, bool minimal_keep); friend bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set, friend bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set, std::set<UsageLocation>* locations); std::set<UsageLocation>* locations); Loading @@ -89,7 +89,7 @@ bool CollectProguardRules(IAaptContext* context, xml::XmlResource* res, KeepSet* bool CollectResourceReferences(IAaptContext* context, ResourceTable* table, KeepSet* keep_set); bool CollectResourceReferences(IAaptContext* context, ResourceTable* table, KeepSet* keep_set); void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out); void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out, bool minimal_keep); bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set, bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set, std::set<UsageLocation>* locations); std::set<UsageLocation>* locations); Loading tools/aapt2/java/ProguardRules_test.cpp +72 −22 Original line number Original line Diff line number Diff line Loading @@ -26,10 +26,10 @@ using ::testing::Not; namespace aapt { namespace aapt { std::string GetKeepSetString(const proguard::KeepSet& set) { std::string GetKeepSetString(const proguard::KeepSet& set, bool minimal_rules) { std::string out; std::string out; StringOutputStream sout(&out); StringOutputStream sout(&out); proguard::WriteKeepSet(set, &sout); proguard::WriteKeepSet(set, &sout, minimal_rules); sout.Flush(); sout.Flush(); return out; return out; } } Loading @@ -53,8 +53,17 @@ TEST(ProguardRulesTest, ManifestRuleDefaultConstructorOnly) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRulesForManifest(manifest.get(), &set, false)); ASSERT_TRUE(proguard::CollectProguardRulesForManifest(manifest.get(), &set, false)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarAppComponentFactory { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarBackupAgent { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarApplication { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarActivity { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarService { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarReceiver { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarProvider { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarInstrumentation { <init>(); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarAppComponentFactory { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarAppComponentFactory { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarBackupAgent { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarBackupAgent { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarApplication { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarApplication { <init>(); }")); Loading @@ -75,8 +84,10 @@ TEST(ProguardRulesTest, FragmentNameRuleIsEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); } } Loading @@ -89,8 +100,10 @@ TEST(ProguardRulesTest, FragmentClassRuleIsEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); } } Loading @@ -105,8 +118,11 @@ TEST(ProguardRulesTest, FragmentNameAndClassRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(); }")); } } Loading @@ -133,7 +149,12 @@ TEST(ProguardRulesTest, NavigationFragmentNameAndClassRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), navigation.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), navigation.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Foo { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.base.Nested { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Foo { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Foo { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.base.Nested { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.base.Nested { <init>(...); }")); Loading @@ -150,8 +171,10 @@ TEST(ProguardRulesTest, CustomViewRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); } } Loading Loading @@ -188,8 +211,13 @@ TEST(ProguardRulesTest, IncludedLayoutRulesAreConditional) { ASSERT_TRUE(proguard::CollectProguardRules(context.get(), bar_layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), bar_layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), foo_layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), foo_layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("int foo")); EXPECT_THAT(actual, HasSubstr("int bar")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); Loading @@ -209,8 +237,14 @@ TEST(ProguardRulesTest, AliasedLayoutRulesAreConditional) { set.AddReference({test::ParseNameOrDie("layout/bar"), {}}, layout->file.name); set.AddReference({test::ParseNameOrDie("layout/bar"), {}}, layout->file.name); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); EXPECT_THAT(actual, HasSubstr("int foo")); EXPECT_THAT(actual, HasSubstr("int bar")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); Loading @@ -230,8 +264,11 @@ TEST(ProguardRulesTest, NonLayoutReferencesAreUnconditional) { set.AddReference({test::ParseNameOrDie("style/MyStyle"), {}}, layout->file.name); set.AddReference({test::ParseNameOrDie("style/MyStyle"), {}}, layout->file.name); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, Not(HasSubstr("-if"))); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, Not(HasSubstr("-if"))); EXPECT_THAT(actual, Not(HasSubstr("-if"))); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); Loading @@ -247,8 +284,11 @@ TEST(ProguardRulesTest, ViewOnClickRuleIsEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr( "-keepclassmembers class * { *** bar_method(android.view.View); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keepclassmembers class * { *** bar_method(android.view.View); }")); "-keepclassmembers class * { *** bar_method(android.view.View); }")); } } Loading @@ -267,8 +307,14 @@ TEST(ProguardRulesTest, MenuRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), menu.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), menu.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr( "-keepclassmembers class * { *** on_click(android.view.MenuItem); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(...); }")); EXPECT_THAT(actual, Not(HasSubstr("com.foo.Bat"))); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keepclassmembers class * { *** on_click(android.view.MenuItem); }")); "-keepclassmembers class * { *** on_click(android.view.MenuItem); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(android.content.Context); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(android.content.Context); }")); Loading @@ -287,8 +333,10 @@ TEST(ProguardRulesTest, TransitionPathMotionRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), transition.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), transition.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); } } Loading @@ -304,8 +352,10 @@ TEST(ProguardRulesTest, TransitionRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), transitionSet.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), transitionSet.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); } } Loading Loading
tools/aapt2/cmd/Link.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -1260,7 +1260,7 @@ class Linker { return false; return false; } } proguard::WriteKeepSet(keep_set, &fout); proguard::WriteKeepSet(keep_set, &fout, options_.generate_minimal_proguard_rules); fout.Flush(); fout.Flush(); if (fout.HadError()) { if (fout.HadError()) { Loading
tools/aapt2/cmd/Link.h +4 −0 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,7 @@ struct LinkOptions { Maybe<std::string> generate_proguard_rules_path; Maybe<std::string> generate_proguard_rules_path; Maybe<std::string> generate_main_dex_proguard_rules_path; Maybe<std::string> generate_main_dex_proguard_rules_path; bool generate_conditional_proguard_rules = false; bool generate_conditional_proguard_rules = false; bool generate_minimal_proguard_rules = false; bool generate_non_final_ids = false; bool generate_non_final_ids = false; std::vector<std::string> javadoc_annotations; std::vector<std::string> javadoc_annotations; Maybe<std::string> private_symbols; Maybe<std::string> private_symbols; Loading Loading @@ -119,6 +120,9 @@ class LinkCommand : public Command { AddOptionalSwitch("--proguard-conditional-keep-rules", AddOptionalSwitch("--proguard-conditional-keep-rules", "Generate conditional Proguard keep rules.", "Generate conditional Proguard keep rules.", &options_.generate_conditional_proguard_rules); &options_.generate_conditional_proguard_rules); AddOptionalSwitch("--proguard-minimal-keep-rules", "Generate a minimal set of Proguard keep rules.", &options_.generate_minimal_proguard_rules); AddOptionalSwitch("--no-auto-version", "Disables automatic style and layout SDK versioning.", AddOptionalSwitch("--no-auto-version", "Disables automatic style and layout SDK versioning.", &options_.no_auto_version); &options_.no_auto_version); AddOptionalSwitch("--no-version-vectors", AddOptionalSwitch("--no-version-vectors", Loading
tools/aapt2/java/ProguardRules.cpp +9 −5 Original line number Original line Diff line number Diff line Loading @@ -384,7 +384,7 @@ bool CollectProguardRules(IAaptContext* context_, xml::XmlResource* res, KeepSet return true; return true; } } void WriteKeepSet(const KeepSet& keep_set, OutputStream* out) { void WriteKeepSet(const KeepSet& keep_set, OutputStream* out, bool minimal_keep) { Printer printer(out); Printer printer(out); for (const auto& entry : keep_set.manifest_class_set_) { for (const auto& entry : keep_set.manifest_class_set_) { for (const UsageLocation& location : entry.second) { for (const UsageLocation& location : entry.second) { Loading @@ -406,15 +406,19 @@ void WriteKeepSet(const KeepSet& keep_set, OutputStream* out) { printer.Print("-if class **.R$layout { int ") printer.Print("-if class **.R$layout { int ") .Print(JavaClassGenerator::TransformToFieldName(location.name.entry)) .Print(JavaClassGenerator::TransformToFieldName(location.name.entry)) .Println("; }"); .Println("; }"); printer.Print("-keep class ").Print(entry.first.name).Print(" { <init>(") .Print(entry.first.signature).Println("); }"); printer.Print("-keep class ").Print(entry.first.name).Print(" { <init>("); printer.Print((minimal_keep) ? entry.first.signature : "..."); printer.Println("); }"); } } } else { } else { for (const UsageLocation& location : entry.second) { for (const UsageLocation& location : entry.second) { printer.Print("# Referenced at ").Println(location.source.to_string()); printer.Print("# Referenced at ").Println(location.source.to_string()); } } printer.Print("-keep class ").Print(entry.first.name).Print(" { <init>(") .Print(entry.first.signature).Println("); }"); printer.Print("-keep class ").Print(entry.first.name).Print(" { <init>("); printer.Print((minimal_keep) ? entry.first.signature : "..."); printer.Println("); }"); } } printer.Println(); printer.Println(); } } Loading
tools/aapt2/java/ProguardRules.h +2 −2 Original line number Original line Diff line number Diff line Loading @@ -70,7 +70,7 @@ class KeepSet { } } private: private: friend void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out); friend void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out, bool minimal_keep); friend bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set, friend bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set, std::set<UsageLocation>* locations); std::set<UsageLocation>* locations); Loading @@ -89,7 +89,7 @@ bool CollectProguardRules(IAaptContext* context, xml::XmlResource* res, KeepSet* bool CollectResourceReferences(IAaptContext* context, ResourceTable* table, KeepSet* keep_set); bool CollectResourceReferences(IAaptContext* context, ResourceTable* table, KeepSet* keep_set); void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out); void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out, bool minimal_keep); bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set, bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set, std::set<UsageLocation>* locations); std::set<UsageLocation>* locations); Loading
tools/aapt2/java/ProguardRules_test.cpp +72 −22 Original line number Original line Diff line number Diff line Loading @@ -26,10 +26,10 @@ using ::testing::Not; namespace aapt { namespace aapt { std::string GetKeepSetString(const proguard::KeepSet& set) { std::string GetKeepSetString(const proguard::KeepSet& set, bool minimal_rules) { std::string out; std::string out; StringOutputStream sout(&out); StringOutputStream sout(&out); proguard::WriteKeepSet(set, &sout); proguard::WriteKeepSet(set, &sout, minimal_rules); sout.Flush(); sout.Flush(); return out; return out; } } Loading @@ -53,8 +53,17 @@ TEST(ProguardRulesTest, ManifestRuleDefaultConstructorOnly) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRulesForManifest(manifest.get(), &set, false)); ASSERT_TRUE(proguard::CollectProguardRulesForManifest(manifest.get(), &set, false)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarAppComponentFactory { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarBackupAgent { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarApplication { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarActivity { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarService { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarReceiver { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarProvider { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarInstrumentation { <init>(); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarAppComponentFactory { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarAppComponentFactory { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarBackupAgent { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarBackupAgent { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarApplication { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarApplication { <init>(); }")); Loading @@ -75,8 +84,10 @@ TEST(ProguardRulesTest, FragmentNameRuleIsEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); } } Loading @@ -89,8 +100,10 @@ TEST(ProguardRulesTest, FragmentClassRuleIsEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); } } Loading @@ -105,8 +118,11 @@ TEST(ProguardRulesTest, FragmentNameAndClassRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(); }")); } } Loading @@ -133,7 +149,12 @@ TEST(ProguardRulesTest, NavigationFragmentNameAndClassRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), navigation.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), navigation.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Foo { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.base.Nested { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Foo { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Foo { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.package.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.base.Nested { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.base.Nested { <init>(...); }")); Loading @@ -150,8 +171,10 @@ TEST(ProguardRulesTest, CustomViewRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); } } Loading Loading @@ -188,8 +211,13 @@ TEST(ProguardRulesTest, IncludedLayoutRulesAreConditional) { ASSERT_TRUE(proguard::CollectProguardRules(context.get(), bar_layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), bar_layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), foo_layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), foo_layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("int foo")); EXPECT_THAT(actual, HasSubstr("int bar")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); Loading @@ -209,8 +237,14 @@ TEST(ProguardRulesTest, AliasedLayoutRulesAreConditional) { set.AddReference({test::ParseNameOrDie("layout/bar"), {}}, layout->file.name); set.AddReference({test::ParseNameOrDie("layout/bar"), {}}, layout->file.name); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); EXPECT_THAT(actual, HasSubstr("int foo")); EXPECT_THAT(actual, HasSubstr("int bar")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); EXPECT_THAT(actual, HasSubstr("-if class **.R$layout")); Loading @@ -230,8 +264,11 @@ TEST(ProguardRulesTest, NonLayoutReferencesAreUnconditional) { set.AddReference({test::ParseNameOrDie("style/MyStyle"), {}}, layout->file.name); set.AddReference({test::ParseNameOrDie("style/MyStyle"), {}}, layout->file.name); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, Not(HasSubstr("-if"))); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, Not(HasSubstr("-if"))); EXPECT_THAT(actual, Not(HasSubstr("-if"))); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); Loading @@ -247,8 +284,11 @@ TEST(ProguardRulesTest, ViewOnClickRuleIsEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr( "-keepclassmembers class * { *** bar_method(android.view.View); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keepclassmembers class * { *** bar_method(android.view.View); }")); "-keepclassmembers class * { *** bar_method(android.view.View); }")); } } Loading @@ -267,8 +307,14 @@ TEST(ProguardRulesTest, MenuRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), menu.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), menu.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr( "-keepclassmembers class * { *** on_click(android.view.MenuItem); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(...); }")); EXPECT_THAT(actual, Not(HasSubstr("com.foo.Bat"))); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keepclassmembers class * { *** on_click(android.view.MenuItem); }")); "-keepclassmembers class * { *** on_click(android.view.MenuItem); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(android.content.Context); }")); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(android.content.Context); }")); Loading @@ -287,8 +333,10 @@ TEST(ProguardRulesTest, TransitionPathMotionRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), transition.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), transition.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); } } Loading @@ -304,8 +352,10 @@ TEST(ProguardRulesTest, TransitionRulesAreEmitted) { proguard::KeepSet set; proguard::KeepSet set; ASSERT_TRUE(proguard::CollectProguardRules(context.get(), transitionSet.get(), &set)); ASSERT_TRUE(proguard::CollectProguardRules(context.get(), transitionSet.get(), &set)); std::string actual = GetKeepSetString(set); std::string actual = GetKeepSetString(set, /** minimal_rules */ false); EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }")); actual = GetKeepSetString(set, /** minimal_rules */ true); EXPECT_THAT(actual, HasSubstr( EXPECT_THAT(actual, HasSubstr( "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); "-keep class com.foo.Bar { <init>(android.content.Context, android.util.AttributeSet); }")); } } Loading