diff options
author | 2021-03-24 12:08:53 +0000 | |
---|---|---|
committer | 2021-03-25 12:53:25 +0000 | |
commit | bb9ff5108b409fc02c5b7e3ab7c86c9de996377e (patch) | |
tree | 15c8c12f65acb64443057676fe2853c2fae615ec | |
parent | db462dd9878e6d412139e853e2c1224caf7452a3 (diff) |
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
-rw-r--r-- | java/platform_compat_config.go | 28 | ||||
-rw-r--r-- | sdk/compat_config_sdk_test.go | 4 |
2 files changed, 28 insertions, 4 deletions
diff --git a/java/platform_compat_config.go b/java/platform_compat_config.go index 03e82c2a8..c3d13ae65 100644 --- a/java/platform_compat_config.go +++ b/java/platform_compat_config.go @@ -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) } diff --git a/sdk/compat_config_sdk_test.go b/sdk/compat_config_sdk_test.go index 1b62885bd..00073c29d 100644 --- a/sdk/compat_config_sdk_test.go +++ b/sdk/compat_config_sdk_test.go @@ -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", ) }), |