Loading tools/aapt2/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -170,7 +170,7 @@ cc_test_host { "test/Builders.cpp", "test/Common.cpp", "**/*_test.cpp", ], ] + toolSources, static_libs: [ "libaapt2", "libgmock", Loading tools/aapt2/cmd/Util.cpp +15 −2 Original line number Diff line number Diff line Loading @@ -72,7 +72,6 @@ bool ParseSplitParameter(const StringPiece& arg, IDiagnostics* diag, std::string } *out_path = parts[0]; std::vector<ConfigDescription> configs; for (const StringPiece& config_str : util::Tokenize(parts[1], ',')) { ConfigDescription config; if (!ConfigDescription::Parse(config_str, &config)) { Loading Loading @@ -141,6 +140,16 @@ static xml::NamespaceDecl CreateAndroidNamespaceDecl() { return decl; } static std::string MakePackageSafeName(const std::string &name) { std::string result(name); for (char &c : result) { if (c == '-') { c = '_'; } } return result; } std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info, const SplitConstraints& constraints) { const ResourceId kVersionCode(0x0101021b); Loading Loading @@ -172,7 +181,11 @@ std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info, if (app_info.split_name) { split_name << app_info.split_name.value() << "."; } split_name << "config." << util::Joiner(constraints.configs, "_"); std::vector<std::string> sanitized_config_names; for (const auto &config : constraints.configs) { sanitized_config_names.push_back(MakePackageSafeName(config.toString().string())); } split_name << "config." << util::Joiner(sanitized_config_names, "_"); manifest_el->attributes.push_back(xml::Attribute{"", "split", split_name.str()}); Loading tools/aapt2/cmd/Util_test.cpp 0 → 100644 +38 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Util.h" #include "AppInfo.h" #include "split/TableSplitter.h" #include "test/Test.h" namespace aapt { TEST(UtilTest, SplitNamesAreSanitized) { AppInfo app_info{"com.pkg"}; SplitConstraints split_constraints{{test::ParseConfigOrDie("en-rUS-land")}}; 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"); // but we should use resource qualifiers verbatim in 'targetConfig'. EXPECT_EQ(root->FindAttribute("", "targetConfig")->value, "en-rUS-land"); } } // namespace aapt Loading
tools/aapt2/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -170,7 +170,7 @@ cc_test_host { "test/Builders.cpp", "test/Common.cpp", "**/*_test.cpp", ], ] + toolSources, static_libs: [ "libaapt2", "libgmock", Loading
tools/aapt2/cmd/Util.cpp +15 −2 Original line number Diff line number Diff line Loading @@ -72,7 +72,6 @@ bool ParseSplitParameter(const StringPiece& arg, IDiagnostics* diag, std::string } *out_path = parts[0]; std::vector<ConfigDescription> configs; for (const StringPiece& config_str : util::Tokenize(parts[1], ',')) { ConfigDescription config; if (!ConfigDescription::Parse(config_str, &config)) { Loading Loading @@ -141,6 +140,16 @@ static xml::NamespaceDecl CreateAndroidNamespaceDecl() { return decl; } static std::string MakePackageSafeName(const std::string &name) { std::string result(name); for (char &c : result) { if (c == '-') { c = '_'; } } return result; } std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info, const SplitConstraints& constraints) { const ResourceId kVersionCode(0x0101021b); Loading Loading @@ -172,7 +181,11 @@ std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info, if (app_info.split_name) { split_name << app_info.split_name.value() << "."; } split_name << "config." << util::Joiner(constraints.configs, "_"); std::vector<std::string> sanitized_config_names; for (const auto &config : constraints.configs) { sanitized_config_names.push_back(MakePackageSafeName(config.toString().string())); } split_name << "config." << util::Joiner(sanitized_config_names, "_"); manifest_el->attributes.push_back(xml::Attribute{"", "split", split_name.str()}); Loading
tools/aapt2/cmd/Util_test.cpp 0 → 100644 +38 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Util.h" #include "AppInfo.h" #include "split/TableSplitter.h" #include "test/Test.h" namespace aapt { TEST(UtilTest, SplitNamesAreSanitized) { AppInfo app_info{"com.pkg"}; SplitConstraints split_constraints{{test::ParseConfigOrDie("en-rUS-land")}}; 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"); // but we should use resource qualifiers verbatim in 'targetConfig'. EXPECT_EQ(root->FindAttribute("", "targetConfig")->value, "en-rUS-land"); } } // namespace aapt