Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d55bef78 authored by Pierre Lecesne's avatar Pierre Lecesne
Browse files

AAPT2 - Convert command to copy all the files.

Test: Manual

Change-Id: I8705966cb34ff41eb362126a35956720147fae91
parent a591149c
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -235,8 +235,7 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
        return false;
      }
    } else {
      uint32_t compression_flags = file->WasCompressed() ? ArchiveEntry::kCompress : 0u;
      if (!io::CopyFileToArchive(context, file, path, compression_flags, writer)) {
      if (!io::CopyFileToArchivePreserveCompression(context, file, path, writer)) {
        return false;
      }
    }
+33 −12
Original line number Diff line number Diff line
@@ -46,17 +46,6 @@ class ISerializer {
  virtual bool SerializeTable(ResourceTable* table, IArchiveWriter* writer) = 0;
  virtual bool SerializeFile(const FileReference* file, IArchiveWriter* writer) = 0;

  bool CopyFileToArchive(const FileReference* file, IArchiveWriter* writer) {
    uint32_t compression_flags = file->file->WasCompressed() ? ArchiveEntry::kCompress : 0u;
    if (!io::CopyFileToArchive(context_, file->file, *file->path, compression_flags, writer)) {
      context_->GetDiagnostics()->Error(DiagMessage(source_)
                                        << "failed to copy file " << *file->path);
      return false;
    }

    return true;
  }

  virtual ~ISerializer() = default;

 protected:
@@ -66,18 +55,21 @@ class ISerializer {

bool ConvertProtoApkToBinaryApk(IAaptContext* context, unique_ptr<LoadedApk> apk,
                                ISerializer* serializer, IArchiveWriter* writer) {
  // AndroidManifest.xml
  if (!serializer->SerializeXml(apk->GetManifest(), kAndroidManifestPath, true /*utf16*/, writer)) {
    context->GetDiagnostics()->Error(DiagMessage(apk->GetSource())
                                     << "failed to serialize AndroidManifest.xml");
    return false;
  }

  // Resource table
  if (!serializer->SerializeTable(apk->GetResourceTable(), writer)) {
    context->GetDiagnostics()->Error(DiagMessage(apk->GetSource())
                                     << "failed to serialize the resource table");
    return false;
  }

  // Resources
  for (const auto& package : apk->GetResourceTable()->packages) {
    for (const auto& type : package->types) {
      for (const auto& entry : type->entries) {
@@ -100,6 +92,31 @@ bool ConvertProtoApkToBinaryApk(IAaptContext* context, unique_ptr<LoadedApk> apk
      } // entry
    } // type
  } // package

  // Other files
  std::unique_ptr<io::IFileCollectionIterator> iterator = apk->GetFileCollection()->Iterator();
  while (iterator->HasNext()) {
    io::IFile* file = iterator->Next();

    std::string path = file->GetSource().path;
    // The name of the path has the format "<zip-file-name>@<path-to-file>".
    path = path.substr(path.find('@') + 1);

    // Manifest, resource table and resources have already been taken care of.
    if (path == kAndroidManifestPath ||
        path == kApkResourceTablePath ||
        path == kProtoResourceTablePath ||
        path.find("res/") == 0) {
      continue;
    }

    if (!io::CopyFileToArchivePreserveCompression(context, file, path, writer)) {
      context->GetDiagnostics()->Error(DiagMessage(apk->GetSource())
                                       << "failed to copy file " << path);
      return false;
    }
  }

  return true;
}

@@ -169,7 +186,11 @@ class BinarySerializer : public ISerializer {
        return false;
      }
    } else {
      return CopyFileToArchive(file, writer);
      if (!io::CopyFileToArchivePreserveCompression(context_, file->file, *file->path, writer)) {
        context_->GetDiagnostics()->Error(DiagMessage(source_)
                                          << "failed to copy file " << *file->path);
        return false;
      }
    }

    return true;
+2 −4
Original line number Diff line number Diff line
@@ -256,9 +256,7 @@ class OptimizeCommand {

        for (auto& entry : config_sorted_files) {
          FileReference* file_ref = entry.second;
          uint32_t compression_flags =
              file_ref->file->WasCompressed() ? ArchiveEntry::kCompress : 0u;
          if (!io::CopyFileToArchive(context_, file_ref->file, *file_ref->path, compression_flags,
          if (!io::CopyFileToArchivePreserveCompression(context_, file_ref->file, *file_ref->path,
                                                        writer)) {
            return false;
          }
+6 −0
Original line number Diff line number Diff line
@@ -48,6 +48,12 @@ bool CopyFileToArchive(IAaptContext* context, io::IFile* file, const std::string
  return CopyInputStreamToArchive(context, data.get(), out_path, compression_flags, writer);
}

bool CopyFileToArchivePreserveCompression(IAaptContext* context, io::IFile* file,
                                          const std::string& out_path, IArchiveWriter* writer) {
  uint32_t compression_flags = file->WasCompressed() ? ArchiveEntry::kCompress : 0u;
  return CopyFileToArchive(context, file, out_path, compression_flags, writer);
}

bool CopyProtoToArchive(IAaptContext* context, ::google::protobuf::MessageLite* proto_msg,
                        const std::string& out_path, uint32_t compression_flags,
                        IArchiveWriter* writer) {
+3 −0
Original line number Diff line number Diff line
@@ -35,6 +35,9 @@ bool CopyInputStreamToArchive(IAaptContext* context, InputStream* in, const std:
bool CopyFileToArchive(IAaptContext* context, IFile* file, const std::string& out_path,
                       uint32_t compression_flags, IArchiveWriter* writer);

bool CopyFileToArchivePreserveCompression(IAaptContext* context, IFile* file,
                                          const std::string& out_path, IArchiveWriter* writer);

bool CopyProtoToArchive(IAaptContext* context, ::google::protobuf::MessageLite* proto_msg,
                        const std::string& out_path, uint32_t compression_flags,
                        IArchiveWriter* writer);