Support path exclusion for native coverage.

Specify list of paths to exclude from coverage instrumentation.

Test: make NATIVE_COVERAGE=true COVERAGE_PATHS=hardware/interfaces
COVERAGE_EXCLUDE_PATHS=hardware/interfaces/graphics
Bug: 35769817

Change-Id: I3bf10e5e5697d140d6cff73d000768b00aa28ca4
diff --git a/android/config.go b/android/config.go
index b4b0be8..1d8cdba 100644
--- a/android/config.go
+++ b/android/config.go
@@ -477,12 +477,22 @@
 }
 
 func (c *deviceConfig) CoverageEnabledForPath(path string) bool {
+	coverage := false
 	if c.config.ProductVariables.CoveragePaths != nil {
 		for _, prefix := range *c.config.ProductVariables.CoveragePaths {
 			if strings.HasPrefix(path, prefix) {
-				return true
+				coverage = true
+				break
 			}
 		}
 	}
-	return false
+	if coverage && c.config.ProductVariables.CoverageExcludePaths != nil {
+		for _, prefix := range *c.config.ProductVariables.CoverageExcludePaths {
+			if strings.HasPrefix(path, prefix) {
+				coverage = false
+				break
+			}
+		}
+	}
+	return coverage
 }
diff --git a/android/variable.go b/android/variable.go
index 68fa7cd..c5b957b 100644
--- a/android/variable.go
+++ b/android/variable.go
@@ -121,8 +121,9 @@
 	ClangTidy  *bool   `json:",omitempty"`
 	TidyChecks *string `json:",omitempty"`
 
-	NativeCoverage *bool     `json:",omitempty"`
-	CoveragePaths  *[]string `json:",omitempty"`
+	NativeCoverage       *bool     `json:",omitempty"`
+	CoveragePaths        *[]string `json:",omitempty"`
+	CoverageExcludePaths *[]string `json:",omitempty"`
 
 	DevicePrefer32BitExecutables *bool `json:",omitempty"`
 	HostPrefer32BitExecutables   *bool `json:",omitempty"`