Loading tools/aapt2/cmd/Util.cpp +17 −2 Original line number Diff line number Diff line Loading @@ -140,12 +140,27 @@ static xml::NamespaceDecl CreateAndroidNamespaceDecl() { return decl; } // Returns a copy of 'name' which conforms to the regex '[a-zA-Z]+[a-zA-Z0-9_]*' by // replacing nonconforming characters with underscores. // // See frameworks/base/core/java/android/content/pm/PackageParser.java which // checks this at runtime. static std::string MakePackageSafeName(const std::string &name) { std::string result(name); bool first = true; for (char &c : result) { if (c == '-') { c = '_'; if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { first = false; continue; } if (!first) { if (c >= '0' && c <= '9') { continue; } } c = '_'; first = false; } return result; } Loading tools/aapt2/cmd/Util_test.cpp +5 −4 Original line number Diff line number Diff line Loading @@ -24,15 +24,16 @@ namespace aapt { TEST(UtilTest, SplitNamesAreSanitized) { AppInfo app_info{"com.pkg"}; SplitConstraints split_constraints{{test::ParseConfigOrDie("en-rUS-land")}}; SplitConstraints split_constraints{ {test::ParseConfigOrDie("en-rUS-land"), test::ParseConfigOrDie("b+sr+Latn")}}; const auto doc = GenerateSplitManifest(app_info, split_constraints); const auto &root = doc->root; EXPECT_EQ(root->name, "manifest"); // split names cannot contain hyphens EXPECT_EQ(root->FindAttribute("", "split")->value, "config.en_rUS_land"); // split names cannot contain hyphens or plus signs. EXPECT_EQ(root->FindAttribute("", "split")->value, "config.b_sr_Latn_en_rUS_land"); // but we should use resource qualifiers verbatim in 'targetConfig'. EXPECT_EQ(root->FindAttribute("", "targetConfig")->value, "en-rUS-land"); EXPECT_EQ(root->FindAttribute("", "targetConfig")->value, "b+sr+Latn,en-rUS-land"); } } // namespace aapt Loading
tools/aapt2/cmd/Util.cpp +17 −2 Original line number Diff line number Diff line Loading @@ -140,12 +140,27 @@ static xml::NamespaceDecl CreateAndroidNamespaceDecl() { return decl; } // Returns a copy of 'name' which conforms to the regex '[a-zA-Z]+[a-zA-Z0-9_]*' by // replacing nonconforming characters with underscores. // // See frameworks/base/core/java/android/content/pm/PackageParser.java which // checks this at runtime. static std::string MakePackageSafeName(const std::string &name) { std::string result(name); bool first = true; for (char &c : result) { if (c == '-') { c = '_'; if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { first = false; continue; } if (!first) { if (c >= '0' && c <= '9') { continue; } } c = '_'; first = false; } return result; } Loading
tools/aapt2/cmd/Util_test.cpp +5 −4 Original line number Diff line number Diff line Loading @@ -24,15 +24,16 @@ namespace aapt { TEST(UtilTest, SplitNamesAreSanitized) { AppInfo app_info{"com.pkg"}; SplitConstraints split_constraints{{test::ParseConfigOrDie("en-rUS-land")}}; SplitConstraints split_constraints{ {test::ParseConfigOrDie("en-rUS-land"), test::ParseConfigOrDie("b+sr+Latn")}}; const auto doc = GenerateSplitManifest(app_info, split_constraints); const auto &root = doc->root; EXPECT_EQ(root->name, "manifest"); // split names cannot contain hyphens EXPECT_EQ(root->FindAttribute("", "split")->value, "config.en_rUS_land"); // split names cannot contain hyphens or plus signs. EXPECT_EQ(root->FindAttribute("", "split")->value, "config.b_sr_Latn_en_rUS_land"); // but we should use resource qualifiers verbatim in 'targetConfig'. EXPECT_EQ(root->FindAttribute("", "targetConfig")->value, "en-rUS-land"); EXPECT_EQ(root->FindAttribute("", "targetConfig")->value, "b+sr+Latn,en-rUS-land"); } } // namespace aapt