Renames system to framework and other to vendor.
Also fixes small nit from previous change to write_sorted_data(). Bug: 132788610 Test: python -m unittest test_merge_target_files Test: Creating and booting a merged build. Change-Id: I3dc43a4fe55b86b436dec08feb5d70096d38de36
This commit is contained in:
@@ -15,31 +15,31 @@
|
|||||||
# the License.
|
# the License.
|
||||||
"""This script merges two partial target files packages.
|
"""This script merges two partial target files packages.
|
||||||
|
|
||||||
One package contains system files, and the other contains non-system files.
|
One package contains framework files, and the other contains vendor files.
|
||||||
It produces a complete target files package that can be used to generate an
|
It produces a complete target files package that can be used to generate an
|
||||||
OTA package.
|
OTA package.
|
||||||
|
|
||||||
Usage: merge_target_files.py [args]
|
Usage: merge_target_files.py [args]
|
||||||
|
|
||||||
--system-target-files system-target-files-zip-archive
|
--framework-target-files framework-target-files-zip-archive
|
||||||
The input target files package containing system bits. This is a zip
|
The input target files package containing framework bits. This is a zip
|
||||||
archive.
|
archive.
|
||||||
|
|
||||||
--system-item-list system-item-list-file
|
--framework-item-list framework-item-list-file
|
||||||
The optional path to a newline-separated config file that replaces the
|
The optional path to a newline-separated config file that replaces the
|
||||||
contents of DEFAULT_SYSTEM_ITEM_LIST if provided.
|
contents of DEFAULT_FRAMEWORK_ITEM_LIST if provided.
|
||||||
|
|
||||||
--system-misc-info-keys system-misc-info-keys-file
|
--framework-misc-info-keys framework-misc-info-keys-file
|
||||||
The optional path to a newline-separated config file that replaces the
|
The optional path to a newline-separated config file that replaces the
|
||||||
contents of DEFAULT_SYSTEM_MISC_INFO_KEYS if provided.
|
contents of DEFAULT_FRAMEWORK_MISC_INFO_KEYS if provided.
|
||||||
|
|
||||||
--other-target-files other-target-files-zip-archive
|
--vendor-target-files vendor-target-files-zip-archive
|
||||||
The input target files package containing other bits. This is a zip
|
The input target files package containing vendor bits. This is a zip
|
||||||
archive.
|
archive.
|
||||||
|
|
||||||
--other-item-list other-item-list-file
|
--vendor-item-list vendor-item-list-file
|
||||||
The optional path to a newline-separated config file that replaces the
|
The optional path to a newline-separated config file that replaces the
|
||||||
contents of DEFAULT_OTHER_ITEM_LIST if provided.
|
contents of DEFAULT_VENDOR_ITEM_LIST if provided.
|
||||||
|
|
||||||
--output-target-files output-target-files-package
|
--output-target-files output-target-files-package
|
||||||
If provided, the output merged target files package. Also a zip archive.
|
If provided, the output merged target files package. Also a zip archive.
|
||||||
@@ -93,11 +93,11 @@ import ota_from_target_files
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
OPTIONS = common.OPTIONS
|
OPTIONS = common.OPTIONS
|
||||||
OPTIONS.verbose = True
|
OPTIONS.verbose = True
|
||||||
OPTIONS.system_target_files = None
|
OPTIONS.framework_target_files = None
|
||||||
OPTIONS.system_item_list = None
|
OPTIONS.framework_item_list = None
|
||||||
OPTIONS.system_misc_info_keys = None
|
OPTIONS.framework_misc_info_keys = None
|
||||||
OPTIONS.other_target_files = None
|
OPTIONS.vendor_target_files = None
|
||||||
OPTIONS.other_item_list = None
|
OPTIONS.vendor_item_list = None
|
||||||
OPTIONS.output_target_files = None
|
OPTIONS.output_target_files = None
|
||||||
OPTIONS.output_dir = None
|
OPTIONS.output_dir = None
|
||||||
OPTIONS.output_item_list = None
|
OPTIONS.output_item_list = None
|
||||||
@@ -107,12 +107,12 @@ OPTIONS.output_super_empty = None
|
|||||||
OPTIONS.rebuild_recovery = False
|
OPTIONS.rebuild_recovery = False
|
||||||
OPTIONS.keep_tmp = False
|
OPTIONS.keep_tmp = False
|
||||||
|
|
||||||
# DEFAULT_SYSTEM_ITEM_LIST is a list of items to extract from the partial
|
# DEFAULT_FRAMEWORK_ITEM_LIST is a list of items to extract from the partial
|
||||||
# system target files package as is, meaning these items will land in the
|
# framework target files package as is, meaning these items will land in the
|
||||||
# output target files package exactly as they appear in the input partial
|
# output target files package exactly as they appear in the input partial
|
||||||
# system target files package.
|
# framework target files package.
|
||||||
|
|
||||||
DEFAULT_SYSTEM_ITEM_LIST = (
|
DEFAULT_FRAMEWORK_ITEM_LIST = (
|
||||||
'META/apkcerts.txt',
|
'META/apkcerts.txt',
|
||||||
'META/filesystem_config.txt',
|
'META/filesystem_config.txt',
|
||||||
'META/root_filesystem_config.txt',
|
'META/root_filesystem_config.txt',
|
||||||
@@ -124,17 +124,18 @@ DEFAULT_SYSTEM_ITEM_LIST = (
|
|||||||
'SYSTEM/*',
|
'SYSTEM/*',
|
||||||
)
|
)
|
||||||
|
|
||||||
# SYSTEM_EXTRACT_SPECIAL_ITEM_LIST is a list of items to extract from the
|
# FRAMEWORK_EXTRACT_SPECIAL_ITEM_LIST is a list of items to extract from the
|
||||||
# partial system target files package that need some special processing, such
|
# partial framework target files package that need some special processing, such
|
||||||
# as some sort of combination with items from the partial other target files
|
# as some sort of combination with items from the partial vendor target files
|
||||||
# package.
|
# package.
|
||||||
|
|
||||||
SYSTEM_EXTRACT_SPECIAL_ITEM_LIST = ('META/*',)
|
FRAMEWORK_EXTRACT_SPECIAL_ITEM_LIST = ('META/*',)
|
||||||
|
|
||||||
# DEFAULT_SYSTEM_MISC_INFO_KEYS is a list of keys to obtain from the system
|
# DEFAULT_FRAMEWORK_MISC_INFO_KEYS is a list of keys to obtain from the
|
||||||
# instance of META/misc_info.txt. The remaining keys from the other instance.
|
# framework instance of META/misc_info.txt. The remaining keys from the
|
||||||
|
# vendor instance.
|
||||||
|
|
||||||
DEFAULT_SYSTEM_MISC_INFO_KEYS = (
|
DEFAULT_FRAMEWORK_MISC_INFO_KEYS = (
|
||||||
'avb_system_hashtree_enable',
|
'avb_system_hashtree_enable',
|
||||||
'avb_system_add_hashtree_footer_args',
|
'avb_system_add_hashtree_footer_args',
|
||||||
'avb_system_key_path',
|
'avb_system_key_path',
|
||||||
@@ -151,12 +152,12 @@ DEFAULT_SYSTEM_MISC_INFO_KEYS = (
|
|||||||
'system_size',
|
'system_size',
|
||||||
)
|
)
|
||||||
|
|
||||||
# DEFAULT_OTHER_ITEM_LIST is a list of items to extract from the partial
|
# DEFAULT_VENDOR_ITEM_LIST is a list of items to extract from the partial
|
||||||
# other target files package as is, meaning these items will land in the output
|
# vendor target files package as is, meaning these items will land in the output
|
||||||
# target files package exactly as they appear in the input partial other target
|
# target files package exactly as they appear in the input partial vendor target
|
||||||
# files package.
|
# files package.
|
||||||
|
|
||||||
DEFAULT_OTHER_ITEM_LIST = (
|
DEFAULT_VENDOR_ITEM_LIST = (
|
||||||
'META/boot_filesystem_config.txt',
|
'META/boot_filesystem_config.txt',
|
||||||
'META/otakeys.txt',
|
'META/otakeys.txt',
|
||||||
'META/releasetools.py',
|
'META/releasetools.py',
|
||||||
@@ -172,17 +173,17 @@ DEFAULT_OTHER_ITEM_LIST = (
|
|||||||
'VENDOR/*',
|
'VENDOR/*',
|
||||||
)
|
)
|
||||||
|
|
||||||
# OTHER_EXTRACT_SPECIAL_ITEM_LIST is a list of items to extract from the
|
# VENDOR_EXTRACT_SPECIAL_ITEM_LIST is a list of items to extract from the
|
||||||
# partial other target files package that need some special processing, such as
|
# partial vendor target files package that need some special processing, such as
|
||||||
# some sort of combination with items from the partial system target files
|
# some sort of combination with items from the partial framework target files
|
||||||
# package.
|
# package.
|
||||||
|
|
||||||
OTHER_EXTRACT_SPECIAL_ITEM_LIST = ('META/*',)
|
VENDOR_EXTRACT_SPECIAL_ITEM_LIST = ('META/*',)
|
||||||
|
|
||||||
# The merge config lists should not attempt to extract items from both
|
# The merge config lists should not attempt to extract items from both
|
||||||
# builds for any of the following partitions. The partitions in
|
# builds for any of the following partitions. The partitions in
|
||||||
# SINGLE_BUILD_PARTITIONS should come entirely from a single build (either
|
# SINGLE_BUILD_PARTITIONS should come entirely from a single build (either
|
||||||
# system or other, but not both).
|
# framework or vendor, but not both).
|
||||||
|
|
||||||
SINGLE_BUILD_PARTITIONS = (
|
SINGLE_BUILD_PARTITIONS = (
|
||||||
'BOOT/',
|
'BOOT/',
|
||||||
@@ -211,9 +212,7 @@ def write_sorted_data(data, path):
|
|||||||
be overridden if it exists.
|
be overridden if it exists.
|
||||||
"""
|
"""
|
||||||
with open(path, 'w') as output:
|
with open(path, 'w') as output:
|
||||||
sorted_data = sorted(data.keys()) if isinstance(data,
|
for entry in sorted(data):
|
||||||
dict) else sorted(data)
|
|
||||||
for entry in sorted_data:
|
|
||||||
out_str = '{}={}\n'.format(entry, data[entry]) if isinstance(
|
out_str = '{}={}\n'.format(entry, data[entry]) if isinstance(
|
||||||
data, dict) else '{}\n'.format(entry)
|
data, dict) else '{}\n'.format(entry)
|
||||||
output.write(out_str)
|
output.write(out_str)
|
||||||
@@ -295,28 +294,29 @@ def read_config_list(config_file_path):
|
|||||||
return config_file.read().splitlines()
|
return config_file.read().splitlines()
|
||||||
|
|
||||||
|
|
||||||
def validate_config_lists(system_item_list, system_misc_info_keys,
|
def validate_config_lists(framework_item_list, framework_misc_info_keys,
|
||||||
other_item_list):
|
vendor_item_list):
|
||||||
"""Performs validations on the merge config lists.
|
"""Performs validations on the merge config lists.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
system_item_list: The list of items to extract from the partial system
|
framework_item_list: The list of items to extract from the partial framework
|
||||||
|
target files package as is.
|
||||||
|
framework_misc_info_keys: A list of keys to obtain from the framework
|
||||||
|
instance of META/misc_info.txt. The remaining keys from the vendor
|
||||||
|
instance.
|
||||||
|
vendor_item_list: The list of items to extract from the partial vendor
|
||||||
target files package as is.
|
target files package as is.
|
||||||
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.
|
|
||||||
other_item_list: The list of items to extract from the partial other target
|
|
||||||
files package as is.
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
False if a validation fails, otherwise true.
|
False if a validation fails, otherwise true.
|
||||||
"""
|
"""
|
||||||
has_error = False
|
has_error = False
|
||||||
|
|
||||||
default_combined_item_set = set(DEFAULT_SYSTEM_ITEM_LIST)
|
default_combined_item_set = set(DEFAULT_FRAMEWORK_ITEM_LIST)
|
||||||
default_combined_item_set.update(DEFAULT_OTHER_ITEM_LIST)
|
default_combined_item_set.update(DEFAULT_VENDOR_ITEM_LIST)
|
||||||
|
|
||||||
combined_item_set = set(system_item_list)
|
combined_item_set = set(framework_item_list)
|
||||||
combined_item_set.update(other_item_list)
|
combined_item_set.update(vendor_item_list)
|
||||||
|
|
||||||
# Check that the merge config lists are not missing any item specified
|
# Check that the merge config lists are not missing any item specified
|
||||||
# by the default config lists.
|
# by the default config lists.
|
||||||
@@ -324,36 +324,37 @@ def validate_config_lists(system_item_list, system_misc_info_keys,
|
|||||||
if difference:
|
if difference:
|
||||||
logger.error('Missing merge config items: %s', list(difference))
|
logger.error('Missing merge config items: %s', list(difference))
|
||||||
logger.error('Please ensure missing items are in either the '
|
logger.error('Please ensure missing items are in either the '
|
||||||
'system-item-list or other-item-list files provided to '
|
'framework-item-list or vendor-item-list files provided to '
|
||||||
'this script.')
|
'this script.')
|
||||||
has_error = True
|
has_error = True
|
||||||
|
|
||||||
for partition in SINGLE_BUILD_PARTITIONS:
|
for partition in SINGLE_BUILD_PARTITIONS:
|
||||||
in_system = any(item.startswith(partition) for item in system_item_list)
|
in_framework = any(
|
||||||
in_other = any(item.startswith(partition) for item in other_item_list)
|
item.startswith(partition) for item in framework_item_list)
|
||||||
if in_system and in_other:
|
in_vendor = any(item.startswith(partition) for item in vendor_item_list)
|
||||||
|
if in_framework and in_vendor:
|
||||||
logger.error(
|
logger.error(
|
||||||
'Cannot extract items from {0} for both the system and other builds. '
|
'Cannot extract items from {0} for both the framework and vendor builds. '
|
||||||
'Please ensure only one merge config item list includes {0}.'.format(
|
'Please ensure only one merge config item list includes {0}.'.format(
|
||||||
partition))
|
partition))
|
||||||
has_error = True
|
has_error = True
|
||||||
|
|
||||||
if ('dynamic_partition_list' in system_misc_info_keys) or (
|
if ('dynamic_partition_list' in framework_misc_info_keys) or (
|
||||||
'super_partition_groups' in system_misc_info_keys):
|
'super_partition_groups' in framework_misc_info_keys):
|
||||||
logger.error('Dynamic partition misc info keys should come from '
|
logger.error('Dynamic partition misc info keys should come from '
|
||||||
'the other instance of META/misc_info.txt.')
|
'the vendor instance of META/misc_info.txt.')
|
||||||
has_error = True
|
has_error = True
|
||||||
|
|
||||||
return not has_error
|
return not has_error
|
||||||
|
|
||||||
|
|
||||||
def process_ab_partitions_txt(system_target_files_temp_dir,
|
def process_ab_partitions_txt(framework_target_files_temp_dir,
|
||||||
other_target_files_temp_dir,
|
vendor_target_files_temp_dir,
|
||||||
output_target_files_temp_dir):
|
output_target_files_temp_dir):
|
||||||
"""Perform special processing for META/ab_partitions.txt.
|
"""Perform special processing for META/ab_partitions.txt.
|
||||||
|
|
||||||
This function merges the contents of the META/ab_partitions.txt files from
|
This function merges the contents of the META/ab_partitions.txt files from
|
||||||
the system directory and the other directory, placing the merged result in
|
the framework directory and the vendor directory, placing the merged result in
|
||||||
the output directory. The precondition in that the files are already
|
the output directory. The precondition in that the files are already
|
||||||
extracted. The post condition is that the output META/ab_partitions.txt
|
extracted. The post condition is that the output META/ab_partitions.txt
|
||||||
contains the merged content. The format for each ab_partitions.txt a one
|
contains the merged content. The format for each ab_partitions.txt a one
|
||||||
@@ -361,28 +362,28 @@ def process_ab_partitions_txt(system_target_files_temp_dir,
|
|||||||
names.
|
names.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
system_target_files_temp_dir: The name of a directory containing the special
|
framework_target_files_temp_dir: The name of a directory containing the
|
||||||
items extracted from the system target files package.
|
special items extracted from the framework target files package.
|
||||||
other_target_files_temp_dir: The name of a directory containing the special
|
vendor_target_files_temp_dir: The name of a directory containing the special
|
||||||
items extracted from the other target files package.
|
items extracted from the vendor target files package.
|
||||||
output_target_files_temp_dir: The name of a directory that will be used to
|
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
|
create the output target files package after all the special cases are
|
||||||
processed.
|
processed.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
system_ab_partitions_txt = os.path.join(system_target_files_temp_dir, 'META',
|
framework_ab_partitions_txt = os.path.join(framework_target_files_temp_dir,
|
||||||
|
'META', 'ab_partitions.txt')
|
||||||
|
|
||||||
|
vendor_ab_partitions_txt = os.path.join(vendor_target_files_temp_dir, 'META',
|
||||||
'ab_partitions.txt')
|
'ab_partitions.txt')
|
||||||
|
|
||||||
other_ab_partitions_txt = os.path.join(other_target_files_temp_dir, 'META',
|
with open(framework_ab_partitions_txt) as f:
|
||||||
'ab_partitions.txt')
|
framework_ab_partitions = f.read().splitlines()
|
||||||
|
|
||||||
with open(system_ab_partitions_txt) as f:
|
with open(vendor_ab_partitions_txt) as f:
|
||||||
system_ab_partitions = f.read().splitlines()
|
vendor_ab_partitions = f.read().splitlines()
|
||||||
|
|
||||||
with open(other_ab_partitions_txt) as f:
|
output_ab_partitions = set(framework_ab_partitions + vendor_ab_partitions)
|
||||||
other_ab_partitions = f.read().splitlines()
|
|
||||||
|
|
||||||
output_ab_partitions = set(system_ab_partitions + other_ab_partitions)
|
|
||||||
|
|
||||||
output_ab_partitions_txt = os.path.join(output_target_files_temp_dir, 'META',
|
output_ab_partitions_txt = os.path.join(output_target_files_temp_dir, 'META',
|
||||||
'ab_partitions.txt')
|
'ab_partitions.txt')
|
||||||
@@ -416,8 +417,8 @@ def append_recovery_to_filesystem_config(output_target_files_temp_dir):
|
|||||||
'selabel=u:object_r:install_recovery_exec:s0 capabilities=0x0\n')
|
'selabel=u:object_r:install_recovery_exec:s0 capabilities=0x0\n')
|
||||||
|
|
||||||
|
|
||||||
def merge_dynamic_partition_info_dicts(system_dict,
|
def merge_dynamic_partition_info_dicts(framework_dict,
|
||||||
other_dict,
|
vendor_dict,
|
||||||
include_dynamic_partition_list=True,
|
include_dynamic_partition_list=True,
|
||||||
size_prefix='',
|
size_prefix='',
|
||||||
size_suffix='',
|
size_suffix='',
|
||||||
@@ -426,10 +427,10 @@ def merge_dynamic_partition_info_dicts(system_dict,
|
|||||||
"""Merges dynamic partition info variables.
|
"""Merges dynamic partition info variables.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
system_dict: The dictionary of dynamic partition info variables from the
|
framework_dict: The dictionary of dynamic partition info variables from the
|
||||||
partial system target files.
|
partial framework target files.
|
||||||
other_dict: The dictionary of dynamic partition info variables from the
|
vendor_dict: The dictionary of dynamic partition info variables from the
|
||||||
partial other target files.
|
partial vendor target files.
|
||||||
include_dynamic_partition_list: If true, merges the dynamic_partition_list
|
include_dynamic_partition_list: If true, merges the dynamic_partition_list
|
||||||
variable. Not all use cases need this variable merged.
|
variable. Not all use cases need this variable merged.
|
||||||
size_prefix: The prefix in partition group size variables that precedes the
|
size_prefix: The prefix in partition group size variables that precedes the
|
||||||
@@ -447,53 +448,56 @@ def merge_dynamic_partition_info_dicts(system_dict,
|
|||||||
The merged dynamic partition info dictionary.
|
The merged dynamic partition info dictionary.
|
||||||
"""
|
"""
|
||||||
merged_dict = {}
|
merged_dict = {}
|
||||||
# Partition groups and group sizes are defined by the other (non-system)
|
# Partition groups and group sizes are defined by the vendor dict because
|
||||||
# dict because these values may vary for each board that uses a shared system
|
# these values may vary for each board that uses a shared system image.
|
||||||
# image.
|
merged_dict['super_partition_groups'] = vendor_dict['super_partition_groups']
|
||||||
merged_dict['super_partition_groups'] = other_dict['super_partition_groups']
|
|
||||||
if include_dynamic_partition_list:
|
if include_dynamic_partition_list:
|
||||||
system_dynamic_partition_list = system_dict.get('dynamic_partition_list',
|
framework_dynamic_partition_list = framework_dict.get(
|
||||||
|
'dynamic_partition_list', '')
|
||||||
|
vendor_dynamic_partition_list = vendor_dict.get('dynamic_partition_list',
|
||||||
'')
|
'')
|
||||||
other_dynamic_partition_list = other_dict.get('dynamic_partition_list', '')
|
|
||||||
merged_dict['dynamic_partition_list'] = (
|
merged_dict['dynamic_partition_list'] = (
|
||||||
'%s %s' %
|
'%s %s' % (framework_dynamic_partition_list,
|
||||||
(system_dynamic_partition_list, other_dynamic_partition_list)).strip()
|
vendor_dynamic_partition_list)).strip()
|
||||||
for partition_group in merged_dict['super_partition_groups'].split(' '):
|
for partition_group in merged_dict['super_partition_groups'].split(' '):
|
||||||
# Set the partition group's size using the value from the other dict.
|
# Set the partition group's size using the value from the vendor dict.
|
||||||
key = '%s%s%s' % (size_prefix, partition_group, size_suffix)
|
key = '%s%s%s' % (size_prefix, partition_group, size_suffix)
|
||||||
if key not in other_dict:
|
if key not in vendor_dict:
|
||||||
raise ValueError('Other dict does not contain required key %s.' % key)
|
raise ValueError('Vendor dict does not contain required key %s.' % key)
|
||||||
merged_dict[key] = other_dict[key]
|
merged_dict[key] = vendor_dict[key]
|
||||||
|
|
||||||
# Set the partition group's partition list using a concatenation of the
|
# Set the partition group's partition list using a concatenation of the
|
||||||
# system and other partition lists.
|
# framework and vendor partition lists.
|
||||||
key = '%s%s%s' % (list_prefix, partition_group, list_suffix)
|
key = '%s%s%s' % (list_prefix, partition_group, list_suffix)
|
||||||
merged_dict[key] = (
|
merged_dict[key] = (
|
||||||
'%s %s' % (system_dict.get(key, ''), other_dict.get(key, ''))).strip()
|
'%s %s' %
|
||||||
|
(framework_dict.get(key, ''), vendor_dict.get(key, ''))).strip()
|
||||||
return merged_dict
|
return merged_dict
|
||||||
|
|
||||||
|
|
||||||
def process_misc_info_txt(system_target_files_temp_dir,
|
def process_misc_info_txt(framework_target_files_temp_dir,
|
||||||
other_target_files_temp_dir,
|
vendor_target_files_temp_dir,
|
||||||
output_target_files_temp_dir, system_misc_info_keys):
|
output_target_files_temp_dir,
|
||||||
|
framework_misc_info_keys):
|
||||||
"""Perform special processing for META/misc_info.txt.
|
"""Perform special processing for META/misc_info.txt.
|
||||||
|
|
||||||
This function merges the contents of the META/misc_info.txt files from the
|
This function merges the contents of the META/misc_info.txt files from the
|
||||||
system directory and the other directory, placing the merged result in the
|
framework directory and the vendor directory, placing the merged result in the
|
||||||
output directory. The precondition in that the files are already extracted.
|
output directory. The precondition in that the files are already extracted.
|
||||||
The post condition is that the output META/misc_info.txt contains the merged
|
The post condition is that the output META/misc_info.txt contains the merged
|
||||||
content.
|
content.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
system_target_files_temp_dir: The name of a directory containing the special
|
framework_target_files_temp_dir: The name of a directory containing the
|
||||||
items extracted from the system target files package.
|
special items extracted from the framework target files package.
|
||||||
other_target_files_temp_dir: The name of a directory containing the special
|
vendor_target_files_temp_dir: The name of a directory containing the special
|
||||||
items extracted from the other target files package.
|
items extracted from the vendor target files package.
|
||||||
output_target_files_temp_dir: The name of a directory that will be used to
|
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
|
create the output target files package after all the special cases are
|
||||||
processed.
|
processed.
|
||||||
system_misc_info_keys: A list of keys to obtain from the system instance of
|
framework_misc_info_keys: A list of keys to obtain from the framework
|
||||||
META/misc_info.txt. The remaining keys from the other instance.
|
instance of META/misc_info.txt. The remaining keys from the vendor
|
||||||
|
instance.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def read_helper(d):
|
def read_helper(d):
|
||||||
@@ -501,72 +505,72 @@ def process_misc_info_txt(system_target_files_temp_dir,
|
|||||||
with open(misc_info_txt) as f:
|
with open(misc_info_txt) as f:
|
||||||
return list(f.read().splitlines())
|
return list(f.read().splitlines())
|
||||||
|
|
||||||
system_info_dict = common.LoadDictionaryFromLines(
|
framework_dict = common.LoadDictionaryFromLines(
|
||||||
read_helper(system_target_files_temp_dir))
|
read_helper(framework_target_files_temp_dir))
|
||||||
|
|
||||||
# We take most of the misc info from the other target files.
|
# We take most of the misc info from the vendor target files.
|
||||||
|
|
||||||
merged_info_dict = common.LoadDictionaryFromLines(
|
merged_dict = common.LoadDictionaryFromLines(
|
||||||
read_helper(other_target_files_temp_dir))
|
read_helper(vendor_target_files_temp_dir))
|
||||||
|
|
||||||
# Replace certain values in merged_info_dict with values from
|
# Replace certain values in merged_dict with values from
|
||||||
# system_info_dict.
|
# framework_dict.
|
||||||
|
|
||||||
for key in system_misc_info_keys:
|
for key in framework_misc_info_keys:
|
||||||
merged_info_dict[key] = system_info_dict[key]
|
merged_dict[key] = framework_dict[key]
|
||||||
|
|
||||||
# Merge misc info keys used for Dynamic Partitions.
|
# Merge misc info keys used for Dynamic Partitions.
|
||||||
if (merged_info_dict.get('use_dynamic_partitions') == 'true') and (
|
if (merged_dict.get('use_dynamic_partitions') == 'true') and (
|
||||||
system_info_dict.get('use_dynamic_partitions') == 'true'):
|
framework_dict.get('use_dynamic_partitions') == 'true'):
|
||||||
merged_dynamic_partitions_dict = merge_dynamic_partition_info_dicts(
|
merged_dynamic_partitions_dict = merge_dynamic_partition_info_dicts(
|
||||||
system_dict=system_info_dict,
|
framework_dict=framework_dict,
|
||||||
other_dict=merged_info_dict,
|
vendor_dict=merged_dict,
|
||||||
size_prefix='super_',
|
size_prefix='super_',
|
||||||
size_suffix='_group_size',
|
size_suffix='_group_size',
|
||||||
list_prefix='super_',
|
list_prefix='super_',
|
||||||
list_suffix='_partition_list')
|
list_suffix='_partition_list')
|
||||||
merged_info_dict.update(merged_dynamic_partitions_dict)
|
merged_dict.update(merged_dynamic_partitions_dict)
|
||||||
|
|
||||||
# Replace <image>_selinux_fc values with system or other file_contexts.bin
|
# Replace <image>_selinux_fc values with framework or vendor file_contexts.bin
|
||||||
# depending on which dictionary the key came from.
|
# depending on which dictionary the key came from.
|
||||||
# Only the file basename is required because all selinux_fc properties are
|
# Only the file basename is required because all selinux_fc properties are
|
||||||
# replaced with the full path to the file under META/ when misc_info.txt is
|
# replaced with the full path to the file under META/ when misc_info.txt is
|
||||||
# loaded from target files for repacking. See common.py LoadInfoDict().
|
# loaded from target files for repacking. See common.py LoadInfoDict().
|
||||||
for key in merged_info_dict:
|
for key in merged_dict:
|
||||||
if key.endswith('_selinux_fc'):
|
if key.endswith('_selinux_fc'):
|
||||||
merged_info_dict[key] = 'other_file_contexts.bin'
|
merged_dict[key] = 'vendor_file_contexts.bin'
|
||||||
for key in system_info_dict:
|
for key in framework_dict:
|
||||||
if key.endswith('_selinux_fc'):
|
if key.endswith('_selinux_fc'):
|
||||||
merged_info_dict[key] = 'system_file_contexts.bin'
|
merged_dict[key] = 'framework_file_contexts.bin'
|
||||||
|
|
||||||
output_misc_info_txt = os.path.join(output_target_files_temp_dir, 'META',
|
output_misc_info_txt = os.path.join(output_target_files_temp_dir, 'META',
|
||||||
'misc_info.txt')
|
'misc_info.txt')
|
||||||
write_sorted_data(data=merged_info_dict, path=output_misc_info_txt)
|
write_sorted_data(data=merged_dict, path=output_misc_info_txt)
|
||||||
|
|
||||||
|
|
||||||
def process_dynamic_partitions_info_txt(system_target_files_dir,
|
def process_dynamic_partitions_info_txt(framework_target_files_dir,
|
||||||
other_target_files_dir,
|
vendor_target_files_dir,
|
||||||
output_target_files_dir):
|
output_target_files_dir):
|
||||||
"""Perform special processing for META/dynamic_partitions_info.txt.
|
"""Perform special processing for META/dynamic_partitions_info.txt.
|
||||||
|
|
||||||
This function merges the contents of the META/dynamic_partitions_info.txt
|
This function merges the contents of the META/dynamic_partitions_info.txt
|
||||||
files from the system directory and the other directory, placing the merged
|
files from the framework directory and the vendor directory, placing the
|
||||||
result in the output directory.
|
merged result in the output directory.
|
||||||
|
|
||||||
This function does nothing if META/dynamic_partitions_info.txt from the other
|
This function does nothing if META/dynamic_partitions_info.txt from the vendor
|
||||||
directory does not exist.
|
directory does not exist.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
system_target_files_dir: The name of a directory containing the special
|
framework_target_files_dir: The name of a directory containing the special
|
||||||
items extracted from the system target files package.
|
items extracted from the framework target files package.
|
||||||
other_target_files_dir: The name of a directory containing the special items
|
vendor_target_files_dir: The name of a directory containing the special
|
||||||
extracted from the other target files package.
|
items extracted from the vendor target files package.
|
||||||
output_target_files_dir: The name of a directory that will be used to create
|
output_target_files_dir: The name of a directory that will be used to create
|
||||||
the output target files package after all the special cases are processed.
|
the output target files package after all the special cases are processed.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not os.path.exists(
|
if not os.path.exists(
|
||||||
os.path.join(other_target_files_dir, 'META',
|
os.path.join(vendor_target_files_dir, 'META',
|
||||||
'dynamic_partitions_info.txt')):
|
'dynamic_partitions_info.txt')):
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -576,14 +580,14 @@ def process_dynamic_partitions_info_txt(system_target_files_dir,
|
|||||||
with open(dynamic_partitions_info_txt) as f:
|
with open(dynamic_partitions_info_txt) as f:
|
||||||
return list(f.read().splitlines())
|
return list(f.read().splitlines())
|
||||||
|
|
||||||
system_dynamic_partitions_dict = common.LoadDictionaryFromLines(
|
framework_dynamic_partitions_dict = common.LoadDictionaryFromLines(
|
||||||
read_helper(system_target_files_dir))
|
read_helper(framework_target_files_dir))
|
||||||
other_dynamic_partitions_dict = common.LoadDictionaryFromLines(
|
vendor_dynamic_partitions_dict = common.LoadDictionaryFromLines(
|
||||||
read_helper(other_target_files_dir))
|
read_helper(vendor_target_files_dir))
|
||||||
|
|
||||||
merged_dynamic_partitions_dict = merge_dynamic_partition_info_dicts(
|
merged_dynamic_partitions_dict = merge_dynamic_partition_info_dicts(
|
||||||
system_dict=system_dynamic_partitions_dict,
|
framework_dict=framework_dynamic_partitions_dict,
|
||||||
other_dict=other_dynamic_partitions_dict,
|
vendor_dict=vendor_dynamic_partitions_dict,
|
||||||
# META/dynamic_partitions_info.txt does not use dynamic_partition_list.
|
# META/dynamic_partitions_info.txt does not use dynamic_partition_list.
|
||||||
include_dynamic_partition_list=False,
|
include_dynamic_partition_list=False,
|
||||||
size_suffix='_size',
|
size_suffix='_size',
|
||||||
@@ -596,24 +600,23 @@ def process_dynamic_partitions_info_txt(system_target_files_dir,
|
|||||||
path=output_dynamic_partitions_info_txt)
|
path=output_dynamic_partitions_info_txt)
|
||||||
|
|
||||||
|
|
||||||
def process_apex_keys_apk_certs_common(system_target_files_dir,
|
def process_apex_keys_apk_certs_common(framework_target_files_dir,
|
||||||
other_target_files_dir,
|
vendor_target_files_dir,
|
||||||
output_target_files_dir, file_name):
|
output_target_files_dir, file_name):
|
||||||
"""Perform special processing for META/apexkeys.txt or META/apkcerts.txt.
|
"""Perform special processing for META/apexkeys.txt or META/apkcerts.txt.
|
||||||
|
|
||||||
This function merges the contents of the META/apexkeys.txt or
|
This function merges the contents of the META/apexkeys.txt or
|
||||||
META/apkcerts.txt
|
META/apkcerts.txt files from the framework directory and the vendor
|
||||||
files from the system directory and the other directory, placing the merged
|
directory, placing the merged result in the output directory. The
|
||||||
result in the output directory. The precondition in that the files are already
|
precondition in that the files are already extracted. The post condition
|
||||||
extracted.
|
is that the output META/apexkeys.txt or META/apkcerts.txt contains the
|
||||||
The post condition is that the output META/apexkeys.txt or META/apkcerts.txt
|
merged content.
|
||||||
contains the merged content.
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
system_target_files_dir: The name of a directory containing the special
|
framework_target_files_dir: The name of a directory containing the special
|
||||||
items extracted from the system target files package.
|
items extracted from the framework target files package.
|
||||||
other_target_files_dir: The name of a directory containing the special items
|
vendor_target_files_dir: The name of a directory containing the special
|
||||||
extracted from the other target files package.
|
items extracted from the vendor target files package.
|
||||||
output_target_files_dir: The name of a directory that will be used to create
|
output_target_files_dir: The name of a directory that will be used to create
|
||||||
the output target files package after all the special cases are processed.
|
the output target files package after all the special cases are processed.
|
||||||
file_name: The name of the file to merge. One of apkcerts.txt or
|
file_name: The name of the file to merge. One of apkcerts.txt or
|
||||||
@@ -629,73 +632,75 @@ def process_apex_keys_apk_certs_common(system_target_files_dir,
|
|||||||
temp[line.split()[0]] = line.strip()
|
temp[line.split()[0]] = line.strip()
|
||||||
return temp
|
return temp
|
||||||
|
|
||||||
system_dict = read_helper(system_target_files_dir)
|
framework_dict = read_helper(framework_target_files_dir)
|
||||||
other_dict = read_helper(other_target_files_dir)
|
vendor_dict = read_helper(vendor_target_files_dir)
|
||||||
|
|
||||||
for key in system_dict:
|
for key in framework_dict:
|
||||||
if key in other_dict and other_dict[key] != system_dict[key]:
|
if key in vendor_dict and vendor_dict[key] != framework_dict[key]:
|
||||||
raise ValueError('Conflicting entries found in %s:\n %s and\n %s' %
|
raise ValueError('Conflicting entries found in %s:\n %s and\n %s' %
|
||||||
(file_name, system_dict[key], other_dict[key]))
|
(file_name, framework_dict[key], vendor_dict[key]))
|
||||||
other_dict[key] = system_dict[key]
|
vendor_dict[key] = framework_dict[key]
|
||||||
|
|
||||||
output_file = os.path.join(output_target_files_dir, 'META', file_name)
|
output_file = os.path.join(output_target_files_dir, 'META', file_name)
|
||||||
|
|
||||||
write_sorted_data(data=other_dict.values(), path=output_file)
|
write_sorted_data(data=vendor_dict.values(), path=output_file)
|
||||||
|
|
||||||
|
|
||||||
def copy_file_contexts(system_target_files_dir, other_target_files_dir,
|
def copy_file_contexts(framework_target_files_dir, vendor_target_files_dir,
|
||||||
output_target_files_dir):
|
output_target_files_dir):
|
||||||
"""Creates named copies of each build's file_contexts.bin in output META/."""
|
"""Creates named copies of each build's file_contexts.bin in output META/."""
|
||||||
system_fc_path = os.path.join(system_target_files_dir, 'META',
|
framework_fc_path = os.path.join(framework_target_files_dir, 'META',
|
||||||
'system_file_contexts.bin')
|
'framework_file_contexts.bin')
|
||||||
if not os.path.exists(system_fc_path):
|
if not os.path.exists(framework_fc_path):
|
||||||
system_fc_path = os.path.join(system_target_files_dir, 'META',
|
framework_fc_path = os.path.join(framework_target_files_dir, 'META',
|
||||||
|
'file_contexts.bin')
|
||||||
|
if not os.path.exists(framework_fc_path):
|
||||||
|
raise ValueError('Missing framework file_contexts.bin.')
|
||||||
|
shutil.copyfile(
|
||||||
|
framework_fc_path,
|
||||||
|
os.path.join(output_target_files_dir, 'META',
|
||||||
|
'framework_file_contexts.bin'))
|
||||||
|
|
||||||
|
vendor_fc_path = os.path.join(vendor_target_files_dir, 'META',
|
||||||
|
'vendor_file_contexts.bin')
|
||||||
|
if not os.path.exists(vendor_fc_path):
|
||||||
|
vendor_fc_path = os.path.join(vendor_target_files_dir, 'META',
|
||||||
'file_contexts.bin')
|
'file_contexts.bin')
|
||||||
if not os.path.exists(system_fc_path):
|
if not os.path.exists(vendor_fc_path):
|
||||||
raise ValueError('Missing system file_contexts.bin.')
|
raise ValueError('Missing vendor file_contexts.bin.')
|
||||||
shutil.copyfile(
|
shutil.copyfile(
|
||||||
system_fc_path,
|
vendor_fc_path,
|
||||||
os.path.join(output_target_files_dir, 'META', 'system_file_contexts.bin'))
|
os.path.join(output_target_files_dir, 'META', 'vendor_file_contexts.bin'))
|
||||||
|
|
||||||
other_fc_path = os.path.join(other_target_files_dir, 'META',
|
|
||||||
'other_file_contexts.bin')
|
|
||||||
if not os.path.exists(other_fc_path):
|
|
||||||
other_fc_path = os.path.join(other_target_files_dir, 'META',
|
|
||||||
'file_contexts.bin')
|
|
||||||
if not os.path.exists(other_fc_path):
|
|
||||||
raise ValueError('Missing other file_contexts.bin.')
|
|
||||||
shutil.copyfile(
|
|
||||||
other_fc_path,
|
|
||||||
os.path.join(output_target_files_dir, 'META', 'other_file_contexts.bin'))
|
|
||||||
|
|
||||||
|
|
||||||
def process_special_cases(system_target_files_temp_dir,
|
def process_special_cases(framework_target_files_temp_dir,
|
||||||
other_target_files_temp_dir,
|
vendor_target_files_temp_dir,
|
||||||
output_target_files_temp_dir, system_misc_info_keys,
|
output_target_files_temp_dir,
|
||||||
rebuild_recovery):
|
framework_misc_info_keys, rebuild_recovery):
|
||||||
"""Perform special-case processing for certain target files items.
|
"""Perform special-case processing for certain target files items.
|
||||||
|
|
||||||
Certain files in the output target files package require special-case
|
Certain files in the output target files package require special-case
|
||||||
processing. This function performs all that special-case processing.
|
processing. This function performs all that special-case processing.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
system_target_files_temp_dir: The name of a directory containing the special
|
framework_target_files_temp_dir: The name of a directory containing the
|
||||||
items extracted from the system target files package.
|
special items extracted from the framework target files package.
|
||||||
other_target_files_temp_dir: The name of a directory containing the special
|
vendor_target_files_temp_dir: The name of a directory containing the special
|
||||||
items extracted from the other target files package.
|
items extracted from the vendor target files package.
|
||||||
output_target_files_temp_dir: The name of a directory that will be used to
|
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
|
create the output target files package after all the special cases are
|
||||||
processed.
|
processed.
|
||||||
system_misc_info_keys: A list of keys to obtain from the system instance of
|
framework_misc_info_keys: A list of keys to obtain from the framework
|
||||||
META/misc_info.txt. The remaining keys from the other instance.
|
instance of META/misc_info.txt. The remaining keys from the vendor
|
||||||
|
instance.
|
||||||
rebuild_recovery: If true, rebuild the recovery patch used by non-A/B
|
rebuild_recovery: If true, rebuild the recovery patch used by non-A/B
|
||||||
devices and write it to the system image.
|
devices and write it to the system image.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if 'ab_update' in system_misc_info_keys:
|
if 'ab_update' in framework_misc_info_keys:
|
||||||
process_ab_partitions_txt(
|
process_ab_partitions_txt(
|
||||||
system_target_files_temp_dir=system_target_files_temp_dir,
|
framework_target_files_temp_dir=framework_target_files_temp_dir,
|
||||||
other_target_files_temp_dir=other_target_files_temp_dir,
|
vendor_target_files_temp_dir=vendor_target_files_temp_dir,
|
||||||
output_target_files_temp_dir=output_target_files_temp_dir)
|
output_target_files_temp_dir=output_target_files_temp_dir)
|
||||||
|
|
||||||
if rebuild_recovery:
|
if rebuild_recovery:
|
||||||
@@ -703,65 +708,66 @@ def process_special_cases(system_target_files_temp_dir,
|
|||||||
output_target_files_temp_dir=output_target_files_temp_dir)
|
output_target_files_temp_dir=output_target_files_temp_dir)
|
||||||
|
|
||||||
copy_file_contexts(
|
copy_file_contexts(
|
||||||
system_target_files_dir=system_target_files_temp_dir,
|
framework_target_files_dir=framework_target_files_temp_dir,
|
||||||
other_target_files_dir=other_target_files_temp_dir,
|
vendor_target_files_dir=vendor_target_files_temp_dir,
|
||||||
output_target_files_dir=output_target_files_temp_dir)
|
output_target_files_dir=output_target_files_temp_dir)
|
||||||
|
|
||||||
process_misc_info_txt(
|
process_misc_info_txt(
|
||||||
system_target_files_temp_dir=system_target_files_temp_dir,
|
framework_target_files_temp_dir=framework_target_files_temp_dir,
|
||||||
other_target_files_temp_dir=other_target_files_temp_dir,
|
vendor_target_files_temp_dir=vendor_target_files_temp_dir,
|
||||||
output_target_files_temp_dir=output_target_files_temp_dir,
|
output_target_files_temp_dir=output_target_files_temp_dir,
|
||||||
system_misc_info_keys=system_misc_info_keys)
|
framework_misc_info_keys=framework_misc_info_keys)
|
||||||
|
|
||||||
process_dynamic_partitions_info_txt(
|
process_dynamic_partitions_info_txt(
|
||||||
system_target_files_dir=system_target_files_temp_dir,
|
framework_target_files_dir=framework_target_files_temp_dir,
|
||||||
other_target_files_dir=other_target_files_temp_dir,
|
vendor_target_files_dir=vendor_target_files_temp_dir,
|
||||||
output_target_files_dir=output_target_files_temp_dir)
|
output_target_files_dir=output_target_files_temp_dir)
|
||||||
|
|
||||||
process_apex_keys_apk_certs_common(
|
process_apex_keys_apk_certs_common(
|
||||||
system_target_files_dir=system_target_files_temp_dir,
|
framework_target_files_dir=framework_target_files_temp_dir,
|
||||||
other_target_files_dir=other_target_files_temp_dir,
|
vendor_target_files_dir=vendor_target_files_temp_dir,
|
||||||
output_target_files_dir=output_target_files_temp_dir,
|
output_target_files_dir=output_target_files_temp_dir,
|
||||||
file_name='apkcerts.txt')
|
file_name='apkcerts.txt')
|
||||||
|
|
||||||
process_apex_keys_apk_certs_common(
|
process_apex_keys_apk_certs_common(
|
||||||
system_target_files_dir=system_target_files_temp_dir,
|
framework_target_files_dir=framework_target_files_temp_dir,
|
||||||
other_target_files_dir=other_target_files_temp_dir,
|
vendor_target_files_dir=vendor_target_files_temp_dir,
|
||||||
output_target_files_dir=output_target_files_temp_dir,
|
output_target_files_dir=output_target_files_temp_dir,
|
||||||
file_name='apexkeys.txt')
|
file_name='apexkeys.txt')
|
||||||
|
|
||||||
|
|
||||||
def merge_target_files(temp_dir, system_target_files, system_item_list,
|
def merge_target_files(temp_dir, framework_target_files, framework_item_list,
|
||||||
system_misc_info_keys, other_target_files,
|
framework_misc_info_keys, vendor_target_files,
|
||||||
other_item_list, output_target_files, output_dir,
|
vendor_item_list, output_target_files, output_dir,
|
||||||
output_item_list, output_ota, output_img,
|
output_item_list, output_ota, output_img,
|
||||||
output_super_empty, rebuild_recovery):
|
output_super_empty, rebuild_recovery):
|
||||||
"""Merge two target files packages together.
|
"""Merge two target files packages together.
|
||||||
|
|
||||||
This function takes system and other target files packages as input, performs
|
This function takes framework and vendor target files packages as input,
|
||||||
various file extractions, special case processing, and finally creates a
|
performs various file extractions, special case processing, and finally
|
||||||
merged zip archive as output.
|
creates a merged zip archive as output.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
temp_dir: The name of a directory we use when we extract items from the
|
temp_dir: The name of a directory we use when we extract items from the
|
||||||
input target files packages, and also a scratch directory that we use for
|
input target files packages, and also a scratch directory that we use for
|
||||||
temporary files.
|
temporary files.
|
||||||
system_target_files: The name of the zip archive containing the system
|
framework_target_files: The name of the zip archive containing the framework
|
||||||
partial target files package.
|
partial target files package.
|
||||||
system_item_list: The list of items to extract from the partial system
|
framework_item_list: The list of items to extract from the partial framework
|
||||||
target files package as is, meaning these items will land in the output
|
target files package as is, meaning these items will land in the output
|
||||||
target files package exactly as they appear in the input partial system
|
target files package exactly as they appear in the input partial framework
|
||||||
target files package.
|
target files package.
|
||||||
system_misc_info_keys: The list of keys to obtain from the system instance
|
framework_misc_info_keys: The list of keys to obtain from the framework
|
||||||
of META/misc_info.txt. The remaining keys from the other instance.
|
instance of META/misc_info.txt. The remaining keys from the vendor
|
||||||
other_target_files: The name of the zip archive containing the other partial
|
instance.
|
||||||
|
vendor_target_files: The name of the zip archive containing the vendor
|
||||||
|
partial target files package.
|
||||||
|
vendor_item_list: The list of items to extract from the partial vendor
|
||||||
|
target files package as is, meaning these items will land in the output
|
||||||
|
target files package exactly as they appear in the input partial vendor
|
||||||
target files package.
|
target files package.
|
||||||
other_item_list: The list of items to extract from the partial other target
|
|
||||||
files package as is, meaning these items will land in the output target
|
|
||||||
files package exactly as they appear in the input partial other target
|
|
||||||
files package.
|
|
||||||
output_target_files: The name of the output zip archive target files package
|
output_target_files: The name of the output zip archive target files package
|
||||||
created by merging system and other.
|
created by merging framework and vendor.
|
||||||
output_dir: The destination directory for saving merged files.
|
output_dir: The destination directory for saving merged files.
|
||||||
output_item_list: The list of items to copy into the output_dir.
|
output_item_list: The list of items to copy into the output_dir.
|
||||||
output_ota: The name of the output zip archive ota package.
|
output_ota: The name of the output zip archive ota package.
|
||||||
@@ -772,51 +778,51 @@ def merge_target_files(temp_dir, system_target_files, system_item_list,
|
|||||||
devices and write it to the system image.
|
devices and write it to the system image.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
logger.info('starting: merge system %s and other %s into output %s',
|
logger.info('starting: merge framework %s and vendor %s into output %s',
|
||||||
system_target_files, other_target_files, output_target_files)
|
framework_target_files, vendor_target_files, output_target_files)
|
||||||
|
|
||||||
# Create directory names that we'll use when we extract files from system,
|
# Create directory names that we'll use when we extract files from framework,
|
||||||
# and other, and for zipping the final output.
|
# and vendor, and for zipping the final output.
|
||||||
|
|
||||||
system_target_files_temp_dir = os.path.join(temp_dir, 'system')
|
framework_target_files_temp_dir = os.path.join(temp_dir, 'framework')
|
||||||
other_target_files_temp_dir = os.path.join(temp_dir, 'other')
|
vendor_target_files_temp_dir = os.path.join(temp_dir, 'vendor')
|
||||||
output_target_files_temp_dir = os.path.join(temp_dir, 'output')
|
output_target_files_temp_dir = os.path.join(temp_dir, 'output')
|
||||||
|
|
||||||
# Extract "as is" items from the input system partial target files package.
|
# Extract "as is" items from the input framework partial target files package.
|
||||||
# We extract them directly into the output temporary directory since the
|
# We extract them directly into the output temporary directory since the
|
||||||
# items do not need special case processing.
|
# items do not need special case processing.
|
||||||
|
|
||||||
extract_items(
|
extract_items(
|
||||||
target_files=system_target_files,
|
target_files=framework_target_files,
|
||||||
target_files_temp_dir=output_target_files_temp_dir,
|
target_files_temp_dir=output_target_files_temp_dir,
|
||||||
extract_item_list=system_item_list)
|
extract_item_list=framework_item_list)
|
||||||
|
|
||||||
# Extract "as is" items from the input other partial target files package. We
|
# Extract "as is" items from the input vendor partial target files package. We
|
||||||
# extract them directly into the output temporary directory since the items
|
# extract them directly into the output temporary directory since the items
|
||||||
# do not need special case processing.
|
# do not need special case processing.
|
||||||
|
|
||||||
extract_items(
|
extract_items(
|
||||||
target_files=other_target_files,
|
target_files=vendor_target_files,
|
||||||
target_files_temp_dir=output_target_files_temp_dir,
|
target_files_temp_dir=output_target_files_temp_dir,
|
||||||
extract_item_list=other_item_list)
|
extract_item_list=vendor_item_list)
|
||||||
|
|
||||||
# Extract "special" items from the input system partial target files package.
|
# Extract "special" items from the input framework partial target files
|
||||||
|
# package. We extract these items to different directory since they require
|
||||||
|
# special processing before they will end up in the output directory.
|
||||||
|
|
||||||
|
extract_items(
|
||||||
|
target_files=framework_target_files,
|
||||||
|
target_files_temp_dir=framework_target_files_temp_dir,
|
||||||
|
extract_item_list=FRAMEWORK_EXTRACT_SPECIAL_ITEM_LIST)
|
||||||
|
|
||||||
|
# Extract "special" items from the input vendor partial target files package.
|
||||||
# We extract these items to different directory since they require special
|
# We extract these items to different directory since they require special
|
||||||
# processing before they will end up in the output directory.
|
# processing before they will end up in the output directory.
|
||||||
|
|
||||||
extract_items(
|
extract_items(
|
||||||
target_files=system_target_files,
|
target_files=vendor_target_files,
|
||||||
target_files_temp_dir=system_target_files_temp_dir,
|
target_files_temp_dir=vendor_target_files_temp_dir,
|
||||||
extract_item_list=SYSTEM_EXTRACT_SPECIAL_ITEM_LIST)
|
extract_item_list=VENDOR_EXTRACT_SPECIAL_ITEM_LIST)
|
||||||
|
|
||||||
# Extract "special" items from the input other partial target files package.
|
|
||||||
# We extract these items to different directory since they require special
|
|
||||||
# processing before they will end up in the output directory.
|
|
||||||
|
|
||||||
extract_items(
|
|
||||||
target_files=other_target_files,
|
|
||||||
target_files_temp_dir=other_target_files_temp_dir,
|
|
||||||
extract_item_list=OTHER_EXTRACT_SPECIAL_ITEM_LIST)
|
|
||||||
|
|
||||||
# Now that the temporary directories contain all the extracted files, perform
|
# Now that the temporary directories contain all the extracted files, perform
|
||||||
# special case processing on any items that need it. After this function
|
# special case processing on any items that need it. After this function
|
||||||
@@ -824,10 +830,10 @@ def merge_target_files(temp_dir, system_target_files, system_item_list,
|
|||||||
# files package are in place.
|
# files package are in place.
|
||||||
|
|
||||||
process_special_cases(
|
process_special_cases(
|
||||||
system_target_files_temp_dir=system_target_files_temp_dir,
|
framework_target_files_temp_dir=framework_target_files_temp_dir,
|
||||||
other_target_files_temp_dir=other_target_files_temp_dir,
|
vendor_target_files_temp_dir=vendor_target_files_temp_dir,
|
||||||
output_target_files_temp_dir=output_target_files_temp_dir,
|
output_target_files_temp_dir=output_target_files_temp_dir,
|
||||||
system_misc_info_keys=system_misc_info_keys,
|
framework_misc_info_keys=framework_misc_info_keys,
|
||||||
rebuild_recovery=rebuild_recovery)
|
rebuild_recovery=rebuild_recovery)
|
||||||
|
|
||||||
# Regenerate IMAGES in the temporary directory.
|
# Regenerate IMAGES in the temporary directory.
|
||||||
@@ -976,15 +982,35 @@ def main():
|
|||||||
|
|
||||||
def option_handler(o, a):
|
def option_handler(o, a):
|
||||||
if o == '--system-target-files':
|
if o == '--system-target-files':
|
||||||
OPTIONS.system_target_files = a
|
logger.warning(
|
||||||
|
'--system-target-files has been renamed to --framework-target-files')
|
||||||
|
OPTIONS.framework_target_files = a
|
||||||
|
elif o == '--framework-target-files':
|
||||||
|
OPTIONS.framework_target_files = a
|
||||||
elif o == '--system-item-list':
|
elif o == '--system-item-list':
|
||||||
OPTIONS.system_item_list = a
|
logger.warning(
|
||||||
|
'--system-item-list has been renamed to --framework-item-list')
|
||||||
|
OPTIONS.framework_item_list = a
|
||||||
|
elif o == '--framework-item-list':
|
||||||
|
OPTIONS.framework_item_list = a
|
||||||
elif o == '--system-misc-info-keys':
|
elif o == '--system-misc-info-keys':
|
||||||
OPTIONS.system_misc_info_keys = a
|
logger.warning(
|
||||||
|
'--system-misc-info-keys has been renamed to --framework-misc-info-keys'
|
||||||
|
)
|
||||||
|
OPTIONS.framework_misc_info_keys = a
|
||||||
|
elif o == '--framework-misc-info-keys':
|
||||||
|
OPTIONS.framework_misc_info_keys = a
|
||||||
elif o == '--other-target-files':
|
elif o == '--other-target-files':
|
||||||
OPTIONS.other_target_files = a
|
logger.warning(
|
||||||
|
'--other-target-files has been renamed to --vendor-target-files')
|
||||||
|
OPTIONS.vendor_target_files = a
|
||||||
|
elif o == '--vendor-target-files':
|
||||||
|
OPTIONS.vendor_target_files = a
|
||||||
elif o == '--other-item-list':
|
elif o == '--other-item-list':
|
||||||
OPTIONS.other_item_list = a
|
logger.warning('--other-item-list has been renamed to --vendor-item-list')
|
||||||
|
OPTIONS.vendor_item_list = a
|
||||||
|
elif o == '--vendor-item-list':
|
||||||
|
OPTIONS.vendor_item_list = a
|
||||||
elif o == '--output-target-files':
|
elif o == '--output-target-files':
|
||||||
OPTIONS.output_target_files = a
|
OPTIONS.output_target_files = a
|
||||||
elif o == '--output-dir':
|
elif o == '--output-dir':
|
||||||
@@ -1010,10 +1036,15 @@ def main():
|
|||||||
__doc__,
|
__doc__,
|
||||||
extra_long_opts=[
|
extra_long_opts=[
|
||||||
'system-target-files=',
|
'system-target-files=',
|
||||||
|
'framework-target-files=',
|
||||||
'system-item-list=',
|
'system-item-list=',
|
||||||
|
'framework-item-list=',
|
||||||
'system-misc-info-keys=',
|
'system-misc-info-keys=',
|
||||||
|
'framework-misc-info-keys=',
|
||||||
'other-target-files=',
|
'other-target-files=',
|
||||||
|
'vendor-target-files=',
|
||||||
'other-item-list=',
|
'other-item-list=',
|
||||||
|
'vendor-item-list=',
|
||||||
'output-target-files=',
|
'output-target-files=',
|
||||||
'output-dir=',
|
'output-dir=',
|
||||||
'output-item-list=',
|
'output-item-list=',
|
||||||
@@ -1025,27 +1056,28 @@ def main():
|
|||||||
],
|
],
|
||||||
extra_option_handler=option_handler)
|
extra_option_handler=option_handler)
|
||||||
|
|
||||||
if (args or OPTIONS.system_target_files is None or
|
if (args or OPTIONS.framework_target_files is None or
|
||||||
OPTIONS.other_target_files is None or
|
OPTIONS.vendor_target_files is None or
|
||||||
(OPTIONS.output_target_files is None and OPTIONS.output_dir is None) or
|
(OPTIONS.output_target_files is None and OPTIONS.output_dir is None) or
|
||||||
(OPTIONS.output_dir is not None and OPTIONS.output_item_list is None)):
|
(OPTIONS.output_dir is not None and OPTIONS.output_item_list is None)):
|
||||||
common.Usage(__doc__)
|
common.Usage(__doc__)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if OPTIONS.system_item_list:
|
if OPTIONS.framework_item_list:
|
||||||
system_item_list = read_config_list(OPTIONS.system_item_list)
|
framework_item_list = read_config_list(OPTIONS.framework_item_list)
|
||||||
else:
|
else:
|
||||||
system_item_list = DEFAULT_SYSTEM_ITEM_LIST
|
framework_item_list = DEFAULT_FRAMEWORK_ITEM_LIST
|
||||||
|
|
||||||
if OPTIONS.system_misc_info_keys:
|
if OPTIONS.framework_misc_info_keys:
|
||||||
system_misc_info_keys = read_config_list(OPTIONS.system_misc_info_keys)
|
framework_misc_info_keys = read_config_list(
|
||||||
|
OPTIONS.framework_misc_info_keys)
|
||||||
else:
|
else:
|
||||||
system_misc_info_keys = DEFAULT_SYSTEM_MISC_INFO_KEYS
|
framework_misc_info_keys = DEFAULT_FRAMEWORK_MISC_INFO_KEYS
|
||||||
|
|
||||||
if OPTIONS.other_item_list:
|
if OPTIONS.vendor_item_list:
|
||||||
other_item_list = read_config_list(OPTIONS.other_item_list)
|
vendor_item_list = read_config_list(OPTIONS.vendor_item_list)
|
||||||
else:
|
else:
|
||||||
other_item_list = DEFAULT_OTHER_ITEM_LIST
|
vendor_item_list = DEFAULT_VENDOR_ITEM_LIST
|
||||||
|
|
||||||
if OPTIONS.output_item_list:
|
if OPTIONS.output_item_list:
|
||||||
output_item_list = read_config_list(OPTIONS.output_item_list)
|
output_item_list = read_config_list(OPTIONS.output_item_list)
|
||||||
@@ -1053,19 +1085,19 @@ def main():
|
|||||||
output_item_list = None
|
output_item_list = None
|
||||||
|
|
||||||
if not validate_config_lists(
|
if not validate_config_lists(
|
||||||
system_item_list=system_item_list,
|
framework_item_list=framework_item_list,
|
||||||
system_misc_info_keys=system_misc_info_keys,
|
framework_misc_info_keys=framework_misc_info_keys,
|
||||||
other_item_list=other_item_list):
|
vendor_item_list=vendor_item_list):
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
call_func_with_temp_dir(
|
call_func_with_temp_dir(
|
||||||
lambda temp_dir: merge_target_files(
|
lambda temp_dir: merge_target_files(
|
||||||
temp_dir=temp_dir,
|
temp_dir=temp_dir,
|
||||||
system_target_files=OPTIONS.system_target_files,
|
framework_target_files=OPTIONS.framework_target_files,
|
||||||
system_item_list=system_item_list,
|
framework_item_list=framework_item_list,
|
||||||
system_misc_info_keys=system_misc_info_keys,
|
framework_misc_info_keys=framework_misc_info_keys,
|
||||||
other_target_files=OPTIONS.other_target_files,
|
vendor_target_files=OPTIONS.vendor_target_files,
|
||||||
other_item_list=other_item_list,
|
vendor_item_list=vendor_item_list,
|
||||||
output_target_files=OPTIONS.output_target_files,
|
output_target_files=OPTIONS.output_target_files,
|
||||||
output_dir=OPTIONS.output_dir,
|
output_dir=OPTIONS.output_dir,
|
||||||
output_item_list=output_item_list,
|
output_item_list=output_item_list,
|
||||||
|
@@ -19,9 +19,9 @@ import os.path
|
|||||||
import common
|
import common
|
||||||
import test_utils
|
import test_utils
|
||||||
from merge_target_files import (read_config_list, validate_config_lists,
|
from merge_target_files import (read_config_list, validate_config_lists,
|
||||||
DEFAULT_SYSTEM_ITEM_LIST,
|
DEFAULT_FRAMEWORK_ITEM_LIST,
|
||||||
DEFAULT_OTHER_ITEM_LIST,
|
DEFAULT_VENDOR_ITEM_LIST,
|
||||||
DEFAULT_SYSTEM_MISC_INFO_KEYS, copy_items,
|
DEFAULT_FRAMEWORK_MISC_INFO_KEYS, copy_items,
|
||||||
merge_dynamic_partition_info_dicts,
|
merge_dynamic_partition_info_dicts,
|
||||||
process_apex_keys_apk_certs_common)
|
process_apex_keys_apk_certs_common)
|
||||||
|
|
||||||
@@ -84,10 +84,10 @@ class MergeTargetFilesTest(test_utils.ReleaseToolsTestCase):
|
|||||||
os.readlink(os.path.join(output_dir, 'a_link.cpp')), 'a.cpp')
|
os.readlink(os.path.join(output_dir, 'a_link.cpp')), 'a.cpp')
|
||||||
|
|
||||||
def test_read_config_list(self):
|
def test_read_config_list(self):
|
||||||
system_item_list_file = os.path.join(self.testdata_dir,
|
framework_item_list_file = os.path.join(self.testdata_dir,
|
||||||
'merge_config_system_item_list')
|
'merge_config_framework_item_list')
|
||||||
system_item_list = read_config_list(system_item_list_file)
|
framework_item_list = read_config_list(framework_item_list_file)
|
||||||
expected_system_item_list = [
|
expected_framework_item_list = [
|
||||||
'META/apkcerts.txt',
|
'META/apkcerts.txt',
|
||||||
'META/filesystem_config.txt',
|
'META/filesystem_config.txt',
|
||||||
'META/root_filesystem_config.txt',
|
'META/root_filesystem_config.txt',
|
||||||
@@ -98,53 +98,58 @@ class MergeTargetFilesTest(test_utils.ReleaseToolsTestCase):
|
|||||||
'ROOT/*',
|
'ROOT/*',
|
||||||
'SYSTEM/*',
|
'SYSTEM/*',
|
||||||
]
|
]
|
||||||
self.assertItemsEqual(system_item_list, expected_system_item_list)
|
self.assertItemsEqual(framework_item_list, expected_framework_item_list)
|
||||||
|
|
||||||
def test_validate_config_lists_ReturnsFalseIfMissingDefaultItem(self):
|
def test_validate_config_lists_ReturnsFalseIfMissingDefaultItem(self):
|
||||||
system_item_list = list(DEFAULT_SYSTEM_ITEM_LIST)
|
framework_item_list = list(DEFAULT_FRAMEWORK_ITEM_LIST)
|
||||||
system_item_list.remove('SYSTEM/*')
|
framework_item_list.remove('SYSTEM/*')
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
validate_config_lists(system_item_list, DEFAULT_SYSTEM_MISC_INFO_KEYS,
|
validate_config_lists(framework_item_list,
|
||||||
DEFAULT_OTHER_ITEM_LIST))
|
DEFAULT_FRAMEWORK_MISC_INFO_KEYS,
|
||||||
|
DEFAULT_VENDOR_ITEM_LIST))
|
||||||
|
|
||||||
def test_validate_config_lists_ReturnsTrueIfDefaultItemInDifferentList(self):
|
def test_validate_config_lists_ReturnsTrueIfDefaultItemInDifferentList(self):
|
||||||
system_item_list = list(DEFAULT_SYSTEM_ITEM_LIST)
|
framework_item_list = list(DEFAULT_FRAMEWORK_ITEM_LIST)
|
||||||
system_item_list.remove('ROOT/*')
|
framework_item_list.remove('ROOT/*')
|
||||||
other_item_list = list(DEFAULT_OTHER_ITEM_LIST)
|
vendor_item_list = list(DEFAULT_VENDOR_ITEM_LIST)
|
||||||
other_item_list.append('ROOT/*')
|
vendor_item_list.append('ROOT/*')
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
validate_config_lists(system_item_list, DEFAULT_SYSTEM_MISC_INFO_KEYS,
|
validate_config_lists(framework_item_list,
|
||||||
other_item_list))
|
DEFAULT_FRAMEWORK_MISC_INFO_KEYS,
|
||||||
|
vendor_item_list))
|
||||||
|
|
||||||
def test_validate_config_lists_ReturnsTrueIfExtraItem(self):
|
def test_validate_config_lists_ReturnsTrueIfExtraItem(self):
|
||||||
system_item_list = list(DEFAULT_SYSTEM_ITEM_LIST)
|
framework_item_list = list(DEFAULT_FRAMEWORK_ITEM_LIST)
|
||||||
system_item_list.append('MY_NEW_PARTITION/*')
|
framework_item_list.append('MY_NEW_PARTITION/*')
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
validate_config_lists(system_item_list, DEFAULT_SYSTEM_MISC_INFO_KEYS,
|
validate_config_lists(framework_item_list,
|
||||||
DEFAULT_OTHER_ITEM_LIST))
|
DEFAULT_FRAMEWORK_MISC_INFO_KEYS,
|
||||||
|
DEFAULT_VENDOR_ITEM_LIST))
|
||||||
|
|
||||||
def test_validate_config_lists_ReturnsFalseIfSharedExtractedPartition(self):
|
def test_validate_config_lists_ReturnsFalseIfSharedExtractedPartition(self):
|
||||||
other_item_list = list(DEFAULT_OTHER_ITEM_LIST)
|
vendor_item_list = list(DEFAULT_VENDOR_ITEM_LIST)
|
||||||
other_item_list.append('SYSTEM/my_system_file')
|
vendor_item_list.append('SYSTEM/my_system_file')
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
validate_config_lists(DEFAULT_SYSTEM_ITEM_LIST,
|
validate_config_lists(DEFAULT_FRAMEWORK_ITEM_LIST,
|
||||||
DEFAULT_SYSTEM_MISC_INFO_KEYS, other_item_list))
|
DEFAULT_FRAMEWORK_MISC_INFO_KEYS,
|
||||||
|
vendor_item_list))
|
||||||
|
|
||||||
def test_validate_config_lists_ReturnsFalseIfBadSystemMiscInfoKeys(self):
|
def test_validate_config_lists_ReturnsFalseIfBadSystemMiscInfoKeys(self):
|
||||||
for bad_key in ['dynamic_partition_list', 'super_partition_groups']:
|
for bad_key in ['dynamic_partition_list', 'super_partition_groups']:
|
||||||
system_misc_info_keys = list(DEFAULT_SYSTEM_MISC_INFO_KEYS)
|
framework_misc_info_keys = list(DEFAULT_FRAMEWORK_MISC_INFO_KEYS)
|
||||||
system_misc_info_keys.append(bad_key)
|
framework_misc_info_keys.append(bad_key)
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
validate_config_lists(DEFAULT_SYSTEM_ITEM_LIST, system_misc_info_keys,
|
validate_config_lists(DEFAULT_FRAMEWORK_ITEM_LIST,
|
||||||
DEFAULT_OTHER_ITEM_LIST))
|
framework_misc_info_keys,
|
||||||
|
DEFAULT_VENDOR_ITEM_LIST))
|
||||||
|
|
||||||
def test_merge_dynamic_partition_info_dicts_ReturnsMergedDict(self):
|
def test_merge_dynamic_partition_info_dicts_ReturnsMergedDict(self):
|
||||||
system_dict = {
|
framework_dict = {
|
||||||
'super_partition_groups': 'group_a',
|
'super_partition_groups': 'group_a',
|
||||||
'dynamic_partition_list': 'system',
|
'dynamic_partition_list': 'system',
|
||||||
'super_group_a_list': 'system',
|
'super_group_a_list': 'system',
|
||||||
}
|
}
|
||||||
other_dict = {
|
vendor_dict = {
|
||||||
'super_partition_groups': 'group_a group_b',
|
'super_partition_groups': 'group_a group_b',
|
||||||
'dynamic_partition_list': 'vendor product',
|
'dynamic_partition_list': 'vendor product',
|
||||||
'super_group_a_list': 'vendor',
|
'super_group_a_list': 'vendor',
|
||||||
@@ -153,8 +158,8 @@ class MergeTargetFilesTest(test_utils.ReleaseToolsTestCase):
|
|||||||
'super_group_b_size': '2000',
|
'super_group_b_size': '2000',
|
||||||
}
|
}
|
||||||
merged_dict = merge_dynamic_partition_info_dicts(
|
merged_dict = merge_dynamic_partition_info_dicts(
|
||||||
system_dict=system_dict,
|
framework_dict=framework_dict,
|
||||||
other_dict=other_dict,
|
vendor_dict=vendor_dict,
|
||||||
size_prefix='super_',
|
size_prefix='super_',
|
||||||
size_suffix='_size',
|
size_suffix='_size',
|
||||||
list_prefix='super_',
|
list_prefix='super_',
|
||||||
@@ -173,19 +178,19 @@ class MergeTargetFilesTest(test_utils.ReleaseToolsTestCase):
|
|||||||
output_dir = common.MakeTempDir()
|
output_dir = common.MakeTempDir()
|
||||||
os.makedirs(os.path.join(output_dir, 'META'))
|
os.makedirs(os.path.join(output_dir, 'META'))
|
||||||
|
|
||||||
system_dir = common.MakeTempDir()
|
framework_dir = common.MakeTempDir()
|
||||||
os.makedirs(os.path.join(system_dir, 'META'))
|
os.makedirs(os.path.join(framework_dir, 'META'))
|
||||||
os.symlink(
|
os.symlink(
|
||||||
os.path.join(self.testdata_dir, 'apexkeys_system.txt'),
|
os.path.join(self.testdata_dir, 'apexkeys_framework.txt'),
|
||||||
os.path.join(system_dir, 'META', 'apexkeys.txt'))
|
os.path.join(framework_dir, 'META', 'apexkeys.txt'))
|
||||||
|
|
||||||
other_dir = common.MakeTempDir()
|
vendor_dir = common.MakeTempDir()
|
||||||
os.makedirs(os.path.join(other_dir, 'META'))
|
os.makedirs(os.path.join(vendor_dir, 'META'))
|
||||||
os.symlink(
|
os.symlink(
|
||||||
os.path.join(self.testdata_dir, 'apexkeys_other.txt'),
|
os.path.join(self.testdata_dir, 'apexkeys_vendor.txt'),
|
||||||
os.path.join(other_dir, 'META', 'apexkeys.txt'))
|
os.path.join(vendor_dir, 'META', 'apexkeys.txt'))
|
||||||
|
|
||||||
process_apex_keys_apk_certs_common(system_dir, other_dir, output_dir,
|
process_apex_keys_apk_certs_common(framework_dir, vendor_dir, output_dir,
|
||||||
'apexkeys.txt')
|
'apexkeys.txt')
|
||||||
|
|
||||||
merged_entries = []
|
merged_entries = []
|
||||||
@@ -206,17 +211,17 @@ class MergeTargetFilesTest(test_utils.ReleaseToolsTestCase):
|
|||||||
output_dir = common.MakeTempDir()
|
output_dir = common.MakeTempDir()
|
||||||
os.makedirs(os.path.join(output_dir, 'META'))
|
os.makedirs(os.path.join(output_dir, 'META'))
|
||||||
|
|
||||||
system_dir = common.MakeTempDir()
|
framework_dir = common.MakeTempDir()
|
||||||
os.makedirs(os.path.join(system_dir, 'META'))
|
os.makedirs(os.path.join(framework_dir, 'META'))
|
||||||
os.symlink(
|
os.symlink(
|
||||||
os.path.join(self.testdata_dir, 'apexkeys_system.txt'),
|
os.path.join(self.testdata_dir, 'apexkeys_framework.txt'),
|
||||||
os.path.join(system_dir, 'META', 'apexkeys.txt'))
|
os.path.join(framework_dir, 'META', 'apexkeys.txt'))
|
||||||
|
|
||||||
conflict_dir = common.MakeTempDir()
|
conflict_dir = common.MakeTempDir()
|
||||||
os.makedirs(os.path.join(conflict_dir, 'META'))
|
os.makedirs(os.path.join(conflict_dir, 'META'))
|
||||||
os.symlink(
|
os.symlink(
|
||||||
os.path.join(self.testdata_dir, 'apexkeys_system_conflict.txt'),
|
os.path.join(self.testdata_dir, 'apexkeys_framework_conflict.txt'),
|
||||||
os.path.join(conflict_dir, 'META', 'apexkeys.txt'))
|
os.path.join(conflict_dir, 'META', 'apexkeys.txt'))
|
||||||
|
|
||||||
self.assertRaises(ValueError, process_apex_keys_apk_certs_common,
|
self.assertRaises(ValueError, process_apex_keys_apk_certs_common,
|
||||||
system_dir, conflict_dir, output_dir, 'apexkeys.txt')
|
framework_dir, conflict_dir, output_dir, 'apexkeys.txt')
|
||||||
|
Reference in New Issue
Block a user