diff --git a/tools/releasetools/Android.bp b/tools/releasetools/Android.bp index 32a5dcb8c9..aa6ec83f07 100644 --- a/tools/releasetools/Android.bp +++ b/tools/releasetools/Android.bp @@ -162,6 +162,7 @@ python_defaults { "releasetools_common", "releasetools_verity_utils", "apex_manifest", + "care_map_proto_py", ], required: [ "brillo_update_payload", diff --git a/tools/releasetools/care_map_pb2.py b/tools/releasetools/care_map_pb2.py new file mode 100644 index 0000000000..06aee25587 --- /dev/null +++ b/tools/releasetools/care_map_pb2.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: bootable/recovery/update_verifier/care_map.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='bootable/recovery/update_verifier/care_map.proto', + package='recovery_update_verifier', + syntax='proto3', + serialized_options=_b('H\003'), + serialized_pb=_b('\n0bootable/recovery/update_verifier/care_map.proto\x12\x18recovery_update_verifier\"\x9e\x01\n\x07\x43\x61reMap\x12\x43\n\npartitions\x18\x01 \x03(\x0b\x32/.recovery_update_verifier.CareMap.PartitionInfo\x1aN\n\rPartitionInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06ranges\x18\x02 \x01(\t\x12\n\n\x02id\x18\x03 \x01(\t\x12\x13\n\x0b\x66ingerprint\x18\x04 \x01(\tB\x02H\x03\x62\x06proto3') +) + + + + +_CAREMAP_PARTITIONINFO = _descriptor.Descriptor( + name='PartitionInfo', + full_name='recovery_update_verifier.CareMap.PartitionInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='recovery_update_verifier.CareMap.PartitionInfo.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='ranges', full_name='recovery_update_verifier.CareMap.PartitionInfo.ranges', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='recovery_update_verifier.CareMap.PartitionInfo.id', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='fingerprint', full_name='recovery_update_verifier.CareMap.PartitionInfo.fingerprint', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=159, + serialized_end=237, +) + +_CAREMAP = _descriptor.Descriptor( + name='CareMap', + full_name='recovery_update_verifier.CareMap', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='partitions', full_name='recovery_update_verifier.CareMap.partitions', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_CAREMAP_PARTITIONINFO, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=79, + serialized_end=237, +) + +_CAREMAP_PARTITIONINFO.containing_type = _CAREMAP +_CAREMAP.fields_by_name['partitions'].message_type = _CAREMAP_PARTITIONINFO +DESCRIPTOR.message_types_by_name['CareMap'] = _CAREMAP +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +CareMap = _reflection.GeneratedProtocolMessageType('CareMap', (_message.Message,), { + + 'PartitionInfo' : _reflection.GeneratedProtocolMessageType('PartitionInfo', (_message.Message,), { + 'DESCRIPTOR' : _CAREMAP_PARTITIONINFO, + '__module__' : 'bootable.recovery.update_verifier.care_map_pb2' + # @@protoc_insertion_point(class_scope:recovery_update_verifier.CareMap.PartitionInfo) + }) + , + 'DESCRIPTOR' : _CAREMAP, + '__module__' : 'bootable.recovery.update_verifier.care_map_pb2' + # @@protoc_insertion_point(class_scope:recovery_update_verifier.CareMap) + }) +_sym_db.RegisterMessage(CareMap) +_sym_db.RegisterMessage(CareMap.PartitionInfo) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 985a21ab77..d4da8b22cb 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -276,6 +276,9 @@ def Run(args, verbose=None, **kwargs): args = args[:] args[0] = FindHostToolPath(args[0]) + if verbose is None: + verbose = OPTIONS.verbose + # Don't log any if caller explicitly says so. if verbose: logger.info(" Running: \"%s\"", " ".join(args)) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 229f7e91a6..eda9814c59 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -237,6 +237,7 @@ import subprocess import sys import zipfile +import care_map_pb2 import common import ota_utils from ota_utils import (UNZIP_PATTERN, FinalizeMetadata, GetPackageMetadata, @@ -832,6 +833,17 @@ def GetTargetFilesZipForPartialUpdates(input_file, ab_partitions): with zipfile.ZipFile(input_file, allowZip64=True) as input_zip: common.ZipWriteStr(partial_target_zip, 'META/ab_partitions.txt', '\n'.join(ab_partitions)) + CARE_MAP_ENTRY = "META/care_map.pb" + if CARE_MAP_ENTRY in input_zip.namelist(): + caremap = care_map_pb2.CareMap() + caremap.ParseFromString(input_zip.read(CARE_MAP_ENTRY)) + filtered = [ + part for part in caremap.partitions if part.name in ab_partitions] + del caremap.partitions[:] + caremap.partitions.extend(filtered) + common.ZipWriteStr(partial_target_zip, CARE_MAP_ENTRY, + caremap.SerializeToString()) + for info_file in ['META/misc_info.txt', DYNAMIC_PARTITION_INFO]: if info_file not in input_zip.namelist(): logger.warning('Cannot find %s in input zipfile', info_file) @@ -841,7 +853,8 @@ def GetTargetFilesZipForPartialUpdates(input_file, ab_partitions): content, lambda p: p in ab_partitions) common.ZipWriteStr(partial_target_zip, info_file, modified_info) - # TODO(xunchang) handle 'META/care_map.pb', 'META/postinstall_config.txt' + # TODO(xunchang) handle META/postinstall_config.txt' + common.ZipClose(partial_target_zip) return partial_target_file