Add support merging system and other for the non-A/B configuration.

For non-A/B, you must supply the --system-item-list, --other-item-list, and
--system-misc-info-keys parameters approrpriate for merging two partial target
files. Additionally, you must supply the --rebuild-recovery option to correctly
generate the filesystem config and file contexts. With all of these parameters,
the script will generate a merged target files containing the correct recovery
files.

Also fix the --keep-tmp option to be consistent with the other options.

Bug: 122813742
Test: verify that merged target image boots and can perform OTA.
Change-Id: I5a942ac0cd9924fec419a686794a2340304594c8
This commit is contained in:
Bill Peckham 2019-03-29 18:27:23 -07:00
parent c712ac1001
commit 364c1ccaa5
1 changed files with 53 additions and 8 deletions

View File

@ -47,6 +47,9 @@ Usage: merge_target_files.py [args]
--rebuild_recovery
Rebuild the recovery patch used by non-A/B devices and write it to the
system image.
--keep-tmp
Keep tempoary files for debugging purposes.
"""
from __future__ import print_function
@ -296,6 +299,37 @@ def process_ab_partitions_txt(
output.write('%s\n' % partition)
def append_recovery_to_filesystem_config(output_target_files_temp_dir):
"""Perform special processing for META/filesystem_config.txt
This function appends recovery information to META/filesystem_config.txt
so that recovery patch regeneration will succeed.
Args:
output_target_files_temp_dir: The name of a directory that will be used
to create the output target files package after all the special cases
are processed. We find filesystem_config.txt here.
"""
filesystem_config_txt = os.path.join(
output_target_files_temp_dir,
'META',
'filesystem_config.txt')
with open(filesystem_config_txt, 'a') as f:
# TODO(bpeckham) this data is hard coded. It should be generated
# programmatically.
f.write(
'system/bin/install-recovery.sh 0 0 750 '
'selabel=u:object_r:install_recovery_exec:s0 capabilities=0x0\n')
f.write(
'system/recovery-from-boot.p 0 0 644 '
'selabel=u:object_r:system_file:s0 capabilities=0x0\n')
f.write(
'system/etc/recovery.img 0 0 440 '
'selabel=u:object_r:install_recovery_exec:s0 capabilities=0x0\n')
def process_misc_info_txt(
system_target_files_temp_dir,
other_target_files_temp_dir,
@ -454,7 +488,9 @@ def process_special_cases(
system_target_files_temp_dir,
other_target_files_temp_dir,
output_target_files_temp_dir,
system_misc_info_keys):
system_misc_info_keys,
rebuild_recovery
):
"""Perform special-case processing for certain target files items.
Certain files in the output target files package require special-case
@ -476,12 +512,20 @@ def process_special_cases(
system_misc_info_keys: A list of keys to obtain from the system instance
of META/misc_info.txt. The remaining keys from the other instance.
rebuild_recovery: If true, rebuild the recovery patch used by non-A/B
devices and write it to the system image.
"""
process_ab_partitions_txt(
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)
if 'ab_update' in system_misc_info_keys:
process_ab_partitions_txt(
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)
if rebuild_recovery:
append_recovery_to_filesystem_config(
output_target_files_temp_dir=output_target_files_temp_dir)
process_misc_info_txt(
system_target_files_temp_dir=system_target_files_temp_dir,
@ -599,7 +643,8 @@ def merge_target_files(
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)
system_misc_info_keys=system_misc_info_keys,
rebuild_recovery=rebuild_recovery)
# Regenerate IMAGES in the temporary directory.
@ -704,7 +749,7 @@ def main():
OPTIONS.output_target_files = a
elif o == '--rebuild_recovery':
OPTIONS.rebuild_recovery = True
elif o == '--keep_tmp':
elif o == '--keep-tmp':
OPTIONS.keep_tmp = True
else:
return False
@ -720,7 +765,7 @@ def main():
'other-item-list=',
'output-target-files=',
'rebuild_recovery',
"keep_tmp",
'keep-tmp',
],
extra_option_handler=option_handler)