Revert^4 "Implement detecting container violations."
This change introduces a method to detect violating inter-container dependencies between modules. The method is run in `ModuleBase.GenerateBuildActions`, after the container info provider is set. Given that the provider of the direct dependencies would have been set at this time, the method utilizes this information to determine the violations, which are introduced in https://r.android.com/3141104. Note that this enforcement does not turn all inter-container dependencies as errors. Instead, it will only turn dependencies that matches the pre-defined violations into errors. Even if the dependency matches the violation, an error will not be thrown if the dependency satisfies any of the exception functions (e.g. the dependent module is stubs, or the two modules belong to the same apexes). Test: m nothing --no-skip-soong-tests Bug: 338660802 Change-Id: Ib9ddc0761fa46f1309b1a1a4f759d9a4e04fd70e
This commit is contained in:
@@ -16,6 +16,7 @@ package android
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"slices"
|
||||
"sort"
|
||||
"strconv"
|
||||
@@ -145,6 +146,17 @@ func (i ApexInfo) InApexModule(apexModuleName string) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// To satisfy the comparable interface
|
||||
func (i ApexInfo) Equal(other any) bool {
|
||||
otherApexInfo, ok := other.(ApexInfo)
|
||||
return ok && i.ApexVariationName == otherApexInfo.ApexVariationName &&
|
||||
i.MinSdkVersion == otherApexInfo.MinSdkVersion &&
|
||||
i.Updatable == otherApexInfo.Updatable &&
|
||||
i.UsePlatformApis == otherApexInfo.UsePlatformApis &&
|
||||
reflect.DeepEqual(i.InApexVariants, otherApexInfo.InApexVariants) &&
|
||||
reflect.DeepEqual(i.InApexModules, otherApexInfo.InApexModules)
|
||||
}
|
||||
|
||||
// ApexTestForInfo stores the contents of APEXes for which this module is a test - although this
|
||||
// module is not part of the APEX - and thus has access to APEX internals.
|
||||
type ApexTestForInfo struct {
|
||||
|
@@ -15,8 +15,10 @@
|
||||
package android
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"github.com/google/blueprint"
|
||||
)
|
||||
@@ -395,6 +397,40 @@ func (c *ContainersInfo) UpdatableApex() bool {
|
||||
|
||||
var ContainersInfoProvider = blueprint.NewProvider[ContainersInfo]()
|
||||
|
||||
func satisfyAllowedExceptions(ctx ModuleContext, allowedExceptionLabels []exceptionHandleFuncLabel, m, dep Module) bool {
|
||||
for _, label := range allowedExceptionLabels {
|
||||
if exceptionHandleFunctionsTable[label](ctx, m, dep) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (c *ContainersInfo) GetViolations(mctx ModuleContext, m, dep Module, depInfo ContainersInfo) []string {
|
||||
var violations []string
|
||||
|
||||
// Any containers that the module belongs to but the dependency does not belong to must be examined.
|
||||
_, containersUniqueToModule, _ := ListSetDifference(c.belongingContainers, depInfo.belongingContainers)
|
||||
|
||||
// Apex container should be examined even if both the module and the dependency belong to
|
||||
// the apex container to check that the two modules belong to the same apex.
|
||||
if InList(ApexContainer, c.belongingContainers) && !InList(ApexContainer, containersUniqueToModule) {
|
||||
containersUniqueToModule = append(containersUniqueToModule, ApexContainer)
|
||||
}
|
||||
|
||||
for _, containerUniqueToModule := range containersUniqueToModule {
|
||||
for _, restriction := range containerUniqueToModule.restricted {
|
||||
if InList(restriction.dependency, depInfo.belongingContainers) {
|
||||
if !satisfyAllowedExceptions(mctx, restriction.allowedExceptions, m, dep) {
|
||||
violations = append(violations, restriction.errorMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return violations
|
||||
}
|
||||
|
||||
func generateContainerInfo(ctx ModuleContext) ContainersInfo {
|
||||
var containers []*container
|
||||
|
||||
@@ -436,3 +472,32 @@ func setContainerInfo(ctx ModuleContext) {
|
||||
SetProvider(ctx, ContainersInfoProvider, containersInfo)
|
||||
}
|
||||
}
|
||||
|
||||
func checkContainerViolations(ctx ModuleContext) {
|
||||
if _, ok := ctx.Module().(InstallableModule); ok {
|
||||
containersInfo, _ := getContainerModuleInfo(ctx, ctx.Module())
|
||||
ctx.VisitDirectDepsIgnoreBlueprint(func(dep Module) {
|
||||
if !dep.Enabled(ctx) {
|
||||
return
|
||||
}
|
||||
|
||||
// Pre-existing violating dependencies are tracked in containerDependencyViolationAllowlist.
|
||||
// If this dependency is allowlisted, do not check for violation.
|
||||
// If not, check if this dependency matches any restricted dependency and
|
||||
// satisfies any exception functions, which allows bypassing the
|
||||
// restriction. If all of the exceptions are not satisfied, throw an error.
|
||||
if depContainersInfo, ok := getContainerModuleInfo(ctx, dep); ok {
|
||||
if allowedViolations, ok := ContainerDependencyViolationAllowlist[ctx.ModuleName()]; ok && InList(dep.Name(), allowedViolations) {
|
||||
return
|
||||
} else {
|
||||
violations := containersInfo.GetViolations(ctx, ctx.Module(), dep, depContainersInfo)
|
||||
if len(violations) > 0 {
|
||||
errorMessage := fmt.Sprintf("%s cannot depend on %s. ", ctx.ModuleName(), dep.Name())
|
||||
errorMessage += strings.Join(violations, " ")
|
||||
ctx.ModuleErrorf(errorMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@@ -1778,6 +1778,9 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext)
|
||||
}
|
||||
|
||||
setContainerInfo(ctx)
|
||||
if ctx.Config().Getenv("DISABLE_CONTAINER_CHECK") != "true" {
|
||||
checkContainerViolations(ctx)
|
||||
}
|
||||
|
||||
ctx.licenseMetadataFile = PathForModuleOut(ctx, "meta_lic")
|
||||
|
||||
|
@@ -74,6 +74,8 @@ func TestValidationAcrossContainersExportedPass(t *testing.T) {
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
sdk_version: "none",
|
||||
system_modules: "none",
|
||||
}`,
|
||||
},
|
||||
{
|
||||
@@ -122,6 +124,8 @@ func TestValidationAcrossContainersExportedPass(t *testing.T) {
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
sdk_version: "none",
|
||||
system_modules: "none",
|
||||
}`,
|
||||
},
|
||||
{
|
||||
@@ -345,6 +349,8 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) {
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
sdk_version: "none",
|
||||
system_modules: "none",
|
||||
}`,
|
||||
expectedError: `.*my_java_library_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`,
|
||||
},
|
||||
@@ -392,6 +398,8 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) {
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
sdk_version: "none",
|
||||
system_modules: "none",
|
||||
}`,
|
||||
expectedError: `.*my_android_app_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`,
|
||||
},
|
||||
@@ -693,6 +701,8 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) {
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
sdk_version: "none",
|
||||
system_modules: "none",
|
||||
}`,
|
||||
expectedError: `.*my_android_app_foo/myapex depends on my_java_aconfig_library_foo/otherapex/production across containers`,
|
||||
},
|
||||
@@ -769,6 +779,8 @@ func TestValidationNotPropagateAcrossShared(t *testing.T) {
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
sdk_version: "none",
|
||||
system_modules: "none",
|
||||
}`,
|
||||
},
|
||||
}
|
||||
|
@@ -4929,6 +4929,7 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {
|
||||
java_import {
|
||||
name: "libfoo",
|
||||
jars: ["libfoo.jar"],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_sdk_library_import {
|
||||
@@ -4969,6 +4970,22 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {
|
||||
t.Run("prebuilt with source preferred", func(t *testing.T) {
|
||||
|
||||
bp := `
|
||||
apex {
|
||||
name: "myapex",
|
||||
key: "myapex.key",
|
||||
updatable: false,
|
||||
java_libs: [
|
||||
"libfoo",
|
||||
"libbar",
|
||||
],
|
||||
}
|
||||
|
||||
apex_key {
|
||||
name: "myapex.key",
|
||||
public_key: "testkey.avbpubkey",
|
||||
private_key: "testkey.pem",
|
||||
}
|
||||
|
||||
prebuilt_apex {
|
||||
name: "myapex",
|
||||
arch: {
|
||||
@@ -4985,10 +5002,21 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {
|
||||
java_import {
|
||||
name: "libfoo",
|
||||
jars: ["libfoo.jar"],
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
compile_dex: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "libfoo",
|
||||
srcs: ["foo/bar/MyClass.java"],
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
compile_dex: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_sdk_library_import {
|
||||
@@ -4996,12 +5024,21 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {
|
||||
public: {
|
||||
jars: ["libbar.jar"],
|
||||
},
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
compile_dex: true,
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
name: "libbar",
|
||||
srcs: ["foo/bar/MyClass.java"],
|
||||
unsafe_ignore_missing_latest_api: true,
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
compile_dex: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
`
|
||||
|
||||
@@ -5010,11 +5047,9 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {
|
||||
|
||||
checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
|
||||
checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
|
||||
ensureNoSourceVariant(t, ctx, "libfoo")
|
||||
|
||||
checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
|
||||
checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
|
||||
ensureNoSourceVariant(t, ctx, "libbar")
|
||||
})
|
||||
|
||||
t.Run("prebuilt preferred with source", func(t *testing.T) {
|
||||
@@ -5040,6 +5075,7 @@ func TestPrebuiltExportDexImplementationJars(t *testing.T) {
|
||||
|
||||
java_library {
|
||||
name: "libfoo",
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_sdk_library_import {
|
||||
@@ -5166,6 +5202,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
|
||||
jars: ["libfoo.jar"],
|
||||
apex_available: ["myapex"],
|
||||
permitted_packages: ["foo"],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_sdk_library_import {
|
||||
@@ -5320,12 +5357,14 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
|
||||
name: "libfoo",
|
||||
jars: ["libfoo.jar"],
|
||||
apex_available: ["myapex"],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "libfoo",
|
||||
srcs: ["foo/bar/MyClass.java"],
|
||||
apex_available: ["myapex"],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_sdk_library_import {
|
||||
@@ -5417,6 +5456,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
|
||||
jars: ["libfoo.jar"],
|
||||
apex_available: ["myapex"],
|
||||
permitted_packages: ["foo"],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
@@ -5424,6 +5464,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
|
||||
srcs: ["foo/bar/MyClass.java"],
|
||||
apex_available: ["myapex"],
|
||||
installable: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_sdk_library_import {
|
||||
@@ -5514,6 +5555,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
|
||||
name: "libfoo",
|
||||
jars: ["libfoo.jar"],
|
||||
apex_available: ["myapex"],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
@@ -5522,6 +5564,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
|
||||
apex_available: ["myapex"],
|
||||
permitted_packages: ["foo"],
|
||||
installable: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_sdk_library_import {
|
||||
@@ -5540,6 +5583,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
|
||||
apex_available: ["myapex"],
|
||||
permitted_packages: ["bar"],
|
||||
compile_dex: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
`
|
||||
|
||||
@@ -6134,6 +6178,7 @@ func TestApexWithTestHelperApp(t *testing.T) {
|
||||
name: "TesterHelpAppFoo",
|
||||
srcs: ["foo/bar/MyClass.java"],
|
||||
apex_available: [ "myapex" ],
|
||||
sdk_version: "test_current",
|
||||
}
|
||||
|
||||
`)
|
||||
@@ -7736,7 +7781,7 @@ func TestSymlinksFromApexToSystem(t *testing.T) {
|
||||
srcs: ["foo/bar/MyClass.java"],
|
||||
sdk_version: "none",
|
||||
system_modules: "none",
|
||||
libs: ["myotherjar"],
|
||||
static_libs: ["myotherjar"],
|
||||
apex_available: [
|
||||
"myapex",
|
||||
"myapex.updatable",
|
||||
@@ -8397,6 +8442,7 @@ func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
sdk_version: "current",
|
||||
}
|
||||
|
||||
systemserverclasspath_fragment {
|
||||
@@ -9439,6 +9485,7 @@ func TestApexJavaCoverage(t *testing.T) {
|
||||
srcs: ["mybootclasspathlib.java"],
|
||||
apex_available: ["myapex"],
|
||||
compile_dex: true,
|
||||
sdk_version: "current",
|
||||
}
|
||||
|
||||
systemserverclasspath_fragment {
|
||||
@@ -9754,6 +9801,7 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
|
||||
unsafe_ignore_missing_latest_api: true,
|
||||
min_sdk_version: "31",
|
||||
static_libs: ["util"],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
@@ -9762,6 +9810,7 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
|
||||
apex_available: ["myapex"],
|
||||
min_sdk_version: "31",
|
||||
static_libs: ["another_util"],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
@@ -9769,6 +9818,7 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
|
||||
srcs: ["a.java"],
|
||||
min_sdk_version: "31",
|
||||
apex_available: ["myapex"],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
`)
|
||||
})
|
||||
@@ -9824,7 +9874,7 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
|
||||
preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
|
||||
preparer.
|
||||
RunTestWithBp(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
@@ -9855,6 +9905,8 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
|
||||
apex_available: ["myapex"],
|
||||
compile_dex: true,
|
||||
unsafe_ignore_missing_latest_api: true,
|
||||
sdk_version: "current",
|
||||
min_sdk_version: "30",
|
||||
}
|
||||
`)
|
||||
})
|
||||
@@ -10107,6 +10159,9 @@ func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
|
||||
key: "myapex.key",
|
||||
bootclasspath_fragments: ["mybootclasspathfragment"],
|
||||
min_sdk_version: "29",
|
||||
java_libs: [
|
||||
"jacocoagent",
|
||||
],
|
||||
}
|
||||
apex_key {
|
||||
name: "myapex.key",
|
||||
|
@@ -104,6 +104,7 @@ func TestBootclasspathFragments_FragmentDependency(t *testing.T) {
|
||||
test: {
|
||||
enabled: true,
|
||||
},
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
@@ -749,6 +750,7 @@ func TestBootclasspathFragment_HiddenAPIList(t *testing.T) {
|
||||
],
|
||||
srcs: ["b.java"],
|
||||
compile_dex: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
@@ -922,6 +924,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) {
|
||||
],
|
||||
srcs: ["b.java"],
|
||||
compile_dex: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
@@ -1093,6 +1096,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) {
|
||||
],
|
||||
srcs: ["b.java"],
|
||||
compile_dex: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
@@ -1245,6 +1249,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *test
|
||||
],
|
||||
srcs: ["b.java"],
|
||||
compile_dex: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
|
@@ -92,6 +92,7 @@ func TestCreateClasspathElements(t *testing.T) {
|
||||
],
|
||||
srcs: ["b.java"],
|
||||
installable: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
java_library {
|
||||
|
@@ -30,7 +30,7 @@ func TestApexDepsContainers(t *testing.T) {
|
||||
result := android.GroupFixturePreparers(
|
||||
prepareForApexTest,
|
||||
java.PrepareForTestWithJavaSdkLibraryFiles,
|
||||
java.FixtureWithLastReleaseApis("mybootclasspathlib"),
|
||||
java.FixtureWithLastReleaseApis("mybootclasspathlib", "bar"),
|
||||
).RunTestWithBp(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
@@ -68,16 +68,17 @@ func TestApexDepsContainers(t *testing.T) {
|
||||
],
|
||||
compile_dex: true,
|
||||
static_libs: [
|
||||
"foo",
|
||||
"food",
|
||||
"baz",
|
||||
],
|
||||
libs: [
|
||||
"bar",
|
||||
"bar.stubs",
|
||||
],
|
||||
min_sdk_version: "30",
|
||||
sdk_version: "current",
|
||||
}
|
||||
java_library {
|
||||
name: "foo",
|
||||
name: "food",
|
||||
srcs:[
|
||||
"A.java",
|
||||
],
|
||||
@@ -85,13 +86,15 @@ func TestApexDepsContainers(t *testing.T) {
|
||||
"myapex",
|
||||
],
|
||||
min_sdk_version: "30",
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
java_library {
|
||||
java_sdk_library {
|
||||
name: "bar",
|
||||
srcs:[
|
||||
"A.java",
|
||||
],
|
||||
min_sdk_version: "30",
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
java_library {
|
||||
name: "baz",
|
||||
@@ -103,6 +106,7 @@ func TestApexDepsContainers(t *testing.T) {
|
||||
"myapex",
|
||||
],
|
||||
min_sdk_version: "30",
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
`)
|
||||
testcases := []struct {
|
||||
@@ -130,7 +134,7 @@ func TestApexDepsContainers(t *testing.T) {
|
||||
isApexContainer: false,
|
||||
},
|
||||
{
|
||||
moduleName: "foo",
|
||||
moduleName: "food",
|
||||
variant: "android_common_apex30",
|
||||
isSystemContainer: true,
|
||||
isApexContainer: true,
|
||||
@@ -162,7 +166,7 @@ func TestNonUpdatableApexDepsContainers(t *testing.T) {
|
||||
result := android.GroupFixturePreparers(
|
||||
prepareForApexTest,
|
||||
java.PrepareForTestWithJavaSdkLibraryFiles,
|
||||
java.FixtureWithLastReleaseApis("mybootclasspathlib"),
|
||||
java.FixtureWithLastReleaseApis("mybootclasspathlib", "bar"),
|
||||
).RunTestWithBp(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
@@ -199,26 +203,30 @@ func TestNonUpdatableApexDepsContainers(t *testing.T) {
|
||||
],
|
||||
compile_dex: true,
|
||||
static_libs: [
|
||||
"foo",
|
||||
"food",
|
||||
],
|
||||
libs: [
|
||||
"bar",
|
||||
"bar.stubs",
|
||||
],
|
||||
sdk_version: "current",
|
||||
}
|
||||
java_library {
|
||||
name: "foo",
|
||||
name: "food",
|
||||
srcs:[
|
||||
"A.java",
|
||||
],
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
java_library {
|
||||
java_sdk_library {
|
||||
name: "bar",
|
||||
srcs:[
|
||||
"A.java",
|
||||
],
|
||||
sdk_version: "none",
|
||||
system_modules: "none",
|
||||
}
|
||||
`)
|
||||
testcases := []struct {
|
||||
@@ -246,7 +254,7 @@ func TestNonUpdatableApexDepsContainers(t *testing.T) {
|
||||
isApexContainer: false,
|
||||
},
|
||||
{
|
||||
moduleName: "foo",
|
||||
moduleName: "food",
|
||||
variant: "android_common_apex10000",
|
||||
isSystemContainer: true,
|
||||
isApexContainer: true,
|
||||
|
@@ -293,6 +293,7 @@ func TestPlatformBootclasspathDependencies(t *testing.T) {
|
||||
],
|
||||
srcs: ["b.java"],
|
||||
installable: true,
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
// Add a java_import that is not preferred and so won't have an appropriate apex variant created
|
||||
|
@@ -80,6 +80,7 @@ func TestSystemserverclasspathFragmentContents(t *testing.T) {
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
systemserverclasspath_fragment {
|
||||
@@ -350,6 +351,7 @@ func TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) {
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
sdk_version: "core_current",
|
||||
}
|
||||
|
||||
systemserverclasspath_fragment {
|
||||
|
@@ -593,6 +593,13 @@ func (j *Module) InstallInProduct() bool {
|
||||
return j.ProductSpecific()
|
||||
}
|
||||
|
||||
var _ android.StubsAvailableModule = (*Module)(nil)
|
||||
|
||||
// To safisfy the StubsAvailableModule interface
|
||||
func (j *Module) IsStubsModule() bool {
|
||||
return proptools.Bool(j.properties.Is_stubs_module)
|
||||
}
|
||||
|
||||
func (j *Module) CheckStableSdkVersion(ctx android.BaseModuleContext) error {
|
||||
sdkVersion := j.SdkVersion(ctx)
|
||||
if sdkVersion.Stable() {
|
||||
|
@@ -38,6 +38,7 @@ java_defaults {
|
||||
visibility: ["//visibility:public"],
|
||||
sdk_version: "none",
|
||||
system_modules: "none",
|
||||
is_stubs_module: true,
|
||||
}
|
||||
|
||||
java_library {
|
||||
@@ -289,6 +290,7 @@ java_defaults {
|
||||
sdk_version: "none",
|
||||
system_modules: "none",
|
||||
patch_module: "java.base",
|
||||
is_stubs_module: true,
|
||||
}
|
||||
|
||||
// Same as legacy.core.platform.api.stubs, but android annotations are
|
||||
@@ -307,6 +309,7 @@ java_library {
|
||||
"legacy.core.platform.api.stubs",
|
||||
],
|
||||
patch_module: "java.base",
|
||||
is_stubs_module: true,
|
||||
}
|
||||
|
||||
java_library {
|
||||
@@ -339,6 +342,7 @@ java_library {
|
||||
"stable.core.platform.api.stubs",
|
||||
],
|
||||
patch_module: "java.base",
|
||||
is_stubs_module: true,
|
||||
}
|
||||
|
||||
// Used when compiling higher-level code against *.core.platform.api.stubs.
|
||||
|
@@ -54,6 +54,7 @@ func TestDexpreoptEnabled(t *testing.T) {
|
||||
name: "foo",
|
||||
installable: true,
|
||||
srcs: ["a.java"],
|
||||
sdk_version: "current",
|
||||
}`,
|
||||
enabled: true,
|
||||
},
|
||||
@@ -98,6 +99,7 @@ func TestDexpreoptEnabled(t *testing.T) {
|
||||
java_library {
|
||||
name: "foo",
|
||||
installable: true,
|
||||
sdk_version: "current",
|
||||
}`,
|
||||
enabled: false,
|
||||
},
|
||||
@@ -107,6 +109,7 @@ func TestDexpreoptEnabled(t *testing.T) {
|
||||
java_library {
|
||||
name: "foo",
|
||||
srcs: ["a.java"],
|
||||
sdk_version: "current",
|
||||
}`,
|
||||
enabled: false,
|
||||
},
|
||||
@@ -144,6 +147,7 @@ func TestDexpreoptEnabled(t *testing.T) {
|
||||
name: "foo",
|
||||
srcs: ["a.java"],
|
||||
compile_dex: true,
|
||||
sdk_version: "current",
|
||||
}`,
|
||||
enabled: false,
|
||||
},
|
||||
@@ -164,6 +168,7 @@ func TestDexpreoptEnabled(t *testing.T) {
|
||||
installable: true,
|
||||
srcs: ["a.java"],
|
||||
apex_available: ["com.android.apex1"],
|
||||
sdk_version: "current",
|
||||
}`,
|
||||
apexVariant: true,
|
||||
enabled: false,
|
||||
@@ -176,6 +181,7 @@ func TestDexpreoptEnabled(t *testing.T) {
|
||||
installable: true,
|
||||
srcs: ["a.java"],
|
||||
apex_available: ["com.android.apex1"],
|
||||
sdk_version: "current",
|
||||
}`,
|
||||
moduleName: "service-foo",
|
||||
apexVariant: true,
|
||||
@@ -189,6 +195,7 @@ func TestDexpreoptEnabled(t *testing.T) {
|
||||
installable: true,
|
||||
srcs: ["a.java"],
|
||||
apex_available: ["com.android.apex1"],
|
||||
sdk_version: "current",
|
||||
}`,
|
||||
moduleName: "prebuilt_service-foo",
|
||||
apexVariant: true,
|
||||
@@ -202,6 +209,7 @@ func TestDexpreoptEnabled(t *testing.T) {
|
||||
installable: true,
|
||||
srcs: ["a.java"],
|
||||
apex_available: ["com.android.apex1"],
|
||||
sdk_version: "current",
|
||||
}`,
|
||||
moduleName: "service-foo",
|
||||
apexVariant: false,
|
||||
@@ -311,6 +319,7 @@ func TestDexpreoptBuiltInstalledForApex(t *testing.T) {
|
||||
installable: true,
|
||||
srcs: ["a.java"],
|
||||
apex_available: ["com.android.apex1"],
|
||||
sdk_version: "current",
|
||||
}`)
|
||||
ctx := result.TestContext
|
||||
module := ctx.ModuleForTests("service-foo", "android_common_apex1000")
|
||||
@@ -342,6 +351,7 @@ func TestDexpreoptBuiltInstalledForApex(t *testing.T) {
|
||||
name: "foo",
|
||||
installable: true,
|
||||
srcs: ["a.java"],
|
||||
sdk_version: "current",
|
||||
}`)
|
||||
ctx = result.TestContext
|
||||
module = ctx.ModuleForTests("foo", "android_common")
|
||||
@@ -398,6 +408,7 @@ func TestAndroidMkEntriesForApex(t *testing.T) {
|
||||
installable: true,
|
||||
srcs: ["a.java"],
|
||||
apex_available: ["com.android.apex1"],
|
||||
sdk_version: "current",
|
||||
}`)
|
||||
ctx := result.TestContext
|
||||
module := ctx.ModuleForTests("service-foo", "android_common_apex1000")
|
||||
@@ -429,6 +440,7 @@ func TestAndroidMkEntriesForApex(t *testing.T) {
|
||||
name: "foo",
|
||||
installable: true,
|
||||
srcs: ["a.java"],
|
||||
sdk_version: "current",
|
||||
}`)
|
||||
ctx = result.TestContext
|
||||
module = ctx.ModuleForTests("foo", "android_common")
|
||||
@@ -454,6 +466,7 @@ func TestGenerateProfileEvenIfDexpreoptIsDisabled(t *testing.T) {
|
||||
profile: "art-profile",
|
||||
},
|
||||
srcs: ["a.java"],
|
||||
sdk_version: "current",
|
||||
}`)
|
||||
|
||||
ctx := result.TestContext
|
||||
|
@@ -2099,6 +2099,7 @@ func (module *SdkLibrary) topLevelStubsLibraryProps(mctx android.DefaultableHook
|
||||
props.Dist.Dir = proptools.StringPtr(module.apiDistPath(apiScope))
|
||||
props.Dist.Tag = proptools.StringPtr(".jar")
|
||||
}
|
||||
props.Is_stubs_module = proptools.BoolPtr(true)
|
||||
|
||||
return props
|
||||
}
|
||||
|
@@ -184,6 +184,10 @@ var PrepareForTestWithJacocoInstrumentation = android.GroupFixturePreparers(
|
||||
host_supported: true,
|
||||
srcs: ["Test.java"],
|
||||
sdk_version: "current",
|
||||
apex_available: [
|
||||
"//apex_available:anyapex",
|
||||
"//apex_available:platform",
|
||||
],
|
||||
}
|
||||
`)),
|
||||
)
|
||||
@@ -408,7 +412,6 @@ func gatherRequiredDepsForTest() string {
|
||||
"core.current.stubs",
|
||||
"legacy.core.platform.api.stubs",
|
||||
"stable.core.platform.api.stubs",
|
||||
|
||||
"android_stubs_current_exportable",
|
||||
"android_system_stubs_current_exportable",
|
||||
"android_test_stubs_current_exportable",
|
||||
@@ -416,13 +419,11 @@ func gatherRequiredDepsForTest() string {
|
||||
"android_system_server_stubs_current_exportable",
|
||||
"core.current.stubs.exportable",
|
||||
"legacy.core.platform.api.stubs.exportable",
|
||||
|
||||
"kotlin-stdlib",
|
||||
"kotlin-stdlib-jdk7",
|
||||
"kotlin-stdlib-jdk8",
|
||||
"kotlin-annotations",
|
||||
"stub-annotations",
|
||||
|
||||
"aconfig-annotations-lib",
|
||||
"unsupportedappusage",
|
||||
}
|
||||
@@ -435,6 +436,7 @@ func gatherRequiredDepsForTest() string {
|
||||
sdk_version: "none",
|
||||
system_modules: "stable-core-platform-api-stubs-system-modules",
|
||||
compile_dex: true,
|
||||
is_stubs_module: true,
|
||||
}
|
||||
`, extra)
|
||||
}
|
||||
|
@@ -338,6 +338,7 @@ func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, co
|
||||
shared_library: false,
|
||||
public: {enabled: true},
|
||||
min_sdk_version: "2",
|
||||
sdk_version: "current",
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
@@ -348,6 +349,7 @@ func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, co
|
||||
public: {enabled: true},
|
||||
min_sdk_version: "2",
|
||||
permitted_packages: ["myothersdklibrary"],
|
||||
sdk_version: "current",
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
@@ -357,6 +359,7 @@ func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, co
|
||||
compile_dex: true,
|
||||
public: {enabled: true},
|
||||
min_sdk_version: "2",
|
||||
sdk_version: "current",
|
||||
}
|
||||
`),
|
||||
).RunTest(t)
|
||||
@@ -624,6 +627,7 @@ func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) {
|
||||
min_sdk_version: "2",
|
||||
permitted_packages: ["myothersdklibrary"],
|
||||
compile_dex: true,
|
||||
sdk_version: "current",
|
||||
}
|
||||
`),
|
||||
|
||||
@@ -655,6 +659,7 @@ func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) {
|
||||
shared_library: false,
|
||||
public: {enabled: true},
|
||||
min_sdk_version: "2",
|
||||
sdk_version: "current",
|
||||
}
|
||||
`),
|
||||
).RunTest(t)
|
||||
@@ -877,6 +882,7 @@ func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) {
|
||||
public: {enabled: true},
|
||||
permitted_packages: ["mysdklibrary"],
|
||||
min_sdk_version: "current",
|
||||
sdk_version: "current",
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
@@ -895,6 +901,7 @@ func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) {
|
||||
package_prefixes: ["newlibrary.all.mine"],
|
||||
single_packages: ["newlibrary.mine"],
|
||||
},
|
||||
sdk_version: "current",
|
||||
}
|
||||
`),
|
||||
).RunTest(t)
|
||||
@@ -1080,6 +1087,7 @@ func testSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T, targetBui
|
||||
shared_library: false,
|
||||
public: {enabled: true},
|
||||
min_sdk_version: "S",
|
||||
sdk_version: "current",
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
@@ -1090,6 +1098,7 @@ func testSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T, targetBui
|
||||
public: {enabled: true},
|
||||
min_sdk_version: "Tiramisu",
|
||||
permitted_packages: ["mynewsdklibrary"],
|
||||
sdk_version: "current",
|
||||
}
|
||||
`),
|
||||
).RunTest(t)
|
||||
@@ -1287,6 +1296,7 @@ func TestSnapshotWithEmptyBootClasspathFragment(t *testing.T) {
|
||||
shared_library: false,
|
||||
public: {enabled: true},
|
||||
min_sdk_version: "Tiramisu",
|
||||
sdk_version: "current",
|
||||
}
|
||||
java_sdk_library {
|
||||
name: "mynewsdklibrary",
|
||||
@@ -1296,6 +1306,7 @@ func TestSnapshotWithEmptyBootClasspathFragment(t *testing.T) {
|
||||
public: {enabled: true},
|
||||
min_sdk_version: "Tiramisu",
|
||||
permitted_packages: ["mynewsdklibrary"],
|
||||
sdk_version: "current",
|
||||
}
|
||||
`),
|
||||
).RunTest(t)
|
||||
|
@@ -80,6 +80,7 @@ func testSnapshotWithSystemServerClasspathFragment(t *testing.T, sdk string, tar
|
||||
dex_preopt: {
|
||||
profile: "art-profile",
|
||||
},
|
||||
sdk_version: "current",
|
||||
}
|
||||
`),
|
||||
).RunTest(t)
|
||||
@@ -110,12 +111,14 @@ func TestSnapshotWithPartialSystemServerClasspathFragment(t *testing.T) {
|
||||
apex_available: ["myapex"],
|
||||
srcs: ["Test.java"],
|
||||
min_sdk_version: "33", // Tiramisu
|
||||
sdk_version: "current",
|
||||
}
|
||||
java_sdk_library {
|
||||
name: "mysdklibrary-future",
|
||||
apex_available: ["myapex"],
|
||||
srcs: ["Test.java"],
|
||||
min_sdk_version: "34", // UpsideDownCake
|
||||
sdk_version: "current",
|
||||
}
|
||||
sdk {
|
||||
name: "mysdk",
|
||||
@@ -199,6 +202,7 @@ func TestSnapshotWithEmptySystemServerClasspathFragment(t *testing.T) {
|
||||
apex_available: ["myapex"],
|
||||
srcs: ["Test.java"],
|
||||
min_sdk_version: "34", // UpsideDownCake
|
||||
sdk_version: "current",
|
||||
}
|
||||
sdk {
|
||||
name: "mysdk",
|
||||
|
Reference in New Issue
Block a user