diff --git a/apex/apex.go b/apex/apex.go index 6f02c476f..efeb0e222 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1924,7 +1924,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { // Rlib is statically linked, but it might have shared lib // dependencies. Track them. return true - } else if java.IsbootImageContentDepTag(depTag) { + } else if java.IsBootclasspathFragmentContentDepTag(depTag) { // Add the contents of the bootclasspath fragment to the apex. switch child.(type) { case *java.Library, *java.SdkLibrary: diff --git a/apex/boot_image_test.go b/apex/boot_image_test.go index e18c2ea2c..dab72f76b 100644 --- a/apex/boot_image_test.go +++ b/apex/boot_image_test.go @@ -216,6 +216,22 @@ func TestBootclasspathFragmentInArtApex(t *testing.T) { ], } + java_import { + name: "foo", + jars: ["foo.jar"], + apex_available: [ + "com.android.art", + ], + } + + java_import { + name: "bar", + jars: ["bar.jar"], + apex_available: [ + "com.android.art", + ], + } + // Make sure that a preferred prebuilt doesn't affect the apex. prebuilt_boot_image { name: "mybootclasspathfragment", diff --git a/java/boot_image.go b/java/boot_image.go index 78215f05a..192b16b40 100644 --- a/java/boot_image.go +++ b/java/boot_image.go @@ -53,7 +53,7 @@ func RegisterBootImageBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("prebuilt_bootclasspath_fragment", prebuiltBootImageFactory) } -type bootImageContentDependencyTag struct { +type bootclasspathFragmentContentDependencyTag struct { blueprint.BaseDependencyTag } @@ -62,16 +62,22 @@ type bootImageContentDependencyTag struct { // This is a temporary workaround to make it easier to migrate to boot image modules with proper // dependencies. // TODO(b/177892522): Remove this and add needed visibility. -func (b bootImageContentDependencyTag) ExcludeFromVisibilityEnforcement() { +func (b bootclasspathFragmentContentDependencyTag) ExcludeFromVisibilityEnforcement() { +} + +// The bootclasspath_fragment contents must never depend on prebuilts. +func (b bootclasspathFragmentContentDependencyTag) ReplaceSourceWithPrebuilt() bool { + return false } // The tag used for the dependency between the boot image module and its contents. -var bootImageContentDepTag = bootImageContentDependencyTag{} +var bootclasspathFragmentContentDepTag = bootclasspathFragmentContentDependencyTag{} -var _ android.ExcludeFromVisibilityEnforcementTag = bootImageContentDepTag +var _ android.ExcludeFromVisibilityEnforcementTag = bootclasspathFragmentContentDepTag +var _ android.ReplaceSourceWithPrebuilt = bootclasspathFragmentContentDepTag -func IsbootImageContentDepTag(tag blueprint.DependencyTag) bool { - return tag == bootImageContentDepTag +func IsBootclasspathFragmentContentDepTag(tag blueprint.DependencyTag) bool { + return tag == bootclasspathFragmentContentDepTag } type bootImageProperties struct { @@ -187,7 +193,7 @@ func (i BootImageInfo) AndroidBootImageFilesByArchType() map[android.ArchType]an func (b *BootImageModule) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { tag := ctx.OtherModuleDependencyTag(dep) - if tag == bootImageContentDepTag { + if IsBootclasspathFragmentContentDepTag(tag) { // Boot image contents are automatically added to apex. return true } @@ -202,8 +208,26 @@ func (b *BootImageModule) ShouldSupportSdkVersion(ctx android.BaseModuleContext, return nil } +// ComponentDepsMutator adds dependencies onto modules before any prebuilt modules without a +// corresponding source module are renamed. This means that adding a dependency using a name without +// a prebuilt_ prefix will always resolve to a source module and when using a name with that prefix +// it will always resolve to a prebuilt module. +func (b *BootImageModule) ComponentDepsMutator(ctx android.BottomUpMutatorContext) { + module := ctx.Module() + _, isSourceModule := module.(*BootImageModule) + + for _, name := range b.properties.Contents { + // A bootclasspath_fragment must depend only on other source modules, while the + // prebuilt_bootclasspath_fragment must only depend on other prebuilt modules. + if !isSourceModule { + name = android.PrebuiltNameFromSource(name) + } + ctx.AddDependency(module, bootclasspathFragmentContentDepTag, name) + } + +} + func (b *BootImageModule) DepsMutator(ctx android.BottomUpMutatorContext) { - ctx.AddDependency(ctx.Module(), bootImageContentDepTag, b.properties.Contents...) if SkipDexpreoptBootJars(ctx) { return diff --git a/sdk/Android.bp b/sdk/Android.bp index 7b034e6de..09a7286dc 100644 --- a/sdk/Android.bp +++ b/sdk/Android.bp @@ -20,7 +20,7 @@ bootstrap_go_package { "update.go", ], testSrcs: [ - "boot_image_sdk_test.go", + "bootclasspath_fragment_sdk_test.go", "bp_test.go", "cc_sdk_test.go", "compat_config_sdk_test.go", diff --git a/sdk/boot_image_sdk_test.go b/sdk/bootclasspath_fragment_sdk_test.go similarity index 67% rename from sdk/boot_image_sdk_test.go rename to sdk/bootclasspath_fragment_sdk_test.go index 5a03e346e..10f86e805 100644 --- a/sdk/boot_image_sdk_test.go +++ b/sdk/bootclasspath_fragment_sdk_test.go @@ -20,17 +20,17 @@ import ( "android/soong/android" ) -func TestSnapshotWithBootImage(t *testing.T) { +func TestSnapshotWithBootclasspathFragment(t *testing.T) { result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureWithRootAndroidBp(` sdk { name: "mysdk", - boot_images: ["mybootimage"], + bootclasspath_fragments: ["mybootclasspathfragment"], } - boot_image { - name: "mybootimage", + bootclasspath_fragment { + name: "mybootclasspathfragment", image_name: "art", } `), @@ -40,8 +40,8 @@ func TestSnapshotWithBootImage(t *testing.T) { checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. -prebuilt_boot_image { - name: "mybootimage", +prebuilt_bootclasspath_fragment { + name: "mybootclasspathfragment", prefer: false, visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], @@ -51,9 +51,9 @@ prebuilt_boot_image { checkVersionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. -prebuilt_boot_image { - name: "mysdk_mybootimage@current", - sdk_member_name: "mybootimage", +prebuilt_bootclasspath_fragment { + name: "mysdk_mybootclasspathfragment@current", + sdk_member_name: "mybootclasspathfragment", visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], image_name: "art", @@ -62,37 +62,37 @@ prebuilt_boot_image { sdk_snapshot { name: "mysdk@current", visibility: ["//visibility:public"], - boot_images: ["mysdk_mybootimage@current"], + bootclasspath_fragments: ["mysdk_mybootclasspathfragment@current"], } `), checkAllCopyRules("")) } -// Test that boot_image works with sdk. -func TestBasicSdkWithBootImage(t *testing.T) { +// Test that bootclasspath_fragment works with sdk. +func TestBasicSdkWithBootclasspathFragment(t *testing.T) { android.GroupFixturePreparers( prepareForSdkTestWithApex, prepareForSdkTestWithJava, android.FixtureWithRootAndroidBp(` sdk { name: "mysdk", - boot_images: ["mybootimage"], + bootclasspath_fragments: ["mybootclasspathfragment"], } - boot_image { - name: "mybootimage", + bootclasspath_fragment { + name: "mybootclasspathfragment", image_name: "art", apex_available: ["myapex"], } sdk_snapshot { name: "mysdk@1", - boot_images: ["mybootimage_mysdk_1"], + bootclasspath_fragments: ["mybootclasspathfragment_mysdk_1"], } - prebuilt_boot_image { - name: "mybootimage_mysdk_1", - sdk_member_name: "mybootimage", + prebuilt_bootclasspath_fragment { + name: "mybootclasspathfragment_mysdk_1", + sdk_member_name: "mybootclasspathfragment", prefer: false, visibility: ["//visibility:public"], apex_available: [