Merge "Generate "keep" rules for android:name and class attributes" am: a13d7fc861
Change-Id: I62bd14ae72f805d8326e67b91e6b3622615677fc
This commit is contained in:
@@ -115,15 +115,10 @@ class LayoutVisitor : public BaseVisitor {
|
|||||||
|
|
||||||
void Visit(xml::Element* node) override {
|
void Visit(xml::Element* node) override {
|
||||||
bool is_view = false;
|
bool is_view = false;
|
||||||
bool is_fragment = false;
|
|
||||||
if (node->namespace_uri.empty()) {
|
if (node->namespace_uri.empty()) {
|
||||||
if (node->name == "view") {
|
if (node->name == "view") {
|
||||||
is_view = true;
|
is_view = true;
|
||||||
} else if (node->name == "fragment") {
|
|
||||||
is_fragment = true;
|
|
||||||
}
|
}
|
||||||
} else if (node->namespace_uri == xml::kSchemaAndroid) {
|
|
||||||
is_fragment = node->name == "fragment";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& attr : node->attributes) {
|
for (const auto& attr : node->attributes) {
|
||||||
@@ -132,12 +127,12 @@ class LayoutVisitor : public BaseVisitor {
|
|||||||
if (is_view) {
|
if (is_view) {
|
||||||
AddClass(node->line_number, attr.value,
|
AddClass(node->line_number, attr.value,
|
||||||
"android.content.Context, android.util.AttributeSet");
|
"android.content.Context, android.util.AttributeSet");
|
||||||
} else if (is_fragment) {
|
} else {
|
||||||
AddClass(node->line_number, attr.value, "");
|
AddClass(node->line_number, attr.value, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (attr.namespace_uri == xml::kSchemaAndroid && attr.name == "name") {
|
} else if (attr.namespace_uri == xml::kSchemaAndroid && attr.name == "name") {
|
||||||
if (is_fragment && util::IsJavaClassName(attr.value)) {
|
if (util::IsJavaClassName(attr.value)) {
|
||||||
AddClass(node->line_number, attr.value, "");
|
AddClass(node->line_number, attr.value, "");
|
||||||
}
|
}
|
||||||
} else if (attr.namespace_uri == xml::kSchemaAndroid && attr.name == "onClick") {
|
} else if (attr.namespace_uri == xml::kSchemaAndroid && attr.name == "onClick") {
|
||||||
|
|||||||
@@ -131,6 +131,61 @@ TEST(ProguardRulesTest, FragmentNameAndClassRulesAreEmitted) {
|
|||||||
EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(); }"));
|
EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(); }"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ProguardRulesTest, FragmentContainerViewNameRuleIsEmitted) {
|
||||||
|
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
|
||||||
|
std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"(
|
||||||
|
<androidx.fragment.app.FragmentContainerView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:name="com.foo.Bar"/>)");
|
||||||
|
layout->file.name = test::ParseNameOrDie("layout/foo");
|
||||||
|
|
||||||
|
proguard::KeepSet set;
|
||||||
|
ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &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>(); }"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ProguardRulesTest, FragmentContainerViewClassRuleIsEmitted) {
|
||||||
|
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
|
||||||
|
std::unique_ptr<xml::XmlResource> layout =
|
||||||
|
test::BuildXmlDom(R"(<androidx.fragment.app.FragmentContainerView class="com.foo.Bar"/>)");
|
||||||
|
layout->file.name = test::ParseNameOrDie("layout/foo");
|
||||||
|
|
||||||
|
proguard::KeepSet set;
|
||||||
|
ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &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>(); }"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ProguardRulesTest, FragmentContainerViewNameAndClassRulesAreEmitted) {
|
||||||
|
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
|
||||||
|
std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"(
|
||||||
|
<androidx.fragment.app.FragmentContainerView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:name="com.foo.Baz"
|
||||||
|
class="com.foo.Bar"/>)");
|
||||||
|
layout->file.name = test::ParseNameOrDie("layout/foo");
|
||||||
|
|
||||||
|
proguard::KeepSet set;
|
||||||
|
ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &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.Baz { <init>(); }"));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(ProguardRulesTest, NavigationFragmentNameAndClassRulesAreEmitted) {
|
TEST(ProguardRulesTest, NavigationFragmentNameAndClassRulesAreEmitted) {
|
||||||
std::unique_ptr<IAaptContext> context = test::ContextBuilder()
|
std::unique_ptr<IAaptContext> context = test::ContextBuilder()
|
||||||
.SetCompilationPackage("com.base").Build();
|
.SetCompilationPackage("com.base").Build();
|
||||||
|
|||||||
Reference in New Issue
Block a user