summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Paul Duffin <paulduffin@google.com> 2021-03-24 12:08:53 +0000
committer Paul Duffin <paulduffin@google.com> 2021-03-25 12:53:25 +0000
commitbb9ff5108b409fc02c5b7e3ab7c86c9de996377e (patch)
tree15c8c12f65acb64443057676fe2853c2fae615ec
parentdb462dd9878e6d412139e853e2c1224caf7452a3 (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.go28
-rw-r--r--sdk/compat_config_sdk_test.go4
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",
)
}),