Filter duplicate modules in platform_compat_config_singleton

Previously, unpacking a snapshot containing a
prebuilt_platform_compat_config into a source build would cause build
failure because of duplicate ids because the singleton would collate
ids from both prebuilts (versioned and unversioned) and source.

This change filters out versioned prebuilts and only uses prebuilts
that are preferred and source modules that have not been replaced by a
prebuilt.

Bug: 182402754
Test: m nothing
Change-Id: Idacbb34444e5156370df70bf88c6e8a7e2d67890
This commit is contained in:
Paul Duffin 2021-03-24 12:08:53 +00:00
parent db462dd987
commit bb9ff5108b
2 changed files with 28 additions and 4 deletions

View file

@ -221,12 +221,40 @@ type platformCompatConfigSingleton struct {
metadata android.Path
}
// isModulePreferredByCompatConfig checks to see whether the module is preferred for use by
// platform compat config.
func isModulePreferredByCompatConfig(module android.Module) bool {
// A versioned prebuilt_platform_compat_config, i.e. foo-platform-compat-config@current should be
// ignored.
if s, ok := module.(android.SdkAware); ok {
if !s.ContainingSdk().Unversioned() {
return false
}
}
// A prebuilt module should only be used when it is preferred.
if pi, ok := module.(android.PrebuiltInterface); ok {
if p := pi.Prebuilt(); p != nil {
return p.UsePrebuilt()
}
}
// Otherwise, a module should only be used if it has not been replaced by a prebuilt.
return !module.IsReplacedByPrebuilt()
}
func (p *platformCompatConfigSingleton) GenerateBuildActions(ctx android.SingletonContext) {
var compatConfigMetadata android.Paths
ctx.VisitAllModules(func(module android.Module) {
if !module.Enabled() {
return
}
if c, ok := module.(platformCompatConfigMetadataProvider); ok {
if !isModulePreferredByCompatConfig(module) {
return
}
metadata := c.compatConfigMetadata()
compatConfigMetadata = append(compatConfigMetadata, metadata)
}

View file

@ -77,8 +77,6 @@ prebuilt_platform_compat_config {
// Make sure that the snapshot metadata is collated by the platform compat config singleton.
java.CheckMergedCompatConfigInputs(t, result, "snapshot module",
"out/soong/.intermediates/myconfig/android_common/myconfig_meta.xml",
// TODO(b/182402754): Remove this as only the config file from the preferred module should be used.
"snapshot/compat_configs/myconfig/myconfig_meta.xml",
)
}),
@ -86,8 +84,6 @@ prebuilt_platform_compat_config {
func(t *testing.T, result *android.TestResult) {
// Make sure that the snapshot metadata is collated by the platform compat config singleton.
java.CheckMergedCompatConfigInputs(t, result, "snapshot module",
"out/soong/.intermediates/myconfig/android_common/myconfig_meta.xml",
// TODO(b/182402754): Remove this as only the config file from the preferred module should be used.
"snapshot/compat_configs/myconfig/myconfig_meta.xml",
)
}),