summaryrefslogtreecommitdiff
path: root/tools/aapt2/cmd/Link.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/aapt2/cmd/Link.cpp')
-rw-r--r--tools/aapt2/cmd/Link.cpp39
1 files changed, 32 insertions, 7 deletions
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index c9e272c32eae..12ab88345411 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -450,7 +450,7 @@ static bool IsTransitionElement(const std::string& name) {
static bool IsVectorElement(const std::string& name) {
return name == "vector" || name == "animated-vector" || name == "pathInterpolator" ||
- name == "objectAnimator" || name == "gradient";
+ name == "objectAnimator" || name == "gradient" || name == "animated-selector";
}
template <typename T>
@@ -514,6 +514,17 @@ std::vector<std::unique_ptr<xml::XmlResource>> ResourceFileFlattener::LinkAndVer
return xml_compat_versioner.Process(context_, doc, api_range);
}
+ResourceFile::Type XmlFileTypeForOutputFormat(OutputFormat format) {
+ switch (format) {
+ case OutputFormat::kApk:
+ return ResourceFile::Type::kBinaryXml;
+ case OutputFormat::kProto:
+ return ResourceFile::Type::kProtoXml;
+ }
+ LOG_ALWAYS_FATAL("unreachable");
+ return ResourceFile::Type::kUnknown;
+}
+
bool ResourceFileFlattener::Flatten(ResourceTable* table, IArchiveWriter* archive_writer) {
bool error = false;
std::map<std::pair<ConfigDescription, StringPiece>, FileOperation> config_sorted_files;
@@ -587,6 +598,9 @@ bool ResourceFileFlattener::Flatten(ResourceTable* table, IArchiveWriter* archiv
}
}
+ // Update the type that this file will be written as.
+ file_ref->type = XmlFileTypeForOutputFormat(options_.output_format);
+
file_op.xml_to_flatten->file.config = config_value->config;
file_op.xml_to_flatten->file.source = file_ref->GetSource();
file_op.xml_to_flatten->file.name = ResourceName(pkg->name, type->type, entry->name);
@@ -625,12 +639,16 @@ bool ResourceFileFlattener::Flatten(ResourceTable* table, IArchiveWriter* archiv
<< config << "' -> '" << doc->file.config << "'");
}
- dst_path =
- ResourceUtils::BuildResourceFileName(doc->file, context_->GetNameMangler());
- bool result =
- table->AddFileReferenceMangled(doc->file.name, doc->file.config, doc->file.source,
- dst_path, nullptr, context_->GetDiagnostics());
- if (!result) {
+ const ResourceFile& file = doc->file;
+ dst_path = ResourceUtils::BuildResourceFileName(file, context_->GetNameMangler());
+
+ std::unique_ptr<FileReference> file_ref =
+ util::make_unique<FileReference>(table->string_pool.MakeRef(dst_path));
+ file_ref->SetSource(doc->file.source);
+ // Update the output format of this XML file.
+ file_ref->type = XmlFileTypeForOutputFormat(options_.output_format);
+ if (!table->AddResourceMangled(file.name, file.config, {}, std::move(file_ref),
+ context_->GetDiagnostics())) {
return false;
}
}
@@ -1446,6 +1464,13 @@ class LinkCommand {
ContainerReaderEntry* entry;
ContainerReader reader(input_stream.get());
+
+ if (reader.HadError()) {
+ context_->GetDiagnostics()->Error(DiagMessage(src)
+ << "failed to read file: " << reader.GetError());
+ return false;
+ }
+
while ((entry = reader.Next()) != nullptr) {
if (entry->Type() == ContainerEntryType::kResTable) {
pb::ResourceTable pb_table;