Rework class loader context implementation.
The old representation consisted of a list of libraries (UsesLibraries), a list of optional libraries (OptionalUsesLibraries) and a mapping from library name to its build/install paths (LibraryPaths). The separation into lists and map was necessary because of special handling of compatibility libraries, which is now unified with normal libraries. The new representation is a mapping from target SDK version to a tree structure ClassLoaderContext. Each node of the tree represents a library and contains library name, build/install paths and a slice of subcontexts for dependencies. The same library may occur in the tree multiple times in case it is a dependency of multiple libraries. The order in which libraries are added matters (the resulting tree shape may be different). Test results have to be updated, as the resulting <uses-library> list is reodered (previously it was a sorted list of map keys, and now it is formed by a depth-first preorder traversal of the class loader tree). Test: lunch aosp_cf_x86_phone-userdebug && m Bug: 132357300 Bug: 168686456 Change-Id: I11be8cd2967f004fd58753d7c5fb99fed179cd63
This commit is contained in:
36
java/java.go
36
java/java.go
@@ -416,8 +416,8 @@ type Module struct {
|
||||
// manifest file to use instead of properties.Manifest
|
||||
overrideManifest android.OptionalPath
|
||||
|
||||
// map of SDK libs exported by this java module to their build and install paths
|
||||
exportedSdkLibs dexpreopt.LibraryPaths
|
||||
// map of SDK version to class loader context
|
||||
exportedSdkLibs dexpreopt.ClassLoaderContextMap
|
||||
|
||||
// list of plugins that this java module is exporting
|
||||
exportedPluginJars android.Paths
|
||||
@@ -509,7 +509,7 @@ type Dependency interface {
|
||||
ImplementationJars() android.Paths
|
||||
ResourceJars() android.Paths
|
||||
AidlIncludeDirs() android.Paths
|
||||
ExportedSdkLibs() dexpreopt.LibraryPaths
|
||||
ExportedSdkLibs() dexpreopt.ClassLoaderContextMap
|
||||
ExportedPlugins() (android.Paths, []string)
|
||||
SrcJarArgs() ([]string, android.Paths)
|
||||
BaseModuleName() string
|
||||
@@ -1027,7 +1027,8 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
|
||||
case libTag:
|
||||
deps.classpath = append(deps.classpath, dep.SdkHeaderJars(ctx, j.sdkVersion())...)
|
||||
// names of sdk libs that are directly depended are exported
|
||||
j.exportedSdkLibs.MaybeAddLibraryPath(ctx, dep.OptionalImplicitSdkLibrary(), dep.DexJarBuildPath(), dep.DexJarInstallPath())
|
||||
j.exportedSdkLibs.MaybeAddContext(ctx, dep.OptionalImplicitSdkLibrary(),
|
||||
dep.DexJarBuildPath(), dep.DexJarInstallPath())
|
||||
case staticLibTag:
|
||||
ctx.ModuleErrorf("dependency on java_sdk_library %q can only be in libs", otherName)
|
||||
}
|
||||
@@ -1038,7 +1039,7 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
|
||||
case libTag, instrumentationForTag:
|
||||
deps.classpath = append(deps.classpath, dep.HeaderJars()...)
|
||||
// sdk lib names from dependencies are re-exported
|
||||
j.exportedSdkLibs.AddLibraryPaths(dep.ExportedSdkLibs())
|
||||
j.exportedSdkLibs.AddContextMap(dep.ExportedSdkLibs())
|
||||
deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs()...)
|
||||
pluginJars, pluginClasses := dep.ExportedPlugins()
|
||||
addPlugins(&deps, pluginJars, pluginClasses...)
|
||||
@@ -1050,7 +1051,7 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
|
||||
deps.staticHeaderJars = append(deps.staticHeaderJars, dep.HeaderJars()...)
|
||||
deps.staticResourceJars = append(deps.staticResourceJars, dep.ResourceJars()...)
|
||||
// sdk lib names from dependencies are re-exported
|
||||
j.exportedSdkLibs.AddLibraryPaths(dep.ExportedSdkLibs())
|
||||
j.exportedSdkLibs.AddContextMap(dep.ExportedSdkLibs())
|
||||
deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs()...)
|
||||
pluginJars, pluginClasses := dep.ExportedPlugins()
|
||||
addPlugins(&deps, pluginJars, pluginClasses...)
|
||||
@@ -1902,7 +1903,7 @@ func (j *Module) AidlIncludeDirs() android.Paths {
|
||||
return j.exportAidlIncludeDirs
|
||||
}
|
||||
|
||||
func (j *Module) ExportedSdkLibs() dexpreopt.LibraryPaths {
|
||||
func (j *Module) ExportedSdkLibs() dexpreopt.ClassLoaderContextMap {
|
||||
return j.exportedSdkLibs
|
||||
}
|
||||
|
||||
@@ -2041,7 +2042,7 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
j.dexProperties.Uncompress_dex = proptools.BoolPtr(shouldUncompressDex(ctx, &j.dexpreopter))
|
||||
}
|
||||
j.dexpreopter.uncompressedDex = *j.dexProperties.Uncompress_dex
|
||||
j.exportedSdkLibs = make(dexpreopt.LibraryPaths)
|
||||
j.exportedSdkLibs = make(dexpreopt.ClassLoaderContextMap)
|
||||
j.compile(ctx, nil)
|
||||
|
||||
// Collect the module directory for IDE info in java/jdeps.go.
|
||||
@@ -2061,11 +2062,12 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
// add the name of that java_sdk_library to the exported sdk libs to make sure
|
||||
// that, if necessary, a <uses-library> element for that java_sdk_library is
|
||||
// added to the Android manifest.
|
||||
j.exportedSdkLibs.MaybeAddLibraryPath(ctx, j.OptionalImplicitSdkLibrary(), j.DexJarBuildPath(), j.DexJarInstallPath())
|
||||
j.exportedSdkLibs.MaybeAddContext(ctx, j.OptionalImplicitSdkLibrary(),
|
||||
j.DexJarBuildPath(), j.DexJarInstallPath())
|
||||
|
||||
// A non-SDK library may provide a <uses-library> (the name may be different from the module name).
|
||||
if lib := proptools.String(j.usesLibraryProperties.Provides_uses_lib); lib != "" {
|
||||
j.exportedSdkLibs.AddLibraryPath(ctx, lib, j.DexJarBuildPath(), j.DexJarInstallPath())
|
||||
j.exportedSdkLibs.AddContext(ctx, lib, j.DexJarBuildPath(), j.DexJarInstallPath())
|
||||
}
|
||||
|
||||
j.distFiles = j.GenerateTaggedDistFiles(ctx)
|
||||
@@ -2644,7 +2646,7 @@ type Import struct {
|
||||
dexJarFile android.Path
|
||||
|
||||
combinedClasspathFile android.Path
|
||||
exportedSdkLibs dexpreopt.LibraryPaths
|
||||
exportedSdkLibs dexpreopt.ClassLoaderContextMap
|
||||
exportAidlIncludeDirs android.Paths
|
||||
|
||||
hideApexVariantFromMake bool
|
||||
@@ -2719,7 +2721,7 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
TransformJetifier(ctx, outputFile, inputFile)
|
||||
}
|
||||
j.combinedClasspathFile = outputFile
|
||||
j.exportedSdkLibs = make(dexpreopt.LibraryPaths)
|
||||
j.exportedSdkLibs = make(dexpreopt.ClassLoaderContextMap)
|
||||
|
||||
var flags javaBuilderFlags
|
||||
|
||||
@@ -2733,7 +2735,7 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
case libTag, staticLibTag:
|
||||
flags.classpath = append(flags.classpath, dep.HeaderJars()...)
|
||||
// sdk lib names from dependencies are re-exported
|
||||
j.exportedSdkLibs.AddLibraryPaths(dep.ExportedSdkLibs())
|
||||
j.exportedSdkLibs.AddContextMap(dep.ExportedSdkLibs())
|
||||
case bootClasspathTag:
|
||||
flags.bootClasspath = append(flags.bootClasspath, dep.HeaderJars()...)
|
||||
}
|
||||
@@ -2742,7 +2744,8 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
case libTag:
|
||||
flags.classpath = append(flags.classpath, dep.SdkHeaderJars(ctx, j.sdkVersion())...)
|
||||
// names of sdk libs that are directly depended are exported
|
||||
j.exportedSdkLibs.AddLibraryPath(ctx, otherName, dep.DexJarBuildPath(), dep.DexJarInstallPath())
|
||||
j.exportedSdkLibs.AddContext(ctx, otherName,
|
||||
dep.DexJarBuildPath(), dep.DexJarInstallPath())
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -2757,7 +2760,8 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
// add the name of that java_sdk_library to the exported sdk libs to make sure
|
||||
// that, if necessary, a <uses-library> element for that java_sdk_library is
|
||||
// added to the Android manifest.
|
||||
j.exportedSdkLibs.MaybeAddLibraryPath(ctx, j.OptionalImplicitSdkLibrary(), outputFile, installFile)
|
||||
j.exportedSdkLibs.MaybeAddContext(ctx, j.OptionalImplicitSdkLibrary(),
|
||||
outputFile, installFile)
|
||||
|
||||
j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.properties.Aidl.Export_include_dirs)
|
||||
|
||||
@@ -2839,7 +2843,7 @@ func (j *Import) AidlIncludeDirs() android.Paths {
|
||||
return j.exportAidlIncludeDirs
|
||||
}
|
||||
|
||||
func (j *Import) ExportedSdkLibs() dexpreopt.LibraryPaths {
|
||||
func (j *Import) ExportedSdkLibs() dexpreopt.ClassLoaderContextMap {
|
||||
return j.exportedSdkLibs
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user