1*105f6285SAndroid Build Coastguard Worker"""Repacks GKI boot images with the given kernel images.""" 2*105f6285SAndroid Build Coastguard Workerimport argparse 3*105f6285SAndroid Build Coastguard Workerimport json 4*105f6285SAndroid Build Coastguard Workerimport os 5*105f6285SAndroid Build Coastguard Workerimport shutil 6*105f6285SAndroid Build Coastguard Workerimport tempfile 7*105f6285SAndroid Build Coastguard Worker 8*105f6285SAndroid Build Coastguard Workerfrom treble.fetcher import fetcher_lib 9*105f6285SAndroid Build Coastguard Workerfrom treble.gki import repack_gki_lib 10*105f6285SAndroid Build Coastguard Worker 11*105f6285SAndroid Build Coastguard Worker 12*105f6285SAndroid Build Coastguard Workerdef main(): 13*105f6285SAndroid Build Coastguard Worker parser = argparse.ArgumentParser( 14*105f6285SAndroid Build Coastguard Worker description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) 15*105f6285SAndroid Build Coastguard Worker parser.add_argument( 16*105f6285SAndroid Build Coastguard Worker '--json_keyfile', 17*105f6285SAndroid Build Coastguard Worker help='JSON keyfile containing credentials. ' 18*105f6285SAndroid Build Coastguard Worker '(Default: Use default credential file)') 19*105f6285SAndroid Build Coastguard Worker parser.add_argument( 20*105f6285SAndroid Build Coastguard Worker '--bootimg_build_id', help='Download from the specified build.') 21*105f6285SAndroid Build Coastguard Worker parser.add_argument( 22*105f6285SAndroid Build Coastguard Worker '--ramdisk_build_id', help='DEPRECATED. Use --bootimg_build_id instead.') 23*105f6285SAndroid Build Coastguard Worker parser.add_argument( 24*105f6285SAndroid Build Coastguard Worker '--bootimg_target', 25*105f6285SAndroid Build Coastguard Worker help='Name of the bootimg target from the bootimg branch.') 26*105f6285SAndroid Build Coastguard Worker parser.add_argument( 27*105f6285SAndroid Build Coastguard Worker '--ramdisk_target', help='DEPRECATED. Use --bootimg_target instead.') 28*105f6285SAndroid Build Coastguard Worker parser.add_argument( 29*105f6285SAndroid Build Coastguard Worker '--kernel_build_id', 30*105f6285SAndroid Build Coastguard Worker required=True, 31*105f6285SAndroid Build Coastguard Worker help='Download from the specified build.') 32*105f6285SAndroid Build Coastguard Worker parser.add_argument( 33*105f6285SAndroid Build Coastguard Worker '--kernel_target', 34*105f6285SAndroid Build Coastguard Worker required=True, 35*105f6285SAndroid Build Coastguard Worker help='Name of the kernel target from the kernel branch.') 36*105f6285SAndroid Build Coastguard Worker parser.add_argument( 37*105f6285SAndroid Build Coastguard Worker '--kernel_debug_target', 38*105f6285SAndroid Build Coastguard Worker required=True, 39*105f6285SAndroid Build Coastguard Worker help='Name of the kernel debug target from the kernel branch.') 40*105f6285SAndroid Build Coastguard Worker parser.add_argument( 41*105f6285SAndroid Build Coastguard Worker '--kernel_version', 42*105f6285SAndroid Build Coastguard Worker required=True, 43*105f6285SAndroid Build Coastguard Worker help='The Kernel version to use when repacking.') 44*105f6285SAndroid Build Coastguard Worker parser.add_argument( 45*105f6285SAndroid Build Coastguard Worker '--out_dir', required=True, help='Save output to this directory.') 46*105f6285SAndroid Build Coastguard Worker 47*105f6285SAndroid Build Coastguard Worker args = parser.parse_args() 48*105f6285SAndroid Build Coastguard Worker client = fetcher_lib.create_client_from_json_keyfile( 49*105f6285SAndroid Build Coastguard Worker json_keyfile_name=args.json_keyfile) 50*105f6285SAndroid Build Coastguard Worker 51*105f6285SAndroid Build Coastguard Worker if not os.path.exists(args.out_dir): 52*105f6285SAndroid Build Coastguard Worker os.makedirs(args.out_dir) 53*105f6285SAndroid Build Coastguard Worker 54*105f6285SAndroid Build Coastguard Worker bootimg_build_id = args.bootimg_build_id or args.ramdisk_build_id 55*105f6285SAndroid Build Coastguard Worker bootimg_target = args.bootimg_target or args.ramdisk_target 56*105f6285SAndroid Build Coastguard Worker 57*105f6285SAndroid Build Coastguard Worker with tempfile.TemporaryDirectory() as tmp_bootimg_dir, \ 58*105f6285SAndroid Build Coastguard Worker tempfile.TemporaryDirectory() as tmp_kernel_dir: 59*105f6285SAndroid Build Coastguard Worker # Fetch boot images. 60*105f6285SAndroid Build Coastguard Worker repack_gki_lib.fetch_bootimg( 61*105f6285SAndroid Build Coastguard Worker client=client, 62*105f6285SAndroid Build Coastguard Worker out_dir=tmp_bootimg_dir, 63*105f6285SAndroid Build Coastguard Worker build_id=bootimg_build_id, 64*105f6285SAndroid Build Coastguard Worker kernel_version=args.kernel_version, 65*105f6285SAndroid Build Coastguard Worker target=bootimg_target, 66*105f6285SAndroid Build Coastguard Worker ) 67*105f6285SAndroid Build Coastguard Worker 68*105f6285SAndroid Build Coastguard Worker # Fetch kernel artifacts. 69*105f6285SAndroid Build Coastguard Worker kernel_dir, kernel_debug_dir = repack_gki_lib.fetch_kernel( 70*105f6285SAndroid Build Coastguard Worker client=client, 71*105f6285SAndroid Build Coastguard Worker out_dir=tmp_kernel_dir, 72*105f6285SAndroid Build Coastguard Worker build_id=args.kernel_build_id, 73*105f6285SAndroid Build Coastguard Worker kernel_target=args.kernel_target, 74*105f6285SAndroid Build Coastguard Worker kernel_debug_target=args.kernel_debug_target, 75*105f6285SAndroid Build Coastguard Worker ) 76*105f6285SAndroid Build Coastguard Worker 77*105f6285SAndroid Build Coastguard Worker # Save kernel artifacts to the out dir. 78*105f6285SAndroid Build Coastguard Worker kernel_out_dir = os.path.join(args.out_dir, 'kernel', args.kernel_version) 79*105f6285SAndroid Build Coastguard Worker if not os.path.exists(kernel_out_dir): 80*105f6285SAndroid Build Coastguard Worker os.makedirs(kernel_out_dir) 81*105f6285SAndroid Build Coastguard Worker 82*105f6285SAndroid Build Coastguard Worker def copy_kernel_file(in_dir, filename, outname=None): 83*105f6285SAndroid Build Coastguard Worker if not outname: 84*105f6285SAndroid Build Coastguard Worker outname = filename 85*105f6285SAndroid Build Coastguard Worker shutil.copy( 86*105f6285SAndroid Build Coastguard Worker os.path.join(in_dir, filename), os.path.join(kernel_out_dir, outname)) 87*105f6285SAndroid Build Coastguard Worker 88*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_dir, 'System.map') 89*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_dir, 'abi_symbollist') 90*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_dir, 'vmlinux') 91*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_dir, 'vmlinux.symvers') 92*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_dir, 'Image', 93*105f6285SAndroid Build Coastguard Worker 'kernel-{}'.format(args.kernel_version)) 94*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_dir, 'Image.lz4', 95*105f6285SAndroid Build Coastguard Worker 'kernel-{}-lz4'.format(args.kernel_version)) 96*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_dir, 'Image.gz', 97*105f6285SAndroid Build Coastguard Worker 'kernel-{}-gz'.format(args.kernel_version)) 98*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_debug_dir, 'System.map', 'System.map-allsyms') 99*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_debug_dir, 'abi-generated.xml') 100*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_debug_dir, 'abi-full-generated.xml') 101*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_debug_dir, 'Image', 102*105f6285SAndroid Build Coastguard Worker 'kernel-{}-allsyms'.format(args.kernel_version)) 103*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_debug_dir, 'Image.lz4', 104*105f6285SAndroid Build Coastguard Worker 'kernel-{}-lz4-allsyms'.format(args.kernel_version)) 105*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_debug_dir, 'Image.gz', 106*105f6285SAndroid Build Coastguard Worker 'kernel-{}-gz-allsyms'.format(args.kernel_version)) 107*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_debug_dir, 'vmlinux', 'vmlinux-allsyms') 108*105f6285SAndroid Build Coastguard Worker copy_kernel_file(kernel_debug_dir, 'vmlinux.symvers', 'vmlinux.symvers-allsyms') 109*105f6285SAndroid Build Coastguard Worker 110*105f6285SAndroid Build Coastguard Worker # Repack individual boot images using the fetched kernel artifacts, 111*105f6285SAndroid Build Coastguard Worker # then save to the out dir. 112*105f6285SAndroid Build Coastguard Worker repack_gki_lib.repack_bootimgs(tmp_bootimg_dir, kernel_dir, 113*105f6285SAndroid Build Coastguard Worker kernel_debug_dir) 114*105f6285SAndroid Build Coastguard Worker shutil.copytree(tmp_bootimg_dir, args.out_dir, dirs_exist_ok=True) 115*105f6285SAndroid Build Coastguard Worker 116*105f6285SAndroid Build Coastguard Worker # Repack boot images inside the img.zip and save to the out dir. 117*105f6285SAndroid Build Coastguard Worker img_zip_name = [f for f in os.listdir(tmp_bootimg_dir) if '-img-' in f][0] 118*105f6285SAndroid Build Coastguard Worker img_zip_path = os.path.join(tmp_bootimg_dir, img_zip_name) 119*105f6285SAndroid Build Coastguard Worker repack_gki_lib.repack_img_zip(img_zip_path, kernel_dir, kernel_debug_dir, 120*105f6285SAndroid Build Coastguard Worker args.kernel_version) 121*105f6285SAndroid Build Coastguard Worker shutil.copy(img_zip_path, args.out_dir) 122*105f6285SAndroid Build Coastguard Worker 123*105f6285SAndroid Build Coastguard Worker target_files_zip_name = [ 124*105f6285SAndroid Build Coastguard Worker f for f in os.listdir(tmp_bootimg_dir) if '-target_files-' in f 125*105f6285SAndroid Build Coastguard Worker ][0] 126*105f6285SAndroid Build Coastguard Worker target_files_zip_path = os.path.join(tmp_bootimg_dir, target_files_zip_name) 127*105f6285SAndroid Build Coastguard Worker repack_gki_lib.replace_target_files_zip_kernels(target_files_zip_path, 128*105f6285SAndroid Build Coastguard Worker kernel_out_dir, 129*105f6285SAndroid Build Coastguard Worker args.kernel_version) 130*105f6285SAndroid Build Coastguard Worker shutil.copy(target_files_zip_path, args.out_dir) 131*105f6285SAndroid Build Coastguard Worker 132*105f6285SAndroid Build Coastguard Worker # Copy otatools.zip from the bootimg build, used for GKI signing. 133*105f6285SAndroid Build Coastguard Worker shutil.copy(os.path.join(tmp_bootimg_dir, 'otatools.zip'), args.out_dir) 134*105f6285SAndroid Build Coastguard Worker 135*105f6285SAndroid Build Coastguard Worker # Write prebuilt-info.txt using the prebuilt artifact build IDs. 136*105f6285SAndroid Build Coastguard Worker data = { 137*105f6285SAndroid Build Coastguard Worker 'kernel-build-id': int(args.kernel_build_id), 138*105f6285SAndroid Build Coastguard Worker } 139*105f6285SAndroid Build Coastguard Worker with open(os.path.join(kernel_out_dir, 'prebuilt-info.txt'), 'w') as f: 140*105f6285SAndroid Build Coastguard Worker json.dump(data, f, indent=4) 141*105f6285SAndroid Build Coastguard Worker 142*105f6285SAndroid Build Coastguard Worker 143*105f6285SAndroid Build Coastguard Workerif __name__ == '__main__': 144*105f6285SAndroid Build Coastguard Worker main() 145