Merge "Run validation on user specified vabc_compression_param" into main
diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
index d4420c9..7be9876 100755
--- a/tools/releasetools/ota_from_target_files.py
+++ b/tools/releasetools/ota_from_target_files.py
@@ -827,6 +827,15 @@
return ExtractTargetFiles(target_file)
+def ValidateCompressinParam(target_info):
+ vabc_compression_param = OPTIONS.vabc_compression_param
+ if vabc_compression_param:
+ minimum_api_level_required = VABC_COMPRESSION_PARAM_SUPPORT[vabc_compression_param]
+ if target_info.vendor_api_level < minimum_api_level_required:
+ raise ValueError("Specified VABC compression param {} is only supported for API level >= {}, device is on API level {}".format(
+ vabc_compression_param, minimum_api_level_required, target_info.vendor_api_level))
+
+
def GenerateAbOtaPackage(target_file, output_file, source_file=None):
"""Generates an Android OTA package that has A/B update payload."""
# If input target_files are directories, create a copy so that we can modify
@@ -834,6 +843,8 @@
target_info = common.BuildInfo(OPTIONS.info_dict, OPTIONS.oem_dicts)
if OPTIONS.disable_vabc and target_info.is_release_key:
raise ValueError("Disabling VABC on release-key builds is not supported.")
+ ValidateCompressinParam(target_info)
+ vabc_compression_param = target_info.vabc_compression_param
target_file = ExtractOrCopyTargetFiles(target_file)
if source_file is not None:
@@ -862,10 +873,11 @@
if not source_info.is_vabc or not target_info.is_vabc:
logger.info("Either source or target does not support VABC, disabling.")
OPTIONS.disable_vabc = True
- if source_info.vabc_compression_param != target_info.vabc_compression_param:
+ if OPTIONS.vabc_compression_param is None and \
+ 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
+ vabc_compression_param = source_info.vabc_compression_param
# Virtual AB Compression was introduced in Androd S.
# Later, we backported VABC to Android R. But verity support was not
@@ -879,9 +891,9 @@
assert "ab_partitions" in OPTIONS.info_dict, \
"META/ab_partitions.txt is required for ab_update."
source_info = None
- if target_info.vabc_compression_param:
+ if OPTIONS.vabc_compression_param is None and vabc_compression_param:
minimum_api_level_required = VABC_COMPRESSION_PARAM_SUPPORT[
- target_info.vabc_compression_param]
+ 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"
@@ -891,10 +903,10 @@
" 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,
+ vabc_compression_param,
minimum_api_level_required,
target_info.vendor_api_level))
- OPTIONS.vabc_compression_param = "gz"
+ vabc_compression_param = "gz"
if OPTIONS.partial == []:
logger.info(
@@ -950,6 +962,9 @@
logger.error("VABC XOR not supported on this vendor, disabling")
OPTIONS.enable_vabc_xor = False
+ if OPTIONS.vabc_compression_param:
+ vabc_compression_param = OPTIONS.vabc_compression_param
+
additional_args = []
# Prepare custom images.
@@ -964,9 +979,9 @@
elif OPTIONS.partial:
target_file = GetTargetFilesZipForPartialUpdates(target_file,
OPTIONS.partial)
- if OPTIONS.vabc_compression_param:
+ if vabc_compression_param != target_info.vabc_compression_param:
target_file = GetTargetFilesZipForCustomVABCCompression(
- target_file, OPTIONS.vabc_compression_param)
+ target_file, vabc_compression_param)
if OPTIONS.skip_postinstall:
target_file = GetTargetFilesZipWithoutPostinstallConfig(target_file)
# Target_file may have been modified, reparse ab_partitions