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): """Merges 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) output_target_files_temp_dir = create_merged_package( temp_dir, framework_target_files, framework_item_list, vendor_target_files, vendor_item_list, framework_misc_info_keys, rebuild_recovery) if not check_target_files_vintf.CheckVintf(output_target_files_temp_dir): raise RuntimeError("Incompatible VINTF metadata") generate_images(output_target_files_temp_dir, rebuild_recovery) generate_super_empty_image(output_target_files_temp_dir, output_super_empty) # 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 = create_target_files_archive(output_target_files, output_target_files_temp_dir, temp_dir) # Create the IMG package from the merged target files package. if output_img: img_from_target_files.main([output_zip, output_img]) # Create the OTA package from the merged target files package. if output_ota: ota_from_target_files.main([output_zip, output_ota])
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): """Merges 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: A list of keys to obtain from the framework instance of META/misc_info.txt. The remaining keys should come 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) output_target_files_temp_dir = create_merged_package( temp_dir, framework_target_files, framework_item_list, vendor_target_files, vendor_item_list, framework_misc_info_keys, rebuild_recovery) if not check_target_files_vintf.CheckVintf(output_target_files_temp_dir): raise RuntimeError('Incompatible VINTF metadata') partition_map = common.PartitionMapFromTargetFiles( output_target_files_temp_dir) # Generate and check for cross-partition violations of sharedUserId # values in APKs. This requires the input target-files packages to contain # *.apk files. shareduid_violation_modules = os.path.join( output_target_files_temp_dir, 'META', 'shareduid_violation_modules.json') with open(shareduid_violation_modules, 'w') as f: violation = find_shareduid_violation.FindShareduidViolation( output_target_files_temp_dir, partition_map) # Write the output to a file to enable debugging. f.write(violation) # Check for violations across the input builds' partition groups. framework_partitions = item_list_to_partition_set(framework_item_list) vendor_partitions = item_list_to_partition_set(vendor_item_list) shareduid_errors = common.SharedUidPartitionViolations( json.loads(violation), [framework_partitions, vendor_partitions]) if shareduid_errors: for error in shareduid_errors: logger.error(error) raise ValueError('sharedUserId APK error. See %s' % shareduid_violation_modules) # Run host_init_verifier on the combined init rc files. filtered_partitions = { partition: path for partition, path in partition_map.items() # host_init_verifier checks only the following partitions: if partition in ['system', 'system_ext', 'product', 'vendor', 'odm'] } common.RunHostInitVerifier( product_out=output_target_files_temp_dir, partition_map=filtered_partitions) generate_images(output_target_files_temp_dir, rebuild_recovery) generate_super_empty_image(output_target_files_temp_dir, output_super_empty) # 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 = create_target_files_archive(output_target_files, output_target_files_temp_dir, temp_dir) # Create the IMG package from the merged target files package. if output_img: img_from_target_files.main([output_zip, output_img]) # Create the OTA package from the merged target files package. if output_ota: ota_from_target_files.main([output_zip, output_ota])