diff --git a/core/definitions.mk b/core/definitions.mk index 13bd47cdc..1c14f22df 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -3281,6 +3281,30 @@ endef # run test $(strip $(call test-validate-paths-are-subdirs)) +########################################################### +## Validate jacoco class filters and convert them to +## file arguments +## Jacoco class filters are comma-separated lists of class +## files (android.app.Application), and may have '*' as the +## last character to match all classes in a package +## including subpackages. +define jacoco-class-filter-to-file-args +$(strip $(call jacoco-validate-file-args,\ + $(subst $(comma),$(space),\ + $(subst .,/,\ + $(strip $(1)))))) +endef + +define jacoco-validate-file-args +$(strip $(1)\ + $(call validate-paths-are-subdirs,$(1)) + $(foreach arg,$(1),\ + $(if $(findstring ?,$(arg)),$(call pretty-error,\ + '?' filters are not supported in LOCAL_JACK_COVERAGE_INCLUDE_FILTER or LOCAL_JACK_COVERAGE_EXCLUDE_FILTER))\ + $(if $(findstring *,$(patsubst %*,%,$(arg))),$(call pretty-error,\ + '*' is only supported at the end of a filter in LOCAL_JACK_COVERAGE_INCLUDE_FILTER or LOCAL_JACK_COVERAGE_EXCLUDE_FILTER))\ + )) +endef ########################################################### ## Other includes diff --git a/core/jacoco.mk b/core/jacoco.mk index 9e6fd07ba..74d84f44d 100644 --- a/core/jacoco.mk +++ b/core/jacoco.mk @@ -19,41 +19,23 @@ # (at the time of authorship, it is included by java.mk and # java_host_library.mk) -my_include_filter := -my_exclude_filter := +# determine Jacoco include/exclude filters even when coverage is not enabled +# to get syntax checking on LOCAL_JACK_COVERAGE_(INCLUDE|EXCLUDE)_FILTER +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)) + +my_include_args := $(call jacoco-class-filter-to-file-args, $(my_include_filter)) +my_exclude_args := $(call jacoco-class-filter-to-file-args, $(my_exclude_filter)) + +# single-quote each arg of the include args so the '*' gets evaluated by zip +# don't quote the exclude args they need to be evaluated by bash for rm -rf +my_include_args := $(foreach arg,$(my_include_args),'$(arg)') ifeq ($(LOCAL_EMMA_INSTRUMENT),true) - # 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 ' ' - 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 - my_files := $(intermediates.COMMON)/jacoco - $(call validate-paths-are-subdirs,$(my_exclude_args)) - # 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