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

Commit 3ed35d3d authored by Tao Bao's avatar Tao Bao
Browse files

releasetools: Fix the support for getting reproducible images.

We used to support getting idempotent images when given the same inputs,
by specifying UUID and AVB salt to the image builders. The support was
broken by Q changes that moved away from build-time fingerprints [1].

This CL addresses the issue by updating the logic in computing UUID and
AVB salt to be based on BuildInfo.fingerprint, as opposed to the
deprecated static build fingerprint.

[1] https://android-review.googlesource.com/c/platform/build/+/892933

Bug: 134525174
Test: TreeHugger
Test: lunch a target; `atest --host releasetools_test releasetools_py3_test`
Test: `m dist`; `unzip out/dist/target_files.zip IMAGES/\*`;
      `zip -d out/dist/target_files.zip IMAGES/\*`
Test: `add_img_to_target_files -a out/dist/target_files.zip`. Verify that
      the rebuilt images are identical to the ones deleted.
Change-Id: I8844fc7f044e9abfcd96a00e8958fa0583c70eaf
parent 1c320f85
Loading
Loading
Loading
Loading
+3 −8
Original line number Diff line number Diff line
@@ -337,13 +337,8 @@ def CreateImage(input_dir, info_dict, what, output_file, block_list=None):

  # Use repeatable ext4 FS UUID and hash_seed UUID (based on partition name and
  # build fingerprint).
  uuid_seed = what + "-"
  if "build.prop" in info_dict:
    build_prop = info_dict["build.prop"]
    if "ro.build.fingerprint" in build_prop:
      uuid_seed += build_prop["ro.build.fingerprint"]
    elif "ro.build.thumbprint" in build_prop:
      uuid_seed += build_prop["ro.build.thumbprint"]
  build_info = common.BuildInfo(info_dict)
  uuid_seed = what + "-" + build_info.fingerprint
  image_props["uuid"] = str(uuid.uuid5(uuid.NAMESPACE_URL, uuid_seed))
  hash_seed = "hash_seed-" + uuid_seed
  image_props["hash_seed"] = str(uuid.uuid5(uuid.NAMESPACE_URL, hash_seed))
@@ -728,7 +723,7 @@ def AddImagesToTargetFiles(filename):

  # A map between partition names and their paths, which could be used when
  # generating AVB vbmeta image.
  partitions = dict()
  partitions = {}

  def banner(s):
    logger.info("\n\n++++ %s  ++++\n\n", s)
+6 −14
Original line number Diff line number Diff line
@@ -319,7 +319,7 @@ class BuildInfo(object):
  _RO_PRODUCT_PROPS_DEFAULT_SOURCE_ORDER = ["product", "odm", "vendor",
                                            "system_ext", "system"]

  def __init__(self, info_dict, oem_dicts):
  def __init__(self, info_dict, oem_dicts=None):
    """Initializes a BuildInfo instance with the given dicts.

    Note that it only wraps up the given dicts, without making copies.
@@ -628,18 +628,11 @@ def LoadInfoDict(input_file, repacking=False):
          read_helper, "{}/etc/build.prop".format(partition.upper()))
  d["build.prop"] = d["system.build.prop"]

  # Set up the salt (based on fingerprint or thumbprint) that will be used when
  # adding AVB footer.
  # Set up the salt (based on fingerprint) that will be used when adding AVB
  # hash / hashtree footers.
  if d.get("avb_enable") == "true":
    fp = None
    if "build.prop" in d:
      build_prop = d["build.prop"]
      if "ro.build.fingerprint" in build_prop:
        fp = build_prop["ro.build.fingerprint"]
      elif "ro.build.thumbprint" in build_prop:
        fp = build_prop["ro.build.thumbprint"]
    if fp:
      d["avb_salt"] = sha256(fp).hexdigest()
    build_info = BuildInfo(d)
    d["avb_salt"] = sha256(build_info.fingerprint).hexdigest()

  return d

@@ -883,7 +876,6 @@ def GetAvbPartitionArg(partition, image, info_dict=None):
  if key_path:
    chained_partition_arg = GetAvbChainedPartitionArg(partition, info_dict)
    return ["--chain_partition", chained_partition_arg]
  else:
  return ["--include_descriptors_from_image", image]