Merge "Stop suppressing the ChangedDefault error" into main
diff --git a/android/Android.bp b/android/Android.bp
index f5bb785..7fbba43 100644
--- a/android/Android.bp
+++ b/android/Android.bp
@@ -32,6 +32,7 @@
srcs: [
"androidmk.go",
"apex.go",
+ "apex_contributions.go",
"api_domain.go",
"api_levels.go",
"arch.go",
diff --git a/android/apex_contributions.go b/android/apex_contributions.go
new file mode 100644
index 0000000..a28ac31
--- /dev/null
+++ b/android/apex_contributions.go
@@ -0,0 +1,67 @@
+// Copyright 2023 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package android
+
+import (
+ "github.com/google/blueprint/proptools"
+)
+
+func init() {
+ RegisterApexContributionsBuildComponents(InitRegistrationContext)
+}
+
+func RegisterApexContributionsBuildComponents(ctx RegistrationContext) {
+ ctx.RegisterModuleType("apex_contributions", apexContributionsFactory)
+}
+
+type apexContributions struct {
+ ModuleBase
+ properties contributionProps
+}
+
+type contributionProps struct {
+ // Name of the mainline module
+ Api_domain *string
+ // A list of module names that should be used when this contribution
+ // is selected via product_config
+ // The name should be explicit (foo or prebuilt_foo)
+ Contents []string
+}
+
+func (m *apexContributions) ApiDomain() string {
+ return proptools.String(m.properties.Api_domain)
+}
+
+func (m *apexContributions) Contents() []string {
+ return m.properties.Contents
+}
+
+// apex_contributions contains a list of module names (source or
+// prebuilt) belonging to the mainline module
+// An apex can have multiple apex_contributions modules
+// with different combinations of source or prebuilts, but only one can be
+// selected via product_config.
+func apexContributionsFactory() Module {
+ module := &apexContributions{}
+ module.AddProperties(&module.properties)
+ InitAndroidModule(module)
+ return module
+}
+
+// This module type does not have any build actions.
+// It provides metadata that is used in post-deps mutator phase for source vs
+// prebuilts selection.
+func (m *apexContributions) GenerateAndroidBuildActions(ctx ModuleContext) {
+}
diff --git a/android/config.go b/android/config.go
index 213fa2f..4c31bb0 100644
--- a/android/config.go
+++ b/android/config.go
@@ -2124,3 +2124,8 @@
func (c *deviceConfig) HideFlaggedApis() bool {
return c.NextReleaseHideFlaggedApi() && !c.ReleaseExposeFlaggedApi()
}
+
+func (c *config) GetBuildFlag(name string) (string, bool) {
+ val, ok := c.productVariables.BuildFlags[name]
+ return val, ok
+}
diff --git a/android/util.go b/android/util.go
index 5375373..f687bca 100644
--- a/android/util.go
+++ b/android/util.go
@@ -61,17 +61,39 @@
// JoinWithPrefixAndSeparator prepends the prefix to each string in the list and
// returns them joined together with the given separator.
func JoinWithPrefixAndSeparator(strs []string, prefix string, sep string) string {
+ return JoinWithPrefixSuffixAndSeparator(strs, prefix, "", sep)
+}
+
+// JoinWithSuffixAndSeparator appends the suffix to each string in the list and
+// returns them joined together with the given separator.
+func JoinWithSuffixAndSeparator(strs []string, suffix string, sep string) string {
+ return JoinWithPrefixSuffixAndSeparator(strs, "", suffix, sep)
+}
+
+// JoinWithPrefixSuffixAndSeparator appends the prefix/suffix to each string in the list and
+// returns them joined together with the given separator.
+func JoinWithPrefixSuffixAndSeparator(strs []string, prefix, suffix, sep string) string {
if len(strs) == 0 {
return ""
}
+ // Pre-calculate the length of the result
+ length := 0
+ for _, s := range strs {
+ length += len(s)
+ }
+ length += (len(prefix)+len(suffix))*len(strs) + len(sep)*(len(strs)-1)
+
var buf strings.Builder
+ buf.Grow(length)
buf.WriteString(prefix)
buf.WriteString(strs[0])
+ buf.WriteString(suffix)
for i := 1; i < len(strs); i++ {
buf.WriteString(sep)
buf.WriteString(prefix)
buf.WriteString(strs[i])
+ buf.WriteString(suffix)
}
return buf.String()
}
diff --git a/android/variable.go b/android/variable.go
index 9896f20..648e4cf 100644
--- a/android/variable.go
+++ b/android/variable.go
@@ -492,6 +492,8 @@
NextReleaseHideFlaggedApi *bool `json:",omitempty"`
Release_expose_flagged_api *bool `json:",omitempty"`
+
+ BuildFlags map[string]string `json:",omitempty"`
}
type PartitionQualifiedVariablesType struct {
diff --git a/apex/builder.go b/apex/builder.go
index d75cc1d..afbfa1c 100644
--- a/apex/builder.go
+++ b/apex/builder.go
@@ -75,9 +75,11 @@
pctx.HostBinToolVariable("apex_sepolicy_tests", "apex_sepolicy_tests")
pctx.HostBinToolVariable("deapexer", "deapexer")
pctx.HostBinToolVariable("debugfs_static", "debugfs_static")
+ pctx.HostBinToolVariable("fsck_erofs", "fsck.erofs")
pctx.SourcePathVariable("genNdkUsedbyApexPath", "build/soong/scripts/gen_ndk_usedby_apex.sh")
pctx.HostBinToolVariable("conv_linker_config", "conv_linker_config")
pctx.HostBinToolVariable("assemble_vintf", "assemble_vintf")
+ pctx.HostBinToolVariable("apex_elf_checker", "apex_elf_checker")
}
var (
@@ -237,6 +239,12 @@
CommandDeps: []string{"${assemble_vintf}"},
Description: "run assemble_vintf",
})
+
+ apexElfCheckerUnwantedRule = pctx.StaticRule("apexElfCheckerUnwantedRule", blueprint.RuleParams{
+ Command: `${apex_elf_checker} --tool_path ${tool_path} --unwanted ${unwanted} ${in} && touch ${out}`,
+ CommandDeps: []string{"${apex_elf_checker}", "${deapexer}", "${debugfs_static}", "${fsck_erofs}", "${config.ClangBin}/llvm-readelf"},
+ Description: "run apex_elf_checker --unwanted",
+ }, "tool_path", "unwanted")
)
// buildManifest creates buile rules to modify the input apex_manifest.json to add information
@@ -886,6 +894,10 @@
if suffix == imageApexSuffix && ext4 == a.payloadFsType {
validations = append(validations, runApexSepolicyTests(ctx, unsignedOutputFile.OutputPath))
}
+ if !a.testApex && len(a.properties.Unwanted_transitive_deps) > 0 {
+ validations = append(validations,
+ runApexElfCheckerUnwanted(ctx, unsignedOutputFile.OutputPath, a.properties.Unwanted_transitive_deps))
+ }
ctx.Build(pctx, android.BuildParams{
Rule: rule,
Description: "signapk",
@@ -1164,3 +1176,17 @@
})
return timestamp
}
+
+func runApexElfCheckerUnwanted(ctx android.ModuleContext, apexFile android.OutputPath, unwanted []string) android.Path {
+ timestamp := android.PathForModuleOut(ctx, "apex_elf_unwanted.timestamp")
+ ctx.Build(pctx, android.BuildParams{
+ Rule: apexElfCheckerUnwantedRule,
+ Input: apexFile,
+ Output: timestamp,
+ Args: map[string]string{
+ "unwanted": android.JoinWithSuffixAndSeparator(unwanted, ".so", ":"),
+ "tool_path": ctx.Config().HostToolPath(ctx, "").String() + ":${config.ClangBin}",
+ },
+ })
+ return timestamp
+}
diff --git a/cc/config/global.go b/cc/config/global.go
index 892a86c..2ca9df9 100644
--- a/cc/config/global.go
+++ b/cc/config/global.go
@@ -174,9 +174,6 @@
"-Werror=format-security",
"-nostdlibinc",
- // Enable MLGO for register allocation.
- "-mllvm -regalloc-enable-advisor=release",
-
// Emit additional debug info for AutoFDO
"-fdebug-info-for-profiling",
}
@@ -205,8 +202,6 @@
"-Wl,--exclude-libs,libgcc_stripped.a",
"-Wl,--exclude-libs,libunwind_llvm.a",
"-Wl,--exclude-libs,libunwind.a",
- // Enable MLGO for register allocation.
- "-Wl,-mllvm,-regalloc-enable-advisor=release",
}
deviceGlobalLldflags = append(append(deviceGlobalLdflags, commonGlobalLldflags...),
diff --git a/cc/lto.go b/cc/lto.go
index 20e4f24..fb3b485 100644
--- a/cc/lto.go
+++ b/cc/lto.go
@@ -147,10 +147,15 @@
}
}
- // For ML training
- if ctx.Config().IsEnvTrue("THINLTO_EMIT_INDEXES_AND_IMPORTS") {
- ltoLdFlags = append(ltoLdFlags, "-Wl,--save-temps=import")
- ltoLdFlags = append(ltoLdFlags, "-Wl,--thinlto-emit-index-files")
+ // Register allocation MLGO flags for ARM64.
+ if ctx.Arch().ArchType == android.Arm64 {
+ ltoCFlags = append(ltoCFlags, "-mllvm -regalloc-enable-advisor=release")
+ ltoLdFlags = append(ltoLdFlags, "-Wl,-mllvm,-regalloc-enable-advisor=release")
+ // Flags for training MLGO model.
+ if ctx.Config().IsEnvTrue("THINLTO_EMIT_INDEXES_AND_IMPORTS") {
+ ltoLdFlags = append(ltoLdFlags, "-Wl,--save-temps=import")
+ ltoLdFlags = append(ltoLdFlags, "-Wl,--thinlto-emit-index-files")
+ }
}
flags.Local.CFlags = append(flags.Local.CFlags, ltoCFlags...)
diff --git a/cmd/soong_ui/main.go b/cmd/soong_ui/main.go
index 18cba77..34b1589 100644
--- a/cmd/soong_ui/main.go
+++ b/cmd/soong_ui/main.go
@@ -182,8 +182,12 @@
CriticalPath: criticalPath,
}}
- config := c.config(buildCtx, args...)
- config.SetLogsPrefix(c.logsPrefix)
+ freshConfig := func() build.Config {
+ config := c.config(buildCtx, args...)
+ config.SetLogsPrefix(c.logsPrefix)
+ return config
+ }
+ config := freshConfig()
logsDir := config.LogsDir()
buildStarted = config.BuildStartedTimeOrDefault(buildStarted)
@@ -213,6 +217,15 @@
log.Verbosef(" [%d] %s", i, arg)
}
+ // We need to call preProductConfigSetup before we can do product config, which is how we get
+ // PRODUCT_CONFIG_RELEASE_MAPS set for the final product config for the build.
+ // When product config uses a declarative language, we won't need to rerun product config.
+ preProductConfigSetup(buildCtx, config)
+ if build.SetProductReleaseConfigMaps(buildCtx, config) {
+ log.Verbose("Product release config maps found\n")
+ config = freshConfig()
+ }
+
defer func() {
stat.Finish()
criticalPath.WriteToMetrics(met)
@@ -225,7 +238,9 @@
}
-func logAndSymlinkSetup(buildCtx build.Context, config build.Config) {
+// This function must not modify config, since product config may cause us to recreate the config,
+// and we won't call this function a second time.
+func preProductConfigSetup(buildCtx build.Context, config build.Config) {
log := buildCtx.ContextImpl.Logger
logsPrefix := config.GetLogsPrefix()
build.SetupOutDir(buildCtx, config)
@@ -311,7 +326,6 @@
}
func dumpVar(ctx build.Context, config build.Config, args []string) {
- logAndSymlinkSetup(ctx, config)
flags := flag.NewFlagSet("dumpvar", flag.ExitOnError)
flags.SetOutput(ctx.Writer)
@@ -364,7 +378,6 @@
}
func dumpVars(ctx build.Context, config build.Config, args []string) {
- logAndSymlinkSetup(ctx, config)
flags := flag.NewFlagSet("dumpvars", flag.ExitOnError)
flags.SetOutput(ctx.Writer)
@@ -544,7 +557,6 @@
}
func runMake(ctx build.Context, config build.Config, _ []string) {
- logAndSymlinkSetup(ctx, config)
logsDir := config.LogsDir()
if config.IsVerbose() {
writer := ctx.Writer
diff --git a/genrule/allowlists.go b/genrule/allowlists.go
index 9cc98f5..8617de8 100644
--- a/genrule/allowlists.go
+++ b/genrule/allowlists.go
@@ -151,21 +151,6 @@
"link_layer_packets_python3_gen",
"llcp_packets_python3_gen",
"measure_io_as_jar",
- "nos_app_avb_service_genc++",
- "nos_app_avb_service_genc++_headers",
- "nos_app_avb_service_genc++_mock",
- "nos_app_identity_service_genc++",
- "nos_app_identity_service_genc++_headers",
- "nos_app_identity_service_genc++_mock",
- "nos_app_keymaster_service_genc++",
- "nos_app_keymaster_service_genc++_headers",
- "nos_app_keymaster_service_genc++_mock",
- "nos_app_weaver_service_genc++",
- "nos_app_weaver_service_genc++_headers",
- "nos_app_weaver_service_genc++_mock",
- "nos_generator_test_service_genc++",
- "nos_generator_test_service_genc++_headers",
- "nos_generator_test_service_genc++_mock",
"openwrt_rootfs_combined_aarch64",
"openwrt_rootfs_combined_x86_64",
"openwrt_rootfs_customization_aarch64",
diff --git a/java/sdk_library.go b/java/sdk_library.go
index 1de8972..ea45174 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -618,6 +618,10 @@
Api_lint struct {
// Enable api linting.
Enabled *bool
+
+ // If API lint is enabled, this flag controls whether a set of legitimate lint errors
+ // are turned off. The default is true.
+ Legacy_errors_allowed *bool
}
// TODO: determines whether to create HTML doc or not
@@ -1747,13 +1751,15 @@
android.JoinWithPrefix(module.sdkLibraryProperties.Hidden_api_packages, " --hide-package "))
}
droidstubsArgs = append(droidstubsArgs, module.sdkLibraryProperties.Droiddoc_options...)
- disabledWarnings := []string{
- "BroadcastBehavior",
- "DeprecationMismatch",
- "HiddenSuperclass",
- "MissingPermission",
- "SdkConstant",
- "Todo",
+ disabledWarnings := []string{"HiddenSuperclass"}
+ if proptools.BoolDefault(module.sdkLibraryProperties.Api_lint.Legacy_errors_allowed, true) {
+ disabledWarnings = append(disabledWarnings,
+ "BroadcastBehavior",
+ "DeprecationMismatch",
+ "MissingPermission",
+ "SdkConstant",
+ "Todo",
+ )
}
droidstubsArgs = append(droidstubsArgs, android.JoinWithPrefix(disabledWarnings, "--hide "))
diff --git a/ui/build/config.go b/ui/build/config.go
index c33312b..20d9204 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -31,6 +31,7 @@
"time"
"android/soong/shared"
+ "android/soong/ui/metrics"
"google.golang.org/protobuf/proto"
@@ -461,6 +462,42 @@
return NewConfig(ctx, getConfigArgs(action, dir, ctx, args)...)
}
+// Prepare for getting make variables. For them to be accurate, we need to have
+// obtained PRODUCT_RELEASE_CONFIG_MAPS.
+//
+// Returns:
+//
+// Whether config should be called again.
+//
+// TODO: when converting product config to a declarative language, make sure
+// that PRODUCT_RELEASE_CONFIG_MAPS is properly handled as a separate step in
+// that process.
+func SetProductReleaseConfigMaps(ctx Context, config Config) bool {
+ ctx.BeginTrace(metrics.RunKati, "SetProductReleaseConfigMaps")
+ defer ctx.EndTrace()
+
+ if config.SkipConfig() {
+ // This duplicates the logic from Build to skip product config
+ // if the user has explicitly said to.
+ return false
+ }
+
+ releaseConfigVars := []string{
+ "PRODUCT_RELEASE_CONFIG_MAPS",
+ }
+
+ origValue, _ := config.environ.Get("PRODUCT_RELEASE_CONFIG_MAPS")
+ // Get the PRODUCT_RELEASE_CONFIG_MAPS for this product, to avoid polluting the environment
+ // when we run product config to get the rest of the make vars.
+ releaseMapVars, err := dumpMakeVars(ctx, config, nil, releaseConfigVars, false, "")
+ if err != nil {
+ ctx.Fatalln("Error getting PRODUCT_RELEASE_CONFIG_MAPS:", err)
+ }
+ productReleaseConfigMaps := releaseMapVars["PRODUCT_RELEASE_CONFIG_MAPS"]
+ os.Setenv("PRODUCT_RELEASE_CONFIG_MAPS", productReleaseConfigMaps)
+ return origValue != productReleaseConfigMaps
+}
+
// storeConfigMetrics selects a set of configuration information and store in
// the metrics system for further analysis.
func storeConfigMetrics(ctx Context, config Config) {
diff --git a/ui/build/dumpvars.go b/ui/build/dumpvars.go
index efe7478..d364542 100644
--- a/ui/build/dumpvars.go
+++ b/ui/build/dumpvars.go
@@ -191,6 +191,9 @@
"TARGET_BUILD_APPS",
"TARGET_BUILD_UNBUNDLED",
+ // Additional release config maps
+ "PRODUCT_RELEASE_CONFIG_MAPS",
+
// compiler wrappers set up by make
"CC_WRAPPER",
"CXX_WRAPPER",