Add a tool to generate OTA from images

During build, we will need to generate an OTA for boot partition using a
16K boot image. Typically, OTA is generated from target_files.zip . To
avoid relying on target_files.zip as a dependency for 16K OTA, add a
tool to generate OTA directly from a raw image.

Test: th, ota_from_raw_img --partition_name boot --output ota.zip $OUT/boot_16k.img
Bug: 293313353
Change-Id: I2076332faf2a8dc573450597efd481e285a49545
This commit is contained in:
Kelvin Zhang
2023-08-22 08:56:30 -07:00
parent a169e4f7f6
commit c7441e5907
5 changed files with 179 additions and 25 deletions

View File

@@ -14,7 +14,6 @@
import argparse
import logging
import shlex
import struct
import sys
import update_payload
@@ -31,6 +30,7 @@ from update_payload import Payload
from payload_signer import PayloadSigner
from ota_utils import PayloadGenerator, METADATA_PROTO_NAME, FinalizeMetadata
from ota_signing_utils import AddSigningArgumentParse
logger = logging.getLogger(__name__)
@@ -126,7 +126,7 @@ def MergeManifests(payloads: List[Payload]) -> DeltaArchiveManifest:
ExtendPartitionUpdates(output_manifest.partitions, manifest.partitions)
try:
MergeDynamicPartitionMetadata(
output_manifest.dynamic_partition_metadata, manifest.dynamic_partition_metadata)
output_manifest.dynamic_partition_metadata, manifest.dynamic_partition_metadata)
except DuplicatePartitionError:
logger.error(
"OTA %s has duplicate partition with some of the previous OTAs", payload.name)
@@ -190,6 +190,7 @@ def CheckDuplicatePartitions(payloads: List[Payload]):
f"OTA {partition_to_ota[part].name} and {payload.name} have duplicating partition {part}")
partition_to_ota[part] = payload
def ApexInfo(file_paths):
if len(file_paths) > 1:
logger.info("More than one target file specified, will ignore "
@@ -201,33 +202,19 @@ def ApexInfo(file_paths):
return apex_info_bytes
return None
def ParseSignerArgs(args):
if args is None:
return None
return shlex.split(args)
def main(argv):
parser = argparse.ArgumentParser(description='Merge multiple partial OTAs')
parser.add_argument('packages', type=str, nargs='+',
help='Paths to OTA packages to merge')
parser.add_argument('--package_key', type=str,
help='Paths to private key for signing payload')
parser.add_argument('--search_path', type=str,
help='Search path for framework/signapk.jar')
parser.add_argument('--payload_signer', type=str,
help='Path to custom payload signer')
parser.add_argument('--payload_signer_args', type=ParseSignerArgs,
help='Arguments for payload signer if necessary')
parser.add_argument('--payload_signer_maximum_signature_size', type=str,
help='Maximum signature size (in bytes) that would be '
'generated by the given payload signer')
parser.add_argument('--output', type=str,
help='Paths to output merged ota', required=True)
parser.add_argument('--metadata_ota', type=str,
help='Output zip will use build metadata from this OTA package, if unspecified, use the last OTA package in merge list')
parser.add_argument('--private_key_suffix', type=str,
help='Suffix to be appended to package_key path', default=".pk8")
parser.add_argument('-v', action="store_true", help="Enable verbose logging", dest="verbose")
parser.add_argument('-v', action="store_true",
help="Enable verbose logging", dest="verbose")
AddSigningArgumentParse(parser)
parser.epilog = ('This tool can also be used to resign a regular OTA. For a single regular OTA, '
'apex_info.pb will be written to output. When merging multiple OTAs, '
'apex_info.pb will not be written.')
@@ -301,8 +288,6 @@ def main(argv):
return 0
if __name__ == '__main__':
logging.basicConfig()
sys.exit(main(sys.argv))