diff --git a/apex/apex_test.go b/apex/apex_test.go index 485743360..8a71d4fb9 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -7439,6 +7439,80 @@ func TestPrebuiltStubLibDep(t *testing.T) { } } +func TestApexJavaCoverage(t *testing.T) { + bp := ` + apex { + name: "myapex", + key: "myapex.key", + java_libs: ["mylib"], + bootclasspath_fragments: ["mybootclasspathfragment"], + systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], + updatable: false, + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + + java_library { + name: "mylib", + srcs: ["mylib.java"], + apex_available: ["myapex"], + compile_dex: true, + } + + bootclasspath_fragment { + name: "mybootclasspathfragment", + contents: ["mybootclasspathlib"], + apex_available: ["myapex"], + } + + java_library { + name: "mybootclasspathlib", + srcs: ["mybootclasspathlib.java"], + apex_available: ["myapex"], + compile_dex: true, + } + + systemserverclasspath_fragment { + name: "mysystemserverclasspathfragment", + contents: ["mysystemserverclasspathlib"], + apex_available: ["myapex"], + } + + java_library { + name: "mysystemserverclasspathlib", + srcs: ["mysystemserverclasspathlib.java"], + apex_available: ["myapex"], + compile_dex: true, + } + ` + + result := android.GroupFixturePreparers( + PrepareForTestWithApexBuildComponents, + prepareForTestWithMyapex, + java.PrepareForTestWithJavaDefaultModules, + android.PrepareForTestWithAndroidBuildComponents, + android.FixtureWithRootAndroidBp(bp), + android.FixtureMergeEnv(map[string]string{ + "EMMA_INSTRUMENT": "true", + }), + ).RunTest(t) + + // Make sure jacoco ran on both mylib and mybootclasspathlib + if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { + t.Errorf("Failed to find jacoco rule for mylib") + } + if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { + t.Errorf("Failed to find jacoco rule for mybootclasspathlib") + } + if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { + t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib") + } +} + func TestMain(m *testing.M) { os.Exit(m.Run()) } diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index 44803a9ec..792193f9f 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -22,6 +22,7 @@ import ( "android/soong/android" "android/soong/dexpreopt" + "github.com/google/blueprint/proptools" "github.com/google/blueprint" @@ -76,12 +77,17 @@ func (b bootclasspathFragmentContentDependencyTag) ExportMember() bool { return true } +// Contents of bootclasspath fragments in an apex are considered to be directly in the apex, as if +// they were listed in java_libs. +func (b bootclasspathFragmentContentDependencyTag) CopyDirectlyInAnyApex() {} + // The tag used for the dependency between the bootclasspath_fragment module and its contents. var bootclasspathFragmentContentDepTag = bootclasspathFragmentContentDependencyTag{} var _ android.ExcludeFromVisibilityEnforcementTag = bootclasspathFragmentContentDepTag var _ android.ReplaceSourceWithPrebuilt = bootclasspathFragmentContentDepTag var _ android.SdkMemberTypeDependencyTag = bootclasspathFragmentContentDepTag +var _ android.CopyDirectlyInAnyApexTag = bootclasspathFragmentContentDepTag func IsBootclasspathFragmentContentDepTag(tag blueprint.DependencyTag) bool { return tag == bootclasspathFragmentContentDepTag diff --git a/java/systemserver_classpath_fragment.go b/java/systemserver_classpath_fragment.go index f973cf45a..7ffb05602 100644 --- a/java/systemserver_classpath_fragment.go +++ b/java/systemserver_classpath_fragment.go @@ -17,6 +17,7 @@ package java import ( "android/soong/android" "android/soong/dexpreopt" + "github.com/google/blueprint" ) @@ -118,6 +119,12 @@ type systemServerClasspathFragmentContentDependencyTag struct { blueprint.BaseDependencyTag } +// Contents of system server fragments in an apex are considered to be directly in the apex, as if +// they were listed in java_libs. +func (systemServerClasspathFragmentContentDependencyTag) CopyDirectlyInAnyApex() {} + +var _ android.CopyDirectlyInAnyApexTag = systemServerClasspathFragmentContentDepTag + // The tag used for the dependency between the systemserverclasspath_fragment module and its contents. var systemServerClasspathFragmentContentDepTag = systemServerClasspathFragmentContentDependencyTag{}