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

Commit 998758d3 authored by Jeremy Meyer's avatar Jeremy Meyer Committed by Android (Google) Code Review
Browse files

Merge "Allow AssetFileDescriptors to be used to create FRROs" into main

parents 2d1fcecb c04bcb39
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -265,6 +265,7 @@ Status Idmap2Service::createFabricatedOverlay(
            res.configuration.value_or(std::string()));
            res.configuration.value_or(std::string()));
    } else if (res.binaryData.has_value()) {
    } else if (res.binaryData.has_value()) {
      builder.SetResourceValue(res.resourceName, res.binaryData->get(),
      builder.SetResourceValue(res.resourceName, res.binaryData->get(),
                               res.binaryDataOffset, res.binaryDataSize,
                               res.configuration.value_or(std::string()));
                               res.configuration.value_or(std::string()));
    } else {
    } else {
      builder.SetResourceValue(res.resourceName, res.dataType, res.data,
      builder.SetResourceValue(res.resourceName, res.dataType, res.data,
+2 −0
Original line number Original line Diff line number Diff line
@@ -26,4 +26,6 @@ parcelable FabricatedOverlayInternalEntry {
    @nullable @utf8InCpp String stringData;
    @nullable @utf8InCpp String stringData;
    @nullable ParcelFileDescriptor binaryData;
    @nullable ParcelFileDescriptor binaryData;
    @nullable @utf8InCpp String configuration;
    @nullable @utf8InCpp String configuration;
    long binaryDataOffset;
    long binaryDataSize;
}
}
 No newline at end of file
+12 −2
Original line number Original line Diff line number Diff line
@@ -49,6 +49,8 @@ struct FabricatedOverlay {


    Builder& SetResourceValue(const std::string& resource_name,
    Builder& SetResourceValue(const std::string& resource_name,
                              std::optional<android::base::borrowed_fd>&& binary_value,
                              std::optional<android::base::borrowed_fd>&& binary_value,
                              off64_t data_binary_offset,
                              size_t data_binary_size,
                              const std::string& configuration);
                              const std::string& configuration);


    inline Builder& setFrroPath(std::string frro_path) {
    inline Builder& setFrroPath(std::string frro_path) {
@@ -65,6 +67,8 @@ struct FabricatedOverlay {
      DataValue data_value;
      DataValue data_value;
      std::string data_string_value;
      std::string data_string_value;
      std::optional<android::base::borrowed_fd> data_binary_value;
      std::optional<android::base::borrowed_fd> data_binary_value;
      off64_t data_binary_offset;
      size_t data_binary_size;
      std::string configuration;
      std::string configuration;
    };
    };


@@ -76,6 +80,12 @@ struct FabricatedOverlay {
    std::vector<Entry> entries_;
    std::vector<Entry> entries_;
  };
  };


  struct BinaryData {
    android::base::borrowed_fd file_descriptor;
    off64_t offset;
    size_t size;
  };

  Result<Unit> ToBinaryStream(std::ostream& stream) const;
  Result<Unit> ToBinaryStream(std::ostream& stream) const;
  static Result<FabricatedOverlay> FromBinaryStream(std::istream& stream);
  static Result<FabricatedOverlay> FromBinaryStream(std::istream& stream);


@@ -92,13 +102,13 @@ struct FabricatedOverlay {


  explicit FabricatedOverlay(pb::FabricatedOverlay&& overlay,
  explicit FabricatedOverlay(pb::FabricatedOverlay&& overlay,
                             std::string&& string_pool_data_,
                             std::string&& string_pool_data_,
                             std::vector<android::base::borrowed_fd> binary_files_,
                             std::vector<FabricatedOverlay::BinaryData> binary_files_,
                             off_t total_binary_bytes_,
                             off_t total_binary_bytes_,
                             std::optional<uint32_t> crc_from_disk = {});
                             std::optional<uint32_t> crc_from_disk = {});


  pb::FabricatedOverlay overlay_pb_;
  pb::FabricatedOverlay overlay_pb_;
  std::string string_pool_data_;
  std::string string_pool_data_;
  std::vector<android::base::borrowed_fd> binary_files_;
  std::vector<FabricatedOverlay::BinaryData> binary_files_;
  uint32_t total_binary_bytes_;
  uint32_t total_binary_bytes_;
  std::optional<uint32_t> crc_from_disk_;
  std::optional<uint32_t> crc_from_disk_;
  mutable std::optional<SerializedData> data_;
  mutable std::optional<SerializedData> data_;
+2 −0
Original line number Original line Diff line number Diff line
@@ -43,6 +43,8 @@ struct TargetValue {
  DataValue data_value;
  DataValue data_value;
  std::string data_string_value;
  std::string data_string_value;
  std::optional<android::base::borrowed_fd> data_binary_value;
  std::optional<android::base::borrowed_fd> data_binary_value;
  off64_t data_binary_offset;
  size_t data_binary_size;
};
};


struct TargetValueWithConfig {
struct TargetValueWithConfig {
+18 −16
Original line number Original line Diff line number Diff line
@@ -55,7 +55,7 @@ void Write32(std::ostream& stream, uint32_t value) {


FabricatedOverlay::FabricatedOverlay(pb::FabricatedOverlay&& overlay,
FabricatedOverlay::FabricatedOverlay(pb::FabricatedOverlay&& overlay,
                                     std::string&& string_pool_data,
                                     std::string&& string_pool_data,
                                     std::vector<android::base::borrowed_fd> binary_files,
                                     std::vector<FabricatedOverlay::BinaryData> binary_files,
                                     off_t total_binary_bytes,
                                     off_t total_binary_bytes,
                                     std::optional<uint32_t> crc_from_disk)
                                     std::optional<uint32_t> crc_from_disk)
    : overlay_pb_(std::forward<pb::FabricatedOverlay>(overlay)),
    : overlay_pb_(std::forward<pb::FabricatedOverlay>(overlay)),
@@ -81,7 +81,7 @@ FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue(
    const std::string& resource_name, uint8_t data_type, uint32_t data_value,
    const std::string& resource_name, uint8_t data_type, uint32_t data_value,
    const std::string& configuration) {
    const std::string& configuration) {
  entries_.emplace_back(
  entries_.emplace_back(
      Entry{resource_name, data_type, data_value, "", std::nullopt, configuration});
      Entry{resource_name, data_type, data_value, "", std::nullopt, 0, 0, configuration});
  return *this;
  return *this;
}
}


@@ -89,14 +89,15 @@ FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue(
    const std::string& resource_name, uint8_t data_type, const std::string& data_string_value,
    const std::string& resource_name, uint8_t data_type, const std::string& data_string_value,
    const std::string& configuration) {
    const std::string& configuration) {
  entries_.emplace_back(
  entries_.emplace_back(
      Entry{resource_name, data_type, 0, data_string_value, std::nullopt, configuration});
      Entry{resource_name, data_type, 0, data_string_value, std::nullopt, 0, 0, configuration});
  return *this;
  return *this;
}
}


FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue(
FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue(
    const std::string& resource_name, std::optional<android::base::borrowed_fd>&& binary_value,
    const std::string& resource_name, std::optional<android::base::borrowed_fd>&& binary_value,
    const std::string& configuration) {
    off64_t data_binary_offset, size_t data_binary_size, const std::string& configuration) {
  entries_.emplace_back(Entry{resource_name, 0, 0, "", binary_value, configuration});
  entries_.emplace_back(Entry{resource_name, 0, 0, "", binary_value,
                              data_binary_offset, data_binary_size, configuration});
  return *this;
  return *this;
}
}


@@ -148,7 +149,8 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() {
    }
    }


    value->second = TargetValue{res_entry.data_type, res_entry.data_value,
    value->second = TargetValue{res_entry.data_type, res_entry.data_value,
        res_entry.data_string_value, res_entry.data_binary_value};
                                res_entry.data_string_value, res_entry.data_binary_value,
                                res_entry.data_binary_offset, res_entry.data_binary_size};
  }
  }


  pb::FabricatedOverlay overlay_pb;
  pb::FabricatedOverlay overlay_pb;
@@ -157,7 +159,7 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() {
  overlay_pb.set_target_package_name(target_package_name_);
  overlay_pb.set_target_package_name(target_package_name_);
  overlay_pb.set_target_overlayable(target_overlayable_);
  overlay_pb.set_target_overlayable(target_overlayable_);


  std::vector<android::base::borrowed_fd> binary_files;
  std::vector<FabricatedOverlay::BinaryData> binary_files;
  size_t total_binary_bytes = 0;
  size_t total_binary_bytes = 0;
  // 16 for the number of bytes in the frro file before the binary data
  // 16 for the number of bytes in the frro file before the binary data
  const size_t FRRO_HEADER_SIZE = 16;
  const size_t FRRO_HEADER_SIZE = 16;
@@ -182,16 +184,15 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() {
            pb_value->set_data_value(ref.index());
            pb_value->set_data_value(ref.index());
          } else if (value.second.data_binary_value.has_value()) {
          } else if (value.second.data_binary_value.has_value()) {
              pb_value->set_data_type(Res_value::TYPE_STRING);
              pb_value->set_data_type(Res_value::TYPE_STRING);
              struct stat s;
              if (fstat(value.second.data_binary_value->get(), &s) == -1) {
                return Error("unable to get size of binary file: %d", errno);
              }
              std::string uri
              std::string uri
                  = StringPrintf("frro:/%s?offset=%d&size=%d", frro_path_.c_str(),
                  = StringPrintf("frro:/%s?offset=%d&size=%d", frro_path_.c_str(),
                                 static_cast<int> (FRRO_HEADER_SIZE + total_binary_bytes),
                                 static_cast<int> (FRRO_HEADER_SIZE + total_binary_bytes),
                                 static_cast<int> (s.st_size));
                                 static_cast<int> (value.second.data_binary_size));
              total_binary_bytes += s.st_size;
              total_binary_bytes += value.second.data_binary_size;
              binary_files.emplace_back(value.second.data_binary_value->get());
              binary_files.emplace_back(FabricatedOverlay::BinaryData{
                  value.second.data_binary_value->get(),
                  value.second.data_binary_offset,
                  value.second.data_binary_size});
              auto ref = string_pool.MakeRef(std::move(uri));
              auto ref = string_pool.MakeRef(std::move(uri));
              pb_value->set_data_value(ref.index());
              pb_value->set_data_value(ref.index());
          } else {
          } else {
@@ -310,8 +311,9 @@ Result<Unit> FabricatedOverlay::ToBinaryStream(std::ostream& stream) const {
  Write32(stream, (*data)->pb_crc);
  Write32(stream, (*data)->pb_crc);
  Write32(stream, total_binary_bytes_);
  Write32(stream, total_binary_bytes_);
  std::string file_contents;
  std::string file_contents;
  for (const android::base::borrowed_fd fd : binary_files_) {
  for (const FabricatedOverlay::BinaryData fd : binary_files_) {
    if (!ReadFdToString(fd, &file_contents)) {
    file_contents.resize(fd.size);
    if (!ReadFullyAtOffset(fd.file_descriptor, file_contents.data(), fd.size, fd.offset)) {
      return Error("Failed to read binary file data.");
      return Error("Failed to read binary file data.");
    }
    }
    stream.write(file_contents.data(), file_contents.length());
    stream.write(file_contents.data(), file_contents.length());
Loading