def main(argv): key_mapping_options = [] def option_handler(o, a): if o in ("-e", "--extra_apks"): names, key = a.split("=") names = names.split(",") for n in names: OPTIONS.extra_apks[n] = key elif o in ("-d", "--default_key_mappings"): key_mapping_options.append((None, a)) elif o in ("-k", "--key_mapping"): key_mapping_options.append(a.split("=", 1)) elif o in ("-o", "--replace_ota_keys"): OPTIONS.replace_ota_keys = True elif o in ("-t", "--tag_changes"): new = [] for i in a.split(","): i = i.strip() if not i or i[0] not in "-+": raise ValueError("Bad tag change '%s'" % (i,)) new.append(i[0] + i[1:].strip()) OPTIONS.tag_changes = tuple(new) elif o == "--replace_verity_public_key": OPTIONS.replace_verity_public_key = (True, a) elif o == "--replace_verity_private_key": OPTIONS.replace_verity_private_key = (True, a) elif o == "--replace_verity_keyid": OPTIONS.replace_verity_keyid = (True, a) elif o == "--avb_vbmeta_key": OPTIONS.avb_keys['vbmeta'] = a elif o == "--avb_vbmeta_algorithm": OPTIONS.avb_algorithms['vbmeta'] = a elif o == "--avb_vbmeta_extra_args": OPTIONS.avb_extra_args['vbmeta'] = a elif o == "--avb_boot_key": OPTIONS.avb_keys['boot'] = a elif o == "--avb_boot_algorithm": OPTIONS.avb_algorithms['boot'] = a elif o == "--avb_boot_extra_args": OPTIONS.avb_extra_args['boot'] = a elif o == "--avb_dtbo_key": OPTIONS.avb_keys['dtbo'] = a elif o == "--avb_dtbo_algorithm": OPTIONS.avb_algorithms['dtbo'] = a elif o == "--avb_dtbo_extra_args": OPTIONS.avb_extra_args['dtbo'] = a elif o == "--avb_system_key": OPTIONS.avb_keys['system'] = a elif o == "--avb_system_algorithm": OPTIONS.avb_algorithms['system'] = a elif o == "--avb_system_extra_args": OPTIONS.avb_extra_args['system'] = a elif o == "--avb_vendor_key": OPTIONS.avb_keys['vendor'] = a elif o == "--avb_vendor_algorithm": OPTIONS.avb_algorithms['vendor'] = a elif o == "--avb_vendor_extra_args": OPTIONS.avb_extra_args['vendor'] = a else: return False return True args = common.ParseOptions( argv, __doc__, extra_opts="e:d:k:ot:", extra_long_opts=[ "extra_apks=", "default_key_mappings=", "key_mapping=", "replace_ota_keys", "tag_changes=", "replace_verity_public_key=", "replace_verity_private_key=", "replace_verity_keyid=", "avb_vbmeta_algorithm=", "avb_vbmeta_key=", "avb_vbmeta_extra_args=", "avb_boot_algorithm=", "avb_boot_key=", "avb_boot_extra_args=", "avb_dtbo_algorithm=", "avb_dtbo_key=", "avb_dtbo_extra_args=", "avb_system_algorithm=", "avb_system_key=", "avb_system_extra_args=", "avb_vendor_algorithm=", "avb_vendor_key=", "avb_vendor_extra_args=", ], extra_option_handler=option_handler) if len(args) != 2: common.Usage(__doc__) sys.exit(1) input_zip = zipfile.ZipFile(args[0], "r") output_zip = zipfile.ZipFile(args[1], "w", compression=zipfile.ZIP_DEFLATED, allowZip64=True) misc_info = common.LoadInfoDict(input_zip) BuildKeyMap(misc_info, key_mapping_options) certmap, compressed_extension = common.ReadApkCerts(input_zip) apk_key_map = GetApkCerts(certmap) CheckAllApksSigned(input_zip, apk_key_map, compressed_extension) key_passwords = common.GetKeyPasswords(set(apk_key_map.values())) platform_api_level, _ = GetApiLevelAndCodename(input_zip) codename_to_api_level_map = GetCodenameToApiLevelMap(input_zip) ProcessTargetFiles(input_zip, output_zip, misc_info, apk_key_map, key_passwords, platform_api_level, codename_to_api_level_map, compressed_extension) common.ZipClose(input_zip) common.ZipClose(output_zip) # Skip building userdata.img and cache.img when signing the target files. new_args = ["--is_signing"] # add_img_to_target_files builds the system image from scratch, so the # recovery patch is guaranteed to be regenerated there. if OPTIONS.rebuild_recovery: new_args.append("--rebuild_recovery") new_args.append(args[1]) add_img_to_target_files.main(new_args) print("done.")
def merge_target_files(temp_dir, system_target_files, system_item_list, system_misc_info_keys, other_target_files, other_item_list, output_target_files, rebuild_recovery): """Merge two target files packages together. This function takes system and other target files packages as input, performs various file extractions, special case processing, and finally creates a merged zip archive as output. Args: temp_dir: The name of a directory we use when we extract items from the input target files packages, and also a scratch directory that we use for temporary files. system_target_files: The name of the zip archive containing the system partial target files package. system_item_list: The list of items to extract from the partial system target files package as is, meaning these items will land in the output target files package exactly as they appear in the input partial system target files package. system_misc_info_keys: The list of keys to obtain from the system instance of META/misc_info.txt. The remaining keys from the other instance. other_target_files: The name of the zip archive containing the other partial target files package. other_item_list: The list of items to extract from the partial other target files package as is, meaning these items will land in the output target files package exactly as they appear in the input partial other target files package. output_target_files: The name of the output zip archive target files package created by merging system and other. rebuild_recovery: If true, rebuild the recovery patch used by non-A/B devices and write it to the system image. """ logger.info('starting: merge system %s and other %s into output %s', system_target_files, other_target_files, output_target_files) # Create directory names that we'll use when we extract files from system, # and other, and for zipping the final output. system_target_files_temp_dir = os.path.join(temp_dir, 'system') other_target_files_temp_dir = os.path.join(temp_dir, 'other') output_target_files_temp_dir = os.path.join(temp_dir, 'output') # Extract "as is" items from the input system partial target files package. # We extract them directly into the output temporary directory since the # items do not need special case processing. extract_items(target_files=system_target_files, target_files_temp_dir=output_target_files_temp_dir, extract_item_list=system_item_list) # Extract "as is" items from the input other partial target files package. We # extract them directly into the output temporary directory since the items # do not need special case processing. extract_items(target_files=other_target_files, target_files_temp_dir=output_target_files_temp_dir, extract_item_list=other_item_list) # Extract "special" items from the input system partial target files package. # We extract these items to different directory since they require special # processing before they will end up in the output directory. extract_items(target_files=system_target_files, target_files_temp_dir=system_target_files_temp_dir, extract_item_list=system_extract_special_item_list) # Extract "special" items from the input other partial target files package. # We extract these items to different directory since they require special # processing before they will end up in the output directory. extract_items(target_files=other_target_files, target_files_temp_dir=other_target_files_temp_dir, extract_item_list=other_extract_special_item_list) # Now that the temporary directories contain all the extracted files, perform # special case processing on any items that need it. After this function # completes successfully, all the files we need to create the output target # files package are in place. process_special_cases( temp_dir=temp_dir, system_target_files_temp_dir=system_target_files_temp_dir, other_target_files_temp_dir=other_target_files_temp_dir, output_target_files_temp_dir=output_target_files_temp_dir, system_misc_info_keys=system_misc_info_keys, rebuild_recovery=rebuild_recovery) # Regenerate IMAGES in the temporary directory. add_img_args = ['--verbose'] if rebuild_recovery: add_img_args.append('--rebuild_recovery') add_img_args.append(output_target_files_temp_dir) add_img_to_target_files.main(add_img_args) # Finally, create the output target files zip archive. output_zip = os.path.abspath(output_target_files) output_target_files_list = os.path.join(temp_dir, 'output.list') output_target_files_meta_dir = os.path.join(output_target_files_temp_dir, 'META') command = [ 'find', output_target_files_meta_dir, ] # TODO(bpeckham): sort this to be more like build. meta_content = common.RunAndCheckOutput(command, verbose=False) command = [ 'find', output_target_files_temp_dir, '-path', output_target_files_meta_dir, '-prune', '-o', '-print' ] # TODO(bpeckham): sort this to be more like build. other_content = common.RunAndCheckOutput(command, verbose=False) with open(output_target_files_list, 'w') as f: f.write(meta_content) f.write(other_content) command = [ 'soong_zip', '-d', '-o', output_zip, '-C', output_target_files_temp_dir, '-l', output_target_files_list, ] logger.info('creating %s', output_target_files) common.RunAndWait(command, verbose=True)
def main(argv): key_mapping_options = [] def option_handler(o, a): if o in ("-e", "--extra_apks"): names, key = a.split("=") names = names.split(",") for n in names: OPTIONS.extra_apks[n] = key elif o in ("-d", "--default_key_mappings"): key_mapping_options.append((None, a)) elif o in ("-k", "--key_mapping"): key_mapping_options.append(a.split("=", 1)) elif o in ("-o", "--replace_ota_keys"): OPTIONS.replace_ota_keys = True elif o in ("-t", "--tag_changes"): new = [] for i in a.split(","): i = i.strip() if not i or i[0] not in "-+": raise ValueError("Bad tag change '%s'" % (i,)) new.append(i[0] + i[1:].strip()) OPTIONS.tag_changes = tuple(new) elif o == "--replace_verity_public_key": OPTIONS.replace_verity_public_key = (True, a) elif o == "--replace_verity_private_key": OPTIONS.replace_verity_private_key = (True, a) elif o == "--replace_verity_keyid": OPTIONS.replace_verity_keyid = (True, a) else: return False return True args = common.ParseOptions(argv, __doc__, extra_opts="e:d:k:ot:", extra_long_opts=["extra_apks=", "default_key_mappings=", "key_mapping=", "replace_ota_keys", "tag_changes=", "replace_verity_public_key=", "replace_verity_private_key=", "replace_verity_keyid="], extra_option_handler=option_handler) if len(args) != 2: common.Usage(__doc__) sys.exit(1) input_zip = zipfile.ZipFile(args[0], "r") output_zip = zipfile.ZipFile(args[1], "w") misc_info = common.LoadInfoDict(input_zip) BuildKeyMap(misc_info, key_mapping_options) apk_key_map = GetApkCerts(input_zip) CheckAllApksSigned(input_zip, apk_key_map) key_passwords = common.GetKeyPasswords(set(apk_key_map.values())) platform_api_level, platform_codename = GetApiLevelAndCodename(input_zip) codename_to_api_level_map = GetCodenameToApiLevelMap(input_zip) # Android N will be API Level 24, but isn't yet. # TODO: Remove this workaround once Android N is officially API Level 24. if platform_api_level == 23 and platform_codename == "N": platform_api_level = 24 ProcessTargetFiles(input_zip, output_zip, misc_info, apk_key_map, key_passwords, platform_api_level, codename_to_api_level_map) common.ZipClose(input_zip) common.ZipClose(output_zip) # Skip building userdata.img and cache.img when signing the target files. new_args = ["--is_signing", args[1]] add_img_to_target_files.main(new_args) print("done.")
def merge_target_files(temp_dir, framework_target_files, framework_item_list, framework_misc_info_keys, vendor_target_files, vendor_item_list, output_target_files, output_dir, output_item_list, output_ota, output_img, output_super_empty, rebuild_recovery): """Merge two target files packages together. This function takes framework and vendor target files packages as input, performs various file extractions, special case processing, and finally creates a merged zip archive as output. Args: temp_dir: The name of a directory we use when we extract items from the input target files packages, and also a scratch directory that we use for temporary files. framework_target_files: The name of the zip archive containing the framework partial target files package. framework_item_list: The list of items to extract from the partial framework target files package as is, meaning these items will land in the output target files package exactly as they appear in the input partial framework target files package. framework_misc_info_keys: The list of keys to obtain from the framework instance of META/misc_info.txt. The remaining keys from the vendor instance. vendor_target_files: The name of the zip archive containing the vendor partial target files package. vendor_item_list: The list of items to extract from the partial vendor target files package as is, meaning these items will land in the output target files package exactly as they appear in the input partial vendor target files package. output_target_files: The name of the output zip archive target files package created by merging framework and vendor. output_dir: The destination directory for saving merged files. output_item_list: The list of items to copy into the output_dir. output_ota: The name of the output zip archive ota package. output_img: The name of the output zip archive img package. output_super_empty: If provided, creates a super_empty.img file from the merged target files package and saves it at this path. rebuild_recovery: If true, rebuild the recovery patch used by non-A/B devices and write it to the system image. """ logger.info('starting: merge framework %s and vendor %s into output %s', framework_target_files, vendor_target_files, output_target_files) # Create directory names that we'll use when we extract files from framework, # and vendor, and for zipping the final output. framework_target_files_temp_dir = os.path.join(temp_dir, 'framework') vendor_target_files_temp_dir = os.path.join(temp_dir, 'vendor') output_target_files_temp_dir = os.path.join(temp_dir, 'output') # Extract "as is" items from the input framework partial target files package. # We extract them directly into the output temporary directory since the # items do not need special case processing. extract_items( target_files=framework_target_files, target_files_temp_dir=output_target_files_temp_dir, extract_item_list=framework_item_list) # Extract "as is" items from the input vendor partial target files package. We # extract them directly into the output temporary directory since the items # do not need special case processing. extract_items( target_files=vendor_target_files, target_files_temp_dir=output_target_files_temp_dir, extract_item_list=vendor_item_list) # Extract "special" items from the input framework partial target files # package. We extract these items to different directory since they require # special processing before they will end up in the output directory. extract_items( target_files=framework_target_files, target_files_temp_dir=framework_target_files_temp_dir, extract_item_list=FRAMEWORK_EXTRACT_SPECIAL_ITEM_LIST) # Extract "special" items from the input vendor partial target files package. # We extract these items to different directory since they require special # processing before they will end up in the output directory. extract_items( target_files=vendor_target_files, target_files_temp_dir=vendor_target_files_temp_dir, extract_item_list=VENDOR_EXTRACT_SPECIAL_ITEM_LIST) # Now that the temporary directories contain all the extracted files, perform # special case processing on any items that need it. After this function # completes successfully, all the files we need to create the output target # files package are in place. process_special_cases( framework_target_files_temp_dir=framework_target_files_temp_dir, vendor_target_files_temp_dir=vendor_target_files_temp_dir, output_target_files_temp_dir=output_target_files_temp_dir, framework_misc_info_keys=framework_misc_info_keys, rebuild_recovery=rebuild_recovery) # Regenerate IMAGES in the temporary directory. add_img_args = ['--verbose'] if rebuild_recovery: add_img_args.append('--rebuild_recovery') add_img_args.append(output_target_files_temp_dir) add_img_to_target_files.main(add_img_args) # Create super_empty.img using the merged misc_info.txt. misc_info_txt = os.path.join(output_target_files_temp_dir, 'META', 'misc_info.txt') def read_helper(): with open(misc_info_txt) as f: return list(f.read().splitlines()) use_dynamic_partitions = common.LoadDictionaryFromLines( read_helper()).get('use_dynamic_partitions') if use_dynamic_partitions != 'true' and output_super_empty: raise ValueError( 'Building super_empty.img requires use_dynamic_partitions=true.') elif use_dynamic_partitions == 'true': super_empty_img = os.path.join(output_target_files_temp_dir, 'IMAGES', 'super_empty.img') build_super_image_args = [ misc_info_txt, super_empty_img, ] build_super_image.main(build_super_image_args) # Copy super_empty.img to the user-provided output_super_empty location. if output_super_empty: shutil.copyfile(super_empty_img, output_super_empty) # Create the IMG package from the merged target files (before zipping, in # order to avoid an unnecessary unzip and copy). if output_img: img_from_target_files_args = [ output_target_files_temp_dir, output_img, ] img_from_target_files.main(img_from_target_files_args) # Finally, create the output target files zip archive and/or copy the # output items to the output target files directory. if output_dir: copy_items(output_target_files_temp_dir, output_dir, output_item_list) if not output_target_files: return output_zip = os.path.abspath(output_target_files) output_target_files_list = os.path.join(temp_dir, 'output.list') output_target_files_meta_dir = os.path.join(output_target_files_temp_dir, 'META') find_command = [ 'find', output_target_files_meta_dir, ] find_process = common.Run(find_command, stdout=subprocess.PIPE, verbose=False) meta_content = common.RunAndCheckOutput(['sort'], stdin=find_process.stdout, verbose=False) find_command = [ 'find', output_target_files_temp_dir, '-path', output_target_files_meta_dir, '-prune', '-o', '-print' ] find_process = common.Run(find_command, stdout=subprocess.PIPE, verbose=False) other_content = common.RunAndCheckOutput(['sort'], stdin=find_process.stdout, verbose=False) with open(output_target_files_list, 'wb') as f: f.write(meta_content) f.write(other_content) command = [ 'soong_zip', '-d', '-o', output_zip, '-C', output_target_files_temp_dir, '-l', output_target_files_list, ] logger.info('creating %s', output_target_files) common.RunAndWait(command, verbose=True) logger.info('finished creating %s', output_target_files) # Create the OTA package from the merged target files package. if output_ota: ota_from_target_files_args = [ output_zip, output_ota, ] ota_from_target_files.main(ota_from_target_files_args)
def merge_target_files(temp_dir, system_target_files, system_item_list, system_misc_info_keys, other_target_files, other_item_list, output_target_files, output_dir, output_item_list, output_ota, output_img, output_super_empty, rebuild_recovery): """Merge two target files packages together. This function takes system and other target files packages as input, performs various file extractions, special case processing, and finally creates a merged zip archive as output. Args: temp_dir: The name of a directory we use when we extract items from the input target files packages, and also a scratch directory that we use for temporary files. system_target_files: The name of the zip archive containing the system partial target files package. system_item_list: The list of items to extract from the partial system target files package as is, meaning these items will land in the output target files package exactly as they appear in the input partial system target files package. system_misc_info_keys: The list of keys to obtain from the system instance of META/misc_info.txt. The remaining keys from the other instance. other_target_files: The name of the zip archive containing the other partial target files package. other_item_list: The list of items to extract from the partial other target files package as is, meaning these items will land in the output target files package exactly as they appear in the input partial other target files package. output_target_files: The name of the output zip archive target files package created by merging system and other. output_dir: The destination directory for saving merged files. output_item_list: The list of items to copy into the output_dir. output_ota: The name of the output zip archive ota package. output_img: The name of the output zip archive img package. output_super_empty: If provided, creates a super_empty.img file from the merged target files package and saves it at this path. rebuild_recovery: If true, rebuild the recovery patch used by non-A/B devices and write it to the system image. """ logger.info('starting: merge system %s and other %s into output %s', system_target_files, other_target_files, output_target_files) # Create directory names that we'll use when we extract files from system, # and other, and for zipping the final output. system_target_files_temp_dir = os.path.join(temp_dir, 'system') other_target_files_temp_dir = os.path.join(temp_dir, 'other') output_target_files_temp_dir = os.path.join(temp_dir, 'output') # Extract "as is" items from the input system partial target files package. # We extract them directly into the output temporary directory since the # items do not need special case processing. extract_items( target_files=system_target_files, target_files_temp_dir=output_target_files_temp_dir, extract_item_list=system_item_list) # Extract "as is" items from the input other partial target files package. We # extract them directly into the output temporary directory since the items # do not need special case processing. extract_items( target_files=other_target_files, target_files_temp_dir=output_target_files_temp_dir, extract_item_list=other_item_list) # Extract "special" items from the input system partial target files package. # We extract these items to different directory since they require special # processing before they will end up in the output directory. extract_items( target_files=system_target_files, target_files_temp_dir=system_target_files_temp_dir, extract_item_list=system_extract_special_item_list) # Extract "special" items from the input other partial target files package. # We extract these items to different directory since they require special # processing before they will end up in the output directory. extract_items( target_files=other_target_files, target_files_temp_dir=other_target_files_temp_dir, extract_item_list=other_extract_special_item_list) # Now that the temporary directories contain all the extracted files, perform # special case processing on any items that need it. After this function # completes successfully, all the files we need to create the output target # files package are in place. process_special_cases( system_target_files_temp_dir=system_target_files_temp_dir, other_target_files_temp_dir=other_target_files_temp_dir, output_target_files_temp_dir=output_target_files_temp_dir, system_misc_info_keys=system_misc_info_keys, rebuild_recovery=rebuild_recovery) # Regenerate IMAGES in the temporary directory. add_img_args = ['--verbose'] if rebuild_recovery: add_img_args.append('--rebuild_recovery') add_img_args.append(output_target_files_temp_dir) add_img_to_target_files.main(add_img_args) # Create super_empty.img using the merged misc_info.txt. misc_info_txt = os.path.join(output_target_files_temp_dir, 'META', 'misc_info.txt') def read_helper(): with open(misc_info_txt) as f: return list(f.read().splitlines()) use_dynamic_partitions = common.LoadDictionaryFromLines( read_helper()).get('use_dynamic_partitions') if use_dynamic_partitions != 'true' and output_super_empty: raise ValueError( 'Building super_empty.img requires use_dynamic_partitions=true.') elif use_dynamic_partitions == 'true': super_empty_img = os.path.join(output_target_files_temp_dir, 'IMAGES', 'super_empty.img') build_super_image_args = [ misc_info_txt, super_empty_img, ] build_super_image.main(build_super_image_args) # Copy super_empty.img to the user-provided output_super_empty location. if output_super_empty: shutil.copyfile(super_empty_img, output_super_empty) # Create the IMG package from the merged target files (before zipping, in # order to avoid an unnecessary unzip and copy). if output_img: img_from_target_files_args = [ output_target_files_temp_dir, output_img, ] img_from_target_files.main(img_from_target_files_args) # Finally, create the output target files zip archive and/or copy the # output items to the output target files directory. if output_dir: copy_items(output_target_files_temp_dir, output_dir, output_item_list) if not output_target_files: return output_zip = os.path.abspath(output_target_files) output_target_files_list = os.path.join(temp_dir, 'output.list') output_target_files_meta_dir = os.path.join(output_target_files_temp_dir, 'META') find_command = [ 'find', output_target_files_meta_dir, ] find_process = common.Run(find_command, stdout=subprocess.PIPE, verbose=False) meta_content = common.RunAndCheckOutput(['sort'], stdin=find_process.stdout, verbose=False) find_command = [ 'find', output_target_files_temp_dir, '-path', output_target_files_meta_dir, '-prune', '-o', '-print' ] find_process = common.Run(find_command, stdout=subprocess.PIPE, verbose=False) other_content = common.RunAndCheckOutput(['sort'], stdin=find_process.stdout, verbose=False) with open(output_target_files_list, 'wb') as f: f.write(meta_content) f.write(other_content) command = [ 'soong_zip', '-d', '-o', output_zip, '-C', output_target_files_temp_dir, '-l', output_target_files_list, ] logger.info('creating %s', output_target_files) common.RunAndWait(command, verbose=True) # Create the OTA package from the merged target files package. if output_ota: ota_from_target_files_args = [ output_zip, output_ota, ] ota_from_target_files.main(ota_from_target_files_args)
def main(argv): key_mapping_options = [] def option_handler(o, a): if o in ("-e", "--extra_apks"): names, key = a.split("=") names = names.split(",") for n in names: OPTIONS.extra_apks[n] = key elif o == "--extra_apex_payload_key": apex_name, key = a.split("=") OPTIONS.extra_apex_payload_keys[apex_name] = key elif o == "--skip_apks_with_path_prefix": # Check the prefix, which must be in all upper case. prefix = a.split('/')[0] if not prefix or prefix != prefix.upper(): raise ValueError("Invalid path prefix '%s'" % (a,)) OPTIONS.skip_apks_with_path_prefix.add(a) elif o in ("-d", "--default_key_mappings"): key_mapping_options.append((None, a)) elif o in ("-k", "--key_mapping"): key_mapping_options.append(a.split("=", 1)) elif o in ("-o", "--replace_ota_keys"): OPTIONS.replace_ota_keys = True elif o in ("-t", "--tag_changes"): new = [] for i in a.split(","): i = i.strip() if not i or i[0] not in "-+": raise ValueError("Bad tag change '%s'" % (i,)) new.append(i[0] + i[1:].strip()) OPTIONS.tag_changes = tuple(new) elif o == "--replace_verity_public_key": OPTIONS.replace_verity_public_key = (True, a) elif o == "--replace_verity_private_key": OPTIONS.replace_verity_private_key = (True, a) elif o == "--replace_verity_keyid": OPTIONS.replace_verity_keyid = (True, a) elif o == "--remove_avb_public_keys": OPTIONS.remove_avb_public_keys = a.split(",") elif o == "--avb_vbmeta_key": OPTIONS.avb_keys['vbmeta'] = a elif o == "--avb_vbmeta_algorithm": OPTIONS.avb_algorithms['vbmeta'] = a elif o == "--avb_vbmeta_extra_args": OPTIONS.avb_extra_args['vbmeta'] = a elif o == "--avb_boot_key": OPTIONS.avb_keys['boot'] = a elif o == "--avb_boot_algorithm": OPTIONS.avb_algorithms['boot'] = a elif o == "--avb_boot_extra_args": OPTIONS.avb_extra_args['boot'] = a elif o == "--avb_dtbo_key": OPTIONS.avb_keys['dtbo'] = a elif o == "--avb_dtbo_algorithm": OPTIONS.avb_algorithms['dtbo'] = a elif o == "--avb_dtbo_extra_args": OPTIONS.avb_extra_args['dtbo'] = a elif o == "--avb_system_key": OPTIONS.avb_keys['system'] = a elif o == "--avb_system_algorithm": OPTIONS.avb_algorithms['system'] = a elif o == "--avb_system_extra_args": OPTIONS.avb_extra_args['system'] = a elif o == "--avb_system_other_key": OPTIONS.avb_keys['system_other'] = a elif o == "--avb_system_other_algorithm": OPTIONS.avb_algorithms['system_other'] = a elif o == "--avb_system_other_extra_args": OPTIONS.avb_extra_args['system_other'] = a elif o == "--avb_vendor_key": OPTIONS.avb_keys['vendor'] = a elif o == "--avb_vendor_algorithm": OPTIONS.avb_algorithms['vendor'] = a elif o == "--avb_vendor_extra_args": OPTIONS.avb_extra_args['vendor'] = a elif o == "--avb_vbmeta_system_key": OPTIONS.avb_keys['vbmeta_system'] = a elif o == "--avb_vbmeta_system_algorithm": OPTIONS.avb_algorithms['vbmeta_system'] = a elif o == "--avb_vbmeta_system_extra_args": OPTIONS.avb_extra_args['vbmeta_system'] = a elif o == "--avb_vbmeta_vendor_key": OPTIONS.avb_keys['vbmeta_vendor'] = a elif o == "--avb_vbmeta_vendor_algorithm": OPTIONS.avb_algorithms['vbmeta_vendor'] = a elif o == "--avb_vbmeta_vendor_extra_args": OPTIONS.avb_extra_args['vbmeta_vendor'] = a elif o == "--avb_apex_extra_args": OPTIONS.avb_extra_args['apex'] = a elif o == "--avb_extra_custom_image_key": partition, key = a.split("=") OPTIONS.avb_keys[partition] = key elif o == "--avb_extra_custom_image_algorithm": partition, algorithm = a.split("=") OPTIONS.avb_algorithms[partition] = algorithm elif o == "--avb_extra_custom_image_extra_args": # Setting the maxsplit parameter to one, which will return a list with # two elements. e.g., the second '=' should not be splitted for # 'oem=--signing_helper_with_files=/tmp/avbsigner.sh'. partition, extra_args = a.split("=", 1) OPTIONS.avb_extra_args[partition] = extra_args else: return False return True args = common.ParseOptions( argv, __doc__, extra_opts="e:d:k:ot:", extra_long_opts=[ "extra_apks=", "extra_apex_payload_key=", "skip_apks_with_path_prefix=", "default_key_mappings=", "key_mapping=", "replace_ota_keys", "tag_changes=", "replace_verity_public_key=", "replace_verity_private_key=", "replace_verity_keyid=", "remove_avb_public_keys=", "avb_apex_extra_args=", "avb_vbmeta_algorithm=", "avb_vbmeta_key=", "avb_vbmeta_extra_args=", "avb_boot_algorithm=", "avb_boot_key=", "avb_boot_extra_args=", "avb_dtbo_algorithm=", "avb_dtbo_key=", "avb_dtbo_extra_args=", "avb_system_algorithm=", "avb_system_key=", "avb_system_extra_args=", "avb_system_other_algorithm=", "avb_system_other_key=", "avb_system_other_extra_args=", "avb_vendor_algorithm=", "avb_vendor_key=", "avb_vendor_extra_args=", "avb_vbmeta_system_algorithm=", "avb_vbmeta_system_key=", "avb_vbmeta_system_extra_args=", "avb_vbmeta_vendor_algorithm=", "avb_vbmeta_vendor_key=", "avb_vbmeta_vendor_extra_args=", "avb_extra_custom_image_key=", "avb_extra_custom_image_algorithm=", "avb_extra_custom_image_extra_args=", ], extra_option_handler=option_handler) if len(args) != 2: common.Usage(__doc__) sys.exit(1) common.InitLogging() input_zip = zipfile.ZipFile(args[0], "r", allowZip64=True) output_zip = zipfile.ZipFile(args[1], "w", compression=zipfile.ZIP_DEFLATED, allowZip64=True) misc_info = common.LoadInfoDict(input_zip) BuildKeyMap(misc_info, key_mapping_options) apk_keys_info, compressed_extension = common.ReadApkCerts(input_zip) apk_keys = GetApkCerts(apk_keys_info) apex_keys_info = ReadApexKeysInfo(input_zip) apex_keys = GetApexKeys(apex_keys_info, apk_keys) # TODO(xunchang) check for the apks inside the apex files, and abort early if # the keys are not available. CheckApkAndApexKeysAvailable( input_zip, set(apk_keys.keys()) | set(apex_keys.keys()), compressed_extension, apex_keys) key_passwords = common.GetKeyPasswords( set(apk_keys.values()) | set(itertools.chain(*apex_keys.values()))) platform_api_level, _ = GetApiLevelAndCodename(input_zip) codename_to_api_level_map = GetCodenameToApiLevelMap(input_zip) ProcessTargetFiles(input_zip, output_zip, misc_info, apk_keys, apex_keys, key_passwords, platform_api_level, codename_to_api_level_map, compressed_extension) common.ZipClose(input_zip) common.ZipClose(output_zip) # Skip building userdata.img and cache.img when signing the target files. new_args = ["--is_signing"] # add_img_to_target_files builds the system image from scratch, so the # recovery patch is guaranteed to be regenerated there. if OPTIONS.rebuild_recovery: new_args.append("--rebuild_recovery") new_args.append(args[1]) add_img_to_target_files.main(new_args) print("done.")
def main(argv): key_mapping_options = [] def option_handler(o, a): if o in ("-e", "--extra_apks"): names, key = a.split("=") names = names.split(",") for n in names: OPTIONS.extra_apks[n] = key elif o in ("-d", "--default_key_mappings"): key_mapping_options.append((None, a)) elif o in ("-k", "--key_mapping"): key_mapping_options.append(a.split("=", 1)) elif o in ("-o", "--replace_ota_keys"): OPTIONS.replace_ota_keys = True elif o in ("-t", "--tag_changes"): new = [] for i in a.split(","): i = i.strip() if not i or i[0] not in "-+": raise ValueError("Bad tag change '%s'" % (i, )) new.append(i[0] + i[1:].strip()) OPTIONS.tag_changes = tuple(new) elif o == "--replace_verity_public_key": OPTIONS.replace_verity_public_key = (True, a) elif o == "--replace_verity_private_key": OPTIONS.replace_verity_private_key = (True, a) elif o == "--replace_verity_keyid": OPTIONS.replace_verity_keyid = (True, a) elif o == "--avb_vbmeta_key": OPTIONS.avb_keys['vbmeta'] = a elif o == "--avb_vbmeta_algorithm": OPTIONS.avb_algorithms['vbmeta'] = a elif o == "--avb_vbmeta_extra_args": OPTIONS.avb_extra_args['vbmeta'] = a elif o == "--avb_boot_key": OPTIONS.avb_keys['boot'] = a elif o == "--avb_boot_algorithm": OPTIONS.avb_algorithms['boot'] = a elif o == "--avb_boot_extra_args": OPTIONS.avb_extra_args['boot'] = a elif o == "--avb_dtbo_key": OPTIONS.avb_keys['dtbo'] = a elif o == "--avb_dtbo_algorithm": OPTIONS.avb_algorithms['dtbo'] = a elif o == "--avb_dtbo_extra_args": OPTIONS.avb_extra_args['dtbo'] = a elif o == "--avb_system_key": OPTIONS.avb_keys['system'] = a elif o == "--avb_system_algorithm": OPTIONS.avb_algorithms['system'] = a elif o == "--avb_system_extra_args": OPTIONS.avb_extra_args['system'] = a elif o == "--avb_vendor_key": OPTIONS.avb_keys['vendor'] = a elif o == "--avb_vendor_algorithm": OPTIONS.avb_algorithms['vendor'] = a elif o == "--avb_vendor_extra_args": OPTIONS.avb_extra_args['vendor'] = a else: return False return True args = common.ParseOptions(argv, __doc__, extra_opts="e:d:k:ot:", extra_long_opts=[ "extra_apks=", "default_key_mappings=", "key_mapping=", "replace_ota_keys", "tag_changes=", "replace_verity_public_key=", "replace_verity_private_key=", "replace_verity_keyid=", "avb_vbmeta_algorithm=", "avb_vbmeta_key=", "avb_vbmeta_extra_args=", "avb_boot_algorithm=", "avb_boot_key=", "avb_boot_extra_args=", "avb_dtbo_algorithm=", "avb_dtbo_key=", "avb_dtbo_extra_args=", "avb_system_algorithm=", "avb_system_key=", "avb_system_extra_args=", "avb_vendor_algorithm=", "avb_vendor_key=", "avb_vendor_extra_args=", ], extra_option_handler=option_handler) if len(args) != 2: common.Usage(__doc__) sys.exit(1) input_zip = zipfile.ZipFile(args[0], "r") output_zip = zipfile.ZipFile(args[1], "w", compression=zipfile.ZIP_DEFLATED, allowZip64=True) misc_info = common.LoadInfoDict(input_zip) BuildKeyMap(misc_info, key_mapping_options) certmap, compressed_extension = common.ReadApkCerts(input_zip) apk_key_map = GetApkCerts(certmap) CheckAllApksSigned(input_zip, apk_key_map, compressed_extension) key_passwords = common.GetKeyPasswords(set(apk_key_map.values())) platform_api_level, _ = GetApiLevelAndCodename(input_zip) codename_to_api_level_map = GetCodenameToApiLevelMap(input_zip) ProcessTargetFiles(input_zip, output_zip, misc_info, apk_key_map, key_passwords, platform_api_level, codename_to_api_level_map, compressed_extension) common.ZipClose(input_zip) common.ZipClose(output_zip) # Skip building userdata.img and cache.img when signing the target files. new_args = ["--is_signing"] # add_img_to_target_files builds the system image from scratch, so the # recovery patch is guaranteed to be regenerated there. if OPTIONS.rebuild_recovery: new_args.append("--rebuild_recovery") new_args.append(args[1]) add_img_to_target_files.main(new_args) print "done."
def main(argv): key_mapping_options = [] def option_handler(o, a): if o in ("-e", "--extra_apks"): names, key = a.split("=") names = names.split(",") for n in names: OPTIONS.extra_apks[n] = key elif o in ("-d", "--default_key_mappings"): key_mapping_options.append((None, a)) elif o in ("-k", "--key_mapping"): key_mapping_options.append(a.split("=", 1)) elif o in ("-o", "--replace_ota_keys"): OPTIONS.replace_ota_keys = True elif o in ("-t", "--tag_changes"): new = [] for i in a.split(","): i = i.strip() if not i or i[0] not in "-+": raise ValueError("Bad tag change '%s'" % (i,)) new.append(i[0] + i[1:].strip()) OPTIONS.tag_changes = tuple(new) elif o == "--replace_verity_public_key": OPTIONS.replace_verity_public_key = (True, a) elif o == "--replace_verity_private_key": OPTIONS.replace_verity_private_key = (True, a) elif o == "--replace_verity_keyid": OPTIONS.replace_verity_keyid = (True, a) else: return False return True args = common.ParseOptions(argv, __doc__, extra_opts="e:d:k:ot:", extra_long_opts=["extra_apks=", "default_key_mappings=", "key_mapping=", "replace_ota_keys", "tag_changes=", "replace_verity_public_key=", "replace_verity_private_key=", "replace_verity_keyid="], extra_option_handler=option_handler) if len(args) != 2: common.Usage(__doc__) sys.exit(1) input_zip = zipfile.ZipFile(args[0], "r") output_zip = zipfile.ZipFile(args[1], "w") misc_info = common.LoadInfoDict(input_zip) BuildKeyMap(misc_info, key_mapping_options) apk_key_map = GetApkCerts(input_zip) CheckAllApksSigned(input_zip, apk_key_map) key_passwords = common.GetKeyPasswords(set(apk_key_map.values())) platform_api_level, platform_codename = GetApiLevelAndCodename(input_zip) codename_to_api_level_map = GetCodenameToApiLevelMap(input_zip) # Android N will be API Level 24, but isn't yet. # TODO: Remove this workaround once Android N is officially API Level 24. if platform_api_level == 23 and platform_codename == "N": platform_api_level = 24 ProcessTargetFiles(input_zip, output_zip, misc_info, apk_key_map, key_passwords, platform_api_level, codename_to_api_level_map) common.ZipClose(input_zip) common.ZipClose(output_zip) # Skip building userdata.img and cache.img when signing the target files. new_args = ["--is_signing", args[1]] add_img_to_target_files.main(new_args) print "done."