Merge "Revert "Use dx.jar directly""
diff --git a/CleanSpec.mk b/CleanSpec.mk
index b955e25..91f1a0b 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -420,6 +420,10 @@
# Version checking moving to Soong
$(call add-clean-step, rm -rf $(OUT_DIR)/versions_checked.mk)
+# Vendor tests were being installed into /vendor/bin accidentally
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/vendor/nativetest*)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/nativetest*)
+
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************
diff --git a/core/Makefile b/core/Makefile
index 566a0da..7c4c28b 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -2007,7 +2007,8 @@
$(HOST_OUT_EXECUTABLES)/lib/shflags/shflags \
$(HOST_OUT_EXECUTABLES)/delta_generator \
$(AVBTOOL) \
- $(BLK_ALLOC_TO_BASE_FS)
+ $(BLK_ALLOC_TO_BASE_FS) \
+ $(BRO)
ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT))
OTATOOLS += \
@@ -2041,7 +2042,9 @@
$(HOST_LIBRARY_PATH)/libz-host$(HOST_SHLIB_SUFFIX) \
$(HOST_LIBRARY_PATH)/libsparse-host$(HOST_SHLIB_SUFFIX) \
$(HOST_LIBRARY_PATH)/libbase$(HOST_SHLIB_SUFFIX) \
- $(HOST_LIBRARY_PATH)/libpcre2$(HOST_SHLIB_SUFFIX)
+ $(HOST_LIBRARY_PATH)/libpcre2$(HOST_SHLIB_SUFFIX) \
+ $(HOST_LIBRARY_PATH)/libbrotli$(HOST_SHLIB_SUFFIX)
+
.PHONY: otatools
otatools: $(OTATOOLS)
@@ -2475,6 +2478,8 @@
ifeq ($(AB_OTA_UPDATER),true)
$(INTERNAL_OTA_PACKAGE_TARGET): $(BRILLO_UPDATE_PAYLOAD)
+else
+$(INTERNAL_OTA_PACKAGE_TARGET): $(BRO)
endif
$(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) \
@@ -2585,20 +2590,36 @@
zip -qjX $@ $$apps_to_zip; \
fi
-#------------------------------------------------------------------
-# A zip of emma code coverage meta files. Generated for fully emma
-# instrumented build.
-#
ifeq (true,$(EMMA_INSTRUMENT))
-EMMA_META_ZIP := $(PRODUCT_OUT)/emma_meta.zip
-# the dependency will be set up later in build/core/main.mk.
+ #------------------------------------------------------------------
+ # An archive of classes for use in generating code-coverage reports
+ # These are the uninstrumented versions of any classes that were
+ # to be instrumented.
+ # Any dependencies are set up later in build/core/main.mk.
+
+ ifeq ($(ANDROID_COMPILE_WITH_JACK),false)
+ JACOCO_REPORT_CLASSES_ALL := $(PRODUCT_OUT)/jacoco-report-classes-all.jar
+$(JACOCO_REPORT_CLASSES_ALL) :
+ @echo "Collecting uninstrumented classes"
+ $(hide) find $(TARGET_COMMON_OUT_ROOT) $(HOST_COMMON_OUT_ROOT) -name "jacoco-report-classes.jar" | \
+ zip -@ -0 -q -X $@
+# Meaning of these options:
+# -@ scan stdin for file paths to add to the zip
+# -0 don't do any compression
+# -q supress most output
+# -X skip storing extended file attributes
+
+ else
+ EMMA_META_ZIP := $(PRODUCT_OUT)/emma_meta.zip
$(EMMA_META_ZIP) :
@echo "Collecting Emma coverage meta files."
$(hide) find $(TARGET_COMMON_OUT_ROOT) $(HOST_COMMON_OUT_ROOT) -name "coverage.em" | \
zip -@ -qX $@
+endif
endif # EMMA_INSTRUMENT=true
+
#------------------------------------------------------------------
# A zip of Proguard obfuscation dictionary files.
# Only for apps_only build.
diff --git a/core/binary.mk b/core/binary.mk
index 61a8ef6..6753e18 100644
--- a/core/binary.mk
+++ b/core/binary.mk
@@ -523,6 +523,7 @@
my_target_global_c_includes := \
$($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)PROJECT_INCLUDES)
my_target_global_c_system_includes := \
+ $(TARGET_OUT_HEADERS) \
$($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)PROJECT_SYSTEM_INCLUDES)
else ifdef LOCAL_SDK_VERSION
my_target_global_c_includes :=
@@ -1373,6 +1374,8 @@
####################################################
import_includes := $(intermediates)/import_includes
import_includes_deps := $(strip \
+ $(if $(LOCAL_USE_VNDK),\
+ $(call intermediates-dir-for,HEADER_LIBRARIES,device_kernel_headers.vendor,$(my_kind),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/export_includes) \
$(foreach l, $(installed_shared_library_module_names), \
$(call intermediates-dir-for,SHARED_LIBRARIES,$(l),$(my_kind),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/export_includes) \
$(foreach l, $(my_static_libraries) $(my_whole_static_libraries), \
@@ -1465,7 +1468,8 @@
my_c_includes += $(TOPDIR)$(LOCAL_PATH) $(intermediates) $(generated_sources_dir)
-ifndef LOCAL_SDK_VERSION
+# The platform JNI header is for platform modules only.
+ifeq ($(LOCAL_SDK_VERSION)$(LOCAL_USE_VNDK),)
my_c_includes += $(JNI_H_INCLUDE)
endif
diff --git a/core/clear_vars.mk b/core/clear_vars.mk
index 4556fde..64f067e 100644
--- a/core/clear_vars.mk
+++ b/core/clear_vars.mk
@@ -85,6 +85,8 @@
LOCAL_FORCE_STATIC_EXECUTABLE:=
LOCAL_FULL_LIBS_MANIFEST_FILES:=
LOCAL_FULL_MANIFEST_FILE:=
+LOCAL_FULL_CLASSES_JACOCO_JAR:=
+LOCAL_FULL_CLASSES_PRE_JACOCO_JAR:=
LOCAL_GCNO_FILES:=
LOCAL_GENERATED_SOURCES:=
# Group static libraries with "-Wl,--start-group" and "-Wl,--end-group" when linking.
@@ -216,6 +218,7 @@
LOCAL_SANITIZE:=
LOCAL_SANITIZE_DIAG:=
LOCAL_SANITIZE_RECOVER:=
+LOCAL_SANITIZE_BLACKLIST :=
LOCAL_SDK_RES_VERSION:=
LOCAL_SDK_VERSION:=
LOCAL_SHARED_ANDROID_LIBRARIES:=
diff --git a/core/combo/javac.mk b/core/combo/javac.mk
index 99bd0ee..5c2668c 100644
--- a/core/combo/javac.mk
+++ b/core/combo/javac.mk
@@ -35,7 +35,7 @@
endif
# Whatever compiler is on this system.
-COMMON_JAVAC := $(JAVACC) -J-Xmx1024M $(common_jdk_flags)
+COMMON_JAVAC := $(JAVACC) -J-Xmx2048M $(common_jdk_flags)
# Eclipse.
ifeq ($(CUSTOM_JAVA_COMPILER), eclipse)
diff --git a/core/config.mk b/core/config.mk
index f839d3d..41f2a44 100644
--- a/core/config.mk
+++ b/core/config.mk
@@ -592,6 +592,7 @@
VTSC := $(HOST_OUT_EXECUTABLES)/vtsc$(HOST_EXECUTABLE_SUFFIX)
MKBOOTFS := $(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX)
MINIGZIP := $(HOST_OUT_EXECUTABLES)/minigzip$(HOST_EXECUTABLE_SUFFIX)
+BRO := $(HOST_OUT_EXECUTABLES)/bro$(HOST_EXECUTABLE_SUFFIX)
ifeq (,$(strip $(BOARD_CUSTOM_MKBOOTIMG)))
MKBOOTIMG := $(HOST_OUT_EXECUTABLES)/mkbootimg$(HOST_EXECUTABLE_SUFFIX)
else
@@ -668,7 +669,7 @@
FINDBUGS_DIR := external/owasp/sanitizer/tools/findbugs/bin
FINDBUGS := $(FINDBUGS_DIR)/findbugs
-EMMA_JAR := external/emma/lib/emma$(COMMON_JAVA_PACKAGE_SUFFIX)
+JACOCO_CLI_JAR := $(HOST_OUT_JAVA_LIBRARIES)/jacoco-cli$(COMMON_JAVA_PACKAGE_SUFFIX)
# Tool to merge AndroidManifest.xmls
ANDROID_MANIFEST_MERGER := $(JAVA) -classpath prebuilts/devtools/tools/lib/manifest-merger.jar com.android.manifmerger.Main merge
diff --git a/core/config_sanitizers.mk b/core/config_sanitizers.mk
index 967df2d..ab68d8d 100644
--- a/core/config_sanitizers.mk
+++ b/core/config_sanitizers.mk
@@ -9,6 +9,7 @@
# modules that haven't set `LOCAL_CLANG := false` and device modules that
# have set `LOCAL_CLANG := true`.
my_global_sanitize :=
+my_global_sanitize_diag :=
ifeq ($(my_clang),true)
ifdef LOCAL_IS_HOST_MODULE
my_global_sanitize := $(strip $(SANITIZE_HOST))
@@ -17,18 +18,23 @@
my_global_sanitize := $(subst true,address,$(my_global_sanitize))
else
my_global_sanitize := $(strip $(SANITIZE_TARGET))
+ my_global_sanitize_diag := $(strip $(SANITIZE_TARGET_DIAG))
endif
endif
ifneq ($(my_global_sanitize),)
my_sanitize := $(my_global_sanitize) $(my_sanitize)
endif
+ifneq ($(my_global_sanitize_diag),)
+ my_sanitize_diag := $(my_global_sanitize_diag) $(my_sanitize_diag)
+endif
# The sanitizer specified in the product configuration wins over the previous.
ifneq ($(SANITIZER.$(TARGET_PRODUCT).$(LOCAL_MODULE).CONFIG),)
my_sanitize := $(SANITIZER.$(TARGET_PRODUCT).$(LOCAL_MODULE).CONFIG)
ifeq ($(my_sanitize),never)
my_sanitize :=
+ my_sanitize_diag :=
endif
endif
@@ -37,6 +43,7 @@
SANITIZE_TARGET_ARCH ?= $(TARGET_ARCH) $(TARGET_2ND_ARCH)
ifeq ($(filter $(SANITIZE_TARGET_ARCH),$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)),)
my_sanitize :=
+ my_sanitize_diag :=
endif
endif
@@ -47,6 +54,7 @@
ifneq (,$(filter $(LOCAL_MODULE_OWNER),$(subst :, ,$(SANITIZE_NEVER_BY_OWNER))))
$(warning Not sanitizing $(LOCAL_MODULE) based on module owner.)
my_sanitize :=
+ my_sanitize_diag :=
endif
endif
endif
@@ -55,11 +63,13 @@
ifdef LOCAL_SDK_VERSION
my_sanitize :=
my_global_sanitize :=
+ my_sanitize_diag :=
endif
# Never always wins.
ifeq ($(LOCAL_SANITIZE),never)
my_sanitize :=
+ my_sanitize_diag :=
endif
# If CFI is disabled globally, remove it from my_sanitize.
@@ -86,6 +96,22 @@
my_sanitize_diag := $(filter-out cfi,$(my_sanitize_diag))
endif
+# Support for local sanitize blacklist paths.
+ifneq ($(my_sanitize)$(my_global_sanitize),)
+ ifneq ($(LOCAL_SANITIZE_BLACKLIST),)
+ my_cflags += -fsanitize-blacklist=$(LOCAL_PATH)/$(LOCAL_SANITIZE_BLACKLIST)
+ endif
+endif
+
+# Disable integer_overflow if LOCAL_NOSANITIZE=integer.
+ifneq ($(filter integer_overflow, $(my_global_sanitize) $(my_sanitize)),)
+ ifneq ($(filter integer, $(strip $(LOCAL_NOSANITIZE))),)
+ my_sanitize := $(filter-out integer_overflow,$(my_sanitize))
+ my_sanitize_diag := $(filter-out integer_overflow,$(my_sanitize_diag))
+ endif
+endif
+
+
my_nosanitize = $(strip $(LOCAL_NOSANITIZE))
ifneq ($(my_nosanitize),)
my_sanitize := $(filter-out $(my_nosanitize),$(my_sanitize))
@@ -142,6 +168,37 @@
my_sanitize := $(filter-out coverage,$(my_sanitize))
endif
+ifneq ($(filter integer_overflow,$(my_sanitize)),)
+ ifneq ($(filter SHARED_LIBRARIES EXECUTABLES,$(LOCAL_MODULE_CLASS)),)
+ ifneq ($(LOCAL_FORCE_STATIC_EXECUTABLE),true)
+
+ # Respect LOCAL_NOSANITIZE for integer-overflow flags.
+ ifeq ($(filter signed-integer-overflow, $(strip $(LOCAL_NOSANITIZE))),)
+ my_cflags += -fsanitize=signed-integer-overflow
+ endif
+ ifeq ($(filter unsigned-integer-overflow, $(strip $(LOCAL_NOSANITIZE))),)
+ my_cflags += -fsanitize=unsigned-integer-overflow
+ endif
+ my_cflags += -fsanitize-trap=all
+ my_cflags += -ftrap-function=abort
+ my_cflags += $(INTEGER_OVERFLOW_EXTRA_CFLAGS)
+
+ # Check for diagnostics mode (on by default).
+ ifneq ($(filter integer_overflow,$(my_sanitize_diag)),)
+ my_cflags += -fno-sanitize-trap=signed-integer-overflow,unsigned-integer-overflow
+ my_shared_libraries := $($(LOCAL_2ND_ARCH_VAR_PREFIX)UBSAN_RUNTIME_LIBRARY) $(my_shared_libraries)
+ endif
+ endif
+ endif
+ my_sanitize := $(filter-out integer_overflow,$(my_sanitize))
+endif
+
+# Makes sure integer_overflow diagnostics is removed from the diagnostics list
+# even if integer_overflow is not set for some reason.
+ifneq ($(filter integer_overflow,$(my_sanitize_diag)),)
+ my_sanitize_diag := $(filter-out integer_overflow,$(my_sanitize_diag))
+endif
+
ifneq ($(my_sanitize),)
fsanitize_arg := $(subst $(space),$(comma),$(my_sanitize))
my_cflags += -fsanitize=$(fsanitize_arg)
diff --git a/core/definitions.mk b/core/definitions.mk
index fe8d644..6199837 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -2515,12 +2515,6 @@
$(if $(PRIVATE_JAR_MANIFEST), $(hide) echo unsupported options JAR_MANIFEST in $@; exit 53)
endef
-define transform-classes.jar-to-emma
-$(hide) $(JAVA) -classpath $(EMMA_JAR) emma instr -outmode fullcopy -outfile \
- $(PRIVATE_EMMA_COVERAGE_FILE) -ip $< -d $(PRIVATE_EMMA_INTERMEDIATES_DIR) \
- $(addprefix -ix , $(PRIVATE_EMMA_COVERAGE_FILTER))
-endef
-
define desugar-classpath
$(filter-out -classpath -bootclasspath "",$(subst :,$(space),$(1)))
endef
diff --git a/core/envsetup.mk b/core/envsetup.mk
index 27cfd7f..46066e3 100644
--- a/core/envsetup.mk
+++ b/core/envsetup.mk
@@ -273,6 +273,10 @@
ifneq ($(BOARD_VNDK_VERSION),current)
$(error BOARD_VNDK_VERSION: Only "current" is implemented)
endif
+
+ TARGET_VENDOR_TEST_SUFFIX := /vendor
+else
+ TARGET_VENDOR_TEST_SUFFIX :=
endif
# ---------------------------------------------------------------
@@ -480,9 +484,13 @@
ifeq ($(TARGET_IS_64_BIT),true)
TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest64
TARGET_OUT_DATA_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest64
+TARGET_OUT_VENDOR_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest64$(TARGET_VENDOR_TEST_SUFFIX)
+TARGET_OUT_VENDOR_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest64$(TARGET_VENDOR_TEST_SUFFIX)
else
TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest
TARGET_OUT_DATA_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest
+TARGET_OUT_VENDOR_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest$(TARGET_VENDOR_TEST_SUFFIX)
+TARGET_OUT_VENDOR_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest$(TARGET_VENDOR_TEST_SUFFIX)
endif
TARGET_OUT_DATA_FAKE := $(TARGET_OUT_DATA)/fake_packages
@@ -492,9 +500,13 @@
ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true)
$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest/$(TARGET_2ND_ARCH)
$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest/$(TARGET_2ND_ARCH)
+$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest/$(TARGET_2ND_ARCH)$(TARGET_VENDOR_TEST_SUFFIX)
+$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest/$(TARGET_2ND_ARCH)$(TARGET_VENDOR_TEST_SUFFIX)
else
$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest
$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest
+$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest$(TARGET_VENDOR_TEST_SUFFIX)
+$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest$(TARGET_VENDOR_TEST_SUFFIX)
endif
TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache
diff --git a/core/host_java_library.mk b/core/host_java_library.mk
index 939ff37..a68be6a 100644
--- a/core/host_java_library.mk
+++ b/core/host_java_library.mk
@@ -33,16 +33,11 @@
full_classes_compiled_jar := $(intermediates.COMMON)/classes-full-debug.jar
full_classes_jarjar_jar := $(intermediates.COMMON)/classes-jarjar.jar
-emma_intermediates_dir := $(intermediates.COMMON)/emma_out
-# emma is hardcoded to use the leaf name of its input for the output file --
-# only the output directory can be changed
-full_classes_emma_jar := $(emma_intermediates_dir)/lib/$(notdir $(full_classes_jarjar_jar))
full_classes_jar := $(intermediates.COMMON)/classes.jar
LOCAL_INTERMEDIATE_TARGETS += \
$(full_classes_compiled_jar) \
$(full_classes_jarjar_jar) \
- $(full_classes_emma_jar)
#######################################
include $(BUILD_SYSTEM)/base_rules.mk
@@ -95,23 +90,13 @@
full_classes_jarjar_jar := $(full_classes_compiled_jar)
endif
-ifeq (true,$(LOCAL_EMMA_INSTRUMENT))
-$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILE := $(intermediates.COMMON)/coverage.em
-$(full_classes_emma_jar): PRIVATE_EMMA_INTERMEDIATES_DIR := $(emma_intermediates_dir)
-ifdef LOCAL_EMMA_COVERAGE_FILTER
-$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := $(LOCAL_EMMA_COVERAGE_FILTER)
-else
-# by default, avoid applying emma instrumentation onto emma classes itself,
-# otherwise there will be exceptions thrown
-$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := *,-emma,-emmarun,-com.vladium.*
-endif
-# this rule will generate both $(PRIVATE_EMMA_COVERAGE_FILE) and
-# $(full_classes_emma_jar)
-$(full_classes_emma_jar) : $(full_classes_jarjar_jar) | $(EMMA_JAR)
- $(transform-classes.jar-to-emma)
-else # LOCAL_EMMA_INSTRUMENT
-full_classes_emma_jar := $(full_classes_jarjar_jar)
-endif # LOCAL_EMMA_INSTRUMENT
-$(eval $(call copy-one-file,$(full_classes_emma_jar),$(LOCAL_BUILT_MODULE)))
-$(eval $(call copy-one-file,$(full_classes_emma_jar),$(full_classes_jar)))
+LOCAL_FULL_CLASSES_PRE_JACOCO_JAR := $(full_classes_jarjar_jar)
+
+#######################################
+include $(BUILD_SYSTEM)/jacoco.mk
+#######################################
+
+$(eval $(call copy-one-file,$(LOCAL_FULL_CLASSES_JACOCO_JAR),$(LOCAL_BUILT_MODULE)))
+$(eval $(call copy-one-file,$(LOCAL_FULL_CLASSES_JACOCO_JAR),$(full_classes_jar)))
+
diff --git a/core/jacoco.mk b/core/jacoco.mk
new file mode 100644
index 0000000..a04d25e
--- /dev/null
+++ b/core/jacoco.mk
@@ -0,0 +1,140 @@
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This file sets up Java code coverage via Jacoco
+# This file is only intended to be included internally by the build system
+# (at the time of authorship, it is included by java.mk and
+# java_host_library.mk)
+
+my_include_filter :=
+my_exclude_filter :=
+
+ifeq ($(LOCAL_EMMA_INSTRUMENT),true)
+ ifeq ($(ANDROID_COMPILE_WITH_JACK),false)
+ # determine Jacoco include/exclude filters
+ DEFAULT_JACOCO_EXCLUDE_FILTER := org/junit/*,org/jacoco/*,org/mockito/*
+ # copy filters from Jack but also skip some known java packages
+ my_include_filter := $(strip $(LOCAL_JACK_COVERAGE_INCLUDE_FILTER))
+ my_exclude_filter := $(strip $(DEFAULT_JACOCO_EXCLUDE_FILTER),$(LOCAL_JACK_COVERAGE_EXCLUDE_FILTER))
+
+ # replace '.' with '/' and ',' with ' ', and quote each arg
+ ifneq ($(strip $(my_include_filter)),)
+ my_include_args := $(strip $(my_include_filter))
+
+ my_include_args := $(subst .,/,$(my_include_args))
+ my_include_args := '$(subst $(comma),' ',$(my_include_args))'
+ else
+ my_include_args :=
+ endif
+
+ # replace '.' with '/' and ',' with ' ', and quote each arg
+ ifneq ($(strip $(my_exclude_filter)),)
+ my_exclude_args := $(my_exclude_filter)
+
+ my_exclude_args := $(subst .,/,$(my_exclude_args))
+ my_exclude_args := $(subst $(comma)$(comma),$(comma),$(my_exclude_args))
+ my_exclude_args := '$(subst $(comma),' ', $(my_exclude_args))'
+ else
+ my_exclude_args :=
+ endif
+ endif # ANDROID_COMPILE_WITH_JACK==false
+endif # LOCAL_EMMA_INSTRUMENT == true
+
+# determine whether to run the instrumenter based on whether there is any work
+# for it to do
+ifneq ($(my_include_filter),)
+
+ my_files := $(intermediates.COMMON)/jacoco
+
+ # make a task that unzips the classes that we want to instrument from the
+ # input jar
+ my_unzipped_path := $(my_files)/work/classes-to-instrument/classes
+ my_unzipped_timestamp_path := $(my_files)/work/classes-to-instrument/updated.stamp
+$(my_unzipped_timestamp_path): PRIVATE_UNZIPPED_PATH := $(my_unzipped_path)
+$(my_unzipped_timestamp_path): PRIVATE_UNZIPPED_TIMESTAMP_PATH := $(my_unzipped_timestamp_path)
+$(my_unzipped_timestamp_path): PRIVATE_INCLUDE_ARGS := $(my_include_args)
+$(my_unzipped_timestamp_path): PRIVATE_EXCLUDE_ARGS := $(my_exclude_args)
+$(my_unzipped_timestamp_path): PRIVATE_FULL_CLASSES_PRE_JACOCO_JAR := $(LOCAL_FULL_CLASSES_PRE_JACOCO_JAR)
+$(my_unzipped_timestamp_path): $(LOCAL_FULL_CLASSES_PRE_JACOCO_JAR)
+ rm -rf $(PRIVATE_UNZIPPED_PATH) $@
+ mkdir -p $(PRIVATE_UNZIPPED_PATH)
+ unzip -q $(PRIVATE_FULL_CLASSES_PRE_JACOCO_JAR) \
+ -d $(PRIVATE_UNZIPPED_PATH) \
+ $(PRIVATE_INCLUDE_ARGS)
+ rm -rf $(PRIVATE_EXCLUDE_ARGS)
+ touch $(PRIVATE_UNZIPPED_TIMESTAMP_PATH)
+# Unfortunately in the previous task above,
+# 'rm -rf $(PRIVATE_EXCLUDE_ARGS)' needs to be a separate
+# shell command after 'unzip'.
+# We can't just use the '-x' (exclude) option of 'unzip' because if both
+# inclusions and exclusions are specified and an exclusion matches no
+# inclusions, then 'unzip' exits with an error (error 11).
+# We could ignore the error, but that would make the process less reliable
+
+
+ # make a task that zips only the classes that will be instrumented
+ # (for passing in to the report generator later)
+ my_classes_to_report_on_path := $(my_files)/report-resources/jacoco-report-classes.jar
+$(my_classes_to_report_on_path): PRIVATE_UNZIPPED_PATH := $(my_unzipped_path)
+$(my_classes_to_report_on_path): $(my_unzipped_timestamp_path)
+ rm -f $@
+ zip -q $@ \
+ -r $(PRIVATE_UNZIPPED_PATH)
+
+
+
+ # make a task that invokes instrumentation
+ my_instrumented_path := $(my_files)/work/instrumented/classes
+ my_instrumented_timestamp_path := $(my_files)/work/instrumented/updated.stamp
+$(my_instrumented_timestamp_path): PRIVATE_INSTRUMENTED_PATH := $(my_instrumented_path)
+$(my_instrumented_timestamp_path): PRIVATE_INSTRUMENTED_TIMESTAMP_PATH := $(my_instrumented_timestamp_path)
+$(my_instrumented_timestamp_path): PRIVATE_UNZIPPED_PATH := $(my_unzipped_path)
+$(my_instrumented_timestamp_path): $(my_unzipped_timestamp_path) $(JACOCO_CLI_JAR)
+ rm -rf $(PRIVATE_INSTRUMENTED_PATH)
+ mkdir -p $(PRIVATE_INSTRUMENTED_PATH)
+ java -jar $(JACOCO_CLI_JAR) \
+ instrument \
+ -quiet \
+ -dest '$(PRIVATE_INSTRUMENTED_PATH)' \
+ $(PRIVATE_UNZIPPED_PATH)
+ touch $(PRIVATE_INSTRUMENTED_TIMESTAMP_PATH)
+
+
+ # make a task that zips both the instrumented classes and the uninstrumented
+ # classes (this jar is the instrumented application to execute)
+ my_temp_jar_path := $(my_files)/work/usable.jar
+ LOCAL_FULL_CLASSES_JACOCO_JAR := $(intermediates.COMMON)/classes-jacoco.jar
+$(LOCAL_FULL_CLASSES_JACOCO_JAR): PRIVATE_TEMP_JAR_PATH := $(my_temp_jar_path)
+$(LOCAL_FULL_CLASSES_JACOCO_JAR): PRIVATE_INSTRUMENTED_PATH := $(my_instrumented_path)
+$(LOCAL_FULL_CLASSES_JACOCO_JAR): PRIVATE_FULL_CLASSES_PRE_JACOCO_JAR := $(LOCAL_FULL_CLASSES_PRE_JACOCO_JAR)
+$(LOCAL_FULL_CLASSES_JACOCO_JAR): $(my_instrumented_timestamp_path) $(LOCAL_FULL_CLASSES_PRE_JACOCO_JAR)
+ rm -f $@ $(PRIVATE_TEMP_JAR_PATH)
+ # copy the pre-jacoco jar (containing files excluded from instrumentation)
+ cp $(PRIVATE_FULL_CLASSES_PRE_JACOCO_JAR) $(PRIVATE_TEMP_JAR_PATH)
+ # copy instrumented files back into the resultant jar
+ $(JAR) -uf $(PRIVATE_TEMP_JAR_PATH) -C $(PRIVATE_INSTRUMENTED_PATH) .
+ mv $(PRIVATE_TEMP_JAR_PATH) $@
+
+ # this is used to trigger $(my_classes_to_report_on_path) to build
+ # when $(LOCAL_FULL_CLASSES_JACOCO_JAR) builds, but it isn't truly a
+ # dependency.
+$(LOCAL_FULL_CLASSES_JACOCO_JAR): $(my_classes_to_report_on_path)
+
+else # my_include_filter == ''
+ LOCAL_FULL_CLASSES_JACOCO_JAR := $(LOCAL_FULL_CLASSES_PRE_JACOCO_JAR)
+endif # my_include_filter != ''
+
+LOCAL_INTERMEDIATE_TARGETS += $(LOCAL_FULL_CLASSES_JACOCO_JAR)
diff --git a/core/java.mk b/core/java.mk
index e456993..c457bd8 100644
--- a/core/java.mk
+++ b/core/java.mk
@@ -114,10 +114,6 @@
full_classes_desugar_jar := $(intermediates.COMMON)/classes-desugar.jar
jarjar_leaf := classes-jarjar.jar
full_classes_jarjar_jar := $(intermediates.COMMON)/$(jarjar_leaf)
-emma_intermediates_dir := $(intermediates.COMMON)/emma_out
-# emma is hardcoded to use the leaf name of its input for the output file --
-# only the output directory can be changed
-full_classes_emma_jar := $(emma_intermediates_dir)/lib/$(jarjar_leaf)
full_classes_proguard_jar := $(intermediates.COMMON)/classes-proguard.jar
built_dex_intermediate := $(intermediates.COMMON)/$(built_dex_intermediate_leaf)/classes.dex
full_classes_stubs_jar := $(intermediates.COMMON)/stubs.jar
@@ -140,7 +136,6 @@
$(full_classes_compiled_jar) \
$(full_classes_desugar_jar) \
$(full_classes_jarjar_jar) \
- $(full_classes_emma_jar) \
$(full_classes_jar) \
$(full_classes_proguard_jar) \
$(built_dex_intermediate) \
@@ -425,6 +420,16 @@
LOCAL_JAVACFLAGS += $(LOCAL_ERROR_PRONE_FLAGS)
endif
+# For user / userdebug builds, strip the local variable table and the local variable
+# type table. This has no bearing on stack traces, but will leave less information
+# available via JDWP.
+ifneq (,$(PRODUCT_MINIMIZE_JAVA_DEBUG_INFO))
+ifneq (,$(filter userdebug user,$(TARGET_BUILD_VARIANT)))
+LOCAL_JAVACFLAGS+= -g:source,lines
+LOCAL_JACK_FLAGS+= -D jack.dex.debug.vars=false -D jack.dex.debug.vars.synthetic=false
+endif
+endif
+
$(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(GLOBAL_JAVAC_DEBUG_FLAGS) $(LOCAL_JAVACFLAGS) $(annotation_processor_flags)
$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_FILES := $(LOCAL_JAR_EXCLUDE_FILES)
$(full_classes_compiled_jar): PRIVATE_JAR_PACKAGES := $(LOCAL_JAR_PACKAGES)
@@ -454,18 +459,21 @@
# using deferred evaluation (LOCAL_JAR_PROCESSOR_ARGS = instead of :=).
in := $(full_classes_compiled_jar)
out := $(full_classes_processed_jar).tmp
+my_jar_processor := $(HOST_OUT_JAVA_LIBRARIES)/$(LOCAL_JAR_PROCESSOR).jar
+
$(full_classes_processed_jar): PRIVATE_JAR_PROCESSOR_ARGS := $(LOCAL_JAR_PROCESSOR_ARGS)
-$(full_classes_processed_jar): PRIVATE_JAR_PROCESSOR := $(HOST_OUT_JAVA_LIBRARIES)/$(LOCAL_JAR_PROCESSOR).jar
+$(full_classes_processed_jar): PRIVATE_JAR_PROCESSOR := $(my_jar_processor)
$(full_classes_processed_jar): PRIVATE_TMP_OUT := $(out)
in :=
out :=
-$(full_classes_processed_jar): $(full_classes_compiled_jar) $(LOCAL_JAR_PROCESSOR)
+$(full_classes_processed_jar): $(full_classes_compiled_jar) $(my_jar_processor)
@echo Processing $@ with $(PRIVATE_JAR_PROCESSOR)
$(hide) rm -f $@ $(PRIVATE_TMP_OUT)
$(hide) $(JAVA) -jar $(PRIVATE_JAR_PROCESSOR) $(PRIVATE_JAR_PROCESSOR_ARGS)
$(hide) mv $(PRIVATE_TMP_OUT) $@
+my_jar_processor :=
else
full_classes_processed_jar := $(full_classes_compiled_jar)
endif
@@ -494,29 +502,13 @@
full_classes_jarjar_jar := $(full_classes_desugar_jar)
endif
-ifeq ($(LOCAL_EMMA_INSTRUMENT),true)
-$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILE := $(intermediates.COMMON)/coverage.emma.ignore
-$(full_classes_emma_jar): PRIVATE_EMMA_INTERMEDIATES_DIR := $(emma_intermediates_dir)
-# module level coverage filter can be defined using LOCAL_EMMA_COVERAGE_FILTER
-# in Android.mk
-ifdef LOCAL_EMMA_COVERAGE_FILTER
-$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := $(LOCAL_EMMA_COVERAGE_FILTER)
-else
-# by default, avoid applying emma instrumentation onto emma classes itself,
-# otherwise there will be exceptions thrown
-$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := *,-emma,-emmarun,-com.vladium.*
-endif
-# this rule will generate both $(PRIVATE_EMMA_COVERAGE_FILE) and
-# $(full_classes_emma_jar)
-$(full_classes_emma_jar): $(full_classes_jarjar_jar) | $(EMMA_JAR)
- $(transform-classes.jar-to-emma)
+LOCAL_FULL_CLASSES_PRE_JACOCO_JAR := $(full_classes_jarjar_jar)
-else
-full_classes_emma_jar := $(full_classes_jarjar_jar)
-endif
+#######################################
+include $(BUILD_SYSTEM)/jacoco.mk
+#######################################
-# TODO: this should depend on full_classes_emma_jar once coverage works again
-full_classes_pre_proguard_jar := $(full_classes_jarjar_jar)
+full_classes_pre_proguard_jar := $(LOCAL_FULL_CLASSES_JACOCO_JAR)
# Keep a copy of the jar just before proguard processing.
$(eval $(call copy-one-file,$(full_classes_pre_proguard_jar),$(intermediates.COMMON)/classes-pre-proguard.jar))
diff --git a/core/java_library.mk b/core/java_library.mk
index 9db587d..0aad84c 100644
--- a/core/java_library.mk
+++ b/core/java_library.mk
@@ -53,12 +53,7 @@
ifeq (true,$(EMMA_INSTRUMENT))
ifeq (true,$(LOCAL_EMMA_INSTRUMENT))
ifeq (true,$(EMMA_INSTRUMENT_STATIC))
-ifdef LOCAL_JACK_ENABLED
-# Jack supports coverage with Jacoco
LOCAL_STATIC_JAVA_LIBRARIES += jacocoagent
-else
-LOCAL_STATIC_JAVA_LIBRARIES += emma
-endif # LOCAL_JACK_ENABLED
endif # LOCAL_EMMA_INSTRUMENT
endif # EMMA_INSTRUMENT_STATIC
else
diff --git a/core/main.mk b/core/main.mk
index ea72a9a..d14d64b 100644
--- a/core/main.mk
+++ b/core/main.mk
@@ -1006,9 +1006,13 @@
$(call dist-for-goals,apps_only, $(apps_only_dist_built_files))
ifeq ($(EMMA_INSTRUMENT),true)
- $(EMMA_META_ZIP) : $(apps_only_installed_files)
-
- $(call dist-for-goals,apps_only, $(EMMA_META_ZIP))
+ ifeq ($(ANDROID_COMPILE_WITH_JACK),false)
+ $(JACOCO_REPORT_CLASSES_ALL) : $(apps_only_installed_files)
+ $(call dist-for-goals,apps_only, $(JACOCO_REPORT_CLASSES_ALL))
+ else
+ $(EMMA_META_ZIP) : $(apps_only_installed_files)
+ $(call dist-for-goals,apps_only, $(EMMA_META_ZIP))
+ endif
endif
$(PROGUARD_DICT_ZIP) : $(apps_only_installed_files)
@@ -1065,9 +1069,13 @@
endif
ifeq ($(EMMA_INSTRUMENT),true)
- $(EMMA_META_ZIP) : $(INSTALLED_SYSTEMIMAGE)
-
- $(call dist-for-goals, dist_files, $(EMMA_META_ZIP))
+ ifeq ($(ANDROID_COMPILE_WITH_JACK),false)
+ $(JACOCO_REPORT_CLASSES_ALL) : $(INSTALLED_SYSTEMIMAGE)
+ $(call dist-for-goals, dist_files, $(JACOCO_REPORT_CLASSES_ALL))
+ else
+ $(EMMA_META_ZIP) : $(INSTALLED_SYSTEMIMAGE)
+ $(call dist-for-goals, dist_files, $(EMMA_META_ZIP))
+ endif
endif
# Building a full system-- the default is to build droidcore
diff --git a/core/package_internal.mk b/core/package_internal.mk
index 8b3c375..89d3b34 100644
--- a/core/package_internal.mk
+++ b/core/package_internal.mk
@@ -246,7 +246,7 @@
ifeq (true,$(EMMA_INSTRUMENT))
ifndef LOCAL_EMMA_INSTRUMENT
-# No emma for test apks.
+# No jacoco for test apks.
ifeq (,$(LOCAL_INSTRUMENTATION_FOR))
LOCAL_EMMA_INSTRUMENT := true
endif # No test apk
@@ -257,21 +257,14 @@
ifeq (true,$(LOCAL_EMMA_INSTRUMENT))
ifeq (true,$(EMMA_INSTRUMENT_STATIC))
-ifdef LOCAL_JACK_ENABLED
-# Jack supports coverage with Jacoco
ifneq ($(LOCAL_SRC_FILES)$(LOCAL_STATIC_JAVA_LIBRARIES)$(LOCAL_SOURCE_FILES_ALL_GENERATED),)
# Only add jacocoagent if the package contains some java code
LOCAL_STATIC_JAVA_LIBRARIES += jacocoagent
endif # Contains java code
else
-LOCAL_STATIC_JAVA_LIBRARIES += emma
-endif # LOCAL_JACK_ENABLED
-else
ifdef LOCAL_SDK_VERSION
ifdef TARGET_BUILD_APPS
# In unbundled build, merge the coverage library into the apk.
-ifdef LOCAL_JACK_ENABLED
-# Jack supports coverage with Jacoco
ifneq ($(LOCAL_SRC_FILES)$(LOCAL_STATIC_JAVA_LIBRARIES)$(LOCAL_SOURCE_FILES_ALL_GENERATED),)
# Only add jacocoagent if the package contains some java code
LOCAL_STATIC_JAVA_LIBRARIES += jacocoagent
@@ -279,9 +272,6 @@
LOCAL_PROGUARD_FLAGS += -include $(BUILD_SYSTEM)/proguard.jacoco.flags
LOCAL_JACK_PROGUARD_FLAGS += -include $(BUILD_SYSTEM)/proguard.jacoco.flags
endif # Contains java code
-else # ! LOCAL_JACK_ENABLED
-LOCAL_STATIC_JAVA_LIBRARIES += emma
-endif # ! LOCAL_JACK_ENABLED
else # ! TARGET_BUILD_APPS
ifdef LOCAL_JACK_ENABLED
# If build against the SDK in full build, core.jar is not used
@@ -292,11 +282,6 @@
# Note: we have nothing to do for proguard since jacoco will be
# on the classpath only, thus not modified during the compilation.
LOCAL_JAVA_LIBRARIES += jacocoagent
-else # ! LOCAL_JACK_ENABLED
-# If build against the SDK in full build, core.jar is not used,
-# we have to use prebiult emma.jar to make Proguard happy;
-# Otherwise emma classes are included in core.jar.
-LOCAL_PROGUARD_FLAGS += -libraryjars $(EMMA_JAR)
endif # ! LOCAL_JACK_ENABLED
endif # ! TARGET_BUILD_APPS
endif # LOCAL_SDK_VERSION
diff --git a/core/product.mk b/core/product.mk
index ab65ea5..5e943ce 100644
--- a/core/product.mk
+++ b/core/product.mk
@@ -134,6 +134,7 @@
PRODUCT_ART_USE_READ_BARRIER \
PRODUCT_IOT \
PRODUCT_SYSTEM_HEADROOM \
+ PRODUCT_MINIMIZE_JAVA_DEBUG_INFO \
diff --git a/core/product_config.mk b/core/product_config.mk
index d27bdf3..71a342d 100644
--- a/core/product_config.mk
+++ b/core/product_config.mk
@@ -427,3 +427,7 @@
# Add reserved headroom to a system image.
PRODUCT_SYSTEM_HEADROOM := \
$(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_HEADROOM))
+
+# Whether to save disk space by minimizing java debug info
+PRODUCT_MINIMIZE_JAVA_DEBUG_INFO := \
+ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_MINIMIZE_JAVA_DEBUG_INFO))
diff --git a/core/soong_config.mk b/core/soong_config.mk
index e21083d..54a30ea 100644
--- a/core/soong_config.mk
+++ b/core/soong_config.mk
@@ -41,6 +41,7 @@
echo ' "Allow_missing_dependencies": $(if $(ALLOW_MISSING_DEPENDENCIES),true,false),'; \
echo ' "SanitizeHost": $(call json_list,$(SANITIZE_HOST)),'; \
echo ' "SanitizeDevice": $(call json_list,$(SANITIZE_TARGET)),'; \
+ echo ' "SanitizeDeviceDiag": $(call json_list,$(SANITIZE_TARGET_DIAG)),'; \
echo ' "SanitizeDeviceArch": $(call json_list,$(SANITIZE_TARGET_ARCH)),'; \
echo ' "HostStaticBinaries": $(if $(strip $(BUILD_HOST_static)),true,false),'; \
echo ' "Binder32bit": $(if $(BINDER32BIT),true,false),'; \
@@ -85,7 +86,9 @@
echo ''; \
echo ' "ArtUseReadBarrier": $(if $(filter false,$(PRODUCT_ART_USE_READ_BARRIER)),false,true),'; \
echo ''; \
- echo ' "BtConfigIncludeDir": "$(BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR)"'; \
+ echo ' "BtConfigIncludeDir": "$(BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR)",'; \
+ echo ''; \
+ echo ' "DeviceKernelHeaders": $(call json_list,$(strip $(TARGET_PROJECT_SYSTEM_INCLUDES)))'; \
echo '}') > $(SOONG_VARIABLES_TMP); \
if ! cmp -s $(SOONG_VARIABLES_TMP) $(SOONG_VARIABLES); then \
mv $(SOONG_VARIABLES_TMP) $(SOONG_VARIABLES); \
diff --git a/core/tasks/build_custom_images.mk b/core/tasks/build_custom_images.mk
index 0750217..c9b07da 100644
--- a/core/tasks/build_custom_images.mk
+++ b/core/tasks/build_custom_images.mk
@@ -36,6 +36,8 @@
# image. <dest> is relativ to the root of the image.
# - CUSTOM_IMAGE_SELINUX, set to "true" if the image supports selinux.
# - CUSTOM_IMAGE_SUPPORT_VERITY, set to "true" if the product supports verity.
+# - CUSTOM_IMAGE_SUPPORT_VERITY_FEC, set to "true" if the product supports
+# verity FEC (forward error correction).
# - CUSTOM_IMAGE_VERITY_BLOCK_DEVICE
# - CUSTOM_IMAGE_AVB_HASH_ENABLE, set to "true" to add AVB HASH footer.
# - CUSTOM_IMAGE_AVB_ADD_HASH_FOOTER_ARGS, additional args of AVB HASH footer.
@@ -61,6 +63,7 @@
CUSTOM_IMAGE_COPY_FILES \
CUSTOM_IMAGE_SELINUX \
CUSTOM_IMAGE_SUPPORT_VERITY \
+ CUSTOM_IMAGE_SUPPORT_VERITY_FEC \
CUSTOM_IMAGE_VERITY_BLOCK_DEVICE \
CUSTOM_IMAGE_AVB_HASH_ENABLE \
CUSTOM_IMAGE_AVB_ADD_HASH_FOOTER_ARGS \
diff --git a/core/tasks/tools/build_custom_image.mk b/core/tasks/tools/build_custom_image.mk
index 702d8b3..719279c 100644
--- a/core/tasks/tools/build_custom_image.mk
+++ b/core/tasks/tools/build_custom_image.mk
@@ -79,6 +79,7 @@
$(my_built_custom_image): PRIVATE_PICKUP_FILES := $(my_pickup_files)
$(my_built_custom_image): PRIVATE_SELINUX := $(CUSTOM_IMAGE_SELINUX)
$(my_built_custom_image): PRIVATE_SUPPORT_VERITY := $(CUSTOM_IMAGE_SUPPORT_VERITY)
+$(my_built_custom_image): PRIVATE_SUPPORT_VERITY_FEC := $(CUSTOM_IMAGE_SUPPORT_VERITY_FEC)
$(my_built_custom_image): PRIVATE_VERITY_KEY := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY)
$(my_built_custom_image): PRIVATE_VERITY_BLOCK_DEVICE := $(CUSTOM_IMAGE_VERITY_BLOCK_DEVICE)
$(my_built_custom_image): PRIVATE_DICT_FILE := $(CUSTOM_IMAGE_DICT_FILE)
@@ -93,7 +94,15 @@
else ifneq (,$(filter true, $(CUSTOM_IMAGE_AVB_HASH_ENABLE) $(CUSTOM_IMAGE_AVB_HASHTREE_ENABLE)))
$(error Cannot set both CUSTOM_IMAGE_AVB_HASH_ENABLE and CUSTOM_IMAGE_AVB_HASHTREE_ENABLE to true)
endif
-$(my_built_custom_image): $(INTERNAL_USERIMAGES_DEPS) $(my_built_modules) $(my_image_copy_files) \
+ifeq (true,$(CUSTOM_IMAGE_SUPPORT_VERITY_FEC))
+ $(my_built_custom_image): $(FEC)
+endif
+my_custom_image_modules_var:=BOARD_$(strip $(call to-upper,$(my_custom_image_name)))_KERNEL_MODULES
+my_custom_image_modules:=$($(my_custom_image_modules_var))
+my_custom_image_modules_dep:=$(if $(my_custom_image_modules),$(my_custom_image_modules) $(DEPMOD),)
+$(my_built_custom_image): PRIVATE_KERNEL_MODULES := $(my_custom_image_modules)
+$(my_built_custom_image): PRIVATE_IMAGE_NAME := $(my_custom_image_name)
+$(my_built_custom_image): $(INTERNAL_USERIMAGES_DEPS) $(my_built_modules) $(my_image_copy_files) $(my_custom_image_modules_dep) \
$(CUSTOM_IMAGE_DICT_FILE)
@echo "Build image $@"
$(hide) rm -rf $(PRIVATE_INTERMEDIATES) && mkdir -p $(PRIVATE_INTERMEDIATES)
@@ -103,6 +112,8 @@
$(eval pair := $(subst :,$(space),$(p)))\
mkdir -p $(dir $(word 2,$(pair)));\
cp -Rf $(word 1,$(pair)) $(word 2,$(pair));)
+ $(if $(PRIVATE_KERNEL_MODULES), \
+ $(call build-image-kernel-modules,$(PRIVATE_KERNEL_MODULES),$(PRIVATE_STAGING_DIR),$(PRIVATE_IMAGE_NAME)/,$(call intermediates-dir-for,PACKAGING,depmod_$(PRIVATE_IMAGE_NAME))))
$(if $($(PRIVATE_PICKUP_FILES)),$(hide) cp -Rf $(PRIVATE_PICKUP_FILES) $(PRIVATE_STAGING_DIR))
# Generate the dict.
$(hide) echo "# For all accepted properties, see BuildImage() in tools/releasetools/build_image.py" > $(PRIVATE_INTERMEDIATES)/image_info.txt
@@ -117,6 +128,8 @@
echo "verity_key=$(PRIVATE_VERITY_KEY)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\
echo "verity_signer_cmd=$(VERITY_SIGNER)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\
echo "verity_block_device=$(PRIVATE_VERITY_BLOCK_DEVICE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)
+ $(if $(PRIVATE_SUPPORT_VERITY_FEC),\
+ $(hide) echo "verity_fec=$(PRIVATE_SUPPORT_VERITY_FEC)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)
$(hide) echo "avb_avbtool=$(PRIVATE_AVB_AVBTOOL)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt
$(hide) echo "avb_signing_args=$(PRIVATE_AVB_SIGNING_ARGS)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt
$(if $(PRIVATE_AVB_HASH_ENABLE),\
diff --git a/envsetup.sh b/envsetup.sh
index b71a825..d2bcd36 100644
--- a/envsetup.sh
+++ b/envsetup.sh
@@ -741,7 +741,7 @@
local T=$(gettop)
local DRV=$(getdriver $T)
if [ "$T" ]; then
- $DRV make -C $T -f build/core/main.mk $@
+ _wrap_build $DRV $T/build/soong/soong_ui.bash --make-mode $@
else
echo "Couldn't locate the top of the tree. Try setting TOP."
return 1
@@ -770,9 +770,9 @@
local T=$(gettop)
local DRV=$(getdriver $T)
# If we're sitting in the root of the build tree, just do a
- # normal make.
- if [ -f build/core/envsetup.mk -a -f Makefile ]; then
- $DRV make $@
+ # normal build.
+ if [ -f build/soong/soong_ui.bash ]; then
+ _wrap_build $DRV $T/build/soong/soong_ui.bash --make-mode $@
else
# Find the closest Android.mk file.
local M=$(findmakefile)
@@ -807,7 +807,7 @@
if [ "1" = "${WITH_TIDY_ONLY}" -o "true" = "${WITH_TIDY_ONLY}" ]; then
MODULES=tidy_only
fi
- ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES $ARGS
+ ONE_SHOT_MAKEFILE=$M _wrap_build $DRV $T/build/soong/soong_ui.bash --make-mode $MODULES $ARGS
fi
fi
}
@@ -875,7 +875,7 @@
fi
# Convert "/" to "-".
MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-}
- ONE_SHOT_MAKEFILE="$MAKEFILE" $DRV make -C $T -f build/core/main.mk $DASH_ARGS $MODULES $MODULES_IN_PATHS $ARGS
+ ONE_SHOT_MAKEFILE="$MAKEFILE" _wrap_build $DRV $T/build/soong/soong_ui.bash --make-mode $DASH_ARGS $MODULES $MODULES_IN_PATHS $ARGS
else
echo "Couldn't locate the top of the tree. Try setting TOP."
return 1
@@ -886,8 +886,8 @@
{
local T=$(gettop)
local DRV=$(getdriver $T)
- if [ -f build/core/envsetup.mk -a -f Makefile ]; then
- $DRV make $@
+ if [ -f build/soong/soong_ui.bash ]; then
+ _wrap_build $DRV $T/build/soong/soong_ui.bash --make-mode $@
else
if [ ! "$T" ]; then
echo "Couldn't locate the top of the tree. Try setting TOP."
@@ -899,7 +899,7 @@
local MODULES_IN_PATHS=MODULES-IN-$(dirname ${M})
# Convert "/" to "-".
MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-}
- $DRV make -C $T -f build/core/main.mk $@ $MODULES_IN_PATHS
+ _wrap_build $DRV $T/build/soong/soong_ui.bash --make-mode $@ $MODULES_IN_PATHS
fi
}
@@ -937,7 +937,7 @@
done
# Convert "/" to "-".
MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-}
- $DRV make -C $T -f build/core/main.mk $DASH_ARGS $ARGS $MODULES_IN_PATHS
+ _wrap_build $DRV $T/build/soong/soong_ui.bash --make-mode $DASH_ARGS $ARGS $MODULES_IN_PATHS
else
echo "Couldn't locate the top of the tree. Try setting TOP."
return 1
@@ -1583,13 +1583,18 @@
function get_make_command()
{
- echo command make
+ # If we're in the top of an Android tree, use soong_ui.bash instead of make
+ if [ -f build/soong/soong_ui.bash ]; then
+ echo build/soong/soong_ui.bash --make-mode
+ else
+ echo command make
+ fi
}
-function make()
+function _wrap_build()
{
local start_time=$(date +"%s")
- $(get_make_command) "$@"
+ "$@"
local ret=$?
local end_time=$(date +"%s")
local tdiff=$(($end_time-$start_time))
@@ -1608,9 +1613,9 @@
fi
echo
if [ $ret -eq 0 ] ; then
- echo -n "${color_success}#### make completed successfully "
+ echo -n "${color_success}#### build completed successfully "
else
- echo -n "${color_failed}#### make failed to build some targets "
+ echo -n "${color_failed}#### failed to build some targets "
fi
if [ $hours -gt 0 ] ; then
printf "(%02g:%02g:%02g (hh:mm:ss))" $hours $mins $secs
@@ -1624,6 +1629,11 @@
return $ret
}
+function make()
+{
+ _wrap_build $(get_make_command) "$@"
+}
+
function provision()
{
if [ ! "$ANDROID_PRODUCT_OUT" ]; then
diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk
index 5140237..da56d3a 100644
--- a/target/product/core_minimal.mk
+++ b/target/product/core_minimal.mk
@@ -136,5 +136,11 @@
PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,\
frameworks/base/compiled-classes-phone:system/etc/compiled-classes)
+# On userdebug builds, collect more tombstones by default.
+ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
+ tombstoned.max_tombstone_count=50
+endif
+
$(call inherit-product, $(SRC_TARGET_DIR)/product/runtime_libart.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/base.mk)
diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py
index 23c179f..4ff4213 100755
--- a/tools/releasetools/add_img_to_target_files.py
+++ b/tools/releasetools/add_img_to_target_files.py
@@ -602,12 +602,12 @@
for line in lines:
if line.strip() == "system" and (
"system_verity_block_device" in OPTIONS.info_dict or
- OPTIONS.info_dict.get("system_avb_hashtree_enable") == "true"):
+ OPTIONS.info_dict.get("avb_system_hashtree_enable") == "true"):
assert os.path.exists(system_img_path)
care_map_list += GetCareMap("system", system_img_path)
if line.strip() == "vendor" and (
"vendor_verity_block_device" in OPTIONS.info_dict or
- OPTIONS.info_dict.get("vendor_avb_hashtree_enable") == "true"):
+ OPTIONS.info_dict.get("avb_vendor_hashtree_enable") == "true"):
assert os.path.exists(vendor_img_path)
care_map_list += GetCareMap("vendor", vendor_img_path)
diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
index c721a24..ce57f62 100644
--- a/tools/releasetools/common.py
+++ b/tools/releasetools/common.py
@@ -1515,9 +1515,34 @@
ZipWrite(output_zip,
'{}.transfer.list'.format(self.path),
'{}.transfer.list'.format(self.partition))
- ZipWrite(output_zip,
- '{}.new.dat'.format(self.path),
- '{}.new.dat'.format(self.partition))
+
+ # For full OTA, compress the new.dat with brotli with quality 6 to reduce its size. Quailty 9
+ # almost triples the compression time but doesn't further reduce the size too much.
+ # For a typical 1.8G system.new.dat
+ # zip | brotli(quality 6) | brotli(quality 9)
+ # compressed_size: 942M | 869M (~8% reduced) | 854M
+ # compression_time: 75s | 265s | 719s
+ # decompression_time: 15s | 25s | 25s
+
+ if not self.src:
+ bro_cmd = ['bro', '--quality', '6',
+ '--input', '{}.new.dat'.format(self.path),
+ '--output', '{}.new.dat.br'.format(self.path)]
+ print("Compressing {}.new.dat with brotli".format(self.partition))
+ p = Run(bro_cmd, stdout=subprocess.PIPE)
+ p.communicate()
+ assert p.returncode == 0,\
+ 'compression of {}.new.dat failed'.format(self.partition)
+
+ new_data_name = '{}.new.dat.br'.format(self.partition)
+ ZipWrite(output_zip,
+ '{}.new.dat.br'.format(self.path),
+ new_data_name,
+ compress_type=zipfile.ZIP_STORED)
+ else:
+ new_data_name = '{}.new.dat'.format(self.partition)
+ ZipWrite(output_zip, '{}.new.dat'.format(self.path), new_data_name)
+
ZipWrite(output_zip,
'{}.patch.dat'.format(self.path),
'{}.patch.dat'.format(self.partition),
@@ -1530,9 +1555,10 @@
call = ('block_image_update("{device}", '
'package_extract_file("{partition}.transfer.list"), '
- '"{partition}.new.dat", "{partition}.patch.dat") ||\n'
+ '"{new_data_name}", "{partition}.patch.dat") ||\n'
' abort("E{code}: Failed to update {partition} image.");'.format(
- device=self.device, partition=self.partition, code=code))
+ device=self.device, partition=self.partition,
+ new_data_name=new_data_name, code=code))
script.AppendExtra(script.WordWrap(call))
def _HashBlocks(self, source, ranges): # pylint: disable=no-self-use