Loading tools/releasetools/ota_from_target_files.py +15 −0 Original line number Diff line number Diff line Loading @@ -230,6 +230,9 @@ A/B OTA specific options --compressor_types A colon ':' separated list of compressors. Allowed values are bz2 and brotli. --enable_zucchini Whether to enable to zucchini feature. Will generate smaller OTA but uses more memory. """ from __future__ import print_function Loading Loading @@ -299,6 +302,7 @@ OPTIONS.vabc_downgrade = False OPTIONS.enable_vabc_xor = True OPTIONS.force_minor_version = None OPTIONS.compressor_types = None OPTIONS.enable_zucchini = None POSTINSTALL_CONFIG = 'META/postinstall_config.txt' DYNAMIC_PARTITION_INFO = 'META/dynamic_partitions_info.txt' Loading Loading @@ -1141,6 +1145,14 @@ def GenerateAbOtaPackage(target_file, output_file, source_file=None): partition_timestamps_flags = GeneratePartitionTimestampFlags( metadata.postcondition.partition_state) # Auto-check for compatibility only if --enable_zucchini omitted. Otherwise # let user override zucchini settings. This is useful for testing. if OPTIONS.enable_zucchini is None: if not ota_utils.IsZucchiniCompatible(source_file, target_file): additional_args += ["--enable_zucchini", "false"] else: additional_args += ["--enable_zucchini", str(OPTIONS.enable_zucchini).lower()] if OPTIONS.disable_vabc: additional_args += ["--disable_vabc", "true"] if OPTIONS.enable_vabc_xor: Loading Loading @@ -1326,6 +1338,8 @@ def main(argv): OPTIONS.force_minor_version = a elif o == "--compressor_types": OPTIONS.compressor_types = a elif o == "--enable_zucchini": OPTIONS.enable_zucchini = a.lower() != "false" else: return False return True Loading Loading @@ -1373,6 +1387,7 @@ def main(argv): "enable_vabc_xor=", "force_minor_version=", "compressor_types=", "enable_zucchin=", ], extra_option_handler=option_handler) if len(args) != 2: Loading tools/releasetools/ota_utils.py +35 −0 Original line number Diff line number Diff line Loading @@ -638,3 +638,38 @@ def ConstructOtaApexInfo(target_zip, source_file=None): target_apex.source_version = source_apex_versions[name] return target_apex_proto.SerializeToString() def IsZucchiniCompatible(source_file: str, target_file: str): """Check whether zucchini versions in two builds are compatible Args: source_file: Path to source build's target_file.zip target_file: Path to target build's target_file.zip Returns: bool true if and only if zucchini versions are compatible """ if source_file is None or target_file is None: return False assert os.path.exists(source_file) assert os.path.exists(target_file) assert zipfile.is_zipfile(source_file) or os.path.isdir(source_file) assert zipfile.is_zipfile(target_file) or os.path.isdir(target_file) _ZUCCHINI_CONFIG_ENTRY_NAME = "META/zucchini_config.txt" def ReadEntry(path, entry): # Read an entry inside a .zip file or extracted dir of .zip file if zipfile.is_zipfile(path): with zipfile.ZipFile(path, "r", allowZip64=True) as zfp: if entry in zfp.namelist(): return zfp.read(entry).decode() else: entry_path = os.path.join(entry, path) if os.path.exists(entry_path): with open(entry_path, "r") as fp: return fp.read() else: return "" return ReadEntry(source_file, _ZUCCHINI_CONFIG_ENTRY_NAME) == ReadEntry(target_file, _ZUCCHINI_CONFIG_ENTRY_NAME) Loading
tools/releasetools/ota_from_target_files.py +15 −0 Original line number Diff line number Diff line Loading @@ -230,6 +230,9 @@ A/B OTA specific options --compressor_types A colon ':' separated list of compressors. Allowed values are bz2 and brotli. --enable_zucchini Whether to enable to zucchini feature. Will generate smaller OTA but uses more memory. """ from __future__ import print_function Loading Loading @@ -299,6 +302,7 @@ OPTIONS.vabc_downgrade = False OPTIONS.enable_vabc_xor = True OPTIONS.force_minor_version = None OPTIONS.compressor_types = None OPTIONS.enable_zucchini = None POSTINSTALL_CONFIG = 'META/postinstall_config.txt' DYNAMIC_PARTITION_INFO = 'META/dynamic_partitions_info.txt' Loading Loading @@ -1141,6 +1145,14 @@ def GenerateAbOtaPackage(target_file, output_file, source_file=None): partition_timestamps_flags = GeneratePartitionTimestampFlags( metadata.postcondition.partition_state) # Auto-check for compatibility only if --enable_zucchini omitted. Otherwise # let user override zucchini settings. This is useful for testing. if OPTIONS.enable_zucchini is None: if not ota_utils.IsZucchiniCompatible(source_file, target_file): additional_args += ["--enable_zucchini", "false"] else: additional_args += ["--enable_zucchini", str(OPTIONS.enable_zucchini).lower()] if OPTIONS.disable_vabc: additional_args += ["--disable_vabc", "true"] if OPTIONS.enable_vabc_xor: Loading Loading @@ -1326,6 +1338,8 @@ def main(argv): OPTIONS.force_minor_version = a elif o == "--compressor_types": OPTIONS.compressor_types = a elif o == "--enable_zucchini": OPTIONS.enable_zucchini = a.lower() != "false" else: return False return True Loading Loading @@ -1373,6 +1387,7 @@ def main(argv): "enable_vabc_xor=", "force_minor_version=", "compressor_types=", "enable_zucchin=", ], extra_option_handler=option_handler) if len(args) != 2: Loading
tools/releasetools/ota_utils.py +35 −0 Original line number Diff line number Diff line Loading @@ -638,3 +638,38 @@ def ConstructOtaApexInfo(target_zip, source_file=None): target_apex.source_version = source_apex_versions[name] return target_apex_proto.SerializeToString() def IsZucchiniCompatible(source_file: str, target_file: str): """Check whether zucchini versions in two builds are compatible Args: source_file: Path to source build's target_file.zip target_file: Path to target build's target_file.zip Returns: bool true if and only if zucchini versions are compatible """ if source_file is None or target_file is None: return False assert os.path.exists(source_file) assert os.path.exists(target_file) assert zipfile.is_zipfile(source_file) or os.path.isdir(source_file) assert zipfile.is_zipfile(target_file) or os.path.isdir(target_file) _ZUCCHINI_CONFIG_ENTRY_NAME = "META/zucchini_config.txt" def ReadEntry(path, entry): # Read an entry inside a .zip file or extracted dir of .zip file if zipfile.is_zipfile(path): with zipfile.ZipFile(path, "r", allowZip64=True) as zfp: if entry in zfp.namelist(): return zfp.read(entry).decode() else: entry_path = os.path.join(entry, path) if os.path.exists(entry_path): with open(entry_path, "r") as fp: return fp.read() else: return "" return ReadEntry(source_file, _ZUCCHINI_CONFIG_ENTRY_NAME) == ReadEntry(target_file, _ZUCCHINI_CONFIG_ENTRY_NAME)