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

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

Merge "Check device's launch API level before using new compresison algo" into main

parents 7109fe18 8f830007
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -449,6 +449,10 @@ class BuildInfo(object):
    system_prop = self.info_dict.get("system.build.prop")
    system_prop = self.info_dict.get("system.build.prop")
    return system_prop and system_prop.GetProp("ro.build.version.release") == "11"
    return system_prop and system_prop.GetProp("ro.build.version.release") == "11"


  @property
  def vabc_compression_param(self):
    return self.get("virtual_ab_compression_method", "")

  @property
  @property
  def vendor_api_level(self):
  def vendor_api_level(self):
    vendor_prop = self.info_dict.get("vendor.build.prop")
    vendor_prop = self.info_dict.get("vendor.build.prop")
+21 −1
Original line number Original line Diff line number Diff line
@@ -274,7 +274,7 @@ import zipfile
import care_map_pb2
import care_map_pb2
import common
import common
import ota_utils
import ota_utils
from ota_utils import (UNZIP_PATTERN, FinalizeMetadata, GetPackageMetadata,
from ota_utils import (VABC_COMPRESSION_PARAM_SUPPORT, FinalizeMetadata, GetPackageMetadata,
                       PayloadGenerator, SECURITY_PATCH_LEVEL_PROP_NAME, ExtractTargetFiles, CopyTargetFilesDir)
                       PayloadGenerator, SECURITY_PATCH_LEVEL_PROP_NAME, ExtractTargetFiles, CopyTargetFilesDir)
from common import DoesInputFileContain, IsSparseImage
from common import DoesInputFileContain, IsSparseImage
import target_files_diff
import target_files_diff
@@ -872,6 +872,10 @@ def GenerateAbOtaPackage(target_file, output_file, source_file=None):
    if not source_info.is_vabc or not target_info.is_vabc:
    if not source_info.is_vabc or not target_info.is_vabc:
      logger.info("Either source or target does not support VABC, disabling.")
      logger.info("Either source or target does not support VABC, disabling.")
      OPTIONS.disable_vabc = True
      OPTIONS.disable_vabc = True
    if source_info.vabc_compression_param != target_info.vabc_compression_param:
      logger.info("Source build and target build use different compression methods {} vs {}, default to source builds parameter {}".format(
          source_info.vabc_compression_param, target_info.vabc_compression_param, source_info.vabc_compression_param))
      OPTIONS.vabc_compression_param = source_info.vabc_compression_param


    # Virtual AB Compression was introduced in Androd S.
    # Virtual AB Compression was introduced in Androd S.
    # Later, we backported VABC to Android R. But verity support was not
    # Later, we backported VABC to Android R. But verity support was not
@@ -886,6 +890,22 @@ def GenerateAbOtaPackage(target_file, output_file, source_file=None):
        "META/ab_partitions.txt is required for ab_update."
        "META/ab_partitions.txt is required for ab_update."
    target_info = common.BuildInfo(OPTIONS.info_dict, OPTIONS.oem_dicts)
    target_info = common.BuildInfo(OPTIONS.info_dict, OPTIONS.oem_dicts)
    source_info = None
    source_info = None
    if target_info.vabc_compression_param:
      minimum_api_level_required = VABC_COMPRESSION_PARAM_SUPPORT[
          target_info.vabc_compression_param]
      if target_info.vendor_api_level < minimum_api_level_required:
        logger.warning(
            "This full OTA is configured to use VABC compression algorithm"
            " {}, which is supported since"
            " Android API level {}, but device is "
            "launched with {} . If this full OTA is"
            " served to a device running old build, OTA might fail due to "
            "unsupported compression parameter. For safety, gz is used because "
            "it's supported since day 1.".format(
                target_info.vabc_compression_param,
                minimum_api_level_required,
                target_info.vendor_api_level))
        OPTIONS.vabc_compression_param = "gz"


  if OPTIONS.partial == []:
  if OPTIONS.partial == []:
    logger.info(
    logger.info(
+15 −1
Original line number Original line Diff line number Diff line
@@ -51,6 +51,19 @@ SECURITY_PATCH_LEVEL_PROP_NAME = "ro.build.version.security_patch"
TARGET_FILES_IMAGES_SUBDIR = ["IMAGES", "PREBUILT_IMAGES", "RADIO"]
TARGET_FILES_IMAGES_SUBDIR = ["IMAGES", "PREBUILT_IMAGES", "RADIO"]




# Key is the compression algorithm, value is minimum API level required to
# use this compression algorithm for VABC OTA on device.
VABC_COMPRESSION_PARAM_SUPPORT = {
    "gz": 31,
    "brotli": 31,
    "none": 31,
    # lz4 support is added in Android U
    "lz4": 34,
    # zstd support is added in Android V
    "zstd": 35,
}


def FinalizeMetadata(metadata, input_file, output_file, needed_property_files=None, package_key=None, pw=None):
def FinalizeMetadata(metadata, input_file, output_file, needed_property_files=None, package_key=None, pw=None):
  """Finalizes the metadata and signs an A/B OTA package.
  """Finalizes the metadata and signs an A/B OTA package.


@@ -727,6 +740,7 @@ def ExtractTargetFiles(path: str):
    logger.info("target files %s is already extracted", path)
    logger.info("target files %s is already extracted", path)
    return path
    return path
  extracted_dir = common.MakeTempDir("target_files")
  extracted_dir = common.MakeTempDir("target_files")
  logger.info(f"Extracting target files {path} to {extracted_dir}")
  common.UnzipToDir(path, extracted_dir, UNZIP_PATTERN + [""])
  common.UnzipToDir(path, extracted_dir, UNZIP_PATTERN + [""])
  for subdir in TARGET_FILES_IMAGES_SUBDIR:
  for subdir in TARGET_FILES_IMAGES_SUBDIR:
    image_dir = os.path.join(extracted_dir, subdir)
    image_dir = os.path.join(extracted_dir, subdir)