From c75937264b6d47630f23cb9f54b476e65bbf848d Mon Sep 17 00:00:00 2001 From: Sam Delmerico Date: Wed, 31 Aug 2022 15:57:52 -0400 Subject: [PATCH] jacoco libs dependency for instrumented libraries On coverage builds, R8 will fail to properly optimize and fail the build if ignore_warnings: false, because jacoco injects dependencies on jacocoagent classes, but the jacocoagent library is not part of the classpath libraries passed in to R8 in its arguments. Instead we can add jacocoagent as a libs dependency for these modules so that it will get pulled into the r8 flags. Bug: 243903417 Test: add optimize.ignore_warnings: false to NetworkStackAppDefaults && make SKIP_ABI_CHECKS=true PRODUCT=cf_x86_phone-userdebug \ EMMA_INSTRUMENT=true EMMA_INSTRUMENT_FRAMEWORK=true \ CLANG_COVERAGE=true COVERAGE_PATHS="" \ TARGET_USERDATAIMAGE_PARTITION_SIZE=17179869184 \ SKIP_BOOT_JARS_CHECK=true \ NetworkStack Change-Id: I71313b1fd35437ec52890f5c30b3fd1381c7c3d2 --- apex/apex_test.go | 10 ++++++++++ java/base.go | 5 +++++ java/bootclasspath_fragment_test.go | 20 ++++++++++++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/apex/apex_test.go b/apex/apex_test.go index 49a5d2ab1..d6803f639 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -8846,6 +8846,16 @@ func TestApexJavaCoverage(t *testing.T) { android.FixtureMergeEnv(map[string]string{ "EMMA_INSTRUMENT": "true", }), + // need to mock jacocoagent here to satisfy dependency added for + // instrumented libraries at build time + android.FixtureAddFile("jacocoagent/Android.bp", []byte(` + java_library { + name: "jacocoagent", + srcs: ["Test.java"], + system_modules: "none", + sdk_version: "none", + } + `)), ).RunTest(t) // Make sure jacoco ran on both mylib and mybootclasspathlib diff --git a/java/base.go b/java/base.go index cf3b3d510..53f0f52c2 100644 --- a/java/base.go +++ b/java/base.go @@ -169,6 +169,8 @@ type CommonProperties struct { Output_params []string } + // If true, then jacocoagent is automatically added as a libs dependency so that + // r8 will not strip instrumentation classes out of dexed libraries. Instrument bool `blueprint:"mutated"` // If true, then the module supports statically including the jacocoagent // into the library. @@ -787,6 +789,9 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) { } else if j.shouldInstrumentStatic(ctx) { ctx.AddVariationDependencies(nil, staticLibTag, "jacocoagent") } + if j.shouldInstrument(ctx) { + ctx.AddVariationDependencies(nil, libTag, "jacocoagent") + } if j.useCompose() { ctx.AddVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), kotlinPluginTag, diff --git a/java/bootclasspath_fragment_test.go b/java/bootclasspath_fragment_test.go index f95c83fe7..2bfb255af 100644 --- a/java/bootclasspath_fragment_test.go +++ b/java/bootclasspath_fragment_test.go @@ -96,10 +96,22 @@ func TestBootclasspathFragmentInconsistentArtConfiguration_ApexMixture(t *testin } func TestBootclasspathFragment_Coverage(t *testing.T) { - prepareForTestWithFrameworkCoverage := android.FixtureMergeEnv(map[string]string{ - "EMMA_INSTRUMENT": "true", - "EMMA_INSTRUMENT_FRAMEWORK": "true", - }) + prepareForTestWithFrameworkCoverage := android.GroupFixturePreparers( + android.FixtureMergeEnv(map[string]string{ + "EMMA_INSTRUMENT": "true", + "EMMA_INSTRUMENT_FRAMEWORK": "true", + }), + // need to mock jacocoagent here to satisfy dependency added for + // instrumented libraries at build time + android.FixtureAddFile("jacocoagent/Android.bp", []byte(` + java_library { + name: "jacocoagent", + srcs: ["Test.java"], + system_modules: "none", + sdk_version: "none", + } + `)), + ) prepareWithBp := android.FixtureWithRootAndroidBp(` bootclasspath_fragment {