From bb9ff5108b409fc02c5b7e3ab7c86c9de996377e Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Wed, 24 Mar 2021 12:08:53 +0000 Subject: [PATCH] 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 --- java/platform_compat_config.go | 28 ++++++++++++++++++++++++++++ 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", ) }),