Merge "Use implementation jar for updatable-media in snapshot for S"

This commit is contained in:
Paul Duffin
2022-07-15 22:32:58 +00:00
committed by Gerrit Code Review
5 changed files with 101 additions and 14 deletions

View File

@@ -985,6 +985,10 @@ type SdkMemberContext interface {
// RequiresTrait returns true if this member is expected to provide the specified trait. // RequiresTrait returns true if this member is expected to provide the specified trait.
RequiresTrait(trait SdkMemberTrait) bool RequiresTrait(trait SdkMemberTrait) bool
// IsTargetBuildBeforeTiramisu return true if the target build release for which this snapshot is
// being generated is before Tiramisu, i.e. S.
IsTargetBuildBeforeTiramisu() bool
} }
// ExportedComponentsInfo contains information about the components that this module exports to an // ExportedComponentsInfo contains information about the components that this module exports to an

View File

@@ -118,6 +118,16 @@ var (
copyEverythingToSnapshot, copyEverythingToSnapshot,
} }
snapshotRequiresImplementationJar = func(ctx android.SdkMemberContext) bool {
// In the S build the build will break if updatable-media does not provide a full implementation
// jar. That issue was fixed in Tiramisu by b/229932396.
if ctx.IsTargetBuildBeforeTiramisu() && ctx.Name() == "updatable-media" {
return true
}
return false
}
// Supports adding java boot libraries to module_exports and sdk. // Supports adding java boot libraries to module_exports and sdk.
// //
// The build has some implicit dependencies (via the boot jars configuration) on a number of // The build has some implicit dependencies (via the boot jars configuration) on a number of
@@ -135,13 +145,21 @@ var (
SupportsSdk: true, SupportsSdk: true,
}, },
func(ctx android.SdkMemberContext, j *Library) android.Path { func(ctx android.SdkMemberContext, j *Library) android.Path {
if snapshotRequiresImplementationJar(ctx) {
return exportImplementationClassesJar(ctx, j)
}
// Java boot libs are only provided in the SDK to provide access to their dex implementation // Java boot libs are only provided in the SDK to provide access to their dex implementation
// jar for use by dexpreopting and boot jars package check. They do not need to provide an // jar for use by dexpreopting and boot jars package check. They do not need to provide an
// actual implementation jar but the java_import will need a file that exists so just copy an // actual implementation jar but the java_import will need a file that exists so just copy an
// empty file. Any attempt to use that file as a jar will cause a build error. // empty file. Any attempt to use that file as a jar will cause a build error.
return ctx.SnapshotBuilder().EmptyFile() return ctx.SnapshotBuilder().EmptyFile()
}, },
func(osPrefix, name string) string { func(ctx android.SdkMemberContext, osPrefix, name string) string {
if snapshotRequiresImplementationJar(ctx) {
return sdkSnapshotFilePathForJar(ctx, osPrefix, name)
}
// Create a special name for the implementation jar to try and provide some useful information // Create a special name for the implementation jar to try and provide some useful information
// to a developer that attempts to compile against this. // to a developer that attempts to compile against this.
// TODO(b/175714559): Provide a proper error message in Soong not ninja. // TODO(b/175714559): Provide a proper error message in Soong not ninja.
@@ -175,7 +193,7 @@ var (
// file. Any attempt to use that file as a jar will cause a build error. // file. Any attempt to use that file as a jar will cause a build error.
return ctx.SnapshotBuilder().EmptyFile() return ctx.SnapshotBuilder().EmptyFile()
}, },
func(osPrefix, name string) string { func(_ android.SdkMemberContext, osPrefix, name string) string {
// Create a special name for the implementation jar to try and provide some useful information // Create a special name for the implementation jar to try and provide some useful information
// to a developer that attempts to compile against this. // to a developer that attempts to compile against this.
// TODO(b/175714559): Provide a proper error message in Soong not ninja. // TODO(b/175714559): Provide a proper error message in Soong not ninja.
@@ -672,7 +690,7 @@ const (
) )
// path to the jar file of a java library. Relative to <sdk_root>/<api_dir> // path to the jar file of a java library. Relative to <sdk_root>/<api_dir>
func sdkSnapshotFilePathForJar(osPrefix, name string) string { func sdkSnapshotFilePathForJar(_ android.SdkMemberContext, osPrefix, name string) string {
return sdkSnapshotFilePathForMember(osPrefix, name, jarFileSuffix) return sdkSnapshotFilePathForMember(osPrefix, name, jarFileSuffix)
} }
@@ -689,7 +707,7 @@ type librarySdkMemberType struct {
// Function to compute the snapshot relative path to which the named library's // Function to compute the snapshot relative path to which the named library's
// jar should be copied. // jar should be copied.
snapshotPathGetter func(osPrefix, name string) string snapshotPathGetter func(ctx android.SdkMemberContext, osPrefix, name string) string
// True if only the jar should be copied to the snapshot, false if the jar plus any additional // True if only the jar should be copied to the snapshot, false if the jar plus any additional
// files like aidl files should also be copied. // files like aidl files should also be copied.
@@ -747,7 +765,7 @@ func (p *librarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberConte
exportedJar := p.JarToExport exportedJar := p.JarToExport
if exportedJar != nil { if exportedJar != nil {
// Delegate the creation of the snapshot relative path to the member type. // Delegate the creation of the snapshot relative path to the member type.
snapshotRelativeJavaLibPath := memberType.snapshotPathGetter(p.OsPrefix(), ctx.Name()) snapshotRelativeJavaLibPath := memberType.snapshotPathGetter(ctx, p.OsPrefix(), ctx.Name())
// Copy the exported jar to the snapshot. // Copy the exported jar to the snapshot.
builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath) builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath)
@@ -1213,7 +1231,7 @@ func (p *testSdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext,
exportedJar := p.JarToExport exportedJar := p.JarToExport
if exportedJar != nil { if exportedJar != nil {
snapshotRelativeJavaLibPath := sdkSnapshotFilePathForJar(p.OsPrefix(), ctx.Name()) snapshotRelativeJavaLibPath := sdkSnapshotFilePathForJar(ctx, p.OsPrefix(), ctx.Name())
builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath) builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath)
propertySet.AddProperty("jars", []string{snapshotRelativeJavaLibPath}) propertySet.AddProperty("jars", []string{snapshotRelativeJavaLibPath})

View File

@@ -24,18 +24,22 @@ import (
// buildRelease represents the version of a build system used to create a specific release. // buildRelease represents the version of a build system used to create a specific release.
// //
// The name of the release, is the same as the code for the dessert release, e.g. S, T, etc. // The name of the release, is the same as the code for the dessert release, e.g. S, Tiramisu, etc.
type buildRelease struct { type buildRelease struct {
// The name of the release, e.g. S, T, etc. // The name of the release, e.g. S, Tiramisu, etc.
name string name string
// The index of this structure within the buildReleases list. // The index of this structure within the buildReleases list.
ordinal int ordinal int
} }
func (br *buildRelease) EarlierThan(other *buildRelease) bool {
return br.ordinal < other.ordinal
}
// String returns the name of the build release. // String returns the name of the build release.
func (s *buildRelease) String() string { func (br *buildRelease) String() string {
return s.name return br.name
} }
// buildReleaseSet represents a set of buildRelease objects. // buildReleaseSet represents a set of buildRelease objects.

View File

@@ -15,6 +15,7 @@
package sdk package sdk
import ( import (
"fmt"
"testing" "testing"
"android/soong/android" "android/soong/android"
@@ -257,8 +258,8 @@ func TestSnapshotWithJavaBootLibrary(t *testing.T) {
android.FixtureAddFile("aidl", nil), android.FixtureAddFile("aidl", nil),
android.FixtureAddFile("resource.txt", nil), android.FixtureAddFile("resource.txt", nil),
).RunTestWithBp(t, ` ).RunTestWithBp(t, `
module_exports { sdk {
name: "myexports", name: "mysdk",
java_boot_libs: ["myjavalib"], java_boot_libs: ["myjavalib"],
} }
@@ -278,7 +279,7 @@ func TestSnapshotWithJavaBootLibrary(t *testing.T) {
} }
`) `)
CheckSnapshot(t, result, "myexports", "", CheckSnapshot(t, result, "mysdk", "",
checkAndroidBpContents(` checkAndroidBpContents(`
// This is auto-generated. DO NOT EDIT. // This is auto-generated. DO NOT EDIT.
@@ -292,11 +293,65 @@ java_import {
} }
`), `),
checkAllCopyRules(` checkAllCopyRules(`
.intermediates/myexports/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/myjavalib.jar .intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/myjavalib.jar
`), `),
) )
} }
func TestSnapshotWithJavaBootLibrary_UpdatableMedia(t *testing.T) {
runTest := func(t *testing.T, targetBuildRelease, expectedJarPath, expectedCopyRule string) {
result := android.GroupFixturePreparers(
prepareForSdkTestWithJava,
android.FixtureMergeEnv(map[string]string{
"SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": targetBuildRelease,
}),
).RunTestWithBp(t, `
sdk {
name: "mysdk",
java_boot_libs: ["updatable-media"],
}
java_library {
name: "updatable-media",
srcs: ["Test.java"],
system_modules: "none",
sdk_version: "none",
compile_dex: true,
permitted_packages: ["pkg.media"],
apex_available: ["com.android.media"],
}
`)
CheckSnapshot(t, result, "mysdk", "",
checkAndroidBpContents(fmt.Sprintf(`
// This is auto-generated. DO NOT EDIT.
java_import {
name: "updatable-media",
prefer: false,
visibility: ["//visibility:public"],
apex_available: ["com.android.media"],
jars: ["%s"],
permitted_packages: ["pkg.media"],
}
`, expectedJarPath)),
checkAllCopyRules(expectedCopyRule),
)
}
t.Run("updatable-media in S", func(t *testing.T) {
runTest(t, "S", "java/updatable-media.jar", `
.intermediates/updatable-media/android_common/package-check/updatable-media.jar -> java/updatable-media.jar
`)
})
t.Run("updatable-media in T", func(t *testing.T) {
runTest(t, "Tiramisu", "java_boot_libs/snapshot/jars/are/invalid/updatable-media.jar", `
.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/updatable-media.jar
`)
})
}
func TestSnapshotWithJavaSystemserverLibrary(t *testing.T) { func TestSnapshotWithJavaSystemserverLibrary(t *testing.T) {
result := android.GroupFixturePreparers( result := android.GroupFixturePreparers(
prepareForSdkTestWithJava, prepareForSdkTestWithJava,

View File

@@ -1972,6 +1972,12 @@ func (m *memberContext) RequiresTrait(trait android.SdkMemberTrait) bool {
return m.requiredTraits.Contains(trait) return m.requiredTraits.Contains(trait)
} }
func (m *memberContext) IsTargetBuildBeforeTiramisu() bool {
return m.builder.targetBuildRelease.EarlierThan(buildReleaseT)
}
var _ android.SdkMemberContext = (*memberContext)(nil)
func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModule *bpModule) { func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModule *bpModule) {
memberType := member.memberType memberType := member.memberType