Fix jacoco_cli invocation

jacoco_cli --dest takes a directory, not a jar name, and assumes
an output file with the same name as the input jar in that
directory.  Rename jacoco-report-classes.jar to
jacoco-report-classes/modulename.jar, and generate to
jacoco/tmp/modulename.jar before combining to the final output file
at jacoco/modulename.jar.

Bug: 69669951
Test: m EMMA_INSTRUMENT=true
Change-Id: Ia7dd881d2819ae09dfb60a00b4c1b8396629cd9a
This commit is contained in:
Colin Cross
2018-01-03 15:59:46 -08:00
parent 66dbc0bc32
commit 84c3882e64
2 changed files with 21 additions and 12 deletions

View File

@@ -18,6 +18,7 @@ package java
import ( import (
"fmt" "fmt"
"path/filepath"
"strings" "strings"
"github.com/google/blueprint" "github.com/google/blueprint"
@@ -27,11 +28,12 @@ import (
var ( var (
jacoco = pctx.AndroidStaticRule("jacoco", blueprint.RuleParams{ jacoco = pctx.AndroidStaticRule("jacoco", blueprint.RuleParams{
Command: `${config.Zip2ZipCmd} -i $in -o $strippedJar $stripSpec && ` + Command: `rm -rf $tmpDir && mkdir -p $tmpDir && ` +
`${config.Zip2ZipCmd} -i $in -o $strippedJar $stripSpec && ` +
`${config.JavaCmd} -jar ${config.JacocoCLIJar} ` + `${config.JavaCmd} -jar ${config.JacocoCLIJar} ` +
` instrument --quiet --dest $instrumentedJar $strippedJar && ` + ` instrument --quiet --dest $tmpDir $strippedJar && ` +
`${config.Ziptime} $instrumentedJar && ` + `${config.Ziptime} $tmpJar && ` +
`${config.MergeZipsCmd} --ignore-duplicates -j $out $instrumentedJar $in`, `${config.MergeZipsCmd} --ignore-duplicates -j $out $tmpJar $in`,
CommandDeps: []string{ CommandDeps: []string{
"${config.Zip2ZipCmd}", "${config.Zip2ZipCmd}",
"${config.JavaCmd}", "${config.JavaCmd}",
@@ -40,23 +42,30 @@ var (
"${config.MergeZipsCmd}", "${config.MergeZipsCmd}",
}, },
}, },
"strippedJar", "stripSpec", "instrumentedJar") "strippedJar", "stripSpec", "tmpDir", "tmpJar")
) )
func jacocoInstrumentJar(ctx android.ModuleContext, outputJar, strippedJar android.WritablePath, // Instruments a jar using the Jacoco command line interface. Uses stripSpec to extract a subset
// of the classes in inputJar into strippedJar, instruments strippedJar into tmpJar, and then
// combines the classes in tmpJar with inputJar (preferring the instrumented classes in tmpJar)
// to produce instrumentedJar.
func jacocoInstrumentJar(ctx android.ModuleContext, instrumentedJar, strippedJar android.WritablePath,
inputJar android.Path, stripSpec string) { inputJar android.Path, stripSpec string) {
instrumentedJar := android.PathForModuleOut(ctx, "jacoco/instrumented.jar")
// The basename of tmpJar has to be the same as the basename of strippedJar
tmpJar := android.PathForModuleOut(ctx, "jacoco", "tmp", strippedJar.Base())
ctx.Build(pctx, android.BuildParams{ ctx.Build(pctx, android.BuildParams{
Rule: jacoco, Rule: jacoco,
Description: "jacoco", Description: "jacoco",
Output: outputJar, Output: instrumentedJar,
ImplicitOutput: strippedJar, ImplicitOutput: strippedJar,
Input: inputJar, Input: inputJar,
Args: map[string]string{ Args: map[string]string{
"strippedJar": strippedJar.String(), "strippedJar": strippedJar.String(),
"stripSpec": stripSpec, "stripSpec": stripSpec,
"instrumentedJar": instrumentedJar.String(), "tmpDir": filepath.Dir(tmpJar.String()),
"tmpJar": tmpJar.String(),
}, },
}) })
} }

View File

@@ -929,7 +929,7 @@ func (j *Module) instrument(ctx android.ModuleContext, flags javaBuilderFlags,
specs := j.jacocoModuleToZipCommand(ctx) specs := j.jacocoModuleToZipCommand(ctx)
jacocoReportClassesFile := android.PathForModuleOut(ctx, "jacoco", "jacoco-report-classes.jar") jacocoReportClassesFile := android.PathForModuleOut(ctx, "jacoco-report-classes", jarName)
instrumentedJar := android.PathForModuleOut(ctx, "jacoco", jarName) instrumentedJar := android.PathForModuleOut(ctx, "jacoco", jarName)
jacocoInstrumentJar(ctx, instrumentedJar, jacocoReportClassesFile, classesJar, specs) jacocoInstrumentJar(ctx, instrumentedJar, jacocoReportClassesFile, classesJar, specs)