don't export systemserverclasspath_fragment if contents are empty
If a systemserverclasspath_fragment only contains libraries that have a higher min_sdk_version than the target build release version, then we should not export the systemserverclasspath_fragment. Before this change, the fragment was exported with an empty `contents` property which caused errors after being dropped as a prebuilt. Bug: 289183551 Test: go test ./sdk Change-Id: Ifefc6880228e4dd37f5e42b2bda31a83df785375
This commit is contained in:
parent
a56663f695
commit
35881365b4
4 changed files with 136 additions and 10 deletions
|
@ -1194,3 +1194,58 @@ java_sdk_library_import {
|
||||||
expectedSnapshot, expectedCopyRules, expectedStubFlagsInputs, "")
|
expectedSnapshot, expectedCopyRules, expectedStubFlagsInputs, "")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSnapshotWithEmptyBootClasspathFragment(t *testing.T) {
|
||||||
|
result := android.GroupFixturePreparers(
|
||||||
|
prepareForSdkTestWithJava,
|
||||||
|
java.PrepareForTestWithJavaDefaultModules,
|
||||||
|
java.PrepareForTestWithJavaSdkLibraryFiles,
|
||||||
|
java.FixtureWithLastReleaseApis("mysdklibrary", "mynewsdklibrary"),
|
||||||
|
java.FixtureConfigureApexBootJars("myapex:mysdklibrary", "myapex:mynewsdklibrary"),
|
||||||
|
prepareForSdkTestWithApex,
|
||||||
|
// Add a platform_bootclasspath that depends on the fragment.
|
||||||
|
fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
|
||||||
|
android.FixtureMergeEnv(map[string]string{
|
||||||
|
"SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": "S",
|
||||||
|
}),
|
||||||
|
android.FixtureWithRootAndroidBp(`
|
||||||
|
sdk {
|
||||||
|
name: "mysdk",
|
||||||
|
apexes: ["myapex"],
|
||||||
|
}
|
||||||
|
apex {
|
||||||
|
name: "myapex",
|
||||||
|
key: "myapex.key",
|
||||||
|
min_sdk_version: "S",
|
||||||
|
bootclasspath_fragments: ["mybootclasspathfragment"],
|
||||||
|
}
|
||||||
|
bootclasspath_fragment {
|
||||||
|
name: "mybootclasspathfragment",
|
||||||
|
apex_available: ["myapex"],
|
||||||
|
contents: ["mysdklibrary", "mynewsdklibrary"],
|
||||||
|
hidden_api: {
|
||||||
|
split_packages: [],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
java_sdk_library {
|
||||||
|
name: "mysdklibrary",
|
||||||
|
apex_available: ["myapex"],
|
||||||
|
srcs: ["Test.java"],
|
||||||
|
shared_library: false,
|
||||||
|
public: {enabled: true},
|
||||||
|
min_sdk_version: "Tiramisu",
|
||||||
|
}
|
||||||
|
java_sdk_library {
|
||||||
|
name: "mynewsdklibrary",
|
||||||
|
apex_available: ["myapex"],
|
||||||
|
srcs: ["Test.java"],
|
||||||
|
compile_dex: true,
|
||||||
|
public: {enabled: true},
|
||||||
|
min_sdk_version: "Tiramisu",
|
||||||
|
permitted_packages: ["mynewsdklibrary"],
|
||||||
|
}
|
||||||
|
`),
|
||||||
|
).RunTest(t)
|
||||||
|
|
||||||
|
CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.`))
|
||||||
|
}
|
||||||
|
|
10
sdk/bp.go
10
sdk/bp.go
|
@ -311,13 +311,15 @@ func (t identityTransformation) transformProperty(_ string, value interface{}, t
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *bpModule) deepCopy() *bpModule {
|
func (m *bpModule) deepCopy() *bpModule {
|
||||||
return m.transform(deepCopyTransformer)
|
return transformModule(m, deepCopyTransformer)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *bpModule) transform(transformer bpTransformer) *bpModule {
|
func transformModule(m *bpModule, transformer bpTransformer) *bpModule {
|
||||||
transformedModule := transformer.transformModule(m)
|
transformedModule := transformer.transformModule(m)
|
||||||
// Copy the contents of the returned property set into the module and then transform that.
|
if transformedModule != nil {
|
||||||
transformedModule.bpPropertySet, _ = transformPropertySet(transformer, "", transformedModule.bpPropertySet, nil)
|
// Copy the contents of the returned property set into the module and then transform that.
|
||||||
|
transformedModule.bpPropertySet, _ = transformPropertySet(transformer, "", transformedModule.bpPropertySet, nil)
|
||||||
|
}
|
||||||
return transformedModule
|
return transformedModule
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,51 @@ func testSnapshotWithSystemServerClasspathFragment(t *testing.T, sdk string, tar
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSnapshotWithEmptySystemServerClasspathFragment(t *testing.T) {
|
||||||
|
commonSdk := `
|
||||||
|
apex {
|
||||||
|
name: "myapex",
|
||||||
|
key: "myapex.key",
|
||||||
|
min_sdk_version: "Tiramisu",
|
||||||
|
systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
|
||||||
|
}
|
||||||
|
systemserverclasspath_fragment {
|
||||||
|
name: "mysystemserverclasspathfragment",
|
||||||
|
apex_available: ["myapex"],
|
||||||
|
contents: ["mysdklibrary"],
|
||||||
|
}
|
||||||
|
java_sdk_library {
|
||||||
|
name: "mysdklibrary",
|
||||||
|
apex_available: ["myapex"],
|
||||||
|
srcs: ["Test.java"],
|
||||||
|
min_sdk_version: "34", // UpsideDownCake
|
||||||
|
}
|
||||||
|
sdk {
|
||||||
|
name: "mysdk",
|
||||||
|
apexes: ["myapex"],
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
result := android.GroupFixturePreparers(
|
||||||
|
prepareForSdkTestWithJava,
|
||||||
|
java.PrepareForTestWithJavaDefaultModules,
|
||||||
|
java.PrepareForTestWithJavaSdkLibraryFiles,
|
||||||
|
java.FixtureWithLastReleaseApis("mysdklibrary"),
|
||||||
|
dexpreopt.FixtureSetApexSystemServerJars("myapex:mysdklibrary"),
|
||||||
|
android.FixtureModifyEnv(func(env map[string]string) {
|
||||||
|
// targeting Tiramisu here means that we won't export mysdklibrary
|
||||||
|
env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = "Tiramisu"
|
||||||
|
}),
|
||||||
|
android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
|
||||||
|
variables.Platform_version_active_codenames = []string{"UpsideDownCake"}
|
||||||
|
}),
|
||||||
|
prepareForSdkTestWithApex,
|
||||||
|
android.FixtureWithRootAndroidBp(commonSdk),
|
||||||
|
).RunTest(t)
|
||||||
|
|
||||||
|
CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.`))
|
||||||
|
}
|
||||||
|
|
||||||
func TestSnapshotWithSystemServerClasspathFragment(t *testing.T) {
|
func TestSnapshotWithSystemServerClasspathFragment(t *testing.T) {
|
||||||
|
|
||||||
commonSdk := `
|
commonSdk := `
|
||||||
|
|
|
@ -455,11 +455,14 @@ be unnecessary as every module in the sdk already has its own licenses property.
|
||||||
|
|
||||||
for _, module := range builder.prebuiltOrder {
|
for _, module := range builder.prebuiltOrder {
|
||||||
// Prune any empty property sets.
|
// Prune any empty property sets.
|
||||||
module = module.transform(pruneEmptySetTransformer{})
|
module = transformModule(module, pruneEmptySetTransformer{})
|
||||||
|
|
||||||
// Transform the module module to make it suitable for use in the snapshot.
|
// Transform the module module to make it suitable for use in the snapshot.
|
||||||
module.transform(snapshotTransformer)
|
module = transformModule(module, snapshotTransformer)
|
||||||
bpFile.AddModule(module)
|
module = transformModule(module, emptyClasspathContentsTransformation{})
|
||||||
|
if module != nil {
|
||||||
|
bpFile.AddModule(module)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate Android.bp
|
// generate Android.bp
|
||||||
|
@ -835,9 +838,11 @@ type snapshotTransformation struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t snapshotTransformation) transformModule(module *bpModule) *bpModule {
|
func (t snapshotTransformation) transformModule(module *bpModule) *bpModule {
|
||||||
// If the module is an internal member then use a unique name for it.
|
if module != nil {
|
||||||
name := module.Name()
|
// If the module is an internal member then use a unique name for it.
|
||||||
module.setProperty("name", t.builder.snapshotSdkMemberName(name, true))
|
name := module.Name()
|
||||||
|
module.setProperty("name", t.builder.snapshotSdkMemberName(name, true))
|
||||||
|
}
|
||||||
return module
|
return module
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -850,6 +855,25 @@ func (t snapshotTransformation) transformProperty(_ string, value interface{}, t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type emptyClasspathContentsTransformation struct {
|
||||||
|
identityTransformation
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t emptyClasspathContentsTransformation) transformModule(module *bpModule) *bpModule {
|
||||||
|
classpathModuleTypes := []string{
|
||||||
|
"prebuilt_bootclasspath_fragment",
|
||||||
|
"prebuilt_systemserverclasspath_fragment",
|
||||||
|
}
|
||||||
|
if module != nil && android.InList(module.moduleType, classpathModuleTypes) {
|
||||||
|
if contents, ok := module.bpPropertySet.properties["contents"].([]string); ok {
|
||||||
|
if len(contents) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return module
|
||||||
|
}
|
||||||
|
|
||||||
type pruneEmptySetTransformer struct {
|
type pruneEmptySetTransformer struct {
|
||||||
identityTransformation
|
identityTransformation
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue