Aapt2 Optimize: Exempt particular resources from path shortening
Design: go/no_path_shorten
Bug: b/246845175
Test: Added new atests and verified affected atests pass
Change-Id: I4d5b48ea9f0efd4740823101b9a3d776d151a808
diff --git a/tools/aapt2/cmd/Convert.cpp b/tools/aapt2/cmd/Convert.cpp
index 612e3a6..7381a85 100644
--- a/tools/aapt2/cmd/Convert.cpp
+++ b/tools/aapt2/cmd/Convert.cpp
@@ -364,7 +364,8 @@
}
std::unordered_set<ResourceName> resources_exclude_list;
bool result = ParseResourceConfig(content, context, resources_exclude_list,
- out_options.name_collapse_exemptions);
+ out_options.name_collapse_exemptions,
+ out_options.path_shorten_exemptions);
if (!result) {
return false;
}
diff --git a/tools/aapt2/cmd/Optimize.cpp b/tools/aapt2/cmd/Optimize.cpp
index d7a39bf..dbe7970 100644
--- a/tools/aapt2/cmd/Optimize.cpp
+++ b/tools/aapt2/cmd/Optimize.cpp
@@ -322,7 +322,8 @@
return false;
}
return ParseResourceConfig(content, context, options->resources_exclude_list,
- options->table_flattener_options.name_collapse_exemptions);
+ options->table_flattener_options.name_collapse_exemptions,
+ options->table_flattener_options.path_shorten_exemptions);
}
bool ExtractAppDataFromManifest(OptimizeContext* context, const LoadedApk* apk,
diff --git a/tools/aapt2/cmd/Optimize.h b/tools/aapt2/cmd/Optimize.h
index 1879f25..ee53af1 100644
--- a/tools/aapt2/cmd/Optimize.h
+++ b/tools/aapt2/cmd/Optimize.h
@@ -122,7 +122,8 @@
"--resources-config-path.",
&options_.table_flattener_options.collapse_key_stringpool);
AddOptionalSwitch("--shorten-resource-paths",
- "Shortens the paths of resources inside the APK.",
+ "Shortens the paths of resources inside the APK. Resources can be exempted using the \n"
+ "\"no_path_shorten\" directive in a file specified by --resources-config-path.",
&options_.shorten_resource_paths);
// TODO(b/246489170): keep the old option and format until transform to the new one
AddOptionalFlag("--resource-path-shortening-map",
diff --git a/tools/aapt2/cmd/Util.cpp b/tools/aapt2/cmd/Util.cpp
index 92849cf..1671e1e 100644
--- a/tools/aapt2/cmd/Util.cpp
+++ b/tools/aapt2/cmd/Util.cpp
@@ -448,7 +448,8 @@
bool ParseResourceConfig(const std::string& content, IAaptContext* context,
std::unordered_set<ResourceName>& out_resource_exclude_list,
- std::set<ResourceName>& out_name_collapse_exemptions) {
+ std::set<ResourceName>& out_name_collapse_exemptions,
+ std::set<ResourceName>& out_path_shorten_exemptions) {
for (StringPiece line : util::Tokenize(content, '\n')) {
line = util::TrimWhitespace(line);
if (line.empty()) {
@@ -477,6 +478,8 @@
out_resource_exclude_list.insert(resource_name.ToResourceName());
} else if (directive == "no_collapse" || directive == "no_obfuscate") {
out_name_collapse_exemptions.insert(resource_name.ToResourceName());
+ } else if (directive == "no_path_shorten") {
+ out_path_shorten_exemptions.insert(resource_name.ToResourceName());
}
}
}
diff --git a/tools/aapt2/cmd/Util.h b/tools/aapt2/cmd/Util.h
index 169d5f9..712c07b 100644
--- a/tools/aapt2/cmd/Util.h
+++ b/tools/aapt2/cmd/Util.h
@@ -81,7 +81,8 @@
bool ParseResourceConfig(const std::string& content, IAaptContext* context,
std::unordered_set<ResourceName>& out_resource_exclude_list,
- std::set<ResourceName>& out_name_collapse_exemptions);
+ std::set<ResourceName>& out_name_collapse_exemptions,
+ std::set<ResourceName>& out_path_shorten_exemptions);
} // namespace aapt
diff --git a/tools/aapt2/cmd/Util_test.cpp b/tools/aapt2/cmd/Util_test.cpp
index 28a6de8..139bfbc 100644
--- a/tools/aapt2/cmd/Util_test.cpp
+++ b/tools/aapt2/cmd/Util_test.cpp
@@ -416,19 +416,27 @@
const std::string& content = R"(
bool/remove_me#remove
bool/keep_name#no_collapse
+layout/keep_path#no_path_shorten
string/foo#no_obfuscate
dimen/bar#no_obfuscate
+layout/keep_name_and_path#no_collapse,no_path_shorten
)";
aapt::test::Context context;
std::unordered_set<ResourceName> resource_exclusion;
std::set<ResourceName> name_collapse_exemptions;
+ std::set<ResourceName> path_shorten_exemptions;
- EXPECT_TRUE(ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions));
+ EXPECT_TRUE(ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions,
+ path_shorten_exemptions));
EXPECT_THAT(name_collapse_exemptions,
UnorderedElementsAre(ResourceName({}, ResourceType::kString, "foo"),
ResourceName({}, ResourceType::kDimen, "bar"),
- ResourceName({}, ResourceType::kBool, "keep_name")));
+ ResourceName({}, ResourceType::kBool, "keep_name"),
+ ResourceName({}, ResourceType::kLayout, "keep_name_and_path")));
+ EXPECT_THAT(path_shorten_exemptions,
+ UnorderedElementsAre(ResourceName({}, ResourceType::kLayout, "keep_path"),
+ ResourceName({}, ResourceType::kLayout, "keep_name_and_path")));
EXPECT_THAT(resource_exclusion,
UnorderedElementsAre(ResourceName({}, ResourceType::kBool, "remove_me")));
}
@@ -440,9 +448,10 @@
aapt::test::Context context;
std::unordered_set<ResourceName> resource_exclusion;
std::set<ResourceName> name_collapse_exemptions;
+ std::set<ResourceName> path_shorten_exemptions;
- EXPECT_FALSE(
- ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions));
+ EXPECT_FALSE(ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions,
+ path_shorten_exemptions));
}
TEST(UtilTest, ParseConfigInvalidName) {
@@ -452,9 +461,10 @@
aapt::test::Context context;
std::unordered_set<ResourceName> resource_exclusion;
std::set<ResourceName> name_collapse_exemptions;
+ std::set<ResourceName> path_shorten_exemptions;
- EXPECT_FALSE(
- ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions));
+ EXPECT_FALSE(ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions,
+ path_shorten_exemptions));
}
TEST(UtilTest, ParseConfigNoHash) {
@@ -464,9 +474,10 @@
aapt::test::Context context;
std::unordered_set<ResourceName> resource_exclusion;
std::set<ResourceName> name_collapse_exemptions;
+ std::set<ResourceName> path_shorten_exemptions;
- EXPECT_FALSE(
- ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions));
+ EXPECT_FALSE(ParseResourceConfig(content, &context, resource_exclusion, name_collapse_exemptions,
+ path_shorten_exemptions));
}
} // namespace aapt