Merge "Update outputFilesForModuleFromProvider" into main
diff --git a/apex/apex.go b/apex/apex.go
index 9fa48a8..e6815bc 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -1172,6 +1172,7 @@
"test_com.android.os.statsd",
"test_com.android.permission",
"test_com.android.wifi",
+ "test_imgdiag_com.android.art",
"test_jitzygote_com.android.art",
// go/keep-sorted end
}
diff --git a/apex/apex_test.go b/apex/apex_test.go
index 3c8700d..3bb3966 100644
--- a/apex/apex_test.go
+++ b/apex/apex_test.go
@@ -10037,6 +10037,56 @@
}
}
+func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
+ bp := `
+ apex {
+ name: "myapex",
+ key: "myapex.key",
+ bootclasspath_fragments: ["mybootclasspathfragment"],
+ min_sdk_version: "29",
+ }
+ apex_key {
+ name: "myapex.key",
+ }
+ bootclasspath_fragment {
+ name: "mybootclasspathfragment",
+ contents: ["foo"],
+ apex_available: ["myapex"],
+ hidden_api: {
+ split_packages: ["*"],
+ },
+ }
+ java_sdk_library {
+ name: "foo",
+ srcs: ["MyClass.java"],
+ apex_available: [ "myapex" ],
+ sdk_version: "current",
+ min_sdk_version: "29",
+ compile_dex: true,
+ }
+ `
+ fs := android.MockFS{
+ "lint-baseline.xml": nil,
+ }
+
+ result := android.GroupFixturePreparers(
+ prepareForApexTest,
+ java.PrepareForTestWithJavaSdkLibraryFiles,
+ java.PrepareForTestWithJacocoInstrumentation,
+ java.FixtureWithLastReleaseApis("foo"),
+ android.FixtureModifyConfig(func(config android.Config) {
+ config.SetApiLibraries([]string{"foo"})
+ }),
+ android.FixtureMergeMockFs(fs),
+ ).RunTestWithBp(t, bp)
+
+ myapex := result.ModuleForTests("myapex", "android_common_myapex")
+ lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
+ android.AssertStringDoesContain(t,
+ "myapex lint report expected to contain that of the sdk library impl lib as an input",
+ lintReportInputs, "foo.impl")
+}
+
// updatable apexes should propagate updatable=true to its apps
func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
bp := `
diff --git a/java/android_manifest.go b/java/android_manifest.go
index 8599003..0c77968 100644
--- a/java/android_manifest.go
+++ b/java/android_manifest.go
@@ -71,12 +71,15 @@
return targetSdkVersionLevel.IsPreview() && (ctx.Config().UnbundledBuildApps() || includedInMts(ctx.Module()))
}
-// Helper function that casts android.Module to java.androidTestApp
-// If this type conversion is possible, it queries whether the test app is included in an MTS suite
+// Helper function that returns true if android_test, android_test_helper_app, java_test are in an MTS suite.
func includedInMts(module android.Module) bool {
if test, ok := module.(androidTestApp); ok {
return test.includedInTestSuite("mts")
}
+ // java_test
+ if test, ok := module.(*Test); ok {
+ return android.PrefixInList(test.testProperties.Test_suites, "mts")
+ }
return false
}
diff --git a/java/app.go b/java/app.go
index 739ef1a..f35e4c3 100644
--- a/java/app.go
+++ b/java/app.go
@@ -345,7 +345,35 @@
}
}
+// TODO(b/156476221): Remove this allowlist
+var (
+ missingMinSdkVersionMtsAllowlist = []string{
+ "CellBroadcastReceiverGoogleUnitTests",
+ "CellBroadcastReceiverUnitTests",
+ "CtsBatterySavingTestCases",
+ "CtsDeviceAndProfileOwnerApp23",
+ "CtsDeviceAndProfileOwnerApp30",
+ "CtsIntentSenderApp",
+ "CtsJobSchedulerTestCases",
+ "CtsMimeMapTestCases",
+ "CtsTareTestCases",
+ "LibStatsPullTests",
+ "MediaProviderClientTests",
+ "TeleServiceTests",
+ "TestExternalImsServiceApp",
+ "TestSmsRetrieverApp",
+ "TetheringPrivilegedTests",
+ }
+)
+
+func checkMinSdkVersionMts(ctx android.ModuleContext, minSdkVersion android.ApiLevel) {
+ if includedInMts(ctx.Module()) && !minSdkVersion.Specified() && !android.InList(ctx.ModuleName(), missingMinSdkVersionMtsAllowlist) {
+ ctx.PropertyErrorf("min_sdk_version", "min_sdk_version is a required property for tests included in MTS")
+ }
+}
+
func (a *AndroidTestHelperApp) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+ checkMinSdkVersionMts(ctx, a.MinSdkVersion(ctx))
applicationId := a.appTestHelperAppProperties.Manifest_values.ApplicationId
if applicationId != nil {
if a.overridableAppProperties.Package_name != nil {
@@ -1366,6 +1394,7 @@
}
func (a *AndroidTest) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+ checkMinSdkVersionMts(ctx, a.MinSdkVersion(ctx))
var configs []tradefed.Config
if a.appTestProperties.Instrumentation_target_package != nil {
a.additionalAaptFlags = append(a.additionalAaptFlags,
diff --git a/java/app_test.go b/java/app_test.go
index 1a862fa..9e2d19e 100644
--- a/java/app_test.go
+++ b/java/app_test.go
@@ -4146,6 +4146,7 @@
bpTemplate := `
%v {
name: "mytest",
+ min_sdk_version: "34",
target_sdk_version: "%v",
test_suites: ["othersuite", "%v"],
}
diff --git a/java/java.go b/java/java.go
index 6fee7ce..a2fc5fb 100644
--- a/java/java.go
+++ b/java/java.go
@@ -1510,6 +1510,7 @@
}
func (j *Test) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+ checkMinSdkVersionMts(ctx, j.MinSdkVersion(ctx))
j.generateAndroidBuildActionsWithConfig(ctx, nil)
android.SetProvider(ctx, testing.TestModuleProviderKey, testing.TestModuleProviderData{})
}
diff --git a/java/sdk_library.go b/java/sdk_library.go
index 82f6cb5..e6cb6c4 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -118,9 +118,6 @@
// The tag to use to depend on the stubs source module (if separate from the API module).
stubsSourceTag scopeDependencyTag
- // The tag to use to depend on the API file generating module (if separate from the stubs source module).
- apiFileTag scopeDependencyTag
-
// The tag to use to depend on the stubs source and API module.
stubsSourceAndApiTag scopeDependencyTag
@@ -195,11 +192,6 @@
apiScope: scope,
depInfoExtractor: (*scopePaths).extractStubsSourceInfoFromDep,
}
- scope.apiFileTag = scopeDependencyTag{
- name: name + "-api",
- apiScope: scope,
- depInfoExtractor: (*scopePaths).extractApiInfoFromDep,
- }
scope.stubsSourceAndApiTag = scopeDependencyTag{
name: name + "-stubs-source-and-api",
apiScope: scope,
@@ -804,12 +796,6 @@
return combinedError
}
-func (paths *scopePaths) extractApiInfoFromDep(ctx android.ModuleContext, dep android.Module) error {
- return paths.treatDepAsApiStubsProvider(dep, func(provider ApiStubsProvider) error {
- return paths.extractApiInfoFromApiStubsProvider(provider, Everything)
- })
-}
-
func (paths *scopePaths) extractStubsSourceInfoFromApiStubsProviders(provider ApiStubsSrcProvider, stubsType StubsType) error {
stubsSrcJar, err := provider.StubsSrcJar(stubsType)
if err == nil {
@@ -819,22 +805,23 @@
}
func (paths *scopePaths) extractStubsSourceInfoFromDep(ctx android.ModuleContext, dep android.Module) error {
+ stubsType := Everything
+ if ctx.Config().ReleaseHiddenApiExportableStubs() {
+ stubsType = Exportable
+ }
return paths.treatDepAsApiStubsSrcProvider(dep, func(provider ApiStubsSrcProvider) error {
- return paths.extractStubsSourceInfoFromApiStubsProviders(provider, Everything)
+ return paths.extractStubsSourceInfoFromApiStubsProviders(provider, stubsType)
})
}
func (paths *scopePaths) extractStubsSourceAndApiInfoFromApiStubsProvider(ctx android.ModuleContext, dep android.Module) error {
+ stubsType := Everything
if ctx.Config().ReleaseHiddenApiExportableStubs() {
- return paths.treatDepAsApiStubsProvider(dep, func(provider ApiStubsProvider) error {
- extractApiInfoErr := paths.extractApiInfoFromApiStubsProvider(provider, Exportable)
- extractStubsSourceInfoErr := paths.extractStubsSourceInfoFromApiStubsProviders(provider, Exportable)
- return errors.Join(extractApiInfoErr, extractStubsSourceInfoErr)
- })
+ stubsType = Exportable
}
return paths.treatDepAsApiStubsProvider(dep, func(provider ApiStubsProvider) error {
- extractApiInfoErr := paths.extractApiInfoFromApiStubsProvider(provider, Everything)
- extractStubsSourceInfoErr := paths.extractStubsSourceInfoFromApiStubsProviders(provider, Everything)
+ extractApiInfoErr := paths.extractApiInfoFromApiStubsProvider(provider, stubsType)
+ extractStubsSourceInfoErr := paths.extractStubsSourceInfoFromApiStubsProviders(provider, stubsType)
return errors.Join(extractApiInfoErr, extractStubsSourceInfoErr)
})
}
diff --git a/scripts/buildinfo.py b/scripts/buildinfo.py
index 3383bf7..db99209 100755
--- a/scripts/buildinfo.py
+++ b/scripts/buildinfo.py
@@ -68,6 +68,7 @@
option.build_id = product_config["BuildId"]
option.build_type = product_config["BuildType"]
option.build_variant = get_build_variant(product_config)
+ option.build_version_tags = product_config["BuildVersionTags"]
option.cpu_abis = product_config["DeviceAbi"]
option.default_locale = None
if len(product_config.get("ProductLocales", [])) > 0:
@@ -96,9 +97,11 @@
build_hostname = option.build_hostname_file.read().strip()
build_number = option.build_number_file.read().strip()
- build_version_tags = option.build_keys
+ build_version_tags_list = option.build_version_tags
if option.build_type == "debug":
- build_version_tags = "debug," + build_version_tags
+ build_version_tags_list.append("debug")
+ build_version_tags_list.append(option.build_keys)
+ build_version_tags = ",".join(sorted(set(build_version_tags_list)))
raw_date = option.date_file.read().strip()
date = subprocess.check_output(["date", "-d", f"@{raw_date}"], text=True).strip()
diff --git a/scripts/gen_build_prop.py b/scripts/gen_build_prop.py
index 6c02906..42e3207 100644
--- a/scripts/gen_build_prop.py
+++ b/scripts/gen_build_prop.py
@@ -73,9 +73,13 @@
config["BuildHostname"] = args.build_hostname_file.read().strip()
config["BuildNumber"] = args.build_number_file.read().strip()
config["BuildUsername"] = args.build_username
- config["BuildVersionTags"] = config["BuildKeys"]
+
+ build_version_tags_list = config["BuildVersionTags"]
if config["BuildType"] == "debug":
- config["BuildVersionTags"] = "debug," + config["BuildVersionTags"]
+ build_version_tags_list.append("debug")
+ build_version_tags_list.append(config["BuildKeys"])
+ build_version_tags = ",".join(sorted(set(build_version_tags_list)))
+ config["BuildVersionTags"] = build_version_tags
raw_date = args.date_file.read().strip()
config["Date"] = subprocess.check_output(["date", "-d", f"@{raw_date}"], text=True).strip()
diff --git a/ui/build/config.go b/ui/build/config.go
index c4a6797..1d5269c 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -99,9 +99,10 @@
// Autodetected
totalRAM uint64
- brokenDupRules bool
- brokenUsesNetwork bool
- brokenNinjaEnvVars []string
+ brokenDupRules bool
+ brokenUsesNetwork bool
+ brokenNinjaEnvVars []string
+ brokenMissingOutputs bool
pathReplaced bool
@@ -1608,6 +1609,14 @@
return c.brokenNinjaEnvVars
}
+func (c *configImpl) SetBuildBrokenMissingOutputs(val bool) {
+ c.brokenMissingOutputs = val
+}
+
+func (c *configImpl) BuildBrokenMissingOutputs() bool {
+ return c.brokenMissingOutputs
+}
+
func (c *configImpl) SetTargetDeviceDir(dir string) {
c.targetDeviceDir = dir
}
diff --git a/ui/build/dumpvars.go b/ui/build/dumpvars.go
index eba86a0..e77df44 100644
--- a/ui/build/dumpvars.go
+++ b/ui/build/dumpvars.go
@@ -235,6 +235,11 @@
"BUILD_BROKEN_SRC_DIR_IS_WRITABLE",
"BUILD_BROKEN_SRC_DIR_RW_ALLOWLIST",
+ // Whether missing outputs should be treated as warnings
+ // instead of errors.
+ // `true` will relegate missing outputs to warnings.
+ "BUILD_BROKEN_MISSING_OUTPUTS",
+
// Not used, but useful to be in the soong.log
"TARGET_BUILD_TYPE",
"HOST_ARCH",
@@ -301,4 +306,5 @@
config.SetBuildBrokenUsesNetwork(makeVars["BUILD_BROKEN_USES_NETWORK"] == "true")
config.SetBuildBrokenNinjaUsesEnvVars(strings.Fields(makeVars["BUILD_BROKEN_NINJA_USES_ENV_VARS"]))
config.SetSourceRootDirs(strings.Fields(makeVars["PRODUCT_SOURCE_ROOT_DIRS"]))
+ config.SetBuildBrokenMissingOutputs(makeVars["BUILD_BROKEN_MISSING_OUTPUTS"] == "true")
}
diff --git a/ui/build/ninja.go b/ui/build/ninja.go
index 551b8ab..ae27330 100644
--- a/ui/build/ninja.go
+++ b/ui/build/ninja.go
@@ -77,6 +77,14 @@
"-w", "dupbuild=err",
"-w", "missingdepfile=err")
+ if !config.BuildBrokenMissingOutputs() {
+ // Missing outputs will be treated as errors.
+ // BUILD_BROKEN_MISSING_OUTPUTS can be used to bypass this check.
+ args = append(args,
+ "-w", "missingoutfile=err",
+ )
+ }
+
cmd := Command(ctx, config, "ninja", executable, args...)
// Set up the nsjail sandbox Ninja runs in.