Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 99a22624 authored by Chris Gross's avatar Chris Gross Committed by android-build-merger
Browse files

Merge "Add merging of apexkeys and apkcerts metadata" am: a489a92f

am: 07d985d1

Change-Id: Ib5e6d864f3704ffeeb4adb1933bb34f92d3511d8
parents 55a499b2 07d985d1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -696,7 +696,7 @@ $(APKCERTS_FILE):
	@echo APK certs list: $@
	@mkdir -p $(dir $@)
	@rm -f $@
	$(foreach p,$(PACKAGES),\
	$(foreach p,$(sort $(PACKAGES)),\
	  $(if $(PACKAGES.$(p).EXTERNAL_KEY),\
	    $(call _apkcerts_write_line,$(p),"EXTERNAL","",$(PACKAGES.$(p).COMPRESSED),$@),\
	    $(call _apkcerts_write_line,$(p),$(PACKAGES.$(p).CERTIFICATE),$(PACKAGES.$(p).PRIVATE_KEY),$(PACKAGES.$(p).COMPRESSED),$@)))
+84 −11
Original line number Diff line number Diff line
@@ -185,6 +185,26 @@ other_extract_special_item_list = [
]


def write_sorted_data(data, path):
  """Write the sorted contents of either a list or dict to file.

  This function sorts the contents of the list or dict and then
  writes the resulting sorted contents to a file specified by path.

  Args:
    data: The list or dict to sort and write.
    path: Path to the file to write the sorted values to. The file at path will
      be overridden if it exists.
  """
  with open(path, 'w') as output:
    sorted_data = sorted(data.keys()) if isinstance(data,
                                                    dict) else sorted(data)
    for entry in sorted_data:
      out_str = '{}={}\n'.format(entry, data[entry]) if isinstance(
          data, dict) else '{}\n'.format(entry)
      output.write(out_str)


def extract_items(target_files, target_files_temp_dir, extract_item_list):
  """Extract items from target files to temporary directory.

@@ -341,9 +361,7 @@ def process_ab_partitions_txt(system_target_files_temp_dir,
  output_ab_partitions_txt = os.path.join(output_target_files_temp_dir, 'META',
                                          'ab_partitions.txt')

  with open(output_ab_partitions_txt, 'w') as output:
    for partition in sorted(output_ab_partitions):
      output.write('%s\n' % partition)
  write_sorted_data(data=output_ab_partitions, path=output_ab_partitions_txt)


def append_recovery_to_filesystem_config(output_target_files_temp_dir):
@@ -485,10 +503,7 @@ def process_misc_info_txt(system_target_files_temp_dir,

  output_misc_info_txt = os.path.join(output_target_files_temp_dir, 'META',
                                      'misc_info.txt')
  with open(output_misc_info_txt, 'w') as output:
    sorted_keys = sorted(merged_info_dict.keys())
    for key in sorted_keys:
      output.write('{}={}\n'.format(key, merged_info_dict[key]))
  write_sorted_data(data=merged_info_dict, path=output_misc_info_txt)


def process_dynamic_partitions_info_txt(system_target_files_dir,
@@ -538,10 +553,56 @@ def process_dynamic_partitions_info_txt(system_target_files_dir,

  output_dynamic_partitions_info_txt = os.path.join(
      output_target_files_dir, 'META', 'dynamic_partitions_info.txt')
  with open(output_dynamic_partitions_info_txt, 'w') as output:
    sorted_keys = sorted(merged_dynamic_partitions_dict.keys())
    for key in sorted_keys:
      output.write('{}={}\n'.format(key, merged_dynamic_partitions_dict[key]))
  write_sorted_data(
      data=merged_dynamic_partitions_dict,
      path=output_dynamic_partitions_info_txt)


def process_apex_keys_apk_certs_common(system_target_files_dir,
                                       other_target_files_dir,
                                       output_target_files_dir, file_name):
  """Perform special processing for META/apexkeys.txt or META/apkcerts.txt.

  This function merges the contents of the META/apexkeys.txt or
  META/apkcerts.txt
  files from the system directory and the other directory, placing the merged
  result in the output directory. The precondition in that the files are already
  extracted.
  The post condition is that the output META/apexkeys.txt or META/apkcerts.txt
  contains the merged content.

  Args:
    system_target_files_dir: The name of a directory containing the special
      items extracted from the system target files package.
    other_target_files_dir: The name of a directory containing the special items
      extracted from the other target files package.
    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.
    file_name: The name of the file to merge. One of apkcerts.txt or
      apexkeys.txt.
  """

  def read_helper(d):
    temp = {}
    file_path = os.path.join(d, 'META', file_name)
    with open(file_path) as f:
      for line in f:
        if line.strip():
          temp[line.split()[0]] = line.strip()
    return temp

  system_dict = read_helper(system_target_files_dir)
  other_dict = read_helper(other_target_files_dir)

  for key in system_dict:
    if key in other_dict and other_dict[key] != system_dict[key]:
      raise ValueError('Conflicting entries found in %s:\n %s and\n %s' %
                       (file_name, system_dict[key], other_dict[key]))
    other_dict[key] = system_dict[key]

  output_file = os.path.join(output_target_files_dir, 'META', file_name)

  write_sorted_data(data=other_dict.values(), path=output_file)


def process_special_cases(system_target_files_temp_dir,
@@ -588,6 +649,18 @@ def process_special_cases(system_target_files_temp_dir,
      other_target_files_dir=other_target_files_temp_dir,
      output_target_files_dir=output_target_files_temp_dir)

  process_apex_keys_apk_certs_common(
      system_target_files_dir=system_target_files_temp_dir,
      other_target_files_dir=other_target_files_temp_dir,
      output_target_files_dir=output_target_files_temp_dir,
      file_name='apkcerts.txt')

  process_apex_keys_apk_certs_common(
      system_target_files_dir=system_target_files_temp_dir,
      other_target_files_dir=other_target_files_temp_dir,
      output_target_files_dir=output_target_files_temp_dir,
      file_name='apexkeys.txt')


def merge_target_files(temp_dir, system_target_files, system_item_list,
                       system_misc_info_keys, other_target_files,
+54 −1
Original line number Diff line number Diff line
@@ -22,7 +22,8 @@ from merge_target_files import (read_config_list, validate_config_lists,
                                default_system_item_list,
                                default_other_item_list,
                                default_system_misc_info_keys, copy_items,
                                merge_dynamic_partition_info_dicts)
                                merge_dynamic_partition_info_dicts,
                                process_apex_keys_apk_certs_common)


class MergeTargetFilesTest(test_utils.ReleaseToolsTestCase):
@@ -160,3 +161,55 @@ class MergeTargetFilesTest(test_utils.ReleaseToolsTestCase):
        'super_group_b_size': '2000',
    }
    self.assertEqual(merged_dict, expected_merged_dict)

  def test_process_apex_keys_apk_certs_ReturnsTrueIfNoConflicts(self):
    output_dir = common.MakeTempDir()
    os.makedirs(os.path.join(output_dir, 'META'))

    system_dir = common.MakeTempDir()
    os.makedirs(os.path.join(system_dir, 'META'))
    os.symlink(
        os.path.join(self.testdata_dir, 'apexkeys_system.txt'),
        os.path.join(system_dir, 'META', 'apexkeys.txt'))

    other_dir = common.MakeTempDir()
    os.makedirs(os.path.join(other_dir, 'META'))
    os.symlink(
        os.path.join(self.testdata_dir, 'apexkeys_other.txt'),
        os.path.join(other_dir, 'META', 'apexkeys.txt'))

    process_apex_keys_apk_certs_common(system_dir, other_dir, output_dir,
                                       'apexkeys.txt')

    merged_entries = []
    merged_path = os.path.join(self.testdata_dir, 'apexkeys_merge.txt')

    with open(merged_path) as f:
      merged_entries = f.read().split('\n')

    output_entries = []
    output_path = os.path.join(output_dir, 'META', 'apexkeys.txt')

    with open(output_path) as f:
      output_entries = f.read().split('\n')

    return self.assertEqual(merged_entries, output_entries)

  def test_process_apex_keys_apk_certs_ReturnsFalseIfConflictsPresent(self):
    output_dir = common.MakeTempDir()
    os.makedirs(os.path.join(output_dir, 'META'))

    system_dir = common.MakeTempDir()
    os.makedirs(os.path.join(system_dir, 'META'))
    os.symlink(
        os.path.join(self.testdata_dir, 'apexkeys_system.txt'),
        os.path.join(system_dir, 'META', 'apexkeys.txt'))

    conflict_dir = common.MakeTempDir()
    os.makedirs(os.path.join(conflict_dir, 'META'))
    os.symlink(
        os.path.join(self.testdata_dir, 'apexkeys_system_conflict.txt'),
        os.path.join(conflict_dir, 'META', 'apexkeys.txt'))

    self.assertRaises(ValueError, process_apex_keys_apk_certs_common,
                      system_dir, conflict_dir, output_dir, 'apexkeys.txt')
+4 −0
Original line number Diff line number Diff line
name="com.android.conscrypt.apex" public_key="external/conscrypt/apex/com.android.conscrypt.avbpubkey" private_key="external/conscrypt/apex/com.android.conscrypt.pem" container_certificate="external/conscrypt/apex/com.android.conscrypt.x509.pem" container_private_key="external/conscrypt/apex/com.android.conscrypt.pk8"
name="com.android.runtime.debug.apex" public_key="art/build/apex/com.android.runtime.avbpubkey" private_key="art/build/apex/com.android.runtime.pem" container_certificate="art/build/apex/com.android.runtime.debug.x509.pem" container_private_key="art/build/apex/com.android.runtime.debug.pk8"
name="com.android.runtime.release.apex" public_key="art/build/apex/com.android.runtime.avbpubkey" private_key="art/build/apex/com.android.runtime.pem" container_certificate="art/build/apex/com.android.runtime.release.x509.pem" container_private_key="art/build/apex/com.android.runtime.release.pk8"
name="com.android.support.apexer.apex" public_key="system/apex/apexer/etc/com.android.support.apexer.avbpubkey" private_key="system/apex/apexer/etc/com.android.support.apexer.pem" container_certificate="build/target/product/security/testkey.x509.pem" container_private_key="build/target/product/security/testkey.pk8"
+3 −0
Original line number Diff line number Diff line
name="com.android.runtime.release.apex" public_key="art/build/apex/com.android.runtime.avbpubkey" private_key="art/build/apex/com.android.runtime.pem" container_certificate="art/build/apex/com.android.runtime.release.x509.pem" container_private_key="art/build/apex/com.android.runtime.release.pk8"
name="com.android.support.apexer.apex" public_key="system/apex/apexer/etc/com.android.support.apexer.avbpubkey" private_key="system/apex/apexer/etc/com.android.support.apexer.pem" container_certificate="build/target/product/security/testkey.x509.pem" container_private_key="build/target/product/security/testkey.pk8"
name="com.android.runtime.debug.apex" public_key="art/build/apex/com.android.runtime.avbpubkey" private_key="art/build/apex/com.android.runtime.pem" container_certificate="art/build/apex/com.android.runtime.debug.x509.pem" container_private_key="art/build/apex/com.android.runtime.debug.pk8"
Loading