From e840995ac39040b1e6804e5067a5dde11fa85f8c Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Thu, 22 Sep 2022 16:24:46 +0100 Subject: [PATCH] java_sdk_library: Use dist_stem when generating sdk snapshot file names The API finalization process for platform releases copies various files from the apistubs/ dist directory into prebuilts/sdk//... Having them use the same name in both places makes that process simpler. For most modules the name of the file is derived from the name of the module by appending a suffix but unfortunately, for some modules that does not work. e.g. the conscrypt.txt file is produced by the conscrypt.module.public.api module. The dist_stem property was added to java_sdk_library to allow the stem name of the file to differ from the module name. The API finalization process for extension APIs does something similar as it extracts various files from the snapshots and copies them into the appropriate extension API specific directory in prebuilts/sdk/extensions/. Instead of copying files from the apistubs/ dist directory (which is not built for trains) it copies them from sdk snapshots that are built as part of the train. Previously, the sdk snapshot used to derive the name of the files within the snapshot from the name of the module, it ignored the dist_stem property. This change causes it to use the dist_stem property to make it consistent with the apistubs/ dist directory naming. The file name is created in sdkLibrarySdkMemberProperties.AddPropertyToSet() which does not have access to the dist_stem property. So, it has to be supplied in the sdkLibrarySdkMemberProperties instance in the new Stem property. Bug: 248258460 Test: m nothing BUILD_NUMBER=fixed packages/modules/common/build/mainline_modules_sdks.sh --build-release=latest # Ran the previous command before and after and make sure that the # conscrypt, art and icu sdk snapshots use the dist_stem value but # none of the other snapshots are affected. Change-Id: Ied52003de63dcdb86a252a39bb8781f85d51a6ff --- java/sdk_library.go | 33 ++++++++++++++++++++++------- sdk/java_sdk_test.go | 50 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 8 deletions(-) diff --git a/java/sdk_library.go b/java/sdk_library.go index 8f499b101..d188133c6 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -539,7 +539,7 @@ type sdkLibraryProperties struct { } // TODO: determines whether to create HTML doc or not - //Html_doc *bool + // Html_doc *bool } // Paths to outputs from java_sdk_library and java_sdk_library_import. @@ -1354,7 +1354,7 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) // Provide additional information for inclusion in an sdk's generated .info file. additionalSdkInfo := map[string]interface{}{} additionalSdkInfo["dist_stem"] = module.distStem() - baseModuleName := module.BaseModuleName() + baseModuleName := module.distStem() scopes := map[string]interface{}{} additionalSdkInfo["scopes"] = scopes for scope, scopePaths := range module.scopePaths { @@ -2904,6 +2904,18 @@ var javaSdkLibrarySdkMemberType = &sdkLibrarySdkMemberType{ type sdkLibrarySdkMemberProperties struct { android.SdkMemberPropertiesBase + // Stem name for files in the sdk snapshot. + // + // This is used to construct the path names of various sdk library files in the sdk snapshot to + // make sure that they match the finalized versions of those files in prebuilts/sdk. + // + // This property is marked as keep so that it will be kept in all instances of this struct, will + // not be cleared but will be copied to common structs. That is needed because this field is used + // to construct many file names for other parts of this struct and so it needs to be present in + // all structs. If it was not marked as keep then it would be cleared in some structs and so would + // be unavailable for generating file names if there were other properties that were still set. + Stem string `sdk:"keep"` + // Scope to per scope properties. Scopes map[*apiScope]*scopeProperties @@ -2965,6 +2977,9 @@ type scopeProperties struct { func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) { sdk := variant.(*SdkLibrary) + // Copy the stem name for files in the sdk snapshot. + s.Stem = sdk.distStem() + s.Scopes = make(map[*apiScope]*scopeProperties) for _, apiScope := range allApiScopes { paths := sdk.findScopePaths(apiScope) @@ -3017,6 +3032,8 @@ func (s *sdkLibrarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberCo propertySet.AddProperty("permitted_packages", s.Permitted_packages) } + stem := s.Stem + for _, apiScope := range allApiScopes { if properties, ok := s.Scopes[apiScope]; ok { scopeSet := propertySet.AddPropertySet(apiScope.propertyName) @@ -3025,7 +3042,7 @@ func (s *sdkLibrarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberCo var jars []string for _, p := range properties.Jars { - dest := filepath.Join(scopeDir, ctx.Name()+"-stubs.jar") + dest := filepath.Join(scopeDir, stem+"-stubs.jar") ctx.SnapshotBuilder().CopyToSnapshot(p, dest) jars = append(jars, dest) } @@ -3033,31 +3050,31 @@ func (s *sdkLibrarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberCo if ctx.SdkModuleContext().Config().IsEnvTrue("SOONG_SDK_SNAPSHOT_USE_SRCJAR") { // Copy the stubs source jar into the snapshot zip as is. - srcJarSnapshotPath := filepath.Join(scopeDir, ctx.Name()+".srcjar") + srcJarSnapshotPath := filepath.Join(scopeDir, stem+".srcjar") ctx.SnapshotBuilder().CopyToSnapshot(properties.StubsSrcJar, srcJarSnapshotPath) scopeSet.AddProperty("stub_srcs", []string{srcJarSnapshotPath}) } else { // Merge the stubs source jar into the snapshot zip so that when it is unpacked // the source files are also unpacked. - snapshotRelativeDir := filepath.Join(scopeDir, ctx.Name()+"_stub_sources") + snapshotRelativeDir := filepath.Join(scopeDir, stem+"_stub_sources") ctx.SnapshotBuilder().UnzipToSnapshot(properties.StubsSrcJar, snapshotRelativeDir) scopeSet.AddProperty("stub_srcs", []string{snapshotRelativeDir}) } if properties.CurrentApiFile != nil { - currentApiSnapshotPath := apiScope.snapshotRelativeCurrentApiTxtPath(ctx.Name()) + currentApiSnapshotPath := apiScope.snapshotRelativeCurrentApiTxtPath(stem) ctx.SnapshotBuilder().CopyToSnapshot(properties.CurrentApiFile, currentApiSnapshotPath) scopeSet.AddProperty("current_api", currentApiSnapshotPath) } if properties.RemovedApiFile != nil { - removedApiSnapshotPath := apiScope.snapshotRelativeRemovedApiTxtPath(ctx.Name()) + removedApiSnapshotPath := apiScope.snapshotRelativeRemovedApiTxtPath(stem) ctx.SnapshotBuilder().CopyToSnapshot(properties.RemovedApiFile, removedApiSnapshotPath) scopeSet.AddProperty("removed_api", removedApiSnapshotPath) } if properties.AnnotationsZip != nil { - annotationsSnapshotPath := filepath.Join(scopeDir, ctx.Name()+"_annotations.zip") + annotationsSnapshotPath := filepath.Join(scopeDir, stem+"_annotations.zip") ctx.SnapshotBuilder().CopyToSnapshot(properties.AnnotationsZip, annotationsSnapshotPath) scopeSet.AddProperty("annotations", annotationsSnapshotPath) } diff --git a/sdk/java_sdk_test.go b/sdk/java_sdk_test.go index d59883435..51903ce39 100644 --- a/sdk/java_sdk_test.go +++ b/sdk/java_sdk_test.go @@ -889,6 +889,56 @@ java_sdk_library_import { ) } +func TestSnapshotWithJavaSdkLibrary_DistStem(t *testing.T) { + result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, ` + sdk { + name: "mysdk", + java_sdk_libs: ["myjavalib-foo"], + } + + java_sdk_library { + name: "myjavalib-foo", + apex_available: ["//apex_available:anyapex"], + srcs: ["Test.java"], + sdk_version: "current", + shared_library: false, + public: { + enabled: true, + }, + dist_stem: "myjavalib", + } + `) + + CheckSnapshot(t, result, "mysdk", "", + checkAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_sdk_library_import { + name: "myjavalib-foo", + prefer: false, + visibility: ["//visibility:public"], + apex_available: ["//apex_available:anyapex"], + shared_library: false, + public: { + jars: ["sdk_library/public/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/public/myjavalib_stub_sources"], + current_api: "sdk_library/public/myjavalib.txt", + removed_api: "sdk_library/public/myjavalib-removed.txt", + sdk_version: "current", + }, +} +`), + checkAllCopyRules(` +.intermediates/myjavalib-foo.stubs/android_common/javac/myjavalib-foo.stubs.jar -> sdk_library/public/myjavalib-stubs.jar +.intermediates/myjavalib-foo.stubs.source/android_common/metalava/myjavalib-foo.stubs.source_api.txt -> sdk_library/public/myjavalib.txt +.intermediates/myjavalib-foo.stubs.source/android_common/metalava/myjavalib-foo.stubs.source_removed.txt -> sdk_library/public/myjavalib-removed.txt +`), + checkMergeZips( + ".intermediates/mysdk/common_os/tmp/sdk_library/public/myjavalib_stub_sources.zip", + ), + ) +} + func TestSnapshotWithJavaSdkLibrary_UseSrcJar(t *testing.T) { result := android.GroupFixturePreparers( prepareForSdkTestWithJavaSdkLibrary,