Merge changes I697a65e4,Iaac6aaf6
* changes: Do not propagate <uses-library> deps through static SDK component libs. Make error message more precise.
This commit is contained in:
commit
678ddb9d24
|
@ -437,7 +437,11 @@ func validateClassLoaderContextRec(sdkVer int, clcs []*ClassLoaderContext) (bool
|
|||
if sdkVer == AnySdkVersion {
|
||||
// Return error if dexpreopt doesn't know paths to one of the <uses-library>
|
||||
// dependencies. In the future we may need to relax this and just disable dexpreopt.
|
||||
return false, fmt.Errorf("invalid path for <uses-library> \"%s\"", clc.Name)
|
||||
if clc.Host == nil {
|
||||
return false, fmt.Errorf("invalid build path for <uses-library> \"%s\"", clc.Name)
|
||||
} else {
|
||||
return false, fmt.Errorf("invalid install path for <uses-library> \"%s\"", clc.Name)
|
||||
}
|
||||
} else {
|
||||
// No error for compatibility libraries, as Soong doesn't know if they are needed
|
||||
// (this depends on the targetSdkVersion in the manifest), but the CLC is invalid.
|
||||
|
|
|
@ -195,7 +195,7 @@ func TestCLCMaybeAdd(t *testing.T) {
|
|||
// But class loader context in such cases should raise an error on validation.
|
||||
t.Run("validate", func(t *testing.T) {
|
||||
_, err := validateClassLoaderContext(m)
|
||||
checkError(t, err, "invalid path for <uses-library> \"a\"")
|
||||
checkError(t, err, "invalid build path for <uses-library> \"a\"")
|
||||
})
|
||||
}
|
||||
|
||||
|
|
11
java/aar.go
11
java/aar.go
|
@ -407,6 +407,7 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext, classLoaderConte
|
|||
|
||||
ctx.VisitDirectDeps(func(module android.Module) {
|
||||
depName := ctx.OtherModuleName(module)
|
||||
depTag := ctx.OtherModuleDependencyTag(module)
|
||||
|
||||
var exportPackage android.Path
|
||||
aarDep, _ := module.(AndroidLibraryDependency)
|
||||
|
@ -414,7 +415,7 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext, classLoaderConte
|
|||
exportPackage = aarDep.ExportPackage()
|
||||
}
|
||||
|
||||
switch ctx.OtherModuleDependencyTag(module) {
|
||||
switch depTag {
|
||||
case instrumentationForTag:
|
||||
// Nothing, instrumentationForTag is treated as libTag for javac but not for aapt2.
|
||||
case libTag:
|
||||
|
@ -439,7 +440,6 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext, classLoaderConte
|
|||
transitiveStaticLibs = append(transitiveStaticLibs, aarDep.ExportedStaticPackages()...)
|
||||
transitiveStaticLibs = append(transitiveStaticLibs, exportPackage)
|
||||
transitiveStaticLibManifests = append(transitiveStaticLibManifests, aarDep.ExportedManifests()...)
|
||||
classLoaderContexts.AddContextMap(aarDep.ClassLoaderContexts(), depName)
|
||||
if aarDep.ExportedAssets().Valid() {
|
||||
assets = append(assets, aarDep.ExportedAssets().Path())
|
||||
}
|
||||
|
@ -458,11 +458,8 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext, classLoaderConte
|
|||
}
|
||||
}
|
||||
|
||||
// Add nested dependencies after processing the direct dependency: if it is a <uses-library>,
|
||||
// nested context is added as its subcontext, and should not be re-added at the top-level.
|
||||
if dep, ok := module.(Dependency); ok {
|
||||
classLoaderContexts.AddContextMap(dep.ClassLoaderContexts(), depName)
|
||||
}
|
||||
// Merge dep's CLC after processing the dep itself (which may add its own <uses-library>).
|
||||
maybeAddCLCFromDep(module, depTag, depName, classLoaderContexts)
|
||||
})
|
||||
|
||||
deps = append(deps, sharedLibs...)
|
||||
|
|
|
@ -2729,6 +2729,13 @@ func TestUsesLibraries(t *testing.T) {
|
|||
sdk_version: "current",
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
name: "fred",
|
||||
srcs: ["a.java"],
|
||||
api_packages: ["fred"],
|
||||
sdk_version: "current",
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
name: "bar",
|
||||
srcs: ["a.java"],
|
||||
|
@ -2753,7 +2760,12 @@ func TestUsesLibraries(t *testing.T) {
|
|||
name: "app",
|
||||
srcs: ["a.java"],
|
||||
libs: ["qux", "quuz.stubs"],
|
||||
static_libs: ["static-runtime-helper"],
|
||||
static_libs: [
|
||||
"static-runtime-helper",
|
||||
// statically linked component libraries should not pull their SDK libraries,
|
||||
// so "fred" should not be added to class loader context
|
||||
"fred.stubs",
|
||||
],
|
||||
uses_libs: ["foo"],
|
||||
sdk_version: "current",
|
||||
optional_uses_libs: [
|
||||
|
|
41
java/java.go
41
java/java.go
|
@ -1081,7 +1081,6 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
|
|||
switch tag {
|
||||
case libTag:
|
||||
deps.classpath = append(deps.classpath, dep.SdkHeaderJars(ctx, j.sdkVersion())...)
|
||||
// names of sdk libs that are directly depended are exported
|
||||
j.classLoaderContexts.MaybeAddContext(ctx, dep.OptionalImplicitSdkLibrary(),
|
||||
dep.DexJarBuildPath(), dep.DexJarInstallPath())
|
||||
case staticLibTag:
|
||||
|
@ -1093,7 +1092,6 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
|
|||
deps.bootClasspath = append(deps.bootClasspath, dep.HeaderJars()...)
|
||||
case libTag, instrumentationForTag:
|
||||
deps.classpath = append(deps.classpath, dep.HeaderJars()...)
|
||||
// sdk lib names from dependencies are re-exported
|
||||
j.classLoaderContexts.AddContextMap(dep.ClassLoaderContexts(), otherName)
|
||||
deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs()...)
|
||||
pluginJars, pluginClasses, disableTurbine := dep.ExportedPlugins()
|
||||
|
@ -1106,8 +1104,6 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
|
|||
deps.staticJars = append(deps.staticJars, dep.ImplementationJars()...)
|
||||
deps.staticHeaderJars = append(deps.staticHeaderJars, dep.HeaderJars()...)
|
||||
deps.staticResourceJars = append(deps.staticResourceJars, dep.ResourceJars()...)
|
||||
// sdk lib names from dependencies are re-exported
|
||||
j.classLoaderContexts.AddContextMap(dep.ClassLoaderContexts(), otherName)
|
||||
deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs()...)
|
||||
pluginJars, pluginClasses, disableTurbine := dep.ExportedPlugins()
|
||||
addPlugins(&deps, pluginJars, pluginClasses...)
|
||||
|
@ -1182,6 +1178,9 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
|
|||
deps.systemModules = &systemModules{outputDir, outputDeps}
|
||||
}
|
||||
}
|
||||
|
||||
// Merge dep's CLC after processing the dep itself (which may add its own <uses-library>).
|
||||
maybeAddCLCFromDep(module, tag, otherName, j.classLoaderContexts)
|
||||
})
|
||||
|
||||
return deps
|
||||
|
@ -2815,8 +2814,6 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||
switch tag {
|
||||
case libTag, staticLibTag:
|
||||
flags.classpath = append(flags.classpath, dep.HeaderJars()...)
|
||||
// sdk lib names from dependencies are re-exported
|
||||
j.classLoaderContexts.AddContextMap(dep.ClassLoaderContexts(), otherName)
|
||||
case bootClasspathTag:
|
||||
flags.bootClasspath = append(flags.bootClasspath, dep.HeaderJars()...)
|
||||
}
|
||||
|
@ -2824,10 +2821,12 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||
switch tag {
|
||||
case libTag:
|
||||
flags.classpath = append(flags.classpath, dep.SdkHeaderJars(ctx, j.sdkVersion())...)
|
||||
// names of sdk libs that are directly depended are exported
|
||||
j.classLoaderContexts.AddContext(ctx, otherName, dep.DexJarBuildPath(), dep.DexJarInstallPath())
|
||||
}
|
||||
}
|
||||
|
||||
// Merge dep's CLC after processing the dep itself (which may add its own <uses-library>).
|
||||
maybeAddCLCFromDep(module, tag, otherName, j.classLoaderContexts)
|
||||
})
|
||||
|
||||
var installFile android.Path
|
||||
|
@ -3248,3 +3247,31 @@ var Bool = proptools.Bool
|
|||
var BoolDefault = proptools.BoolDefault
|
||||
var String = proptools.String
|
||||
var inList = android.InList
|
||||
|
||||
// Add class loader context of a given dependency to the given class loader context, provided that
|
||||
// all the necessary conditions are met.
|
||||
func maybeAddCLCFromDep(depModule android.Module, depTag blueprint.DependencyTag,
|
||||
depName string, clcMap dexpreopt.ClassLoaderContextMap) {
|
||||
|
||||
if dep, ok := depModule.(Dependency); ok {
|
||||
if depTag == libTag {
|
||||
// Ok, propagate <uses-library> through non-static library dependencies.
|
||||
} else if depTag == staticLibTag {
|
||||
// Propagate <uses-library> through static library dependencies, unless it is a
|
||||
// component library (such as stubs). Component libraries have a dependency on their
|
||||
// SDK library, which should not be pulled just because of a static component library.
|
||||
if comp, isComp := depModule.(SdkLibraryComponentDependency); isComp {
|
||||
if compName := comp.OptionalImplicitSdkLibrary(); compName != nil {
|
||||
dep = nil
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Don't propagate <uses-library> for other dependency tags.
|
||||
dep = nil
|
||||
}
|
||||
|
||||
if dep != nil {
|
||||
clcMap.AddContextMap(dep.ClassLoaderContexts(), depName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue