Remove global state from sysprop libraries
Sysprop libraries use a global list to rewrite dependencies from implementation libraries to public stub libraries when appropriate. Remove the global list, and instead add a dependency from the implementation to the public stub that forwards the JavaInfo. Bug: 181367697 Test: sysprop_test.go Change-Id: Ia7995feb3c079ca9bb6a403daaae3e3329fd7f6a
This commit is contained in:
115
java/java.go
115
java/java.go
@@ -370,6 +370,10 @@ type CompilerDeviceProperties struct {
|
||||
// If true, generate the signature file of APK Signing Scheme V4, along side the signed APK file.
|
||||
// Defaults to false.
|
||||
V4_signature *bool
|
||||
|
||||
// Only for libraries created by a sysprop_library module, SyspropPublicStub is the name of the
|
||||
// public stubs library.
|
||||
SyspropPublicStub string `blueprint:"mutated"`
|
||||
}
|
||||
|
||||
// Functionality common to Module and Import
|
||||
@@ -580,6 +584,16 @@ type JavaInfo struct {
|
||||
|
||||
var JavaInfoProvider = blueprint.NewProvider(JavaInfo{})
|
||||
|
||||
// SyspropPublicStubInfo contains info about the sysprop public stub library that corresponds to
|
||||
// the sysprop implementation library.
|
||||
type SyspropPublicStubInfo struct {
|
||||
// JavaInfo is the JavaInfoProvider of the sysprop public stub library that corresponds to
|
||||
// the sysprop implementation library.
|
||||
JavaInfo JavaInfo
|
||||
}
|
||||
|
||||
var SyspropPublicStubInfoProvider = blueprint.NewProvider(SyspropPublicStubInfo{})
|
||||
|
||||
// Methods that need to be implemented for a module that is added to apex java_libs property.
|
||||
type ApexDependency interface {
|
||||
HeaderJars() android.Paths
|
||||
@@ -649,29 +663,30 @@ func IsJniDepTag(depTag blueprint.DependencyTag) bool {
|
||||
}
|
||||
|
||||
var (
|
||||
dataNativeBinsTag = dependencyTag{name: "dataNativeBins"}
|
||||
staticLibTag = dependencyTag{name: "staticlib"}
|
||||
libTag = dependencyTag{name: "javalib"}
|
||||
java9LibTag = dependencyTag{name: "java9lib"}
|
||||
pluginTag = dependencyTag{name: "plugin"}
|
||||
errorpronePluginTag = dependencyTag{name: "errorprone-plugin"}
|
||||
exportedPluginTag = dependencyTag{name: "exported-plugin"}
|
||||
bootClasspathTag = dependencyTag{name: "bootclasspath"}
|
||||
systemModulesTag = dependencyTag{name: "system modules"}
|
||||
frameworkResTag = dependencyTag{name: "framework-res"}
|
||||
kotlinStdlibTag = dependencyTag{name: "kotlin-stdlib"}
|
||||
kotlinAnnotationsTag = dependencyTag{name: "kotlin-annotations"}
|
||||
proguardRaiseTag = dependencyTag{name: "proguard-raise"}
|
||||
certificateTag = dependencyTag{name: "certificate"}
|
||||
instrumentationForTag = dependencyTag{name: "instrumentation_for"}
|
||||
extraLintCheckTag = dependencyTag{name: "extra-lint-check"}
|
||||
jniLibTag = dependencyTag{name: "jnilib"}
|
||||
jniInstallTag = installDependencyTag{name: "jni install"}
|
||||
binaryInstallTag = installDependencyTag{name: "binary install"}
|
||||
usesLibTag = makeUsesLibraryDependencyTag(dexpreopt.AnySdkVersion)
|
||||
usesLibCompat28Tag = makeUsesLibraryDependencyTag(28)
|
||||
usesLibCompat29Tag = makeUsesLibraryDependencyTag(29)
|
||||
usesLibCompat30Tag = makeUsesLibraryDependencyTag(30)
|
||||
dataNativeBinsTag = dependencyTag{name: "dataNativeBins"}
|
||||
staticLibTag = dependencyTag{name: "staticlib"}
|
||||
libTag = dependencyTag{name: "javalib"}
|
||||
java9LibTag = dependencyTag{name: "java9lib"}
|
||||
pluginTag = dependencyTag{name: "plugin"}
|
||||
errorpronePluginTag = dependencyTag{name: "errorprone-plugin"}
|
||||
exportedPluginTag = dependencyTag{name: "exported-plugin"}
|
||||
bootClasspathTag = dependencyTag{name: "bootclasspath"}
|
||||
systemModulesTag = dependencyTag{name: "system modules"}
|
||||
frameworkResTag = dependencyTag{name: "framework-res"}
|
||||
kotlinStdlibTag = dependencyTag{name: "kotlin-stdlib"}
|
||||
kotlinAnnotationsTag = dependencyTag{name: "kotlin-annotations"}
|
||||
proguardRaiseTag = dependencyTag{name: "proguard-raise"}
|
||||
certificateTag = dependencyTag{name: "certificate"}
|
||||
instrumentationForTag = dependencyTag{name: "instrumentation_for"}
|
||||
extraLintCheckTag = dependencyTag{name: "extra-lint-check"}
|
||||
jniLibTag = dependencyTag{name: "jnilib"}
|
||||
syspropPublicStubDepTag = dependencyTag{name: "sysprop public stub"}
|
||||
jniInstallTag = installDependencyTag{name: "jni install"}
|
||||
binaryInstallTag = installDependencyTag{name: "binary install"}
|
||||
usesLibTag = makeUsesLibraryDependencyTag(dexpreopt.AnySdkVersion)
|
||||
usesLibCompat28Tag = makeUsesLibraryDependencyTag(28)
|
||||
usesLibCompat29Tag = makeUsesLibraryDependencyTag(29)
|
||||
usesLibCompat30Tag = makeUsesLibraryDependencyTag(30)
|
||||
)
|
||||
|
||||
func IsLibDepTag(depTag blueprint.DependencyTag) bool {
|
||||
@@ -810,35 +825,17 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) {
|
||||
j.linter.deps(ctx)
|
||||
|
||||
sdkDeps(ctx, sdkContext(j), j.dexer)
|
||||
}
|
||||
|
||||
syspropPublicStubs := syspropPublicStubs(ctx.Config())
|
||||
|
||||
// rewriteSyspropLibs validates if a java module can link against platform's sysprop_library,
|
||||
// and redirects dependency to public stub depending on the link type.
|
||||
rewriteSyspropLibs := func(libs []string, prop string) []string {
|
||||
// make a copy
|
||||
ret := android.CopyOf(libs)
|
||||
|
||||
for idx, lib := range libs {
|
||||
stub, ok := syspropPublicStubs[lib]
|
||||
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
linkType, _ := j.getLinkType(ctx.ModuleName())
|
||||
// only platform modules can use internal props
|
||||
if linkType != javaPlatform {
|
||||
ret[idx] = stub
|
||||
}
|
||||
if j.deviceProperties.SyspropPublicStub != "" {
|
||||
// This is a sysprop implementation library that has a corresponding sysprop public
|
||||
// stubs library, and a dependency on it so that dependencies on the implementation can
|
||||
// be forwarded to the public stubs library when necessary.
|
||||
ctx.AddVariationDependencies(nil, syspropPublicStubDepTag, j.deviceProperties.SyspropPublicStub)
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
libDeps := ctx.AddVariationDependencies(nil, libTag, rewriteSyspropLibs(j.properties.Libs, "libs")...)
|
||||
ctx.AddVariationDependencies(nil, staticLibTag, rewriteSyspropLibs(j.properties.Static_libs, "static_libs")...)
|
||||
libDeps := ctx.AddVariationDependencies(nil, libTag, j.properties.Libs...)
|
||||
ctx.AddVariationDependencies(nil, staticLibTag, j.properties.Static_libs...)
|
||||
|
||||
// Add dependency on libraries that provide additional hidden api annotations.
|
||||
ctx.AddVariationDependencies(nil, hiddenApiAnnotationsTag, j.properties.Hiddenapi_additional_annotations...)
|
||||
@@ -853,15 +850,11 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) {
|
||||
// if true, enable enforcement
|
||||
// PRODUCT_INTER_PARTITION_JAVA_LIBRARY_ALLOWLIST
|
||||
// exception list of java_library names to allow inter-partition dependency
|
||||
for idx, lib := range j.properties.Libs {
|
||||
for idx := range j.properties.Libs {
|
||||
if libDeps[idx] == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if _, ok := syspropPublicStubs[lib]; ok {
|
||||
continue
|
||||
}
|
||||
|
||||
if javaDep, ok := libDeps[idx].(javaSdkLibraryEnforceContext); ok {
|
||||
// java_sdk_library is always allowed at inter-partition dependency.
|
||||
// So, skip check.
|
||||
@@ -1131,6 +1124,8 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
|
||||
}
|
||||
}
|
||||
|
||||
linkType, _ := j.getLinkType(ctx.ModuleName())
|
||||
|
||||
ctx.VisitDirectDeps(func(module android.Module) {
|
||||
otherName := ctx.OtherModuleName(module)
|
||||
tag := ctx.OtherModuleDependencyTag(module)
|
||||
@@ -1153,6 +1148,14 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
|
||||
}
|
||||
} else if ctx.OtherModuleHasProvider(module, JavaInfoProvider) {
|
||||
dep := ctx.OtherModuleProvider(module, JavaInfoProvider).(JavaInfo)
|
||||
if linkType != javaPlatform &&
|
||||
ctx.OtherModuleHasProvider(module, SyspropPublicStubInfoProvider) {
|
||||
// dep is a sysprop implementation library, but this module is not linking against
|
||||
// the platform, so it gets the sysprop public stubs library instead. Replace
|
||||
// dep with the JavaInfo from the SyspropPublicStubInfoProvider.
|
||||
syspropDep := ctx.OtherModuleProvider(module, SyspropPublicStubInfoProvider).(SyspropPublicStubInfo)
|
||||
dep = syspropDep.JavaInfo
|
||||
}
|
||||
switch tag {
|
||||
case bootClasspathTag:
|
||||
deps.bootClasspath = append(deps.bootClasspath, dep.HeaderJars...)
|
||||
@@ -1211,6 +1214,12 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
|
||||
deps.kotlinStdlib = append(deps.kotlinStdlib, dep.HeaderJars...)
|
||||
case kotlinAnnotationsTag:
|
||||
deps.kotlinAnnotations = dep.HeaderJars
|
||||
case syspropPublicStubDepTag:
|
||||
// This is a sysprop implementation library, forward the JavaInfoProvider from
|
||||
// the corresponding sysprop public stub library as SyspropPublicStubInfoProvider.
|
||||
ctx.SetProvider(SyspropPublicStubInfoProvider, SyspropPublicStubInfo{
|
||||
JavaInfo: dep,
|
||||
})
|
||||
}
|
||||
} else if dep, ok := module.(android.SourceFileProducer); ok {
|
||||
switch tag {
|
||||
|
Reference in New Issue
Block a user