Merge "Follow symlink when creating symbols.zip"
diff --git a/core/Makefile b/core/Makefile
index 72b6ba2..6d8e629 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -732,8 +732,10 @@
# -----------------------------------------------------------------
# build /product/etc/security/avb/system_other.avbpubkey if needed
ifdef BUILDING_SYSTEM_OTHER_IMAGE
+ifeq ($(BOARD_AVB_ENABLE),true)
INSTALLED_PRODUCT_SYSTEM_OTHER_AVBKEY_TARGET := $(TARGET_OUT_PRODUCT_ETC)/security/avb/system_other.avbpubkey
ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_PRODUCT_SYSTEM_OTHER_AVBKEY_TARGET)
+endif # BOARD_AVB_ENABLE
endif # BUILDING_SYSTEM_OTHER_IMAGE
# -----------------------------------------------------------------
diff --git a/core/clear_vars.mk b/core/clear_vars.mk
index 444612f..d67c9f8 100644
--- a/core/clear_vars.mk
+++ b/core/clear_vars.mk
@@ -263,7 +263,8 @@
LOCAL_SOONG_LINK_TYPE :=
LOCAL_SOONG_PROGUARD_DICT :=
LOCAL_SOONG_RESOURCE_EXPORT_PACKAGE :=
-LOCAL_SOONG_RRO_DIRS :=
+LOCAL_SOONG_DEVICE_RRO_DIRS :=
+LOCAL_SOONG_PRODUCT_RRO_DIRS :=
LOCAL_SOONG_STATIC_LIBRARY_EXTRA_PACKAGES :=
LOCAL_SOONG_SYMBOL_PATH :=
LOCAL_SOONG_TOC :=
diff --git a/core/soong_app_prebuilt.mk b/core/soong_app_prebuilt.mk
index a9169eb..cfcb0c6 100644
--- a/core/soong_app_prebuilt.mk
+++ b/core/soong_app_prebuilt.mk
@@ -159,13 +159,13 @@
include $(BUILD_SYSTEM)/link_type.mk
endif # !LOCAL_IS_HOST_MODULE
-ifdef LOCAL_SOONG_RRO_DIRS
+ifneq (,$(LOCAL_SOONG_DEVICE_RRO_DIRS)$(LOCAL_SOONG_PRODUCT_RRO_DIRS))
$(call append_enforce_rro_sources, \
$(my_register_name), \
false, \
$(LOCAL_FULL_MANIFEST_FILE), \
$(if $(LOCAL_EXPORT_PACKAGE_RESOURCES),true,false), \
- $(LOCAL_SOONG_RRO_DIRS))
+ $(LOCAL_SOONG_DEVICE_RRO_DIRS) $(LOCAL_SOONG_PRODUCT_RRO_DIRS))
endif
SOONG_ALREADY_CONV := $(SOONG_ALREADY_CONV) $(LOCAL_MODULE)
diff --git a/core/soong_config.mk b/core/soong_config.mk
index 995fc11..baba31b 100644
--- a/core/soong_config.mk
+++ b/core/soong_config.mk
@@ -61,7 +61,8 @@
$(call add_json_str, CrossHostArch, $(HOST_CROSS_ARCH))
$(call add_json_str, CrossHostSecondaryArch, $(HOST_CROSS_2ND_ARCH))
-$(call add_json_list, ResourceOverlays, $(PRODUCT_PACKAGE_OVERLAYS) $(DEVICE_PACKAGE_OVERLAYS))
+$(call add_json_list, DeviceResourceOverlays, $(DEVICE_PACKAGE_OVERLAYS))
+$(call add_json_list, ProductResourceOverlays, $(PRODUCT_PACKAGE_OVERLAYS))
$(call add_json_list, EnforceRROTargets, $(PRODUCT_ENFORCE_RRO_TARGETS))
$(call add_json_list, EnforceRROExcludedOverlays, $(PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS))
diff --git a/tools/check_elf_file.py b/tools/check_elf_file.py
index 38c1cf4..de855c6 100755
--- a/tools/check_elf_file.py
+++ b/tools/check_elf_file.py
@@ -260,13 +260,20 @@
_SYMBOL_ENTRY_END_PATTERN = ' }'
- @classmethod
- def _parse_symbol_name(cls, name_with_version):
+ @staticmethod
+ def _parse_symbol_name(name_with_version):
"""Split `name_with_version` into name and version. This function may split
at last occurrence of `@@` or `@`."""
- name, version = name_with_version.rsplit('@', 1)
- if name and name[-1] == '@':
- name = name[:-1]
+ pos = name_with_version.rfind('@')
+ if pos == -1:
+ name = name_with_version
+ version = ''
+ else:
+ if pos > 0 and name_with_version[pos - 1] == '@':
+ name = name_with_version[0:pos - 1]
+ else:
+ name = name_with_version[0:pos]
+ version = name_with_version[pos + 1:]
return (name, version)
diff --git a/tools/releasetools/check_target_files_signatures.py b/tools/releasetools/check_target_files_signatures.py
index 9b76954..4b0d4c7 100755
--- a/tools/releasetools/check_target_files_signatures.py
+++ b/tools/releasetools/check_target_files_signatures.py
@@ -168,6 +168,7 @@
class APK(object):
+
def __init__(self, full_filename, filename):
self.filename = filename
self.certs = None
@@ -244,12 +245,12 @@
# must decompress them individually before we perform any analysis.
# This is the list of wildcards of files we extract from |filename|.
- apk_extensions = ['*.apk']
+ apk_extensions = ['*.apk', '*.apex']
self.certmap, compressed_extension = common.ReadApkCerts(
- zipfile.ZipFile(filename, "r"))
+ zipfile.ZipFile(filename))
if compressed_extension:
- apk_extensions.append("*.apk" + compressed_extension)
+ apk_extensions.append('*.apk' + compressed_extension)
d = common.UnzipTemp(filename, apk_extensions)
self.apks = {}
@@ -272,7 +273,7 @@
os.remove(os.path.join(dirpath, fn))
fn = uncompressed_fn
- if fn.endswith(".apk"):
+ if fn.endswith(('.apk', '.apex')):
fullname = os.path.join(dirpath, fn)
displayname = fullname[len(d)+1:]
apk = APK(fullname, displayname)
diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
index 780b9c1..34c1359 100644
--- a/tools/releasetools/common.py
+++ b/tools/releasetools/common.py
@@ -17,6 +17,7 @@
import collections
import copy
import errno
+import fnmatch
import getopt
import getpass
import gzip
@@ -771,21 +772,29 @@
shutil.copyfileobj(in_file, out_file)
-def UnzipToDir(filename, dirname, pattern=None):
+def UnzipToDir(filename, dirname, patterns=None):
"""Unzips the archive to the given directory.
Args:
filename: The name of the zip file to unzip.
-
dirname: Where the unziped files will land.
-
- pattern: Files to unzip from the archive. If omitted, will unzip the entire
- archvie.
+ patterns: Files to unzip from the archive. If omitted, will unzip the entire
+ archvie. Non-matching patterns will be filtered out. If there's no match
+ after the filtering, no file will be unzipped.
"""
-
cmd = ["unzip", "-o", "-q", filename, "-d", dirname]
- if pattern is not None:
- cmd.extend(pattern)
+ if patterns is not None:
+ # Filter out non-matching patterns. unzip will complain otherwise.
+ with zipfile.ZipFile(filename) as input_zip:
+ names = input_zip.namelist()
+ filtered = [
+ pattern for pattern in patterns if fnmatch.filter(names, pattern)]
+
+ # There isn't any matching files. Don't unzip anything.
+ if not filtered:
+ return
+ cmd.extend(filtered)
+
RunAndCheckOutput(cmd)
diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
index fe40936..37f4e38 100755
--- a/tools/releasetools/ota_from_target_files.py
+++ b/tools/releasetools/ota_from_target_files.py
@@ -236,7 +236,7 @@
POSTINSTALL_CONFIG = 'META/postinstall_config.txt'
DYNAMIC_PARTITION_INFO = 'META/dynamic_partitions_info.txt'
AB_PARTITIONS = 'META/ab_partitions.txt'
-UNZIP_PATTERN = ['IMAGES/*', 'META/*']
+UNZIP_PATTERN = ['IMAGES/*', 'META/*', 'RADIO/*']
RETROFIT_DAP_UNZIP_PATTERN = ['OTA/super_*.img', AB_PARTITIONS]
@@ -1802,12 +1802,7 @@
infolist = input_zip.infolist()
namelist = input_zip.namelist()
- # Additionally unzip 'RADIO/*' if exists.
- unzip_pattern = UNZIP_PATTERN[:]
- if any([entry.startswith('RADIO/') for entry in namelist]):
- unzip_pattern.append('RADIO/*')
- input_tmp = common.UnzipTemp(input_file, unzip_pattern)
-
+ input_tmp = common.UnzipTemp(input_file, UNZIP_PATTERN)
for info in infolist:
unzipped_file = os.path.join(input_tmp, *info.filename.split('/'))
if info.filename == 'IMAGES/system_other.img':
diff --git a/tools/releasetools/test_common.py b/tools/releasetools/test_common.py
index 8709124..d4fa5f3 100644
--- a/tools/releasetools/test_common.py
+++ b/tools/releasetools/test_common.py
@@ -359,6 +359,90 @@
finally:
os.remove(zip_file.name)
+ @staticmethod
+ def _test_UnzipTemp_createZipFile():
+ zip_file = common.MakeTempFile(suffix='.zip')
+ output_zip = zipfile.ZipFile(
+ zip_file, 'w', compression=zipfile.ZIP_DEFLATED)
+ contents = os.urandom(1024)
+ with tempfile.NamedTemporaryFile() as entry_file:
+ entry_file.write(contents)
+ common.ZipWrite(output_zip, entry_file.name, arcname='Test1')
+ common.ZipWrite(output_zip, entry_file.name, arcname='Test2')
+ common.ZipWrite(output_zip, entry_file.name, arcname='Foo3')
+ common.ZipWrite(output_zip, entry_file.name, arcname='Bar4')
+ common.ZipWrite(output_zip, entry_file.name, arcname='Dir5/Baz5')
+ common.ZipClose(output_zip)
+ common.ZipClose(output_zip)
+ return zip_file
+
+ def test_UnzipTemp(self):
+ zip_file = self._test_UnzipTemp_createZipFile()
+ unzipped_dir = common.UnzipTemp(zip_file)
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Test1')))
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Test2')))
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Foo3')))
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Bar4')))
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Dir5/Baz5')))
+
+ def test_UnzipTemp_withPatterns(self):
+ zip_file = self._test_UnzipTemp_createZipFile()
+
+ unzipped_dir = common.UnzipTemp(zip_file, ['Test1'])
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Test1')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Test2')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Foo3')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Bar4')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Dir5/Baz5')))
+
+ unzipped_dir = common.UnzipTemp(zip_file, ['Test1', 'Foo3'])
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Test1')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Test2')))
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Foo3')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Bar4')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Dir5/Baz5')))
+
+ unzipped_dir = common.UnzipTemp(zip_file, ['Test*', 'Foo3*'])
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Test1')))
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Test2')))
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Foo3')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Bar4')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Dir5/Baz5')))
+
+ unzipped_dir = common.UnzipTemp(zip_file, ['*Test1', '*Baz*'])
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Test1')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Test2')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Foo3')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Bar4')))
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Dir5/Baz5')))
+
+ def test_UnzipTemp_withEmptyPatterns(self):
+ zip_file = self._test_UnzipTemp_createZipFile()
+ unzipped_dir = common.UnzipTemp(zip_file, [])
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Test1')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Test2')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Foo3')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Bar4')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Dir5/Baz5')))
+
+ def test_UnzipTemp_withPartiallyMatchingPatterns(self):
+ zip_file = self._test_UnzipTemp_createZipFile()
+ unzipped_dir = common.UnzipTemp(zip_file, ['Test*', 'Nonexistent*'])
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Test1')))
+ self.assertTrue(os.path.exists(os.path.join(unzipped_dir, 'Test2')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Foo3')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Bar4')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Dir5/Baz5')))
+
+ def test_UnzipTemp_withNoMatchingPatterns(self):
+ zip_file = self._test_UnzipTemp_createZipFile()
+ unzipped_dir = common.UnzipTemp(zip_file, ['Foo4', 'Nonexistent*'])
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Test1')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Test2')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Foo3')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Bar4')))
+ self.assertFalse(os.path.exists(os.path.join(unzipped_dir, 'Dir5/Baz5')))
+
class CommonApkUtilsTest(test_utils.ReleaseToolsTestCase):
"""Tests the APK utils related functions."""