Add custom java_sdk_library info to the SDK info file

Previously the SDK info file only contained basic common information
about each member. This change adds support for each member to
provide custom information to add to the info file.

It uses that mechanism to add the following:
* "dist_stem"
* "scopes" object containing:
  * for each scope a:
    "<scope>" object containing:
    * "current_api" - the path within the snapshot for the API's .txt
                      file.
    * "removed_api" - the path within the snapshot for the removed
                      API's .txt file.
    * "latest_api" - the path within the build to the latest finalized
                     API .txt file.
    * "latest_removed_api" - the path within the build to the latest
                             finalized removed API .txt file.

In order to access the latest API files it was necessary to add and
resolve dependencies on the module that makes them available. In order
to do that safely the code for creating the names of the modules was
refactored to avoid duplicating the name creation logic.

Bug: 204763318
Test: m nothing
Change-Id: Ica68abbd2b2c7c2b2b7877b502f96cc89f06fd68
This commit is contained in:
Paul Duffin
2022-05-16 13:10:47 +00:00
parent 4dd76eb26c
commit 958806b8c8
7 changed files with 192 additions and 31 deletions

View File

@@ -961,3 +961,10 @@ type ExportedComponentsInfo struct {
} }
var ExportedComponentsInfoProvider = blueprint.NewProvider(ExportedComponentsInfo{}) var ExportedComponentsInfoProvider = blueprint.NewProvider(ExportedComponentsInfo{})
// AdditionalSdkInfo contains additional properties to add to the generated SDK info file.
type AdditionalSdkInfo struct {
Properties map[string]interface{}
}
var AdditionalSdkInfoProvider = blueprint.NewProvider(AdditionalSdkInfo{})

View File

@@ -212,6 +212,10 @@ func createSystemModules(mctx android.LoadHookContext, version, scope string) {
mctx.CreateModule(systemModulesImportFactory, &props) mctx.CreateModule(systemModulesImportFactory, &props)
} }
func PrebuiltApiModuleName(module, scope, version string) string {
return module + ".api." + scope + "." + version
}
func prebuiltApiFiles(mctx android.LoadHookContext, p *prebuiltApis) { func prebuiltApiFiles(mctx android.LoadHookContext, p *prebuiltApis) {
// <apiver>/<scope>/api/<module>.txt // <apiver>/<scope>/api/<module>.txt
apiLevelFiles := globApiDirs(mctx, p, "api/*.txt") apiLevelFiles := globApiDirs(mctx, p, "api/*.txt")
@@ -220,12 +224,9 @@ func prebuiltApiFiles(mctx android.LoadHookContext, p *prebuiltApis) {
} }
// Create modules for all (<module>, <scope, <version>) triplets, // Create modules for all (<module>, <scope, <version>) triplets,
apiModuleName := func(module, scope, version string) string {
return module + ".api." + scope + "." + version
}
for _, f := range apiLevelFiles { for _, f := range apiLevelFiles {
module, version, scope := parseFinalizedPrebuiltPath(mctx, f) module, version, scope := parseFinalizedPrebuiltPath(mctx, f)
createApiModule(mctx, apiModuleName(module, scope, strconv.Itoa(version)), f) createApiModule(mctx, PrebuiltApiModuleName(module, scope, strconv.Itoa(version)), f)
} }
// Figure out the latest version of each module/scope // Figure out the latest version of each module/scope
@@ -266,7 +267,7 @@ func prebuiltApiFiles(mctx android.LoadHookContext, p *prebuiltApis) {
// Sort the keys in order to make build.ninja stable // Sort the keys in order to make build.ninja stable
for _, k := range android.SortedStringKeys(latest) { for _, k := range android.SortedStringKeys(latest) {
info := latest[k] info := latest[k]
name := apiModuleName(info.module, info.scope, "latest") name := PrebuiltApiModuleName(info.module, info.scope, "latest")
createApiModule(mctx, name, info.path) createApiModule(mctx, name, info.path)
} }
@@ -278,7 +279,7 @@ func prebuiltApiFiles(mctx android.LoadHookContext, p *prebuiltApis) {
filename, _, scope := parsePrebuiltPath(mctx, f) filename, _, scope := parsePrebuiltPath(mctx, f)
referencedModule := strings.TrimSuffix(filename, "-incompatibilities") referencedModule := strings.TrimSuffix(filename, "-incompatibilities")
createApiModule(mctx, apiModuleName(referencedModule+"-incompatibilities", scope, "latest"), f) createApiModule(mctx, PrebuiltApiModuleName(referencedModule+"-incompatibilities", scope, "latest"), f)
incompatibilities[referencedModule+"."+scope] = true incompatibilities[referencedModule+"."+scope] = true
} }
@@ -286,7 +287,7 @@ func prebuiltApiFiles(mctx android.LoadHookContext, p *prebuiltApis) {
// Create empty incompatibilities files for remaining modules // Create empty incompatibilities files for remaining modules
for _, k := range android.SortedStringKeys(latest) { for _, k := range android.SortedStringKeys(latest) {
if _, ok := incompatibilities[k]; !ok { if _, ok := incompatibilities[k]; !ok {
createEmptyFile(mctx, apiModuleName(latest[k].module+"-incompatibilities", latest[k].scope, "latest")) createEmptyFile(mctx, PrebuiltApiModuleName(latest[k].module+"-incompatibilities", latest[k].scope, "latest"))
} }
} }
} }

View File

@@ -97,6 +97,13 @@ type apiScope struct {
// The tag to use to depend on the stubs source and API module. // The tag to use to depend on the stubs source and API module.
stubsSourceAndApiTag scopeDependencyTag stubsSourceAndApiTag scopeDependencyTag
// The tag to use to depend on the module that provides the latest version of the API .txt file.
latestApiModuleTag scopeDependencyTag
// The tag to use to depend on the module that provides the latest version of the API removed.txt
// file.
latestRemovedApiModuleTag scopeDependencyTag
// The scope specific prefix to add to the api file base of "current.txt" or "removed.txt". // The scope specific prefix to add to the api file base of "current.txt" or "removed.txt".
apiFilePrefix string apiFilePrefix string
@@ -158,6 +165,16 @@ func initApiScope(scope *apiScope) *apiScope {
apiScope: scope, apiScope: scope,
depInfoExtractor: (*scopePaths).extractStubsSourceAndApiInfoFromApiStubsProvider, depInfoExtractor: (*scopePaths).extractStubsSourceAndApiInfoFromApiStubsProvider,
} }
scope.latestApiModuleTag = scopeDependencyTag{
name: name + "-latest-api",
apiScope: scope,
depInfoExtractor: (*scopePaths).extractLatestApiPath,
}
scope.latestRemovedApiModuleTag = scopeDependencyTag{
name: name + "-latest-removed-api",
apiScope: scope,
depInfoExtractor: (*scopePaths).extractLatestRemovedApiPath,
}
// To get the args needed to generate the stubs source append all the args from // To get the args needed to generate the stubs source append all the args from
// this scope and all the scopes it extends as each set of args adds additional // this scope and all the scopes it extends as each set of args adds additional
@@ -203,6 +220,24 @@ func (scope *apiScope) String() string {
return scope.name return scope.name
} }
// snapshotRelativeDir returns the snapshot directory into which the files related to scopes will
// be stored.
func (scope *apiScope) snapshotRelativeDir() string {
return filepath.Join("sdk_library", scope.name)
}
// snapshotRelativeCurrentApiTxtPath returns the snapshot path to the API .txt file for the named
// library.
func (scope *apiScope) snapshotRelativeCurrentApiTxtPath(name string) string {
return filepath.Join(scope.snapshotRelativeDir(), name+".txt")
}
// snapshotRelativeRemovedApiTxtPath returns the snapshot path to the removed API .txt file for the
// named library.
func (scope *apiScope) snapshotRelativeRemovedApiTxtPath(name string) string {
return filepath.Join(scope.snapshotRelativeDir(), name+"-removed.txt")
}
type apiScopes []*apiScope type apiScopes []*apiScope
func (scopes apiScopes) Strings(accessor func(*apiScope) string) []string { func (scopes apiScopes) Strings(accessor func(*apiScope) string) []string {
@@ -539,6 +574,12 @@ type scopePaths struct {
// Extracted annotations. // Extracted annotations.
annotationsZip android.OptionalPath annotationsZip android.OptionalPath
// The path to the latest API file.
latestApiPath android.OptionalPath
// The path to the latest removed API file.
latestRemovedApiPath android.OptionalPath
} }
func (paths *scopePaths) extractStubsLibraryInfoFromDependency(ctx android.ModuleContext, dep android.Module) error { func (paths *scopePaths) extractStubsLibraryInfoFromDependency(ctx android.ModuleContext, dep android.Module) error {
@@ -602,6 +643,31 @@ func (paths *scopePaths) extractStubsSourceAndApiInfoFromApiStubsProvider(ctx an
}) })
} }
func extractSingleOptionalOutputPath(dep android.Module) (android.OptionalPath, error) {
var paths android.Paths
if sourceFileProducer, ok := dep.(android.SourceFileProducer); ok {
paths = sourceFileProducer.Srcs()
} else {
return android.OptionalPath{}, fmt.Errorf("module %q does not produce source files", dep)
}
if len(paths) != 1 {
return android.OptionalPath{}, fmt.Errorf("expected one path from %q, got %q", dep, paths)
}
return android.OptionalPathForPath(paths[0]), nil
}
func (paths *scopePaths) extractLatestApiPath(ctx android.ModuleContext, dep android.Module) error {
outputPath, err := extractSingleOptionalOutputPath(dep)
paths.latestApiPath = outputPath
return err
}
func (paths *scopePaths) extractLatestRemovedApiPath(ctx android.ModuleContext, dep android.Module) error {
outputPath, err := extractSingleOptionalOutputPath(dep)
paths.latestRemovedApiPath = outputPath
return err
}
type commonToSdkLibraryAndImportProperties struct { type commonToSdkLibraryAndImportProperties struct {
// The naming scheme to use for the components that this module creates. // The naming scheme to use for the components that this module creates.
// //
@@ -1174,6 +1240,16 @@ func (module *SdkLibrary) ComponentDepsMutator(ctx android.BottomUpMutatorContex
// Add a dependency on the stubs source in order to access both stubs source and api information. // Add a dependency on the stubs source in order to access both stubs source and api information.
ctx.AddVariationDependencies(nil, apiScope.stubsSourceAndApiTag, module.stubsSourceModuleName(apiScope)) ctx.AddVariationDependencies(nil, apiScope.stubsSourceAndApiTag, module.stubsSourceModuleName(apiScope))
if module.compareAgainstLatestApi(apiScope) {
// Add dependencies on the latest finalized version of the API .txt file.
latestApiModuleName := module.latestApiModuleName(apiScope)
ctx.AddDependency(module, apiScope.latestApiModuleTag, latestApiModuleName)
// Add dependencies on the latest finalized version of the remove API .txt file.
latestRemovedApiModuleName := module.latestRemovedApiModuleName(apiScope)
ctx.AddDependency(module, apiScope.latestRemovedApiModuleTag, latestRemovedApiModuleName)
}
} }
if module.requiresRuntimeImplementationLibrary() { if module.requiresRuntimeImplementationLibrary() {
@@ -1194,13 +1270,13 @@ func (module *SdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
if apiScope.unstable { if apiScope.unstable {
continue continue
} }
if m := android.SrcIsModule(module.latestApiFilegroupName(apiScope)); !ctx.OtherModuleExists(m) { if m := module.latestApiModuleName(apiScope); !ctx.OtherModuleExists(m) {
missingApiModules = append(missingApiModules, m) missingApiModules = append(missingApiModules, m)
} }
if m := android.SrcIsModule(module.latestRemovedApiFilegroupName(apiScope)); !ctx.OtherModuleExists(m) { if m := module.latestRemovedApiModuleName(apiScope); !ctx.OtherModuleExists(m) {
missingApiModules = append(missingApiModules, m) missingApiModules = append(missingApiModules, m)
} }
if m := android.SrcIsModule(module.latestIncompatibilitiesFilegroupName(apiScope)); !ctx.OtherModuleExists(m) { if m := module.latestIncompatibilitiesModuleName(apiScope); !ctx.OtherModuleExists(m) {
missingApiModules = append(missingApiModules, m) missingApiModules = append(missingApiModules, m)
} }
} }
@@ -1274,6 +1350,26 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext)
// Make the set of components exported by this module available for use elsewhere. // Make the set of components exported by this module available for use elsewhere.
exportedComponentInfo := android.ExportedComponentsInfo{Components: android.SortedStringKeys(exportedComponents)} exportedComponentInfo := android.ExportedComponentsInfo{Components: android.SortedStringKeys(exportedComponents)}
ctx.SetProvider(android.ExportedComponentsInfoProvider, exportedComponentInfo) ctx.SetProvider(android.ExportedComponentsInfoProvider, exportedComponentInfo)
// Provide additional information for inclusion in an sdk's generated .info file.
additionalSdkInfo := map[string]interface{}{}
additionalSdkInfo["dist_stem"] = module.distStem()
baseModuleName := module.BaseModuleName()
scopes := map[string]interface{}{}
additionalSdkInfo["scopes"] = scopes
for scope, scopePaths := range module.scopePaths {
scopeInfo := map[string]interface{}{}
scopes[scope.name] = scopeInfo
scopeInfo["current_api"] = scope.snapshotRelativeCurrentApiTxtPath(baseModuleName)
scopeInfo["removed_api"] = scope.snapshotRelativeRemovedApiTxtPath(baseModuleName)
if p := scopePaths.latestApiPath; p.Valid() {
scopeInfo["latest_api"] = p.Path().String()
}
if p := scopePaths.latestRemovedApiPath; p.Valid() {
scopeInfo["latest_removed_api"] = p.Path().String()
}
}
ctx.SetProvider(android.AdditionalSdkInfoProvider, android.AdditionalSdkInfo{additionalSdkInfo})
} }
func (module *SdkLibrary) AndroidMkEntries() []android.AndroidMkEntries { func (module *SdkLibrary) AndroidMkEntries() []android.AndroidMkEntries {
@@ -1319,16 +1415,32 @@ func (module *SdkLibrary) distGroup() string {
return proptools.StringDefault(module.sdkLibraryProperties.Dist_group, "unknown") return proptools.StringDefault(module.sdkLibraryProperties.Dist_group, "unknown")
} }
func latestPrebuiltApiModuleName(name string, apiScope *apiScope) string {
return PrebuiltApiModuleName(name, apiScope.name, "latest")
}
func (module *SdkLibrary) latestApiFilegroupName(apiScope *apiScope) string { func (module *SdkLibrary) latestApiFilegroupName(apiScope *apiScope) string {
return ":" + module.distStem() + ".api." + apiScope.name + ".latest" return ":" + module.latestApiModuleName(apiScope)
}
func (module *SdkLibrary) latestApiModuleName(apiScope *apiScope) string {
return latestPrebuiltApiModuleName(module.distStem(), apiScope)
} }
func (module *SdkLibrary) latestRemovedApiFilegroupName(apiScope *apiScope) string { func (module *SdkLibrary) latestRemovedApiFilegroupName(apiScope *apiScope) string {
return ":" + module.distStem() + "-removed.api." + apiScope.name + ".latest" return ":" + module.latestRemovedApiModuleName(apiScope)
}
func (module *SdkLibrary) latestRemovedApiModuleName(apiScope *apiScope) string {
return latestPrebuiltApiModuleName(module.distStem()+"-removed", apiScope)
} }
func (module *SdkLibrary) latestIncompatibilitiesFilegroupName(apiScope *apiScope) string { func (module *SdkLibrary) latestIncompatibilitiesFilegroupName(apiScope *apiScope) string {
return ":" + module.distStem() + "-incompatibilities.api." + apiScope.name + ".latest" return ":" + module.latestIncompatibilitiesModuleName(apiScope)
}
func (module *SdkLibrary) latestIncompatibilitiesModuleName(apiScope *apiScope) string {
return latestPrebuiltApiModuleName(module.distStem()+"-incompatibilities", apiScope)
} }
func childModuleVisibility(childVisibility []string) []string { func childModuleVisibility(childVisibility []string) []string {
@@ -1557,7 +1669,7 @@ func (module *SdkLibrary) createStubsSourcesAndApi(mctx android.DefaultableHookC
props.Check_api.Current.Api_file = proptools.StringPtr(currentApiFileName) props.Check_api.Current.Api_file = proptools.StringPtr(currentApiFileName)
props.Check_api.Current.Removed_api_file = proptools.StringPtr(removedApiFileName) props.Check_api.Current.Removed_api_file = proptools.StringPtr(removedApiFileName)
if !(apiScope.unstable || module.sdkLibraryProperties.Unsafe_ignore_missing_latest_api) { if module.compareAgainstLatestApi(apiScope) {
// check against the latest released API // check against the latest released API
latestApiFilegroupName := proptools.StringPtr(module.latestApiFilegroupName(apiScope)) latestApiFilegroupName := proptools.StringPtr(module.latestApiFilegroupName(apiScope))
props.Previous_api = latestApiFilegroupName props.Previous_api = latestApiFilegroupName
@@ -1609,6 +1721,10 @@ func (module *SdkLibrary) createStubsSourcesAndApi(mctx android.DefaultableHookC
mctx.CreateModule(DroidstubsFactory, &props) mctx.CreateModule(DroidstubsFactory, &props)
} }
func (module *SdkLibrary) compareAgainstLatestApi(apiScope *apiScope) bool {
return !(apiScope.unstable || module.sdkLibraryProperties.Unsafe_ignore_missing_latest_api)
}
// Implements android.ApexModule // Implements android.ApexModule
func (module *SdkLibrary) DepIsInSameApex(mctx android.BaseModuleContext, dep android.Module) bool { func (module *SdkLibrary) DepIsInSameApex(mctx android.BaseModuleContext, dep android.Module) bool {
depTag := mctx.OtherModuleDependencyTag(dep) depTag := mctx.OtherModuleDependencyTag(dep)
@@ -2903,7 +3019,7 @@ func (s *sdkLibrarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberCo
if properties, ok := s.Scopes[apiScope]; ok { if properties, ok := s.Scopes[apiScope]; ok {
scopeSet := propertySet.AddPropertySet(apiScope.propertyName) scopeSet := propertySet.AddPropertySet(apiScope.propertyName)
scopeDir := filepath.Join("sdk_library", s.OsPrefix(), apiScope.name) scopeDir := apiScope.snapshotRelativeDir()
var jars []string var jars []string
for _, p := range properties.Jars { for _, p := range properties.Jars {
@@ -2927,13 +3043,13 @@ func (s *sdkLibrarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberCo
} }
if properties.CurrentApiFile != nil { if properties.CurrentApiFile != nil {
currentApiSnapshotPath := filepath.Join(scopeDir, ctx.Name()+".txt") currentApiSnapshotPath := apiScope.snapshotRelativeCurrentApiTxtPath(ctx.Name())
ctx.SnapshotBuilder().CopyToSnapshot(properties.CurrentApiFile, currentApiSnapshotPath) ctx.SnapshotBuilder().CopyToSnapshot(properties.CurrentApiFile, currentApiSnapshotPath)
scopeSet.AddProperty("current_api", currentApiSnapshotPath) scopeSet.AddProperty("current_api", currentApiSnapshotPath)
} }
if properties.RemovedApiFile != nil { if properties.RemovedApiFile != nil {
removedApiSnapshotPath := filepath.Join(scopeDir, ctx.Name()+"-removed.txt") removedApiSnapshotPath := apiScope.snapshotRelativeRemovedApiTxtPath(ctx.Name())
ctx.SnapshotBuilder().CopyToSnapshot(properties.RemovedApiFile, removedApiSnapshotPath) ctx.SnapshotBuilder().CopyToSnapshot(properties.RemovedApiFile, removedApiSnapshotPath)
scopeSet.AddProperty("removed_api", removedApiSnapshotPath) scopeSet.AddProperty("removed_api", removedApiSnapshotPath)
} }

View File

@@ -126,6 +126,10 @@ func TestJavaSdkLibrary(t *testing.T) {
exportedComponentsInfo := result.ModuleProvider(foo.Module(), android.ExportedComponentsInfoProvider).(android.ExportedComponentsInfo) exportedComponentsInfo := result.ModuleProvider(foo.Module(), android.ExportedComponentsInfoProvider).(android.ExportedComponentsInfo)
expectedFooExportedComponents := []string{ expectedFooExportedComponents := []string{
"foo-removed.api.public.latest",
"foo-removed.api.system.latest",
"foo.api.public.latest",
"foo.api.system.latest",
"foo.stubs", "foo.stubs",
"foo.stubs.source", "foo.stubs.source",
"foo.stubs.source.system", "foo.stubs.source.system",
@@ -529,6 +533,8 @@ func TestJavaSdkLibrary_Deps(t *testing.T) {
CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{ CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
`dex2oatd`, `dex2oatd`,
`sdklib-removed.api.public.latest`,
`sdklib.api.public.latest`,
`sdklib.impl`, `sdklib.impl`,
`sdklib.stubs`, `sdklib.stubs`,
`sdklib.stubs.source`, `sdklib.stubs.source`,
@@ -851,6 +857,8 @@ func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{ CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
`dex2oatd`, `dex2oatd`,
`prebuilt_sdklib`, `prebuilt_sdklib`,
`sdklib-removed.api.public.latest`,
`sdklib.api.public.latest`,
`sdklib.impl`, `sdklib.impl`,
`sdklib.stubs`, `sdklib.stubs`,
`sdklib.stubs.source`, `sdklib.stubs.source`,
@@ -894,6 +902,8 @@ func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{ CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
`prebuilt_sdklib`, `prebuilt_sdklib`,
`sdklib-removed.api.public.latest`,
`sdklib.api.public.latest`,
`sdklib.impl`, `sdklib.impl`,
`sdklib.stubs`, `sdklib.stubs`,
`sdklib.stubs.source`, `sdklib.stubs.source`,

View File

@@ -651,7 +651,19 @@ module_exports_snapshot {
} }
func TestSnapshotWithJavaSystemModules(t *testing.T) { func TestSnapshotWithJavaSystemModules(t *testing.T) {
result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, ` result := android.GroupFixturePreparers(
prepareForSdkTestWithJava,
java.PrepareForTestWithJavaDefaultModules,
java.PrepareForTestWithJavaSdkLibraryFiles,
java.FixtureWithPrebuiltApisAndExtensions(map[string][]string{
"31": {"myjavalib"},
"32": {"myjavalib"},
"current": {"myjavalib"},
}, map[string][]string{
"1": {"myjavalib"},
"2": {"myjavalib"},
}),
).RunTestWithBp(t, `
sdk { sdk {
name: "mysdk", name: "mysdk",
java_header_libs: ["exported-system-module"], java_header_libs: ["exported-system-module"],
@@ -796,7 +808,7 @@ sdk_snapshot {
.intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt .intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt
.intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_removed.txt -> sdk_library/public/myjavalib-removed.txt .intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_removed.txt -> sdk_library/public/myjavalib-removed.txt
`), `),
checkInfoContents(` checkInfoContents(result.Config, `
[ [
{ {
"@type": "sdk", "@type": "sdk",
@@ -826,7 +838,16 @@ sdk_snapshot {
}, },
{ {
"@type": "java_sdk_library", "@type": "java_sdk_library",
"@name": "myjavalib" "@name": "myjavalib",
"dist_stem": "myjavalib",
"scopes": {
"public": {
"current_api": "sdk_library/public/myjavalib.txt",
"latest_api": "out/soong/.intermediates/prebuilts/sdk/myjavalib.api.public.latest/gen/myjavalib.api.public.latest",
"latest_removed_api": "out/soong/.intermediates/prebuilts/sdk/myjavalib-removed.api.public.latest/gen/myjavalib-removed.api.public.latest",
"removed_api": "sdk_library/public/myjavalib-removed.txt"
}
}
}, },
{ {
"@type": "java_library", "@type": "java_library",

View File

@@ -406,11 +406,11 @@ func checkMergeZips(expected ...string) snapshotBuildInfoChecker {
// Check that the snapshot's info contents are ciorrect. // Check that the snapshot's info contents are ciorrect.
// //
// Both the expected and actual string are both trimmed before comparing. // Both the expected and actual string are both trimmed before comparing.
func checkInfoContents(expected string) snapshotBuildInfoChecker { func checkInfoContents(config android.Config, expected string) snapshotBuildInfoChecker {
return func(info *snapshotBuildInfo) { return func(info *snapshotBuildInfo) {
info.t.Helper() info.t.Helper()
android.AssertTrimmedStringEquals(info.t, "info contents do not match", android.AssertTrimmedStringEquals(info.t, "info contents do not match",
expected, info.infoContents) expected, android.StringRelativeToTop(config, info.infoContents))
} }
} }

View File

@@ -566,8 +566,9 @@ type moduleInfo struct {
name string name string
// A list of additional dependencies of the module. // A list of additional dependencies of the module.
deps []string deps []string
// Additional dynamic properties. // Additional member specific properties.
dynamic map[string]interface{} // These will be added into the generated JSON alongside the above properties.
memberSpecific map[string]interface{}
} }
func (m *moduleInfo) MarshalJSON() ([]byte, error) { func (m *moduleInfo) MarshalJSON() ([]byte, error) {
@@ -590,8 +591,8 @@ func (m *moduleInfo) MarshalJSON() ([]byte, error) {
if m.deps != nil { if m.deps != nil {
writeObjectPair("@deps", m.deps) writeObjectPair("@deps", m.deps)
} }
for _, k := range android.SortedStringKeys(m.dynamic) { for _, k := range android.SortedStringKeys(m.memberSpecific) {
v := m.dynamic[k] v := m.memberSpecific[k]
writeObjectPair(k, v) writeObjectPair(k, v)
} }
buffer.WriteString("}") buffer.WriteString("}")
@@ -604,9 +605,9 @@ var _ json.Marshaler = (*moduleInfo)(nil)
func (s *sdk) generateInfoData(ctx android.ModuleContext, memberVariantDeps []sdkMemberVariantDep) interface{} { func (s *sdk) generateInfoData(ctx android.ModuleContext, memberVariantDeps []sdkMemberVariantDep) interface{} {
modules := []*moduleInfo{} modules := []*moduleInfo{}
sdkInfo := moduleInfo{ sdkInfo := moduleInfo{
moduleType: "sdk", moduleType: "sdk",
name: ctx.ModuleName(), name: ctx.ModuleName(),
dynamic: map[string]interface{}{}, memberSpecific: map[string]interface{}{},
} }
modules = append(modules, &sdkInfo) modules = append(modules, &sdkInfo)
@@ -622,6 +623,10 @@ func (s *sdk) generateInfoData(ctx android.ModuleContext, memberVariantDeps []sd
moduleType: moduleType, moduleType: moduleType,
name: name, name: name,
} }
additionalSdkInfo := ctx.OtherModuleProvider(module, android.AdditionalSdkInfoProvider).(android.AdditionalSdkInfo)
info.memberSpecific = additionalSdkInfo.Properties
name2Info[name] = info name2Info[name] = info
} }
return info return info
@@ -630,13 +635,13 @@ func (s *sdk) generateInfoData(ctx android.ModuleContext, memberVariantDeps []sd
for _, memberVariantDep := range memberVariantDeps { for _, memberVariantDep := range memberVariantDeps {
propertyName := memberVariantDep.memberType.SdkPropertyName() propertyName := memberVariantDep.memberType.SdkPropertyName()
var list []string var list []string
if v, ok := sdkInfo.dynamic[propertyName]; ok { if v, ok := sdkInfo.memberSpecific[propertyName]; ok {
list = v.([]string) list = v.([]string)
} }
memberName := memberVariantDep.variant.Name() memberName := memberVariantDep.variant.Name()
list = append(list, memberName) list = append(list, memberName)
sdkInfo.dynamic[propertyName] = android.SortedUniqueStrings(list) sdkInfo.memberSpecific[propertyName] = android.SortedUniqueStrings(list)
if memberVariantDep.container != nil { if memberVariantDep.container != nil {
containerInfo := getModuleInfo(memberVariantDep.container) containerInfo := getModuleInfo(memberVariantDep.container)
@@ -1217,6 +1222,7 @@ type snapshotBuilder struct {
// The target build release for which the snapshot is to be generated. // The target build release for which the snapshot is to be generated.
targetBuildRelease *buildRelease targetBuildRelease *buildRelease
// The contents of the .info file that describes the sdk contents.
infoContents string infoContents string
} }