From 364c1ccaa530d189ec6d0fc7919eef553c643d77 Mon Sep 17 00:00:00 2001 From: Bill Peckham Date: Fri, 29 Mar 2019 18:27:23 -0700 Subject: [PATCH] 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 --- tools/releasetools/merge_target_files.py | 61 ++++++++++++++++++++---- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/tools/releasetools/merge_target_files.py b/tools/releasetools/merge_target_files.py index 3c6bfbfc9..3b72551a3 100755 --- a/tools/releasetools/merge_target_files.py +++ b/tools/releasetools/merge_target_files.py @@ -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)