Loading tools/releasetools/ota_from_target_files.py +54 −2 Original line number Diff line number Diff line Loading @@ -241,6 +241,9 @@ A/B OTA specific options --spl_downgrade Force generate an SPL downgrade OTA. Only needed if target build has an older SPL. --vabc_compression_param Compression algorithm to be used for VABC. Available options: gz, brotli, none """ from __future__ import print_function Loading Loading @@ -312,6 +315,7 @@ OPTIONS.force_minor_version = None OPTIONS.compressor_types = None OPTIONS.enable_zucchini = True OPTIONS.enable_lz4diff = False OPTIONS.vabc_compression_param = None POSTINSTALL_CONFIG = 'META/postinstall_config.txt' DYNAMIC_PARTITION_INFO = 'META/dynamic_partitions_info.txt' Loading Loading @@ -651,6 +655,24 @@ class AbOtaPropertyFiles(StreamingPropertyFiles): return (payload_offset, metadata_total) def ModifyVABCCompressionParam(content, algo): """ Update update VABC Compression Param in dynamic_partitions_info.txt Args: content: The string content of dynamic_partitions_info.txt algo: The compression algorithm should be used for VABC. See https://cs.android.com/android/platform/superproject/+/master:system/core/fs_mgr/libsnapshot/cow_writer.cpp;l=127;bpv=1;bpt=1?q=CowWriter::ParseOptions&sq= Returns: Updated content of dynamic_partitions_info.txt , with custom compression algo """ output_list = [] for line in content.splitlines(): if line.startswith("virtual_ab_compression_method="): continue output_list.append(line) output_list.append("virtual_ab_compression_method="+algo) return "\n".join(output_list) def UpdatesInfoForSpecialUpdates(content, partitions_filter, delete_keys=None): """ Updates info file for secondary payload generation, partial update, etc. Loading Loading @@ -805,6 +827,27 @@ def ParseInfoDict(target_file_path): return common.LoadInfoDict(zfp) def GetTargetFilesZipForCustomVABCCompression(input_file, vabc_compression_param): """Returns a target-files.zip with a custom VABC compression param. Args: input_file: The input target-files.zip path vabc_compression_param: Custom Virtual AB Compression algorithm Returns: The path to modified target-files.zip """ target_file = common.MakeTempFile(prefix="targetfiles-", suffix=".zip") shutil.copyfile(input_file, target_file) common.ZipDelete(target_file, DYNAMIC_PARTITION_INFO) with zipfile.ZipFile(input_file, 'r', allowZip64=True) as zfp: dynamic_partition_info = zfp.read(DYNAMIC_PARTITION_INFO).decode() dynamic_partition_info = ModifyVABCCompressionParam( dynamic_partition_info, vabc_compression_param) with zipfile.ZipFile(target_file, "a", allowZip64=True) as output_zip: output_zip.writestr(DYNAMIC_PARTITION_INFO, dynamic_partition_info) return target_file def GetTargetFilesZipForPartialUpdates(input_file, ab_partitions): """Returns a target-files.zip for partial ota update package generation. Loading Loading @@ -879,6 +922,9 @@ def GetTargetFilesZipForPartialUpdates(input_file, ab_partitions): content = input_zip.read(info_file).decode() modified_info = UpdatesInfoForSpecialUpdates( content, lambda p: p in ab_partitions) if OPTIONS.vabc_compression_param and info_file == DYNAMIC_PARTITION_INFO: modified_info = ModifyVABCCompressionParam( modified_info, OPTIONS.vabc_compression_param) common.ZipWriteStr(partial_target_zip, info_file, modified_info) # TODO(xunchang) handle META/postinstall_config.txt' Loading Loading @@ -1132,6 +1178,9 @@ def GenerateAbOtaPackage(target_file, output_file, source_file=None): target_file = GetTargetFilesZipForPartialUpdates(target_file, OPTIONS.partial) additional_args += ["--is_partial_update", "true"] elif OPTIONS.vabc_compression_param: target_file = GetTargetFilesZipForCustomVABCCompression( target_file, OPTIONS.vabc_compression_param) elif OPTIONS.skip_postinstall: target_file = GetTargetFilesZipWithoutPostinstallConfig(target_file) # Target_file may have been modified, reparse ab_partitions Loading Loading @@ -1166,7 +1215,7 @@ def GenerateAbOtaPackage(target_file, output_file, source_file=None): str(OPTIONS.enable_zucchini).lower()] if not ota_utils.IsLz4diffCompatible(source_file, target_file): logger.warn( logger.warning( "Source build doesn't support lz4diff, or source/target don't have compatible lz4diff versions. Disabling lz4diff.") OPTIONS.enable_lz4diff = False Loading Loading @@ -1377,6 +1426,8 @@ def main(argv): elif o == "--enable_lz4diff": assert a.lower() in ["true", "false"] OPTIONS.enable_lz4diff = a.lower() != "false" elif o == "--vabc_compression_param": OPTIONS.vabc_compression_param = a.lower() else: return False return True Loading Loading @@ -1426,6 +1477,7 @@ def main(argv): "compressor_types=", "enable_zucchin=", "enable_lz4diff=", "vabc_compression_param=", ], extra_option_handler=option_handler) if len(args) != 2: Loading Loading
tools/releasetools/ota_from_target_files.py +54 −2 Original line number Diff line number Diff line Loading @@ -241,6 +241,9 @@ A/B OTA specific options --spl_downgrade Force generate an SPL downgrade OTA. Only needed if target build has an older SPL. --vabc_compression_param Compression algorithm to be used for VABC. Available options: gz, brotli, none """ from __future__ import print_function Loading Loading @@ -312,6 +315,7 @@ OPTIONS.force_minor_version = None OPTIONS.compressor_types = None OPTIONS.enable_zucchini = True OPTIONS.enable_lz4diff = False OPTIONS.vabc_compression_param = None POSTINSTALL_CONFIG = 'META/postinstall_config.txt' DYNAMIC_PARTITION_INFO = 'META/dynamic_partitions_info.txt' Loading Loading @@ -651,6 +655,24 @@ class AbOtaPropertyFiles(StreamingPropertyFiles): return (payload_offset, metadata_total) def ModifyVABCCompressionParam(content, algo): """ Update update VABC Compression Param in dynamic_partitions_info.txt Args: content: The string content of dynamic_partitions_info.txt algo: The compression algorithm should be used for VABC. See https://cs.android.com/android/platform/superproject/+/master:system/core/fs_mgr/libsnapshot/cow_writer.cpp;l=127;bpv=1;bpt=1?q=CowWriter::ParseOptions&sq= Returns: Updated content of dynamic_partitions_info.txt , with custom compression algo """ output_list = [] for line in content.splitlines(): if line.startswith("virtual_ab_compression_method="): continue output_list.append(line) output_list.append("virtual_ab_compression_method="+algo) return "\n".join(output_list) def UpdatesInfoForSpecialUpdates(content, partitions_filter, delete_keys=None): """ Updates info file for secondary payload generation, partial update, etc. Loading Loading @@ -805,6 +827,27 @@ def ParseInfoDict(target_file_path): return common.LoadInfoDict(zfp) def GetTargetFilesZipForCustomVABCCompression(input_file, vabc_compression_param): """Returns a target-files.zip with a custom VABC compression param. Args: input_file: The input target-files.zip path vabc_compression_param: Custom Virtual AB Compression algorithm Returns: The path to modified target-files.zip """ target_file = common.MakeTempFile(prefix="targetfiles-", suffix=".zip") shutil.copyfile(input_file, target_file) common.ZipDelete(target_file, DYNAMIC_PARTITION_INFO) with zipfile.ZipFile(input_file, 'r', allowZip64=True) as zfp: dynamic_partition_info = zfp.read(DYNAMIC_PARTITION_INFO).decode() dynamic_partition_info = ModifyVABCCompressionParam( dynamic_partition_info, vabc_compression_param) with zipfile.ZipFile(target_file, "a", allowZip64=True) as output_zip: output_zip.writestr(DYNAMIC_PARTITION_INFO, dynamic_partition_info) return target_file def GetTargetFilesZipForPartialUpdates(input_file, ab_partitions): """Returns a target-files.zip for partial ota update package generation. Loading Loading @@ -879,6 +922,9 @@ def GetTargetFilesZipForPartialUpdates(input_file, ab_partitions): content = input_zip.read(info_file).decode() modified_info = UpdatesInfoForSpecialUpdates( content, lambda p: p in ab_partitions) if OPTIONS.vabc_compression_param and info_file == DYNAMIC_PARTITION_INFO: modified_info = ModifyVABCCompressionParam( modified_info, OPTIONS.vabc_compression_param) common.ZipWriteStr(partial_target_zip, info_file, modified_info) # TODO(xunchang) handle META/postinstall_config.txt' Loading Loading @@ -1132,6 +1178,9 @@ def GenerateAbOtaPackage(target_file, output_file, source_file=None): target_file = GetTargetFilesZipForPartialUpdates(target_file, OPTIONS.partial) additional_args += ["--is_partial_update", "true"] elif OPTIONS.vabc_compression_param: target_file = GetTargetFilesZipForCustomVABCCompression( target_file, OPTIONS.vabc_compression_param) elif OPTIONS.skip_postinstall: target_file = GetTargetFilesZipWithoutPostinstallConfig(target_file) # Target_file may have been modified, reparse ab_partitions Loading Loading @@ -1166,7 +1215,7 @@ def GenerateAbOtaPackage(target_file, output_file, source_file=None): str(OPTIONS.enable_zucchini).lower()] if not ota_utils.IsLz4diffCompatible(source_file, target_file): logger.warn( logger.warning( "Source build doesn't support lz4diff, or source/target don't have compatible lz4diff versions. Disabling lz4diff.") OPTIONS.enable_lz4diff = False Loading Loading @@ -1377,6 +1426,8 @@ def main(argv): elif o == "--enable_lz4diff": assert a.lower() in ["true", "false"] OPTIONS.enable_lz4diff = a.lower() != "false" elif o == "--vabc_compression_param": OPTIONS.vabc_compression_param = a.lower() else: return False return True Loading Loading @@ -1426,6 +1477,7 @@ def main(argv): "compressor_types=", "enable_zucchin=", "enable_lz4diff=", "vabc_compression_param=", ], extra_option_handler=option_handler) if len(args) != 2: Loading