xref: /aosp_15_r20/tools/treble/gki/repack_gki.py (revision 105f628577ac4ba0e277a494fbb614ed8c12a994)
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