Merge "Build: Make dex2oat boot image error abort explicit"
diff --git a/core/definitions.mk b/core/definitions.mk
index 8232cc0..c8368b4 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -3281,6 +3281,30 @@
 # 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 9e6fd07..74d84f4 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