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

Commit 28cbafd0 authored by Adam Lesinski's avatar Adam Lesinski Committed by android-build-merger
Browse files

Merge "AAPT2: Share split functionality between link and optimize" into oc-dev am: 3750fd24

am: c9b051fc

Change-Id: Iba627ab405c847424bbb1d24e06fe2a24daa49e7
parents dcc92a8a c9b051fc
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -15,11 +15,12 @@
//

toolSources = [
    "compile/Compile.cpp",
    "diff/Diff.cpp",
    "dump/Dump.cpp",
    "link/Link.cpp",
    "optimize/Optimize.cpp",
    "cmd/Compile.cpp",
    "cmd/Diff.cpp",
    "cmd/Dump.cpp",
    "cmd/Link.cpp",
    "cmd/Optimize.cpp",
    "cmd/Util.cpp",
]

cc_defaults {
@@ -90,7 +91,7 @@ cc_library_host_static {
        "io/BigBufferStreams.cpp",
        "io/File.cpp",
        "io/FileSystem.cpp",
        "io/Io.cpp",
        "io/Util.cpp",
        "io/ZipArchive.cpp",
        "link/AutoVersioner.cpp",
        "link/ManifestFixer.cpp",
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ struct AppInfo {
  std::string package;

  // The app's minimum SDK version, if it is defined.
  Maybe<std::string> min_sdk_version;
  Maybe<int> min_sdk_version;

  // The app's version code, if it is defined.
  Maybe<uint32_t> version_code;
+9 −13
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include "flatten/Archive.h"
#include "flatten/TableFlattener.h"
#include "io/BigBufferInputStream.h"
#include "io/Util.h"

namespace aapt {

@@ -47,11 +48,10 @@ std::unique_ptr<LoadedApk> LoadedApk::LoadApkFromPath(IAaptContext* context,
  }

  std::unique_ptr<ResourceTable> table = util::make_unique<ResourceTable>();
  BinaryResourceParser parser(context, table.get(), source, data->data(), data->size());
  BinaryResourceParser parser(context, table.get(), source, data->data(), data->size(), apk.get());
  if (!parser.Parse()) {
    return {};
  }

  return util::make_unique<LoadedApk>(source, std::move(apk), std::move(table));
}

@@ -100,22 +100,18 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, const TableFlattenerOption
      }

      io::BigBufferInputStream input_stream(&buffer);
      if (!writer->WriteFile(path, ArchiveEntry::kAlign, &input_stream)) {
        context->GetDiagnostics()->Error(DiagMessage()
                                         << "Error when writing file '" << path << "' in APK.");
      if (!io::CopyInputStreamToArchive(context, &input_stream, path, ArchiveEntry::kAlign,
                                        writer)) {
        return false;
      }
      continue;
    }

    std::unique_ptr<io::IData> data = file->OpenAsData();
    } else {
      uint32_t compression_flags = file->WasCompressed() ? ArchiveEntry::kCompress : 0u;
    if (!writer->WriteFile(path, compression_flags, data.get())) {
      context->GetDiagnostics()->Error(DiagMessage()
                                       << "Error when writing file '" << path << "' in APK.");
      if (!io::CopyFileToArchive(context, file, path, compression_flags, writer)) {
        return false;
      }
    }
  }
  return true;
}

+1 −1
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ namespace aapt {
static const char* sMajorVersion = "2";

// Update minor version whenever a feature or flag is added.
static const char* sMinorVersion = "12";
static const char* sMinorVersion = "13";

int PrintVersion() {
  std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "."
+60 −0
Original line number Diff line number Diff line
@@ -675,5 +675,65 @@ std::string BuildResourceFileName(const ResourceFile& res_file,
  return out.str();
}

std::unique_ptr<Item> ParseBinaryResValue(const ResourceType& type, const ConfigDescription& config,
                                          const android::ResStringPool& src_pool,
                                          const android::Res_value& res_value,
                                          StringPool* dst_pool) {
  if (type == ResourceType::kId) {
    return util::make_unique<Id>();
  }

  const uint32_t data = util::DeviceToHost32(res_value.data);
  switch (res_value.dataType) {
    case android::Res_value::TYPE_STRING: {
      const std::string str = util::GetString(src_pool, data);
      const android::ResStringPool_span* spans = src_pool.styleAt(data);

      // Check if the string has a valid style associated with it.
      if (spans != nullptr && spans->name.index != android::ResStringPool_span::END) {
        StyleString style_str = {str};
        while (spans->name.index != android::ResStringPool_span::END) {
          style_str.spans.push_back(Span{util::GetString(src_pool, spans->name.index),
                                         spans->firstChar, spans->lastChar});
          spans++;
        }
        return util::make_unique<StyledString>(dst_pool->MakeRef(
            style_str, StringPool::Context(StringPool::Context::kStylePriority, config)));
      } else {
        if (type != ResourceType::kString && util::StartsWith(str, "res/")) {
          // This must be a FileReference.
          return util::make_unique<FileReference>(dst_pool->MakeRef(
              str, StringPool::Context(StringPool::Context::kHighPriority, config)));
        }

        // There are no styles associated with this string, so treat it as a simple string.
        return util::make_unique<String>(dst_pool->MakeRef(str, StringPool::Context(config)));
      }
    } break;

    case android::Res_value::TYPE_REFERENCE:
    case android::Res_value::TYPE_ATTRIBUTE:
    case android::Res_value::TYPE_DYNAMIC_REFERENCE:
    case android::Res_value::TYPE_DYNAMIC_ATTRIBUTE: {
      Reference::Type ref_type = Reference::Type::kResource;
      if (res_value.dataType == android::Res_value::TYPE_ATTRIBUTE ||
          res_value.dataType == android::Res_value::TYPE_DYNAMIC_ATTRIBUTE) {
        ref_type = Reference::Type::kAttribute;
      }

      if (data == 0) {
        // A reference of 0, must be the magic @null reference.
        return util::make_unique<BinaryPrimitive>(android::Res_value::TYPE_REFERENCE, 0u);
      }

      // This is a normal reference.
      return util::make_unique<Reference>(data, ref_type);
    } break;
  }

  // Treat this as a raw binary primitive.
  return util::make_unique<BinaryPrimitive>(res_value);
}

}  // namespace ResourceUtils
}  // namespace aapt
Loading