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

Commit b7ade64e authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Trigger data wipe on spl-downgrade as well"

parents e48dccaa 06400177
Loading
Loading
Loading
Loading
+38 −32
Original line number Original line Diff line number Diff line
@@ -297,8 +297,6 @@ SECONDARY_PAYLOAD_SKIPPED_IMAGES = [
    'vendor_boot']
    'vendor_boot']






class PayloadSigner(object):
class PayloadSigner(object):
  """A class that wraps the payload signing works.
  """A class that wraps the payload signing works.


@@ -765,10 +763,12 @@ def GetTargetFilesZipWithoutPostinstallConfig(input_file):
  common.ZipDelete(target_file, POSTINSTALL_CONFIG)
  common.ZipDelete(target_file, POSTINSTALL_CONFIG)
  return target_file
  return target_file



def ParseInfoDict(target_file_path):
def ParseInfoDict(target_file_path):
  with zipfile.ZipFile(target_file_path, 'r', allowZip64=True) as zfp:
  with zipfile.ZipFile(target_file_path, 'r', allowZip64=True) as zfp:
    return common.LoadInfoDict(zfp)
    return common.LoadInfoDict(zfp)



def GetTargetFilesZipForPartialUpdates(input_file, ab_partitions):
def GetTargetFilesZipForPartialUpdates(input_file, ab_partitions):
  """Returns a target-files.zip for partial ota update package generation.
  """Returns a target-files.zip for partial ota update package generation.


@@ -963,12 +963,14 @@ def GetTargetFilesZipForCustomImagesUpdates(input_file, custom_images):


  return target_file
  return target_file



def GeneratePartitionTimestampFlags(partition_state):
def GeneratePartitionTimestampFlags(partition_state):
  partition_timestamps = [
  partition_timestamps = [
      part.partition_name + ":" + part.version
      part.partition_name + ":" + part.version
      for part in partition_state]
      for part in partition_state]
  return ["--partition_timestamps", ",".join(partition_timestamps)]
  return ["--partition_timestamps", ",".join(partition_timestamps)]



def GeneratePartitionTimestampFlagsDowngrade(
def GeneratePartitionTimestampFlagsDowngrade(
        pre_partition_state, post_partition_state):
        pre_partition_state, post_partition_state):
  assert pre_partition_state is not None
  assert pre_partition_state is not None
@@ -980,15 +982,18 @@ def GeneratePartitionTimestampFlagsDowngrade(
        max(part.version, partition_timestamps[part.partition_name])
        max(part.version, partition_timestamps[part.partition_name])
  return [
  return [
      "--partition_timestamps",
      "--partition_timestamps",
      ",".join([key + ":" + val for (key, val) in partition_timestamps.items()])
      ",".join([key + ":" + val for (key, val)
                in partition_timestamps.items()])
  ]
  ]



def IsSparseImage(filepath):
def IsSparseImage(filepath):
  with open(filepath, 'rb') as fp:
  with open(filepath, 'rb') as fp:
    # Magic for android sparse image format
    # Magic for android sparse image format
    # https://source.android.com/devices/bootloader/images
    # https://source.android.com/devices/bootloader/images
    return fp.read(4) == b'\x3A\xFF\x26\xED'
    return fp.read(4) == b'\x3A\xFF\x26\xED'



def SupportsMainlineGkiUpdates(target_file):
def SupportsMainlineGkiUpdates(target_file):
  """Return True if the build supports MainlineGKIUpdates.
  """Return True if the build supports MainlineGKIUpdates.


@@ -1027,6 +1032,7 @@ def SupportsMainlineGkiUpdates(target_file):
  pattern = re.compile(r"com\.android\.gki\..*\.apex")
  pattern = re.compile(r"com\.android\.gki\..*\.apex")
  return pattern.search(output) is not None
  return pattern.search(output) is not None



def GenerateAbOtaPackage(target_file, output_file, source_file=None):
def GenerateAbOtaPackage(target_file, output_file, source_file=None):
  """Generates an Android OTA package that has A/B update payload."""
  """Generates an Android OTA package that has A/B update payload."""
  # Stage the output zip package for package signing.
  # Stage the output zip package for package signing.
@@ -1103,7 +1109,8 @@ def GenerateAbOtaPackage(target_file, output_file, source_file=None):
  additional_args += ["--max_timestamp", max_timestamp]
  additional_args += ["--max_timestamp", max_timestamp]


  if SupportsMainlineGkiUpdates(source_file):
  if SupportsMainlineGkiUpdates(source_file):
    logger.warning("Detected build with mainline GKI, include full boot image.")
    logger.warning(
        "Detected build with mainline GKI, include full boot image.")
    additional_args.extend(["--full_boot", "true"])
    additional_args.extend(["--full_boot", "true"])


  payload.Generate(
  payload.Generate(
@@ -1271,6 +1278,7 @@ def main(argv):
      OPTIONS.disable_vabc = True
      OPTIONS.disable_vabc = True
    elif o == "--spl_downgrade":
    elif o == "--spl_downgrade":
      OPTIONS.spl_downgrade = True
      OPTIONS.spl_downgrade = True
      OPTIONS.wipe_user_data = True
    else:
    else:
      return False
      return False
    return True
    return True
@@ -1341,7 +1349,6 @@ def main(argv):
    if OPTIONS.incremental_source is None:
    if OPTIONS.incremental_source is None:
      raise ValueError("Cannot generate downgradable full OTAs")
      raise ValueError("Cannot generate downgradable full OTAs")



  # TODO(xunchang) for retrofit and partial updates, maybe we should rebuild the
  # TODO(xunchang) for retrofit and partial updates, maybe we should rebuild the
  # target-file and reload the info_dict. So the info will be consistent with
  # target-file and reload the info_dict. So the info will be consistent with
  # the modified target-file.
  # the modified target-file.
@@ -1349,7 +1356,6 @@ def main(argv):
  logger.info("--- target info ---")
  logger.info("--- target info ---")
  common.DumpInfoDict(OPTIONS.info_dict)
  common.DumpInfoDict(OPTIONS.info_dict)



  # Load the source build dict if applicable.
  # Load the source build dict if applicable.
  if OPTIONS.incremental_source is not None:
  if OPTIONS.incremental_source is not None:
    OPTIONS.target_info_dict = OPTIONS.info_dict
    OPTIONS.target_info_dict = OPTIONS.info_dict
@@ -1423,7 +1429,7 @@ def main(argv):
    source_spl = source_build_prop.GetProp(SECURITY_PATCH_LEVEL_PROP_NAME)
    source_spl = source_build_prop.GetProp(SECURITY_PATCH_LEVEL_PROP_NAME)
    target_spl = target_build_prop.GetProp(SECURITY_PATCH_LEVEL_PROP_NAME)
    target_spl = target_build_prop.GetProp(SECURITY_PATCH_LEVEL_PROP_NAME)
    is_spl_downgrade = target_spl < source_spl
    is_spl_downgrade = target_spl < source_spl
    if is_spl_downgrade and not OPTIONS.spl_downgrade:
    if is_spl_downgrade and not OPTIONS.spl_downgrade and not OPTIONS.downgrade:
      raise common.ExternalError(
      raise common.ExternalError(
          "Target security patch level {} is older than source SPL {} applying "
          "Target security patch level {} is older than source SPL {} applying "
          "such OTA will likely cause device fail to boot. Pass --spl_downgrade "
          "such OTA will likely cause device fail to boot. Pass --spl_downgrade "