Merge "Remove BUILT_VENDOR_MANIFEST variable."
diff --git a/Changes.md b/Changes.md
index 04e0161..70e338c 100644
--- a/Changes.md
+++ b/Changes.md
@@ -1,5 +1,20 @@
# Build System Changes for Android.mk Writers
+## `m4` is not available on `$PATH`
+
+There is a prebuilt of it available in prebuilts/build-tools, and a make
+variable `M4` that contains the path.
+
+Beyond the direct usage, whenever you use bison or flex directly, they call m4
+behind the scene, so you must set the M4 environment variable (and depend upon
+it for incremental build correctness):
+
+```
+$(intermediates)/foo.c: .KATI_IMPLICIT_OUTPUTS := $(intermediates)/foo.h
+$(intermediates)/foo.c: $(LOCAL_PATH)/foo.y $(M4) $(BISON) $(BISON_DATA)
+ M4=$(M4) $(BISON) ...
+```
+
## Rules executed within limited environment
With `ALLOW_NINJA_ENV=false` (soon to be the default), ninja, and all the
diff --git a/core/android_manifest.mk b/core/android_manifest.mk
index 06bea5e..8fab9c6 100644
--- a/core/android_manifest.mk
+++ b/core/android_manifest.mk
@@ -42,19 +42,21 @@
endif
my_target_sdk_version := $(call module-target-sdk-version)
+my_min_sdk_version := $(call module-min-sdk-version)
ifdef TARGET_BUILD_APPS
ifndef TARGET_BUILD_APPS_USE_PREBUILT_SDK
ifeq ($(my_target_sdk_version),$(PLATFORM_VERSION_CODENAME))
ifdef UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT
my_target_sdk_version := $(my_target_sdk_version).$$(cat $(API_FINGERPRINT))
+ my_min_sdk_version := $(my_min_sdk_version).$$(cat $(API_FINGERPRINT))
$(fixed_android_manifest): $(API_FINGERPRINT)
endif
endif
endif
endif
-$(fixed_android_manifest): PRIVATE_MIN_SDK_VERSION := $(call module-min-sdk-version)
+$(fixed_android_manifest): PRIVATE_MIN_SDK_VERSION := $(my_min_sdk_version)
$(fixed_android_manifest): PRIVATE_TARGET_SDK_VERSION := $(my_target_sdk_version)
my_exported_sdk_libs_file := $(call local-intermediates-dir,COMMON)/exported-sdk-libs
diff --git a/core/build_rro_package.mk b/core/build_rro_package.mk
index e5d7685..ae528bd 100644
--- a/core/build_rro_package.mk
+++ b/core/build_rro_package.mk
@@ -32,6 +32,12 @@
LOCAL_MODULE_PATH := $(partition)/overlay/$(LOCAL_RRO_THEME)
endif
+# Do not remove resources without default values nor dedupe resource
+# configurations with the same value
+LOCAL_AAPT_FLAGS += \
+ --no-resource-deduping \
+ --no-resource-removal
+
partition :=
include $(BUILD_SYSTEM)/package.mk
diff --git a/core/clear_vars.mk b/core/clear_vars.mk
index 6c3b249..a5b5018 100644
--- a/core/clear_vars.mk
+++ b/core/clear_vars.mk
@@ -29,6 +29,7 @@
LOCAL_CC:=
LOCAL_CERTIFICATE:=
LOCAL_CFLAGS:=
+LOCAL_CHECK_SAME_VNDK_VARIANTS:=
LOCAL_CHECKED_MODULE:=
LOCAL_C_INCLUDES:=
LOCAL_CLANG:=
@@ -184,7 +185,6 @@
LOCAL_NO_CRT:=
LOCAL_NO_DEFAULT_COMPILER_FLAGS:=
LOCAL_NO_FPIE :=
-LOCAL_NO_LIBGCC:=
LOCAL_NO_LIBCRT_BUILTINS:=
LOCAL_NO_NOTICE_FILE:=
LOCAL_NO_PIC:=
diff --git a/core/cxx_stl_setup.mk b/core/cxx_stl_setup.mk
index 6571d99..a2abb1a 100644
--- a/core/cxx_stl_setup.mk
+++ b/core/cxx_stl_setup.mk
@@ -76,17 +76,27 @@
my_ldflags += -nostdlib++
else
my_static_libraries += libc++demangle
- ifeq (arm,$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH))
- my_static_libraries += libunwind_llvm
- my_ldflags += -Wl,--exclude-libs,libunwind_llvm.a
- endif
ifeq ($(my_link_type),static)
my_static_libraries += libm libc
+ ifeq (arm,$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH))
+ my_static_libraries += libunwind_llvm
+ my_ldflags += -Wl,--exclude-libs,libunwind_llvm.a
+ else
+ my_static_libraries += libgcc_stripped
+ my_ldflags += -Wl,--exclude-libs,libgcc_stripped.a
+ endif
endif
endif
else ifeq ($(my_cxx_stl),ndk)
- # Using an NDK STL. Handled in binary.mk.
+ # Using an NDK STL. Handled in binary.mk, except for the unwinder.
+ ifeq (arm,$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH))
+ my_static_libraries += libunwind_llvm
+ my_ldflags += -Wl,--exclude-libs,libunwind_llvm.a
+ else
+ my_static_libraries += libgcc_stripped
+ my_ldflags += -Wl,--exclude-libs,libgcc_stripped.a
+ endif
else ifeq ($(my_cxx_stl),libstdc++)
$(error $(LOCAL_PATH): $(LOCAL_MODULE): libstdc++ is not supported)
else ifeq ($(my_cxx_stl),none)
diff --git a/core/definitions.mk b/core/definitions.mk
index 49747ed..3a23289 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -1720,7 +1720,6 @@
$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \
$(PRIVATE_TARGET_LIBCRT_BUILTINS) \
$(PRIVATE_TARGET_LIBATOMIC) \
- $(PRIVATE_TARGET_LIBGCC) \
$(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
$(PRIVATE_LDFLAGS) \
$(PRIVATE_ALL_SHARED_LIBRARIES) \
@@ -1756,7 +1755,6 @@
$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \
$(PRIVATE_TARGET_LIBCRT_BUILTINS) \
$(PRIVATE_TARGET_LIBATOMIC) \
- $(PRIVATE_TARGET_LIBGCC) \
$(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
$(PRIVATE_LDFLAGS) \
$(PRIVATE_ALL_SHARED_LIBRARIES) \
@@ -1803,7 +1801,6 @@
$(PRIVATE_TARGET_LIBATOMIC) \
$(filter %libcompiler_rt.a %libcompiler_rt.hwasan.a,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
$(PRIVATE_TARGET_LIBCRT_BUILTINS) \
- $(PRIVATE_TARGET_LIBGCC) \
-Wl,--end-group \
$(PRIVATE_TARGET_CRTEND_O)
endef
diff --git a/core/executable_internal.mk b/core/executable_internal.mk
index a9915aa..32e56dd 100644
--- a/core/executable_internal.mk
+++ b/core/executable_internal.mk
@@ -41,11 +41,6 @@
else
my_target_libcrt_builtins := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)LIBCRT_BUILTINS)
endif
-ifeq ($(LOCAL_NO_LIBGCC),true)
-my_target_libgcc :=
-else
-my_target_libgcc := $(call intermediates-dir-for,STATIC_LIBRARIES,libgcc,,,$(LOCAL_2ND_ARCH_VAR_PREFIX))/libgcc.a
-endif
my_target_libatomic := $(call intermediates-dir-for,STATIC_LIBRARIES,libatomic,,,$(LOCAL_2ND_ARCH_VAR_PREFIX))/libatomic.a
ifeq ($(LOCAL_NO_CRT),true)
my_target_crtbegin_dynamic_o :=
@@ -66,7 +61,6 @@
my_target_crtend_o := $(wildcard $(my_ndk_sysroot_lib)/crtend_android.o)
endif
$(linked_module): PRIVATE_TARGET_LIBCRT_BUILTINS := $(my_target_libcrt_builtins)
-$(linked_module): PRIVATE_TARGET_LIBGCC := $(my_target_libgcc)
$(linked_module): PRIVATE_TARGET_LIBATOMIC := $(my_target_libatomic)
$(linked_module): PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O := $(my_target_crtbegin_dynamic_o)
$(linked_module): PRIVATE_TARGET_CRTBEGIN_STATIC_O := $(my_target_crtbegin_static_o)
@@ -74,11 +68,11 @@
$(linked_module): PRIVATE_POST_LINK_CMD := $(LOCAL_POST_LINK_CMD)
ifeq ($(LOCAL_FORCE_STATIC_EXECUTABLE),true)
-$(linked_module): $(my_target_crtbegin_static_o) $(all_objects) $(all_libraries) $(my_target_crtend_o) $(my_target_libcrt_builtins) $(my_target_libgcc) $(my_target_libatomic) $(CLANG_CXX)
+$(linked_module): $(my_target_crtbegin_static_o) $(all_objects) $(all_libraries) $(my_target_crtend_o) $(my_target_libcrt_builtins) $(my_target_libatomic) $(CLANG_CXX)
$(transform-o-to-static-executable)
$(PRIVATE_POST_LINK_CMD)
else
-$(linked_module): $(my_target_crtbegin_dynamic_o) $(all_objects) $(all_libraries) $(my_target_crtend_o) $(my_target_libcrt_builtins) $(my_target_libgcc) $(my_target_libatomic) $(CLANG_CXX)
+$(linked_module): $(my_target_crtbegin_dynamic_o) $(all_objects) $(all_libraries) $(my_target_crtend_o) $(my_target_libcrt_builtins) $(my_target_libatomic) $(CLANG_CXX)
$(transform-o-to-executable)
$(PRIVATE_POST_LINK_CMD)
endif
diff --git a/core/shared_library_internal.mk b/core/shared_library_internal.mk
index 8ec07f8..219772a 100644
--- a/core/shared_library_internal.mk
+++ b/core/shared_library_internal.mk
@@ -39,11 +39,6 @@
else
my_target_libcrt_builtins := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)LIBCRT_BUILTINS)
endif
-ifeq ($(LOCAL_NO_LIBGCC),true)
-my_target_libgcc :=
-else
-my_target_libgcc := $(call intermediates-dir-for,STATIC_LIBRARIES,libgcc,,,$(LOCAL_2ND_ARCH_VAR_PREFIX))/libgcc.a
-endif
my_target_libatomic := $(call intermediates-dir-for,STATIC_LIBRARIES,libatomic,,,$(LOCAL_2ND_ARCH_VAR_PREFIX))/libatomic.a
ifeq ($(LOCAL_NO_CRT),true)
my_target_crtbegin_so_o :=
@@ -60,7 +55,6 @@
my_target_crtend_so_o := $(wildcard $(my_ndk_sysroot_lib)/crtend_so.o)
endif
$(linked_module): PRIVATE_TARGET_LIBCRT_BUILTINS := $(my_target_libcrt_builtins)
-$(linked_module): PRIVATE_TARGET_LIBGCC := $(my_target_libgcc)
$(linked_module): PRIVATE_TARGET_LIBATOMIC := $(my_target_libatomic)
$(linked_module): PRIVATE_TARGET_CRTBEGIN_SO_O := $(my_target_crtbegin_so_o)
$(linked_module): PRIVATE_TARGET_CRTEND_SO_O := $(my_target_crtend_so_o)
@@ -71,7 +65,6 @@
$(my_target_crtbegin_so_o) \
$(my_target_crtend_so_o) \
$(my_target_libcrt_builtins) \
- $(my_target_libgcc) \
$(my_target_libatomic) \
$(LOCAL_ADDITIONAL_DEPENDENCIES) $(CLANG_CXX)
$(transform-o-to-shared-lib)
diff --git a/core/soong_cc_prebuilt.mk b/core/soong_cc_prebuilt.mk
index 2d5089d..b095b7c 100644
--- a/core/soong_cc_prebuilt.mk
+++ b/core/soong_cc_prebuilt.mk
@@ -104,33 +104,35 @@
endif
endif
-ifeq ($(LOCAL_VNDK_DEPEND_ON_CORE_VARIANT),true)
- # Add $(LOCAL_BUILT_MODULE) as a dependency to no_vendor_variant_vndk_check so
- # that the vendor variant will be built and checked against the core variant.
- no_vendor_variant_vndk_check: $(LOCAL_BUILT_MODULE)
+my_check_same_vndk_variants :=
+ifeq ($(LOCAL_CHECK_SAME_VNDK_VARIANTS),true)
+ ifeq ($(filter hwaddress address, $(SANITIZE_TARGET)),)
+ my_check_same_vndk_variants := true
+ endif
+endif
- my_core_register_name := $(subst .vendor,,$(my_register_name))
+ifeq ($(my_check_same_vndk_variants),true)
+ same_vndk_variants_stamp := $(intermediates)/same_vndk_variants.timestamp
+
+ my_core_register_name := $(subst .vendor,,$(subst .product,,$(my_register_name)))
my_core_variant_files := $(call module-target-built-files,$(my_core_register_name))
my_core_shared_lib := $(sort $(filter %.so,$(my_core_variant_files)))
- $(LOCAL_BUILT_MODULE): PRIVATE_CORE_VARIANT := $(my_core_shared_lib)
- # The built vendor variant library needs to depend on the built core variant
- # so that we can perform identity check against the core variant.
- $(LOCAL_BUILT_MODULE): $(my_core_shared_lib)
+ $(same_vndk_variants_stamp): PRIVATE_CORE_VARIANT := $(my_core_shared_lib)
+ $(same_vndk_variants_stamp): PRIVATE_VENDOR_VARIANT := $(LOCAL_PREBUILT_MODULE_FILE)
+ $(same_vndk_variants_stamp): PRIVATE_TOOLS_PREFIX := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)TOOLS_PREFIX)
+
+ $(same_vndk_variants_stamp): $(my_core_shared_lib) $(LOCAL_PREBUILT_MODULE_FILE)
+ $(call verify-vndk-libs-identical,\
+ $(PRIVATE_CORE_VARIANT),\
+ $(PRIVATE_VENDOR_VARIANT)\
+ $(PRIVATE_TOOLS_PREFIX))
+
+ $(LOCAL_BUILT_MODULE): $(same_vndk_variants_stamp)
endif
-ifeq ($(LOCAL_VNDK_DEPEND_ON_CORE_VARIANT),true)
-$(LOCAL_BUILT_MODULE): PRIVATE_TOOLS_PREFIX := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)TOOLS_PREFIX)
-$(LOCAL_BUILT_MODULE): $(LOCAL_PREBUILT_MODULE_FILE) $(LIBRARY_IDENTITY_CHECK_SCRIPT)
- $(call verify-vndk-libs-identical,\
- $(PRIVATE_CORE_VARIANT),\
- $<,\
- $(PRIVATE_TOOLS_PREFIX))
- $(copy-file-to-target)
-else
$(LOCAL_BUILT_MODULE): $(LOCAL_PREBUILT_MODULE_FILE)
$(transform-prebuilt-to-target)
-endif
ifneq ($(filter EXECUTABLES NATIVE_TESTS,$(LOCAL_MODULE_CLASS)),)
$(hide) chmod +x $@
endif
diff --git a/core/tasks/check_boot_jars/package_whitelist.txt b/core/tasks/check_boot_jars/package_whitelist.txt
index 8d9878f..d4f600a 100644
--- a/core/tasks/check_boot_jars/package_whitelist.txt
+++ b/core/tasks/check_boot_jars/package_whitelist.txt
@@ -69,6 +69,8 @@
javax\.xml\.transform\.stream
javax\.xml\.validation
javax\.xml\.xpath
+jdk\.internal\.util
+jdk\.internal\.vm\.annotation
jdk\.net
org\.w3c\.dom
org\.w3c\.dom\.ls
diff --git a/core/tasks/tools/package-modules.mk b/core/tasks/tools/package-modules.mk
index d7b3010..55a08f5 100644
--- a/core/tasks/tools/package-modules.mk
+++ b/core/tasks/tools/package-modules.mk
@@ -5,6 +5,11 @@
# my_modules: a list of module names
# my_package_name: the name of the output zip file.
# my_copy_pairs: a list of extra files to install (in src:dest format)
+# Optional input variables:
+# my_modules_strict: what happens when a module from my_modules does not exist
+# "true": error out when a module is missing
+# "false": print a warning when a module is missing
+# "": defaults to false currently
# Output variables:
# my_package_zip: the path to the output zip file.
#
@@ -15,6 +20,7 @@
my_built_modules := $(foreach p,$(my_copy_pairs),$(call word-colon,1,$(p)))
my_copy_pairs := $(foreach p,$(my_copy_pairs),$(call word-colon,1,$(p)):$(my_staging_dir)/$(call word-colon,2,$(p)))
my_pickup_files :=
+my_missing_error :=
# Iterate over the modules and include their direct dependencies stated in the
# LOCAL_REQUIRED_MODULES.
@@ -26,10 +32,17 @@
$(eval my_modules_and_deps += $(_explicitly_required))\
)
-# Ignore unknown installed files on partial builds
-my_missing_files :=
-ifneq ($(ALLOW_MISSING_DEPENDENCIES),true)
+ifneq ($(filter-out true false,$(my_modules_strict)),)
+ $(shell $(call echo-error,$(my_makefile),$(my_package_name): Invalid value for 'my_module_strict' = '$(my_modules_strict)'. Valid values: 'true', 'false', ''))
+ $(error done)
+endif
+
my_missing_files = $(shell $(call echo-warning,$(my_makefile),$(my_package_name): Unknown installed file for module '$(1)'))
+ifeq ($(ALLOW_MISSING_DEPENDENCIES),true)
+ # Ignore unknown installed files on partial builds
+ my_missing_files =
+else ifeq ($(my_modules_strict),true)
+ my_missing_files = $(shell $(call echo-error,$(my_makefile),$(my_package_name): Unknown installed file for module '$(1)'))$(eval my_missing_error := true)
endif
# Iterate over modules' built files and installed files;
@@ -63,6 +76,10 @@
$(eval my_copy_pairs += $(bui):$(my_staging_dir)/$(my_copy_dest)))\
))
+ifneq ($(my_missing_error),)
+ $(error done)
+endif
+
my_package_zip := $(my_staging_dir)/$(my_package_name).zip
$(my_package_zip): PRIVATE_COPY_PAIRS := $(my_copy_pairs)
$(my_package_zip): PRIVATE_PICKUP_FILES := $(my_pickup_files)
@@ -84,4 +101,6 @@
my_copy_pairs :=
my_pickup_files :=
my_missing_files :=
+my_missing_error :=
my_modules_and_deps :=
+my_modules_strict :=
diff --git a/target/product/gsi/Android.mk b/target/product/gsi/Android.mk
index 243c00f..4f2027f 100644
--- a/target/product/gsi/Android.mk
+++ b/target/product/gsi/Android.mk
@@ -93,8 +93,8 @@
@chmod a+x $@
#####################################################################
-# Check that all ABI reference dumps have corresponding NDK/VNDK
-# libraries.
+# Check that all ABI reference dumps have corresponding
+# NDK/VNDK/PLATFORM libraries.
# $(1): The directory containing ABI dumps.
# Return a list of ABI dump paths ending with .so.lsdump.
@@ -104,25 +104,42 @@
$(call find-files-in-subdirs,$(1),"*.so.lsdump" -and -type f,.)))
endef
+# $(1): A list of tags.
+# $(2): A list of tag:path.
+# Return the file names of the ABI dumps that match the tags.
+define filter-abi-dump-paths
+$(eval tag_patterns := $(foreach tag,$(1),$(tag):%))
+$(notdir $(patsubst $(tag_patterns),%,$(filter $(tag_patterns),$(2))))
+endef
+
VNDK_ABI_DUMP_DIR := prebuilts/abi-dumps/vndk/$(PLATFORM_VNDK_VERSION)
NDK_ABI_DUMP_DIR := prebuilts/abi-dumps/ndk/$(PLATFORM_VNDK_VERSION)
+PLATFORM_ABI_DUMP_DIR := prebuilts/abi-dumps/platform/$(PLATFORM_VNDK_VERSION)
VNDK_ABI_DUMPS := $(call find-abi-dump-paths,$(VNDK_ABI_DUMP_DIR))
NDK_ABI_DUMPS := $(call find-abi-dump-paths,$(NDK_ABI_DUMP_DIR))
+PLATFORM_ABI_DUMPS := $(call find-abi-dump-paths,$(PLATFORM_ABI_DUMP_DIR))
-$(check-vndk-abi-dump-list-timestamp): $(VNDK_ABI_DUMPS) $(NDK_ABI_DUMPS)
+$(check-vndk-abi-dump-list-timestamp): PRIVATE_LSDUMP_PATHS := $(LSDUMP_PATHS)
+$(check-vndk-abi-dump-list-timestamp):
$(eval added_vndk_abi_dumps := $(strip $(sort $(filter-out \
- $(addsuffix .so.lsdump,$(filter-out $(NDK_MIGRATED_LIBS) $(VNDK_PRIVATE_LIBRARIES),$(LLNDK_LIBRARIES) $(VNDK_SAMEPROCESS_LIBRARIES) $(VNDK_CORE_LIBRARIES))), \
+ $(call filter-abi-dump-paths,LLNDK VNDK-SP VNDK-core,$(PRIVATE_LSDUMP_PATHS)), \
$(notdir $(VNDK_ABI_DUMPS))))))
$(if $(added_vndk_abi_dumps), \
- echo -e "Found ABI reference dumps for non-VNDK libraries. Run \`find \$${ANDROID_BUILD_TOP}/$(VNDK_ABI_DUMP_DIR) '(' -name $(subst $(space), -or -name ,$(added_vndk_abi_dumps)) ')' -delete\` to delete the dumps.")
+ echo -e "Found unexpected ABI reference dump files under $(VNDK_ABI_DUMP_DIR). It is caused by mismatch between Android.bp and the dump files. Run \`find \$${ANDROID_BUILD_TOP}/$(VNDK_ABI_DUMP_DIR) '(' -name $(subst $(space), -or -name ,$(added_vndk_abi_dumps)) ')' -delete\` to delete the dump files.")
$(eval added_ndk_abi_dumps := $(strip $(sort $(filter-out \
- $(addsuffix .so.lsdump,$(NDK_MIGRATED_LIBS)), \
+ $(call filter-abi-dump-paths,NDK,$(PRIVATE_LSDUMP_PATHS)), \
$(notdir $(NDK_ABI_DUMPS))))))
$(if $(added_ndk_abi_dumps), \
- echo -e "Found ABI reference dumps for non-NDK libraries. Run \`find \$${ANDROID_BUILD_TOP}/$(NDK_ABI_DUMP_DIR) '(' -name $(subst $(space), -or -name ,$(added_ndk_abi_dumps)) ')' -delete\` to delete the dumps.")
+ echo -e "Found unexpected ABI reference dump files under $(NDK_ABI_DUMP_DIR). It is caused by mismatch between Android.bp and the dump files. Run \`find \$${ANDROID_BUILD_TOP}/$(NDK_ABI_DUMP_DIR) '(' -name $(subst $(space), -or -name ,$(added_ndk_abi_dumps)) ')' -delete\` to delete the dump files.")
- $(if $(added_vndk_abi_dumps)$(added_ndk_abi_dumps),exit 1)
+ $(eval added_platform_abi_dumps := $(strip $(sort $(filter-out \
+ $(call filter-abi-dump-paths,PLATFORM,$(PRIVATE_LSDUMP_PATHS)), \
+ $(notdir $(PLATFORM_ABI_DUMPS))))))
+ $(if $(added_platform_abi_dumps), \
+ echo -e "Found unexpected ABI reference dump files under $(PLATFORM_ABI_DUMP_DIR). It is caused by mismatch between Android.bp and the dump files. Run \`find \$${ANDROID_BUILD_TOP}/$(PLATFORM_ABI_DUMP_DIR) '(' -name $(subst $(space), -or -name ,$(added_platform_abi_dumps)) ')' -delete\` to delete the dump files.")
+
+ $(if $(added_vndk_abi_dumps)$(added_ndk_abi_dumps)$(added_platform_abi_dumps),exit 1)
$(hide) mkdir -p $(dir $@)
$(hide) touch $@
diff --git a/target/product/gsi/current.txt b/target/product/gsi/current.txt
index d29a48f..a922bc3 100644
--- a/target/product/gsi/current.txt
+++ b/target/product/gsi/current.txt
@@ -128,6 +128,7 @@
VNDK-core: android.hardware.health@1.0.so
VNDK-core: android.hardware.health@2.0.so
VNDK-core: android.hardware.health@2.1.so
+VNDK-core: android.hardware.identity@1.0.so
VNDK-core: android.hardware.input.classifier@1.0.so
VNDK-core: android.hardware.input.common@1.0.so
VNDK-core: android.hardware.ir@1.0.so
@@ -149,6 +150,7 @@
VNDK-core: android.hardware.nfc@1.1.so
VNDK-core: android.hardware.nfc@1.2.so
VNDK-core: android.hardware.oemlock@1.0.so
+VNDK-core: android.hardware.power-V1-ndk_platform.so
VNDK-core: android.hardware.power.stats@1.0.so
VNDK-core: android.hardware.power@1.0.so
VNDK-core: android.hardware.power@1.1.so
@@ -250,7 +252,6 @@
VNDK-core: libpng.so
VNDK-core: libpower.so
VNDK-core: libprocinfo.so
-VNDK-core: libprotobuf-cpp-full-3.9.1.so
VNDK-core: libprotobuf-cpp-lite-3.9.1.so
VNDK-core: libpuresoftkeymasterdevice.so
VNDK-core: libradio_metadata.so
diff --git a/tools/check_identical_lib.sh b/tools/check_identical_lib.sh
index 01007c0..c3aa41a 100755
--- a/tools/check_identical_lib.sh
+++ b/tools/check_identical_lib.sh
@@ -5,11 +5,13 @@
CORE="${2}"
VENDOR="${3}"
-stripped_core="${CORE}.vndk_lib_check.stripped"
-stripped_vendor="${VENDOR}.vndk_lib_check.stripped"
+TMPDIR="$(mktemp -d ${CORE}.vndk_lib_check.XXXXXXXX)"
+stripped_core="${TMPDIR}/core"
+stripped_vendor="${TMPDIR}/vendor"
function cleanup() {
- rm -f ${stripped_core} ${stripped_vendor}
+ rm -f "${stripped_core}" "${stripped_vendor}"
+ rmdir "${TMPDIR}"
}
trap cleanup EXIT
diff --git a/tools/warn/java_warn_patterns.py b/tools/warn/java_warn_patterns.py
index 3a3a676..0a443d4 100644
--- a/tools/warn/java_warn_patterns.py
+++ b/tools/warn/java_warn_patterns.py
@@ -93,6 +93,8 @@
[r".*: warning: \[MultipleTopLevelClasses\] .+"]),
java_low('Avoid having multiple unary operators acting on the same variable in a method call',
[r".*: warning: \[MultipleUnaryOperatorsInMethodCall\] .+"]),
+ java_low('OnNameExpected naming style',
+ [r".*\.java:.*: warning: .+ \[OnNameExpected\]$"]),
java_low('Package names should match the directory they are declared in',
[r".*: warning: \[PackageLocation\] .+"]),
java_low('Non-standard parameter comment; prefer `/* paramName= */ arg`',
diff --git a/tools/warn/other_warn_patterns.py b/tools/warn/other_warn_patterns.py
index 1331bc6..19a4e38 100644
--- a/tools/warn/other_warn_patterns.py
+++ b/tools/warn/other_warn_patterns.py
@@ -46,6 +46,10 @@
return warn('Kotlin', Severity.MEDIUM, description, pattern_list)
+def yacc(description, pattern_list):
+ return warn('yacc', Severity.MEDIUM, description, pattern_list)
+
+
warn_patterns = [
# pylint:disable=line-too-long,g-inconsistent-quotes
# aapt warnings
@@ -115,6 +119,14 @@
kotlin('library has Kotlin runtime',
[r".*: warning: library has Kotlin runtime bundled into it",
r".*: warning: some JAR files .* have the Kotlin Runtime library"]),
+ # Yacc warnings
+ yacc('deprecate directive',
+ [r".*\.yy?:.*: warning: deprecated directive: "]),
+ yacc('shift/reduce conflicts',
+ [r".*\.yy?: warning: .+ shift/reduce conflicts "]),
+ {'category': 'yacc', 'severity': Severity.SKIP,
+ 'description': 'yacc: fix-its can be applied',
+ 'patterns': [r".*\.yy?: warning: fix-its can be applied."]},
# Rust warnings
{'category': 'Rust', 'severity': Severity.HIGH,
'description': 'Rust: Does not derive Copy',
diff --git a/tools/warn/warn_common.py b/tools/warn/warn_common.py
index b885ad2..0c9d9ef 100755
--- a/tools/warn/warn_common.py
+++ b/tools/warn/warn_common.py
@@ -199,22 +199,30 @@
"""
+def make_writer(output_stream):
+
+ def writer(text):
+ return output_stream.write(text + '\n')
+
+ return writer
+
+
def html_big(param):
return '<font size="+2">' + param + '</font>'
-def dump_html_prologue(title):
- print('<html>\n<head>')
- print('<title>' + title + '</title>')
- print(html_head_scripts)
- emit_stats_by_project()
- print('</head>\n<body>')
- print(html_big(title))
- print('<p>')
+def dump_html_prologue(title, writer):
+ writer('<html>\n<head>')
+ writer('<title>' + title + '</title>')
+ writer(html_head_scripts)
+ emit_stats_by_project(writer)
+ writer('</head>\n<body>')
+ writer(html_big(title))
+ writer('<p>')
-def dump_html_epilogue():
- print('</body>\n</head>\n</html>')
+def dump_html_epilogue(writer):
+ writer('</body>\n</head>\n</html>')
def sort_warnings():
@@ -222,7 +230,7 @@
i['members'] = sorted(set(i['members']))
-def emit_stats_by_project():
+def emit_stats_by_project(writer):
"""Dump a google chart table of warnings per project and severity."""
# warnings[p][s] is number of warnings in project p of severity s.
# pylint:disable=g-complex-comprehension
@@ -277,14 +285,14 @@
total_all_severities += total_by_severity[s.value]
one_row.append(total_all_projects)
stats_rows.append(one_row)
- print('<script>')
- emit_const_string_array('StatsHeader', stats_header)
- emit_const_object_array('StatsRows', stats_rows)
- print(draw_table_javascript)
- print('</script>')
+ writer('<script>')
+ emit_const_string_array('StatsHeader', stats_header, writer)
+ emit_const_object_array('StatsRows', stats_rows, writer)
+ writer(draw_table_javascript)
+ writer('</script>')
-def dump_stats():
+def dump_stats(writer):
"""Dump some stats about total number of warnings and such."""
known = 0
skipped = 0
@@ -297,14 +305,14 @@
skipped += len(i['members'])
else:
known += len(i['members'])
- print('Number of classified warnings: <b>' + str(known) + '</b><br>')
- print('Number of skipped warnings: <b>' + str(skipped) + '</b><br>')
- print('Number of unclassified warnings: <b>' + str(unknown) + '</b><br>')
+ writer('Number of classified warnings: <b>' + str(known) + '</b><br>')
+ writer('Number of skipped warnings: <b>' + str(skipped) + '</b><br>')
+ writer('Number of unclassified warnings: <b>' + str(unknown) + '</b><br>')
total = unknown + known + skipped
extra_msg = ''
if total < 1000:
extra_msg = ' (low count may indicate incremental build)'
- print('Total number of warnings: <b>' + str(total) + '</b>' + extra_msg)
+ writer('Total number of warnings: <b>' + str(total) + '</b>' + extra_msg)
# New base table of warnings, [severity, warn_id, project, warning_message]
@@ -317,15 +325,15 @@
# (3) New, group by project + severity,
# id for each warning pattern
# sort by project, severity, warn_id, warning_message
-def emit_buttons():
- print('<button class="button" onclick="expandCollapse(1);">'
- 'Expand all warnings</button>\n'
- '<button class="button" onclick="expandCollapse(0);">'
- 'Collapse all warnings</button>\n'
- '<button class="button" onclick="groupBySeverity();">'
- 'Group warnings by severity</button>\n'
- '<button class="button" onclick="groupByProject();">'
- 'Group warnings by project</button><br>')
+def emit_buttons(writer):
+ writer('<button class="button" onclick="expandCollapse(1);">'
+ 'Expand all warnings</button>\n'
+ '<button class="button" onclick="expandCollapse(0);">'
+ 'Collapse all warnings</button>\n'
+ '<button class="button" onclick="groupBySeverity();">'
+ 'Group warnings by severity</button>\n'
+ '<button class="button" onclick="groupByProject();">'
+ 'Group warnings by project</button><br>')
def all_patterns(category):
@@ -336,33 +344,32 @@
return patterns
-def dump_fixed():
+def dump_fixed(writer):
"""Show which warnings no longer occur."""
anchor = 'fixed_warnings'
mark = anchor + '_mark'
- print('\n<br><p style="background-color:lightblue"><b>'
- '<button id="' + mark + '" '
- 'class="bt" onclick="expand(\'' + anchor + '\');">'
- '⊕</button> Fixed warnings. '
- 'No more occurrences. Please consider turning these into '
- 'errors if possible, before they are reintroduced in to the build'
- ':</b></p>')
- print('<blockquote>')
+ writer('\n<br><p style="background-color:lightblue"><b>'
+ '<button id="' + mark + '" '
+ 'class="bt" onclick="expand(\'' + anchor + '\');">'
+ '⊕</button> Fixed warnings. '
+ 'No more occurrences. Please consider turning these into '
+ 'errors if possible, before they are reintroduced in to the build'
+ ':</b></p>')
+ writer('<blockquote>')
fixed_patterns = []
for i in warn_patterns:
if not i['members']:
- fixed_patterns.append(i['description'] + ' (' +
- all_patterns(i) + ')')
+ fixed_patterns.append(i['description'] + ' (' + all_patterns(i) + ')')
fixed_patterns = sorted(fixed_patterns)
- print('<div id="' + anchor + '" style="display:none;"><table>')
+ writer('<div id="' + anchor + '" style="display:none;"><table>')
cur_row_class = 0
for text in fixed_patterns:
cur_row_class = 1 - cur_row_class
# remove last '\n'
t = text[:-1] if text[-1] == '\n' else text
- print('<tr><td class="c' + str(cur_row_class) + '">' + t + '</td></tr>')
- print('</table></div>')
- print('</blockquote>')
+ writer('<tr><td class="c' + str(cur_row_class) + '">' + t + '</td></tr>')
+ writer('</table></div>')
+ writer('</blockquote>')
def find_project_index(line):
@@ -540,6 +547,7 @@
prev_warning = 'unknown_source_file: ' + prev_warning
warning_lines.add(normalize_warning_line(prev_warning))
prev_warning = ''
+
if warning_pattern.match(line):
if warning_without_file.match(line):
# save this line and combine it with the next line
@@ -547,6 +555,7 @@
else:
warning_lines.add(normalize_warning_line(line))
continue
+
if line_counter < 100:
# save a little bit of time by only doing this for the first few lines
line_counter += 1
@@ -580,22 +589,22 @@
return escape_string(s)
-def emit_warning_array(name):
- print('var warning_{} = ['.format(name))
+def emit_warning_array(name, writer):
+ writer('var warning_{} = ['.format(name))
for i in range(len(warn_patterns)):
- print('{},'.format(warn_patterns[i][name]))
- print('];')
+ writer('{},'.format(warn_patterns[i][name]))
+ writer('];')
-def emit_warning_arrays():
- emit_warning_array('severity')
- print('var warning_description = [')
+def emit_warning_arrays(writer):
+ emit_warning_array('severity', writer)
+ writer('var warning_description = [')
for i in range(len(warn_patterns)):
if warn_patterns[i]['members']:
- print('"{}",'.format(escape_string(warn_patterns[i]['description'])))
+ writer('"{}",'.format(escape_string(warn_patterns[i]['description'])))
else:
- print('"",') # no such warning
- print('];')
+ writer('"",') # no such warning
+ writer('];')
scripts_for_warning_groups = """
@@ -701,7 +710,8 @@
var result = "";
var groups = groupWarningsBySeverity();
for (s=0; s<SeverityColors.length; s++) {
- result += createWarningSection(SeverityHeaders[s], SeverityColors[s], groups[s]);
+ result += createWarningSection(SeverityHeaders[s], SeverityColors[s],
+ groups[s]);
}
return result;
}
@@ -728,63 +738,67 @@
# Emit a JavaScript const string
-def emit_const_string(name, value):
- print('const ' + name + ' = "' + escape_string(value) + '";')
+def emit_const_string(name, value, writer):
+ writer('const ' + name + ' = "' + escape_string(value) + '";')
# Emit a JavaScript const integer array.
-def emit_const_int_array(name, array):
- print('const ' + name + ' = [')
+def emit_const_int_array(name, array, writer):
+ writer('const ' + name + ' = [')
for n in array:
- print(str(n) + ',')
- print('];')
+ writer(str(n) + ',')
+ writer('];')
# Emit a JavaScript const string array.
-def emit_const_string_array(name, array):
- print('const ' + name + ' = [')
+def emit_const_string_array(name, array, writer):
+ writer('const ' + name + ' = [')
for s in array:
- print('"' + strip_escape_string(s) + '",')
- print('];')
+ writer('"' + strip_escape_string(s) + '",')
+ writer('];')
# Emit a JavaScript const string array for HTML.
-def emit_const_html_string_array(name, array):
- print('const ' + name + ' = [')
+def emit_const_html_string_array(name, array, writer):
+ writer('const ' + name + ' = [')
for s in array:
# Not using html.escape yet, to work for both python 2 and 3,
# until all users switch to python 3.
# pylint:disable=deprecated-method
- print('"' + cgi.escape(strip_escape_string(s)) + '",')
- print('];')
+ writer('"' + cgi.escape(strip_escape_string(s)) + '",')
+ writer('];')
# Emit a JavaScript const object array.
-def emit_const_object_array(name, array):
- print('const ' + name + ' = [')
+def emit_const_object_array(name, array, writer):
+ writer('const ' + name + ' = [')
for x in array:
- print(str(x) + ',')
- print('];')
+ writer(str(x) + ',')
+ writer('];')
-def emit_js_data():
+def emit_js_data(writer):
"""Dump dynamic HTML page's static JavaScript data."""
- emit_const_string('FlagURL', args.url if args.url else '')
- emit_const_string('FlagSeparator', args.separator if args.separator else '')
- emit_const_string_array('SeverityColors', [s.color for s in Severity.levels])
+ emit_const_string('FlagURL',
+ args.url if args.url else '', writer)
+ emit_const_string('FlagSeparator',
+ args.separator if args.separator else '', writer)
+ emit_const_string_array('SeverityColors',
+ [s.color for s in Severity.levels], writer)
emit_const_string_array('SeverityHeaders',
- [s.header for s in Severity.levels])
+ [s.header for s in Severity.levels], writer)
emit_const_string_array('SeverityColumnHeaders',
- [s.column_header for s in Severity.levels])
- emit_const_string_array('ProjectNames', project_names)
+ [s.column_header for s in Severity.levels], writer)
+ emit_const_string_array('ProjectNames', project_names, writer)
# pytype: disable=attribute-error
emit_const_int_array('WarnPatternsSeverity',
- [w['severity'].value for w in warn_patterns])
+ [w['severity'].value for w in warn_patterns], writer)
# pytype: enable=attribute-error
emit_const_html_string_array('WarnPatternsDescription',
- [w['description'] for w in warn_patterns])
- emit_const_html_string_array('WarningMessages', warning_messages)
- emit_const_object_array('Warnings', warning_records)
+ [w['description'] for w in warn_patterns],
+ writer)
+ emit_const_html_string_array('WarningMessages', warning_messages, writer)
+ emit_const_object_array('Warnings', warning_records, writer)
draw_table_javascript = """
google.charts.load('current', {'packages':['table']});
@@ -801,31 +815,33 @@
data.setProperty(i, j, 'style', 'border:1px solid black;');
}
}
- var table = new google.visualization.Table(document.getElementById('stats_table'));
+ var table = new google.visualization.Table(
+ document.getElementById('stats_table'));
table.draw(data, {allowHtml: true, alternatingRowStyle: true});
}
"""
-def dump_html():
- """Dump the html output to stdout."""
+def dump_html(output_stream):
+ """Dump the html output to output_stream."""
+ writer = make_writer(output_stream)
dump_html_prologue('Warnings for ' + platform_version + ' - ' +
- target_product + ' - ' + target_variant)
- dump_stats()
- print('<br><div id="stats_table"></div><br>')
- print('\n<script>')
- emit_js_data()
- print(scripts_for_warning_groups)
- print('</script>')
- emit_buttons()
+ target_product + ' - ' + target_variant, writer)
+ dump_stats(writer)
+ writer('<br><div id="stats_table"></div><br>')
+ writer('\n<script>')
+ emit_js_data(writer)
+ writer(scripts_for_warning_groups)
+ writer('</script>')
+ emit_buttons(writer)
# Warning messages are grouped by severities or project names.
- print('<br><div id="warning_groups"></div>')
+ writer('<br><div id="warning_groups"></div>')
if args.byproject:
- print('<script>groupByProject();</script>')
+ writer('<script>groupByProject();</script>')
else:
- print('<script>groupBySeverity();</script>')
- dump_fixed()
- dump_html_epilogue()
+ writer('<script>groupBySeverity();</script>')
+ dump_fixed(writer)
+ dump_html_epilogue(writer)
##### Functions to count warnings and dump csv file. #########################
@@ -884,4 +900,4 @@
if args.gencsv:
dump_csv(csv.writer(sys.stdout, lineterminator='\n'))
else:
- dump_html()
+ dump_html(sys.stdout)