Introduce product variables to select Java code coverage paths in Soong.

Introduce product variables `JavaCoveragePaths` and
`JavaCoverageExcludePaths` (resp. populated from environment variables
`JAVA_COVERAGE_PATHS` and `JAVA_COVERAGE_EXCLUDE_PATHS`). Use them to
control which Java modules are candidate for instrumentation based on
their source path. By default (when `JavaCoveragePaths` is empty),
have all Java module be candidate for instrumentation, to preserve the
existing behavior.

Test: export EMMA_INSTRUMENT=true \
        && export EMMA_INSTRUMENT_FRAMEWORK=true \
        && export JAVA_COVERAGE_PATHS=art \
        && m
Bug: 158212027
Bug: 156284897
Change-Id: Ibe9c1f41ed6110867411952689c5a7ad6536f277
This commit is contained in:
Roland Levillain 2020-06-09 13:07:36 +01:00
parent 2752d926a9
commit ada1270ef8
3 changed files with 27 additions and 1 deletions

View File

@ -1029,6 +1029,27 @@ func (c *deviceConfig) SamplingPGO() bool {
return Bool(c.config.productVariables.SamplingPGO) return Bool(c.config.productVariables.SamplingPGO)
} }
// JavaCoverageEnabledForPath returns whether Java code coverage is enabled for
// path. Coverage is enabled by default when the product variable
// JavaCoveragePaths is empty. If JavaCoveragePaths is not empty, coverage is
// enabled for any path which is part of this variable (and not part of the
// JavaCoverageExcludePaths product variable). Value "*" in JavaCoveragePaths
// represents any path.
func (c *deviceConfig) JavaCoverageEnabledForPath(path string) bool {
coverage := false
if c.config.productVariables.JavaCoveragePaths == nil ||
InList("*", c.config.productVariables.JavaCoveragePaths) ||
HasAnyPrefix(path, c.config.productVariables.JavaCoveragePaths) {
coverage = true
}
if coverage && c.config.productVariables.JavaCoverageExcludePaths != nil {
if HasAnyPrefix(path, c.config.productVariables.JavaCoverageExcludePaths) {
coverage = false
}
}
return coverage
}
func (c *config) NativeLineCoverage() bool { func (c *config) NativeLineCoverage() bool {
return Bool(c.productVariables.NativeLineCoverage) return Bool(c.productVariables.NativeLineCoverage)
} }

View File

@ -266,6 +266,9 @@ type productVariables struct {
SamplingPGO *bool `json:",omitempty"` SamplingPGO *bool `json:",omitempty"`
JavaCoveragePaths []string `json:",omitempty"`
JavaCoverageExcludePaths []string `json:",omitempty"`
NativeLineCoverage *bool `json:",omitempty"` NativeLineCoverage *bool `json:",omitempty"`
Native_coverage *bool `json:",omitempty"` Native_coverage *bool `json:",omitempty"`
ClangCoverage *bool `json:",omitempty"` ClangCoverage *bool `json:",omitempty"`

View File

@ -601,7 +601,9 @@ type jniLib struct {
} }
func (j *Module) shouldInstrument(ctx android.BaseModuleContext) bool { func (j *Module) shouldInstrument(ctx android.BaseModuleContext) bool {
return j.properties.Instrument && ctx.Config().IsEnvTrue("EMMA_INSTRUMENT") return j.properties.Instrument &&
ctx.Config().IsEnvTrue("EMMA_INSTRUMENT") &&
ctx.DeviceConfig().JavaCoverageEnabledForPath(ctx.ModuleDir())
} }
func (j *Module) shouldInstrumentStatic(ctx android.BaseModuleContext) bool { func (j *Module) shouldInstrumentStatic(ctx android.BaseModuleContext) bool {