blob: 90b632e3113d71faa5731e012294b27c44158c94 [file] [log] [blame]
"""Repacks GKI boot images with the given kernel images."""
import argparse
import json
import os
import shutil
import tempfile
from treble.fetcher import fetcher_lib
from treble.gki import repack_gki_lib
def main():
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument(
'--json_keyfile',
help='JSON keyfile containing credentials. '
'(Default: Use default credential file)')
parser.add_argument(
'--ramdisk_build_id',
required=True,
help='Download from the specified build.')
parser.add_argument(
'--ramdisk_target',
required=True,
help='Name of the ramdisk target from the ramdisk branch.')
parser.add_argument(
'--kernel_build_id',
required=True,
help='Download from the specified build.')
parser.add_argument(
'--kernel_target',
required=True,
help='Name of the kernel target from the kernel branch.')
parser.add_argument(
'--kernel_debug_target',
required=True,
help='Name of the kernel debug target from the kernel branch.')
parser.add_argument(
'--kernel_version',
required=True,
help='The Kernel version to use when repacking.')
parser.add_argument(
'--out_dir', required=True, help='Save output to this directory.')
args = parser.parse_args()
client = fetcher_lib.create_client_from_json_keyfile(
json_keyfile_name=args.json_keyfile)
if not os.path.exists(args.out_dir):
os.makedirs(args.out_dir)
with tempfile.TemporaryDirectory() as tmp_bootimg_dir, \
tempfile.TemporaryDirectory() as tmp_kernel_dir:
# Fetch boot images.
repack_gki_lib.fetch_bootimg(
client=client,
out_dir=tmp_bootimg_dir,
build_id=args.ramdisk_build_id,
kernel_version=args.kernel_version,
target=args.ramdisk_target,
)
# Fetch kernel artifacts.
kernel_dir, kernel_debug_dir = repack_gki_lib.fetch_kernel(
client=client,
out_dir=tmp_kernel_dir,
build_id=args.kernel_build_id,
kernel_target=args.kernel_target,
kernel_debug_target=args.kernel_debug_target,
)
# Save kernel artifacts to the out dir.
kernel_out_dir = os.path.join(args.out_dir, 'kernel', args.kernel_version)
if not os.path.exists(kernel_out_dir):
os.makedirs(kernel_out_dir)
def copy_kernel_file(in_dir, filename, outname=None):
if not outname:
outname = filename
shutil.copy(
os.path.join(in_dir, filename), os.path.join(kernel_out_dir, outname))
copy_kernel_file(kernel_dir, 'System.map')
copy_kernel_file(kernel_dir, 'abi_symbollist')
copy_kernel_file(kernel_dir, 'vmlinux')
copy_kernel_file(kernel_dir, 'Image',
'kernel-{}'.format(args.kernel_version))
copy_kernel_file(kernel_dir, 'Image.lz4',
'kernel-{}-lz4'.format(args.kernel_version))
copy_kernel_file(kernel_dir, 'Image.gz',
'kernel-{}-gz'.format(args.kernel_version))
copy_kernel_file(kernel_debug_dir, 'System.map', 'System.map-allsyms')
copy_kernel_file(kernel_debug_dir, 'abi-generated.xml')
copy_kernel_file(kernel_debug_dir, 'abi-full-generated.xml')
copy_kernel_file(kernel_debug_dir, 'Image',
'kernel-{}-allsyms'.format(args.kernel_version))
copy_kernel_file(kernel_debug_dir, 'Image.lz4',
'kernel-{}-lz4-allsyms'.format(args.kernel_version))
copy_kernel_file(kernel_debug_dir, 'Image.gz',
'kernel-{}-gz-allsyms'.format(args.kernel_version))
# Repack individual boot images using the fetched kernel artifacts,
# then save to the out dir.
repack_gki_lib.repack_bootimgs(tmp_bootimg_dir, kernel_dir,
kernel_debug_dir)
shutil.copytree(tmp_bootimg_dir, args.out_dir, dirs_exist_ok=True)
# Repack boot images inside the img.zip and save to the out dir.
img_zip_name = [f for f in os.listdir(tmp_bootimg_dir) if '-img-' in f][0]
img_zip_path = os.path.join(tmp_bootimg_dir, img_zip_name)
repack_gki_lib.repack_img_zip(img_zip_path, kernel_dir, kernel_debug_dir,
args.kernel_version)
shutil.copy(img_zip_path, args.out_dir)
# Replace kernels within the target_files.zip and save to the out dir.
# TODO(b/209035444): GSI target_files does not yet include a 5.15 boot.img.
if args.kernel_version != '5.15':
target_files_zip_name = [
f for f in os.listdir(tmp_bootimg_dir) if '-target_files-' in f
][0]
target_files_zip_path = os.path.join(tmp_bootimg_dir, target_files_zip_name)
repack_gki_lib.replace_target_files_zip_kernels(target_files_zip_path,
kernel_out_dir,
args.kernel_version)
shutil.copy(target_files_zip_path, args.out_dir)
# Copy otatools.zip from the ramdisk build, used for GKI signing.
shutil.copy(os.path.join(tmp_bootimg_dir, 'otatools.zip'), args.out_dir)
# Write prebuilt-info.txt using the prebuilt artifact build IDs.
data = {
'ramdisk-build-id': int(args.ramdisk_build_id),
'kernel-build-id': int(args.kernel_build_id),
}
with open(os.path.join(kernel_out_dir, 'prebuilt-info.txt'), 'w') as f:
json.dump(data, f, indent=4)
if __name__ == '__main__':
main()