Merge "Generate API XML files from android stub targets instead of text input."
diff --git a/CleanSpec.mk b/CleanSpec.mk
index e5a8b5e..d66ac1e 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -549,6 +549,52 @@
# Clean up previous default location of RROs
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/overlay)
+
+# Remove ART artifacts installed only by modules `art-runtime` and
+# `art-tools` in /system on target.
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/dalvikvm)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/dalvikvm32)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/dalvikvm64)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/dex2oat)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/dex2oatd)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/dexdiag)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/dexdump)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/dexlist)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/dexoptanalyzer)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/dexoptanalyzerd)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/oatdump)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/profman)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/profmand)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libadbconnection.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libadbconnectiond.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libart-compiler.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libartd-compiler.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libart-dexlayout.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libartd-dexlayout.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libart-disassembler.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libart.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libartd.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libartbase.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libartbased.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libdexfile.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libdexfiled.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libdexfile_external.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libdexfile_support.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libdt_fd_forward.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libdt_socket.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libjdwp.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libnpt.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libopenjdkd.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libopenjdkjvm.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libopenjdkjvmd.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libopenjdkjvmti.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libopenjdkjvmtid.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libprofile.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libprofiled.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libtombstoned_client.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libvixl.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/libvixld.so)
+
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************
diff --git a/core/binary.mk b/core/binary.mk
index 92bf62d..ccf5580 100644
--- a/core/binary.mk
+++ b/core/binary.mk
@@ -257,6 +257,14 @@
else # LOCAL_NDK_STL_VARIANT must be none
# Do nothing.
endif
+
+ # Clang's coverage/profile runtime needs symbols like 'stderr' that were not
+ # exported from libc prior to API level 23
+ ifneq ($(my_ndk_api),current)
+ ifeq ($(call math_lt, $(my_ndk_api),23),true)
+ my_native_coverage := false
+ endif
+ endif
endif
ifneq ($(LOCAL_USE_VNDK),)
diff --git a/core/config.mk b/core/config.mk
index 71c3f68..518e138 100644
--- a/core/config.mk
+++ b/core/config.mk
@@ -945,6 +945,10 @@
endif
ifeq ($(PRODUCT_USE_DYNAMIC_PARTITIONS),true)
+ ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
+ $(error BOARD_BUILD_SYSTEM_ROOT_IMAGE cannot be true for devices with dynamic partitions)
+ endif
+
requirements := \
PRODUCT_USE_DYNAMIC_PARTITION_SIZE \
PRODUCT_BUILD_SUPER_PARTITION \
diff --git a/core/definitions.mk b/core/definitions.mk
index 4739204..c97f647 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -2480,12 +2480,15 @@
# Copies many files.
# $(1): The files to copy. Each entry is a ':' separated src:dst pair
+# $(2): An optional directory to prepend to the destination
# Evaluates to the list of the dst files (ie suitable for a dependency list)
define copy-many-files
$(foreach f, $(1), $(strip \
$(eval _cmf_tuple := $(subst :, ,$(f))) \
$(eval _cmf_src := $(word 1,$(_cmf_tuple))) \
$(eval _cmf_dest := $(word 2,$(_cmf_tuple))) \
+ $(if $(strip $(2)), \
+ $(eval _cmf_dest := $(patsubst %/,%,$(strip $(2)))/$(patsubst /%,%,$(_cmf_dest)))) \
$(if $(filter-out $(_cmf_src), $(_cmf_dest)), \
$(eval $(call copy-one-file,$(_cmf_src),$(_cmf_dest)))) \
$(_cmf_dest)))
diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk
index cd48025..337b2fe 100644
--- a/core/prebuilt_internal.mk
+++ b/core/prebuilt_internal.mk
@@ -170,14 +170,29 @@
include $(BUILD_SYSTEM)/link_type.mk
endif # prebuilt_module_is_a_library
-# Check prebuilt ELF binaries.
-include $(BUILD_SYSTEM)/check_elf_file.mk
-
# The real dependency will be added after all Android.mks are loaded and the install paths
# of the shared libraries are determined.
ifdef LOCAL_INSTALLED_MODULE
-ifdef LOCAL_SHARED_LIBRARIES
-my_shared_libraries := $(LOCAL_SHARED_LIBRARIES)
+ifdef LOCAL_IS_HOST_MODULE
+ ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none)
+ my_system_shared_libraries :=
+ else
+ my_system_shared_libraries := $(LOCAL_SYSTEM_SHARED_LIBRARIES)
+ endif
+else
+ ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none)
+ my_system_shared_libraries := libc libm libdl
+ else
+ my_system_shared_libraries := $(LOCAL_SYSTEM_SHARED_LIBRARIES)
+ my_system_shared_libraries := $(patsubst libc,libc libdl,$(my_system_shared_libraries))
+ endif
+endif
+
+my_shared_libraries := \
+ $(filter-out $(my_system_shared_libraries),$(LOCAL_SHARED_LIBRARIES)) \
+ $(my_system_shared_libraries)
+
+ifdef my_shared_libraries
# Extra shared libraries introduced by LOCAL_CXX_STL.
include $(BUILD_SYSTEM)/cxx_stl_setup.mk
ifdef LOCAL_USE_VNDK
@@ -187,12 +202,15 @@
$(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)DEPENDENCIES_ON_SHARED_LIBRARIES += \
$(my_register_name):$(LOCAL_INSTALLED_MODULE):$(subst $(space),$(comma),$(my_shared_libraries))
endif
-endif
+endif # my_shared_libraries
# We need to enclose the above export_includes and my_built_shared_libraries in
# "my_strip_module not true" because otherwise the rules are defined in dynamic_binary.mk.
endif # my_strip_module not true
+# Check prebuilt ELF binaries.
+include $(BUILD_SYSTEM)/check_elf_file.mk
+
ifeq ($(NATIVE_COVERAGE),true)
ifneq (,$(strip $(LOCAL_PREBUILT_COVERAGE_ARCHIVE)))
$(eval $(call copy-one-file,$(LOCAL_PREBUILT_COVERAGE_ARCHIVE),$(intermediates)/$(LOCAL_MODULE).gcnodir))
diff --git a/target/product/runtime_libart.mk b/target/product/runtime_libart.mk
index 4aad5f7..f1f807d 100644
--- a/target/product/runtime_libart.mk
+++ b/target/product/runtime_libart.mk
@@ -38,10 +38,6 @@
libicui18n \
libicuuc \
-# ART.
-PRODUCT_PACKAGES += art-runtime
-# ART/dex helpers.
-PRODUCT_PACKAGES += art-tools
# Android Runtime APEX module.
PRODUCT_PACKAGES += com.android.runtime
diff --git a/tools/fs_config/fs_config_generator.py b/tools/fs_config/fs_config_generator.py
index 0a8def8..18e6534 100755
--- a/tools/fs_config/fs_config_generator.py
+++ b/tools/fs_config/fs_config_generator.py
@@ -112,7 +112,8 @@
'Cannot specify delimiter character ":" in uid: "%s"' % uid)
if ':' in logon:
raise ValueError(
- 'Cannot specify delimiter character ":" in logon: "%s"' % logon)
+ 'Cannot specify delimiter character ":" in logon: "%s"' %
+ logon)
return logon, uid
@@ -158,16 +159,17 @@
try:
self.normalized_value = str(int(value, 0))
- except ValueException:
- raise ValueError('Invalid "value", not aid number, got: \"%s\"' % value)
+ except ValueError:
+ raise ValueError(
+ 'Invalid "value", not aid number, got: \"%s\"' % value)
# Where we calculate the friendly name
friendly = identifier[len(AID.PREFIX):].lower()
self.friendly = AID._fixup_friendly(friendly)
if len(self.friendly) > 31:
- raise ValueError('AID names must be under 32 characters "%s"' % self.friendly)
-
+ raise ValueError(
+ 'AID names must be under 32 characters "%s"' % self.friendly)
def __eq__(self, other):
@@ -217,6 +219,7 @@
user (str): The uid or #define identifier (AID_SYSTEM)
group (str): The gid or #define identifier (AID_SYSTEM)
caps (str): The capability set.
+ path (str): The path of the file or directory.
filename (str): The file it was found in.
"""
@@ -227,6 +230,7 @@
user (str): The uid or #define identifier (AID_SYSTEM)
group (str): The gid or #define identifier (AID_SYSTEM)
caps (str): The capability set as a list.
+ path (str): The path of the file or directory.
filename (str): The file it was found in.
"""
self.mode = mode
@@ -242,6 +246,11 @@
and self.group == other.group and self.caps == other.caps \
and self.path == other.path and self.filename == other.filename
+ def __repr__(self):
+ return 'FSConfig(%r, %r, %r, %r, %r, %r)' % (self.mode, self.user,
+ self.group, self.caps,
+ self.path, self.filename)
+
class AIDHeaderParser(object):
"""Parses an android_filesystem_config.h file.
@@ -256,10 +265,10 @@
work.
"""
-
_SKIP_AIDS = [
re.compile(r'%sUNUSED[0-9].*' % AID.PREFIX),
- re.compile(r'%sAPP' % AID.PREFIX), re.compile(r'%sUSER' % AID.PREFIX)
+ re.compile(r'%sAPP' % AID.PREFIX),
+ re.compile(r'%sUSER' % AID.PREFIX)
]
_AID_DEFINE = re.compile(r'\s*#define\s+%s.*' % AID.PREFIX)
_OEM_START_KW = 'START'
@@ -310,7 +319,9 @@
identifier = chunks[1]
value = chunks[2]
- if any(x.match(identifier) for x in AIDHeaderParser._SKIP_AIDS):
+ if any(
+ x.match(identifier)
+ for x in AIDHeaderParser._SKIP_AIDS):
continue
try:
@@ -322,8 +333,8 @@
self._handle_aid(identifier, value)
except ValueError as exception:
sys.exit(
- error_message('{} for "{}"'.format(exception,
- identifier)))
+ error_message('{} for "{}"'.format(
+ exception, identifier)))
def _handle_aid(self, identifier, value):
"""Handle an AID C #define.
@@ -346,8 +357,8 @@
raise ValueError('Duplicate aid "%s"' % identifier)
if value in self._aid_value_to_name and aid.identifier not in AIDHeaderParser._COLLISION_OK:
- raise ValueError('Duplicate aid value "%s" for %s' % (value,
- identifier))
+ raise ValueError(
+ 'Duplicate aid value "%s" for %s' % (value, identifier))
self._aid_name_to_value[aid.friendly] = aid
self._aid_value_to_name[value] = aid.friendly
@@ -400,11 +411,11 @@
if tmp == int_value:
raise ValueError('START and END values equal %u' % int_value)
elif is_start and tmp < int_value:
- raise ValueError('END value %u less than START value %u' %
- (tmp, int_value))
+ raise ValueError(
+ 'END value %u less than START value %u' % (tmp, int_value))
elif not is_start and tmp > int_value:
- raise ValueError('END value %u less than START value %u' %
- (int_value, tmp))
+ raise ValueError(
+ 'END value %u less than START value %u' % (int_value, tmp))
# Add START values to the head of the list and END values at the end.
# Thus, the list is ordered with index 0 as START and index 1 as END.
@@ -533,7 +544,7 @@
# list of handler to required options, used to identify the
# parsing section
- _SECTIONS = [('_handle_aid', ('value',)),
+ _SECTIONS = [('_handle_aid', ('value', )),
('_handle_path', ('mode', 'user', 'group', 'caps'))]
def __init__(self, config_files, oem_ranges):
@@ -596,8 +607,8 @@
break
if not found:
- sys.exit('Invalid section "%s" in file: "%s"' %
- (section, file_name))
+ sys.exit('Invalid section "%s" in file: "%s"' % (section,
+ file_name))
# sort entries:
# * specified path before prefix match
@@ -959,7 +970,7 @@
common = base_set & oem_set
- if len(common) > 0:
+ if common:
emsg = 'Following AID Collisions detected for: \n'
for friendly in common:
base = base_friendly[friendly]
@@ -1234,11 +1245,12 @@
aids = parser.aids
# nothing to do if no aids defined
- if len(aids) == 0:
+ if not aids:
return
for aid in aids:
- if required_prefix is None or aid.friendly.startswith(required_prefix):
+ if required_prefix is None or aid.friendly.startswith(
+ required_prefix):
self._print_formatted_line(aid)
else:
sys.exit("%s: AID '%s' must start with '%s'" %
@@ -1294,6 +1306,7 @@
print "%s::%s:" % (logon, uid)
+
@generator('print')
class PrintGen(BaseGenerator):
"""Prints just the constants and values, separated by spaces, in an easy to
diff --git a/tools/fs_config/test_fs_config_generator.py b/tools/fs_config/test_fs_config_generator.py
index a49058a..0bc5a80 100755
--- a/tools/fs_config/test_fs_config_generator.py
+++ b/tools/fs_config/test_fs_config_generator.py
@@ -45,19 +45,21 @@
def test_aid(self):
"""Test AID class constructor"""
- aid = AID('AID_FOO_BAR', '0xFF', 'myfakefile')
- self.assertEquals(aid.identifier, 'AID_FOO_BAR')
- self.assertEquals(aid.value, '0xFF')
- self.assertEquals(aid.found, 'myfakefile')
- self.assertEquals(aid.normalized_value, '255')
- self.assertEquals(aid.friendly, 'foo_bar')
+ aid = AID('AID_FOO_BAR', '0xFF', 'myfakefile', '/system/bin/sh')
+ self.assertEqual(aid.identifier, 'AID_FOO_BAR')
+ self.assertEqual(aid.value, '0xFF')
+ self.assertEqual(aid.found, 'myfakefile')
+ self.assertEqual(aid.normalized_value, '255')
+ self.assertEqual(aid.friendly, 'foo_bar')
+ self.assertEqual(aid.login_shell, '/system/bin/sh')
- aid = AID('AID_MEDIA_EX', '1234', 'myfakefile')
- self.assertEquals(aid.identifier, 'AID_MEDIA_EX')
- self.assertEquals(aid.value, '1234')
- self.assertEquals(aid.found, 'myfakefile')
- self.assertEquals(aid.normalized_value, '1234')
- self.assertEquals(aid.friendly, 'mediaex')
+ aid = AID('AID_MEDIA_EX', '1234', 'myfakefile', '/vendor/bin/sh')
+ self.assertEqual(aid.identifier, 'AID_MEDIA_EX')
+ self.assertEqual(aid.value, '1234')
+ self.assertEqual(aid.found, 'myfakefile')
+ self.assertEqual(aid.normalized_value, '1234')
+ self.assertEqual(aid.friendly, 'mediaex')
+ self.assertEqual(aid.login_shell, '/vendor/bin/sh')
def test_aid_header_parser_good(self):
"""Test AID Header Parser good input file"""
@@ -265,9 +267,9 @@
dirs = parser.dirs
aids = parser.aids
- self.assertEquals(len(files), 1)
- self.assertEquals(len(dirs), 1)
- self.assertEquals(len(aids), 1)
+ self.assertEqual(len(files), 1)
+ self.assertEqual(len(dirs), 1)
+ self.assertEqual(len(aids), 1)
aid = aids[0]
fcap = files[0]
@@ -275,14 +277,14 @@
self.assertEqual(fcap,
FSConfig('0777', 'AID_FOO', 'AID_SYSTEM',
- '(1ULL << CAP_BLOCK_SUSPEND)',
+ 'CAP_MASK_LONG(CAP_BLOCK_SUSPEND)',
'/system/bin/file', temp_file.name))
self.assertEqual(dcap,
FSConfig('0777', 'AID_FOO', 'AID_SYSTEM', '(0)',
'/vendor/path/dir/', temp_file.name))
- self.assertEqual(aid, AID('AID_OEM1', '0x1389', temp_file.name))
+ self.assertEqual(aid, AID('AID_OEM1', '0x1389', temp_file.name, '/vendor/bin/sh'))
def test_fs_config_file_parser_bad(self):
"""Test FSConfig Parser bad input file"""
diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py
index f545dcc..5132ae7 100755
--- a/tools/releasetools/add_img_to_target_files.py
+++ b/tools/releasetools/add_img_to_target_files.py
@@ -734,6 +734,7 @@
os.path.exists(os.path.join(OPTIONS.input_tmp,
"IMAGES",
"product_services.img")))
+ has_system = os.path.isdir(os.path.join(OPTIONS.input_tmp, "SYSTEM"))
has_system_other = os.path.isdir(os.path.join(OPTIONS.input_tmp,
"SYSTEM_OTHER"))
@@ -798,9 +799,10 @@
if output_zip:
recovery_two_step_image.AddToZip(output_zip)
- banner("system")
- partitions['system'] = AddSystem(
- output_zip, recovery_img=recovery_image, boot_img=boot_image)
+ if has_system:
+ banner("system")
+ partitions['system'] = AddSystem(
+ output_zip, recovery_img=recovery_image, boot_img=boot_image)
if has_vendor:
banner("vendor")