diff options
| author | 2018-10-09 15:08:41 -0700 | |
|---|---|---|
| committer | 2018-10-11 17:14:29 -0700 | |
| commit | 05aebf46b45b2abb48e883bc495907be223a5e0c (patch) | |
| tree | 6aa8cc9892f07832b763cc50d913b0e09eda6f26 | |
| parent | 167aa777b038a9833127a975c747d90f35aa5069 (diff) | |
Preserve compression of xml files in convert
Respect the compression the original compression of xml files when using
aapt2 convert. Uncompressed files should remain uncompressed, and
compressed files should remain compressed.
Bug: 117289326
Test: manual
Change-Id: I81b431b4a4abd81f5694ea7dc3b3c6ec8c13ca32
| -rw-r--r-- | tools/aapt2/cmd/Convert.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/tools/aapt2/cmd/Convert.cpp b/tools/aapt2/cmd/Convert.cpp index 954f1ed3fb72..3ea17552ea7c 100644 --- a/tools/aapt2/cmd/Convert.cpp +++ b/tools/aapt2/cmd/Convert.cpp @@ -46,7 +46,7 @@ class IApkSerializer { IApkSerializer(IAaptContext* context, const Source& source) : context_(context), source_(source) {} virtual bool SerializeXml(const xml::XmlResource* xml, const std::string& path, bool utf16, - IArchiveWriter* writer) = 0; + IArchiveWriter* writer, uint32_t compression_flags) = 0; virtual bool SerializeTable(ResourceTable* table, IArchiveWriter* writer) = 0; virtual bool SerializeFile(FileReference* file, IArchiveWriter* writer) = 0; @@ -59,7 +59,10 @@ class IApkSerializer { bool ConvertApk(IAaptContext* context, unique_ptr<LoadedApk> apk, IApkSerializer* serializer, IArchiveWriter* writer) { - if (!serializer->SerializeXml(apk->GetManifest(), kAndroidManifestPath, true /*utf16*/, writer)) { + io::IFile* manifest = apk->GetFileCollection()->FindFile(kAndroidManifestPath); + if (!serializer->SerializeXml(apk->GetManifest(), kAndroidManifestPath, true /*utf16*/, writer, + (manifest != nullptr && manifest->WasCompressed()) + ? ArchiveEntry::kCompress : 0u)) { context->GetDiagnostics()->Error(DiagMessage(apk->GetSource()) << "failed to serialize AndroidManifest.xml"); return false; @@ -133,7 +136,7 @@ class BinaryApkSerializer : public IApkSerializer { : IApkSerializer(context, source), tableFlattenerOptions_(options) {} bool SerializeXml(const xml::XmlResource* xml, const std::string& path, bool utf16, - IArchiveWriter* writer) override { + IArchiveWriter* writer, uint32_t compression_flags) override { BigBuffer buffer(4096); XmlFlattenerOptions options = {}; options.use_utf16 = utf16; @@ -144,8 +147,7 @@ class BinaryApkSerializer : public IApkSerializer { } io::BigBufferInputStream input_stream(&buffer); - return io::CopyInputStreamToArchive(context_, &input_stream, path, ArchiveEntry::kCompress, - writer); + return io::CopyInputStreamToArchive(context_, &input_stream, path, compression_flags, writer); } bool SerializeTable(ResourceTable* table, IArchiveWriter* writer) override { @@ -186,7 +188,8 @@ class BinaryApkSerializer : public IApkSerializer { return false; } - if (!SerializeXml(xml.get(), *file->path, false /*utf16*/, writer)) { + if (!SerializeXml(xml.get(), *file->path, false /*utf16*/, writer, + file->file->WasCompressed() ? ArchiveEntry::kCompress : 0u)) { context_->GetDiagnostics()->Error(DiagMessage(source_) << "failed to serialize to binary XML: " << *file->path); return false; @@ -216,10 +219,10 @@ class ProtoApkSerializer : public IApkSerializer { : IApkSerializer(context, source) {} bool SerializeXml(const xml::XmlResource* xml, const std::string& path, bool utf16, - IArchiveWriter* writer) override { + IArchiveWriter* writer, uint32_t compression_flags) override { pb::XmlNode pb_node; SerializeXmlResourceToPb(*xml, &pb_node); - return io::CopyProtoToArchive(context_, &pb_node, path, ArchiveEntry::kCompress, writer); + return io::CopyProtoToArchive(context_, &pb_node, path, compression_flags, writer); } bool SerializeTable(ResourceTable* table, IArchiveWriter* writer) override { @@ -246,7 +249,8 @@ class ProtoApkSerializer : public IApkSerializer { return false; } - if (!SerializeXml(xml.get(), *file->path, false /*utf16*/, writer)) { + if (!SerializeXml(xml.get(), *file->path, false /*utf16*/, writer, + file->file->WasCompressed() ? ArchiveEntry::kCompress : 0u)) { context_->GetDiagnostics()->Error(DiagMessage(source_) << "failed to serialize to proto XML: " << *file->path); return false; |