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

Commit ef9e6883 authored by Ryan Mitchell's avatar Ryan Mitchell
Browse files

Add --exclude-sources to AAPT2 link

Information about where resources are defined can make having
reproducible builds more difficult, makes the generates resources.pb
large, and can exposes details about the machines that compiled the
resources.

The --exclude-sources flags can only be used when building a proto APK
and prevents source information from being included in the generated
resources protobuf.

Bug: 134929532
Test: checked debug string with and without the string
Change-Id: Ia345f067fe781ea82a4bcad37eb55576c72c44d7
parent c39db508
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1084,7 +1084,8 @@ class Linker {

      case OutputFormat::kProto: {
        pb::ResourceTable pb_table;
        SerializeTableToPb(*table, &pb_table, context_->GetDiagnostics());
        SerializeTableToPb(*table, &pb_table, context_->GetDiagnostics(),
                           options_.proto_table_flattener_options);
        return io::CopyProtoToArchive(context_, &pb_table, kProtoResourceTablePath,
                                      ArchiveEntry::kCompress, writer);
      } break;
+16 −9
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include "Resource.h"
#include "split/TableSplitter.h"
#include "format/binary/TableFlattener.h"
#include "format/proto/ProtoSerialize.h"
#include "link/ManifestFixer.h"
#include "trace/TraceBuffer.h"

@@ -81,6 +82,7 @@ struct LinkOptions {

  // Flattening options.
  TableFlattenerOptions table_flattener_options;
  SerializeTableOptions proto_table_flattener_options;
  bool keep_raw_values = false;

  // Split APK options.
@@ -283,13 +285,18 @@ class LinkCommand : public Command {
    AddOptionalSwitch("--strict-visibility",
        "Do not allow overlays with different visibility levels.",
        &options_.strict_visibility);
    AddOptionalSwitch("-v", "Enables verbose logging.", &verbose_);
    AddOptionalFlag("--trace-folder", "Generate systrace json trace fragment to specified folder.",
    AddOptionalSwitch("--exclude-sources",
        "Do not serialize source file information when generating resources in\n"
            "Protobuf format.",
        &options_.proto_table_flattener_options.exclude_sources);
    AddOptionalFlag("--trace-folder",
        "Generate systrace json trace fragment to specified folder.",
        &trace_folder_);
    AddOptionalSwitch("--merge-only",
        "Only merge the resources, without verifying resource references. This flag\n"
            "should only be used together with the --static-lib flag.",
        &options_.merge_only);
    AddOptionalSwitch("-v", "Enables verbose logging.", &verbose_);
  }

  int Action(const std::vector<std::string>& args) override;
+27 −14
Original line number Diff line number Diff line
@@ -290,9 +290,11 @@ static void SerializeOverlayableItemToPb(const OverlayableItem& overlayable_item
    pb::Overlayable* pb_overlayable = pb_table->add_overlayable();
    pb_overlayable->set_name(overlayable_item.overlayable->name);
    pb_overlayable->set_actor(overlayable_item.overlayable->actor);
    if (source_pool != nullptr) {
      SerializeSourceToPb(overlayable_item.overlayable->source, source_pool,
                          pb_overlayable->mutable_source());
    }
  }

  pb::OverlayableItem* pb_overlayable_item = pb_entry->mutable_overlayable_item();
  pb_overlayable_item->set_overlayable_idx(i);
@@ -319,14 +321,17 @@ static void SerializeOverlayableItemToPb(const OverlayableItem& overlayable_item
    pb_overlayable_item->add_policy(pb::OverlayableItem::OEM);
  }

  if (source_pool != nullptr) {
    SerializeSourceToPb(overlayable_item.source, source_pool,
                        pb_overlayable_item->mutable_source());
  }
  pb_overlayable_item->set_comment(overlayable_item.comment);
}

void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table,
                        IDiagnostics* diag) {
  StringPool source_pool;
                        IDiagnostics* diag, SerializeTableOptions options) {
  auto source_pool = (options.exclude_sources) ? nullptr : util::make_unique<StringPool>();

  pb::ToolFingerprint* pb_fingerprint = out_table->add_tool_fingerprint();
  pb_fingerprint->set_tool(util::GetToolName());
  pb_fingerprint->set_version(util::GetToolFingerprint());
@@ -356,32 +361,40 @@ void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table
        // Write the Visibility struct.
        pb::Visibility* pb_visibility = pb_entry->mutable_visibility();
        pb_visibility->set_level(SerializeVisibilityToPb(entry->visibility.level));
        SerializeSourceToPb(entry->visibility.source, &source_pool,
        if (source_pool != nullptr) {
          SerializeSourceToPb(entry->visibility.source, source_pool.get(),
                              pb_visibility->mutable_source());
        }
        pb_visibility->set_comment(entry->visibility.comment);

        if (entry->allow_new) {
          pb::AllowNew* pb_allow_new = pb_entry->mutable_allow_new();
          SerializeSourceToPb(entry->allow_new.value().source, &source_pool,
          if (source_pool != nullptr) {
            SerializeSourceToPb(entry->allow_new.value().source, source_pool.get(),
                                pb_allow_new->mutable_source());
          }
          pb_allow_new->set_comment(entry->allow_new.value().comment);
        }

        if (entry->overlayable_item) {
          SerializeOverlayableItemToPb(entry->overlayable_item.value(), overlayables, &source_pool,
                                       pb_entry, out_table);
          SerializeOverlayableItemToPb(entry->overlayable_item.value(), overlayables,
                                       source_pool.get(), pb_entry, out_table);
        }

        for (const std::unique_ptr<ResourceConfigValue>& config_value : entry->values) {
          pb::ConfigValue* pb_config_value = pb_entry->add_config_value();
          SerializeConfig(config_value->config, pb_config_value->mutable_config());
          pb_config_value->mutable_config()->set_product(config_value->product);
          SerializeValueToPb(*config_value->value, pb_config_value->mutable_value(), &source_pool);
          SerializeValueToPb(*config_value->value, pb_config_value->mutable_value(),
                             source_pool.get());
        }
      }
    }
  }

  if (source_pool != nullptr) {
    SerializeStringPoolToPb(*source_pool, out_table->mutable_source_pool(), diag);
  }
  SerializeStringPoolToPb(source_pool, out_table->mutable_source_pool(), diag);
}

static pb::Reference_Type SerializeReferenceTypeToPb(Reference::Type type) {
+7 −1
Original line number Diff line number Diff line
@@ -35,6 +35,11 @@ struct SerializeXmlOptions {
  bool remove_empty_text_nodes = false;
};

struct SerializeTableOptions {
    /** Prevent serializing the source pool and source protos.  */
    bool exclude_sources = false;
};

// Serializes a Value to its protobuf representation. An optional StringPool will hold the
// source path string.
void SerializeValueToPb(const Value& value, pb::Value* out_value, StringPool* src_pool = nullptr);
@@ -59,7 +64,8 @@ void SerializeStringPoolToPb(const StringPool& pool, pb::StringPool* out_pb_pool
void SerializeConfig(const android::ConfigDescription& config, pb::Configuration* out_pb_config);

// Serializes a ResourceTable into its protobuf representation.
void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table, IDiagnostics* diag);
void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table,
                        IDiagnostics* diag, SerializeTableOptions options = {});

// Serializes a ResourceFile into its protobuf representation.
void SerializeCompiledFileToPb(const ResourceFile& file, pb::internal::CompiledFile* out_file);