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

Commit 34b10c52 authored by Cory Smith's avatar Cory Smith Committed by android-build-merger
Browse files

Merge "Writes the resource table proto out when writing a LoadedApk." into pi-dev am: 449be810

am: 6a43bd63

Change-Id: I3e84028a1e74b28d2804d66971cf4610874ae349
parents d1457eea 6a43bd63
Loading
Loading
Loading
Loading
+19 −7
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include "format/binary/TableFlattener.h"
#include "format/binary/XmlFlattener.h"
#include "format/proto/ProtoDeserialize.h"
#include "format/proto/ProtoSerialize.h"
#include "io/BigBufferStream.h"
#include "io/Util.h"
#include "xml/XmlDom.h"
@@ -110,7 +111,7 @@ std::unique_ptr<LoadedApk> LoadedApk::LoadProtoApkFromFileCollection(
    return {};
  }
  return util::make_unique<LoadedApk>(source, std::move(collection), std::move(table),
                                      std::move(manifest));
                                      std::move(manifest), ApkFormat::kProto);
}

std::unique_ptr<LoadedApk> LoadedApk::LoadBinaryApkFromFileCollection(
@@ -153,7 +154,7 @@ std::unique_ptr<LoadedApk> LoadedApk::LoadBinaryApkFromFileCollection(
    return {};
  }
  return util::make_unique<LoadedApk>(source, std::move(collection), std::move(table),
                                      std::move(manifest));
                                      std::move(manifest), ApkFormat::kBinary);
}

bool LoadedApk::WriteToArchive(IAaptContext* context, const TableFlattenerOptions& options,
@@ -205,7 +206,7 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
    }

    // The resource table needs to be re-serialized since it might have changed.
    if (path == "resources.arsc") {
    if (format_ == ApkFormat::kBinary && path == kApkResourceTablePath) {
      BigBuffer buffer(4096);
      // TODO(adamlesinski): How to determine if there were sparse entries (and if to encode
      // with sparse entries) b/35389232.
@@ -215,11 +216,22 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
      }

      io::BigBufferInputStream input_stream(&buffer);
      if (!io::CopyInputStreamToArchive(context, &input_stream, path, ArchiveEntry::kAlign,
      if (!io::CopyInputStreamToArchive(context,
                                        &input_stream,
                                        path,
                                        ArchiveEntry::kAlign,
                                        writer)) {
        return false;
      }

    } else if (format_ == ApkFormat::kProto && path == kProtoResourceTablePath) {
      pb::ResourceTable pb_table;
      SerializeTableToPb(*split_table, &pb_table);
      if (!io::CopyProtoToArchive(context,
                                  &pb_table,
                                  path,
                                  ArchiveEntry::kAlign, writer)) {
        return false;
      }
    } else if (manifest != nullptr && path == "AndroidManifest.xml") {
      BigBuffer buffer(8192);
      XmlFlattenerOptions xml_flattener_options;
@@ -246,9 +258,9 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
}

ApkFormat LoadedApk::DetermineApkFormat(io::IFileCollection* apk) {
  if (apk->FindFile("resources.arsc") != nullptr) {
  if (apk->FindFile(kApkResourceTablePath) != nullptr) {
    return ApkFormat::kBinary;
  } else if (apk->FindFile("resources.pb") != nullptr) {
  } else if (apk->FindFile(kProtoResourceTablePath) != nullptr) {
    return ApkFormat::kProto;
  } else {
    // If the resource table is not present, attempt to read the manifest.
+5 −2
Original line number Diff line number Diff line
@@ -57,11 +57,13 @@ class LoadedApk {
      const Source& source, std::unique_ptr<io::IFileCollection> collection, IDiagnostics* diag);

  LoadedApk(const Source& source, std::unique_ptr<io::IFileCollection> apk,
            std::unique_ptr<ResourceTable> table, std::unique_ptr<xml::XmlResource> manifest)
            std::unique_ptr<ResourceTable> table, std::unique_ptr<xml::XmlResource> manifest,
            const ApkFormat& format)
      : source_(source),
        apk_(std::move(apk)),
        table_(std::move(table)),
        manifest_(std::move(manifest)) {
        manifest_(std::move(manifest)),
        format_(format) {
  }

  io::IFileCollection* GetFileCollection() {
@@ -112,6 +114,7 @@ class LoadedApk {
  std::unique_ptr<io::IFileCollection> apk_;
  std::unique_ptr<ResourceTable> table_;
  std::unique_ptr<xml::XmlResource> manifest_;
  ApkFormat format_;

  static ApkFormat DetermineApkFormat(io::IFileCollection* apk);
};
+3 −3
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ class MultiApkGeneratorTest : public ::testing::Test {
TEST_F(MultiApkGeneratorTest, VersionFilterNewerVersion) {
  std::unique_ptr<ResourceTable> table = BuildTable();

  LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}};
  LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}, kBinary};
  std::unique_ptr<IAaptContext> ctx = test::ContextBuilder().SetMinSdkVersion(19).Build();
  FilterChain chain;

@@ -131,7 +131,7 @@ TEST_F(MultiApkGeneratorTest, VersionFilterNewerVersion) {
TEST_F(MultiApkGeneratorTest, VersionFilterOlderVersion) {
  std::unique_ptr<ResourceTable> table = BuildTable();

  LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}};
  LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}, kBinary};
  std::unique_ptr<IAaptContext> ctx = test::ContextBuilder().SetMinSdkVersion(1).Build();
  FilterChain chain;

@@ -156,7 +156,7 @@ TEST_F(MultiApkGeneratorTest, VersionFilterOlderVersion) {
TEST_F(MultiApkGeneratorTest, VersionFilterNoVersion) {
  std::unique_ptr<ResourceTable> table = BuildTable();

  LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}};
  LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}, kBinary};
  std::unique_ptr<IAaptContext> ctx = test::ContextBuilder().SetMinSdkVersion(1).Build();
  FilterChain chain;