Merge "Revert "Use depsets for transitive manifests and assets"" into main
This commit is contained in:
267
java/aar.go
267
java/aar.go
@@ -31,9 +31,10 @@ import (
|
|||||||
type AndroidLibraryDependency interface {
|
type AndroidLibraryDependency interface {
|
||||||
LibraryDependency
|
LibraryDependency
|
||||||
ExportPackage() android.Path
|
ExportPackage() android.Path
|
||||||
ResourcesNodeDepSet() *android.DepSet[resourcesNode]
|
ExportedRRODirs() []rroDir
|
||||||
RRODirsDepSet() *android.DepSet[rroDir]
|
ExportedStaticPackages() android.Paths
|
||||||
ManifestsDepSet() *android.DepSet[android.Path]
|
ExportedManifests() android.Paths
|
||||||
|
ExportedAssets() android.OptionalPath
|
||||||
SetRROEnforcedForDependent(enforce bool)
|
SetRROEnforcedForDependent(enforce bool)
|
||||||
IsRROEnforced(ctx android.BaseModuleContext) bool
|
IsRROEnforced(ctx android.BaseModuleContext) bool
|
||||||
}
|
}
|
||||||
@@ -93,32 +94,30 @@ type aaptProperties struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type aapt struct {
|
type aapt struct {
|
||||||
aaptSrcJar android.Path
|
aaptSrcJar android.Path
|
||||||
exportPackage android.Path
|
exportPackage android.Path
|
||||||
manifestPath android.Path
|
manifestPath android.Path
|
||||||
proguardOptionsFile android.Path
|
transitiveManifestPaths android.Paths
|
||||||
rTxt android.Path
|
proguardOptionsFile android.Path
|
||||||
extraAaptPackagesFile android.Path
|
rroDirs []rroDir
|
||||||
mergedManifestFile android.Path
|
rTxt android.Path
|
||||||
noticeFile android.OptionalPath
|
extraAaptPackagesFile android.Path
|
||||||
assetPackage android.OptionalPath
|
mergedManifestFile android.Path
|
||||||
isLibrary bool
|
noticeFile android.OptionalPath
|
||||||
defaultManifestVersion string
|
assetPackage android.OptionalPath
|
||||||
useEmbeddedNativeLibs bool
|
isLibrary bool
|
||||||
useEmbeddedDex bool
|
defaultManifestVersion string
|
||||||
usesNonSdkApis bool
|
useEmbeddedNativeLibs bool
|
||||||
hasNoCode bool
|
useEmbeddedDex bool
|
||||||
LoggingParent string
|
usesNonSdkApis bool
|
||||||
resourceFiles android.Paths
|
hasNoCode bool
|
||||||
|
LoggingParent string
|
||||||
|
resourceFiles android.Paths
|
||||||
|
|
||||||
splitNames []string
|
splitNames []string
|
||||||
splits []split
|
splits []split
|
||||||
|
|
||||||
aaptProperties aaptProperties
|
aaptProperties aaptProperties
|
||||||
|
|
||||||
resourcesNodesDepSet *android.DepSet[resourcesNode]
|
|
||||||
rroDirsDepSet *android.DepSet[rroDir]
|
|
||||||
manifestsDepSet *android.DepSet[android.Path]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type split struct {
|
type split struct {
|
||||||
@@ -142,16 +141,17 @@ func propagateRROEnforcementMutator(ctx android.TopDownMutatorContext) {
|
|||||||
func (a *aapt) ExportPackage() android.Path {
|
func (a *aapt) ExportPackage() android.Path {
|
||||||
return a.exportPackage
|
return a.exportPackage
|
||||||
}
|
}
|
||||||
func (a *aapt) ResourcesNodeDepSet() *android.DepSet[resourcesNode] {
|
|
||||||
return a.resourcesNodesDepSet
|
func (a *aapt) ExportedRRODirs() []rroDir {
|
||||||
|
return a.rroDirs
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *aapt) RRODirsDepSet() *android.DepSet[rroDir] {
|
func (a *aapt) ExportedManifests() android.Paths {
|
||||||
return a.rroDirsDepSet
|
return a.transitiveManifestPaths
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *aapt) ManifestsDepSet() *android.DepSet[android.Path] {
|
func (a *aapt) ExportedAssets() android.OptionalPath {
|
||||||
return a.manifestsDepSet
|
return a.assetPackage
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *aapt) SetRROEnforcedForDependent(enforce bool) {
|
func (a *aapt) SetRROEnforcedForDependent(enforce bool) {
|
||||||
@@ -291,7 +291,7 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon
|
|||||||
classLoaderContexts dexpreopt.ClassLoaderContextMap, excludedLibs []string,
|
classLoaderContexts dexpreopt.ClassLoaderContextMap, excludedLibs []string,
|
||||||
enforceDefaultTargetSdkVersion bool, extraLinkFlags ...string) {
|
enforceDefaultTargetSdkVersion bool, extraLinkFlags ...string) {
|
||||||
|
|
||||||
staticResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedDeps, libFlags :=
|
transitiveStaticLibs, transitiveStaticLibManifests, staticRRODirs, assetPackages, libDeps, libFlags :=
|
||||||
aaptLibs(ctx, sdkContext, classLoaderContexts)
|
aaptLibs(ctx, sdkContext, classLoaderContexts)
|
||||||
|
|
||||||
// Exclude any libraries from the supplied list.
|
// Exclude any libraries from the supplied list.
|
||||||
@@ -314,20 +314,13 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon
|
|||||||
EnforceDefaultTargetSdkVersion: enforceDefaultTargetSdkVersion,
|
EnforceDefaultTargetSdkVersion: enforceDefaultTargetSdkVersion,
|
||||||
})
|
})
|
||||||
|
|
||||||
staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
|
|
||||||
|
|
||||||
// Add additional manifest files to transitive manifests.
|
// Add additional manifest files to transitive manifests.
|
||||||
additionalManifests := android.PathsForModuleSrc(ctx, a.aaptProperties.Additional_manifests)
|
additionalManifests := android.PathsForModuleSrc(ctx, a.aaptProperties.Additional_manifests)
|
||||||
transitiveManifestPaths := append(android.Paths{manifestPath}, additionalManifests...)
|
a.transitiveManifestPaths = append(android.Paths{manifestPath}, additionalManifests...)
|
||||||
// TODO(b/288358614): Soong has historically not merged manifests from dependencies of android_library_import
|
a.transitiveManifestPaths = append(a.transitiveManifestPaths, transitiveStaticLibManifests...)
|
||||||
// modules. Merging manifests from dependencies could remove the need for pom2bp to generate the "-nodeps" copies
|
|
||||||
// of androidx libraries, but doing so triggers errors due to errors introduced by existing dependencies of
|
|
||||||
// android_library_import modules. If this is fixed, staticManifestsDepSet can be dropped completely in favor of
|
|
||||||
// staticResourcesNodesDepSet.manifests()
|
|
||||||
transitiveManifestPaths = append(transitiveManifestPaths, staticManifestsDepSet.ToList()...)
|
|
||||||
|
|
||||||
if len(transitiveManifestPaths) > 1 && !Bool(a.aaptProperties.Dont_merge_manifests) {
|
if len(a.transitiveManifestPaths) > 1 && !Bool(a.aaptProperties.Dont_merge_manifests) {
|
||||||
a.mergedManifestFile = manifestMerger(ctx, transitiveManifestPaths[0], transitiveManifestPaths[1:], a.isLibrary)
|
a.mergedManifestFile = manifestMerger(ctx, a.transitiveManifestPaths[0], a.transitiveManifestPaths[1:], a.isLibrary)
|
||||||
if !a.isLibrary {
|
if !a.isLibrary {
|
||||||
// Only use the merged manifest for applications. For libraries, the transitive closure of manifests
|
// Only use the merged manifest for applications. For libraries, the transitive closure of manifests
|
||||||
// will be propagated to the final application and merged there. The merged manifest for libraries is
|
// will be propagated to the final application and merged there. The merged manifest for libraries is
|
||||||
@@ -340,9 +333,9 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon
|
|||||||
|
|
||||||
compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, sdkContext, manifestPath)
|
compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, sdkContext, manifestPath)
|
||||||
|
|
||||||
|
rroDirs = append(rroDirs, staticRRODirs...)
|
||||||
linkFlags = append(linkFlags, libFlags...)
|
linkFlags = append(linkFlags, libFlags...)
|
||||||
linkDeps = append(linkDeps, sharedDeps...)
|
linkDeps = append(linkDeps, libDeps...)
|
||||||
linkDeps = append(linkDeps, staticDeps.resPackages()...)
|
|
||||||
linkFlags = append(linkFlags, extraLinkFlags...)
|
linkFlags = append(linkFlags, extraLinkFlags...)
|
||||||
if a.isLibrary {
|
if a.isLibrary {
|
||||||
linkFlags = append(linkFlags, "--static-lib")
|
linkFlags = append(linkFlags, "--static-lib")
|
||||||
@@ -370,10 +363,6 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon
|
|||||||
|
|
||||||
var compiledRes, compiledOverlay android.Paths
|
var compiledRes, compiledOverlay android.Paths
|
||||||
|
|
||||||
// AAPT2 overlays are in lowest to highest priority order, reverse the topological order
|
|
||||||
// of transitiveStaticLibs.
|
|
||||||
transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages())
|
|
||||||
|
|
||||||
compiledOverlay = append(compiledOverlay, transitiveStaticLibs...)
|
compiledOverlay = append(compiledOverlay, transitiveStaticLibs...)
|
||||||
|
|
||||||
if len(transitiveStaticLibs) > 0 {
|
if len(transitiveStaticLibs) > 0 {
|
||||||
@@ -415,18 +404,12 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// No need to specify assets from dependencies to aapt2Link for libraries, all transitive assets will be
|
|
||||||
// provided to the final app aapt2Link step.
|
|
||||||
var transitiveAssets android.Paths
|
|
||||||
if !a.isLibrary {
|
|
||||||
transitiveAssets = android.ReverseSliceInPlace(staticDeps.assets())
|
|
||||||
}
|
|
||||||
aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt, extraPackages,
|
aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt, extraPackages,
|
||||||
linkFlags, linkDeps, compiledRes, compiledOverlay, transitiveAssets, splitPackages)
|
linkFlags, linkDeps, compiledRes, compiledOverlay, assetPackages, splitPackages)
|
||||||
|
|
||||||
// Extract assets from the resource package output so that they can be used later in aapt2link
|
// Extract assets from the resource package output so that they can be used later in aapt2link
|
||||||
// for modules that depend on this one.
|
// for modules that depend on this one.
|
||||||
if android.PrefixInList(linkFlags, "-A ") {
|
if android.PrefixInList(linkFlags, "-A ") || len(assetPackages) > 0 {
|
||||||
assets := android.PathForModuleOut(ctx, "assets.zip")
|
assets := android.PathForModuleOut(ctx, "assets.zip")
|
||||||
ctx.Build(pctx, android.BuildParams{
|
ctx.Build(pctx, android.BuildParams{
|
||||||
Rule: extractAssetsRule,
|
Rule: extractAssetsRule,
|
||||||
@@ -441,62 +424,17 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon
|
|||||||
a.exportPackage = packageRes
|
a.exportPackage = packageRes
|
||||||
a.manifestPath = manifestPath
|
a.manifestPath = manifestPath
|
||||||
a.proguardOptionsFile = proguardOptionsFile
|
a.proguardOptionsFile = proguardOptionsFile
|
||||||
|
a.rroDirs = rroDirs
|
||||||
a.extraAaptPackagesFile = extraPackages
|
a.extraAaptPackagesFile = extraPackages
|
||||||
a.rTxt = rTxt
|
a.rTxt = rTxt
|
||||||
a.splits = splits
|
a.splits = splits
|
||||||
a.resourcesNodesDepSet = android.NewDepSetBuilder[resourcesNode](android.TOPOLOGICAL).
|
|
||||||
Direct(resourcesNode{
|
|
||||||
resPackage: a.exportPackage,
|
|
||||||
manifest: a.manifestPath,
|
|
||||||
assets: a.assetPackage,
|
|
||||||
}).
|
|
||||||
Transitive(staticResourcesNodesDepSet).Build()
|
|
||||||
a.rroDirsDepSet = android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL).
|
|
||||||
Direct(rroDirs...).
|
|
||||||
Transitive(staticRRODirsDepSet).Build()
|
|
||||||
a.manifestsDepSet = android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).
|
|
||||||
Direct(a.manifestPath).
|
|
||||||
Transitive(staticManifestsDepSet).Build()
|
|
||||||
}
|
|
||||||
|
|
||||||
type resourcesNode struct {
|
|
||||||
resPackage android.Path
|
|
||||||
manifest android.Path
|
|
||||||
assets android.OptionalPath
|
|
||||||
}
|
|
||||||
|
|
||||||
type transitiveAarDeps []resourcesNode
|
|
||||||
|
|
||||||
func (t transitiveAarDeps) resPackages() android.Paths {
|
|
||||||
var paths android.Paths
|
|
||||||
for _, dep := range t {
|
|
||||||
paths = append(paths, dep.resPackage)
|
|
||||||
}
|
|
||||||
return android.FirstUniquePaths(paths)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t transitiveAarDeps) manifests() android.Paths {
|
|
||||||
var paths android.Paths
|
|
||||||
for _, dep := range t {
|
|
||||||
paths = append(paths, dep.manifest)
|
|
||||||
}
|
|
||||||
return android.FirstUniquePaths(paths)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t transitiveAarDeps) assets() android.Paths {
|
|
||||||
var paths android.Paths
|
|
||||||
for _, dep := range t {
|
|
||||||
if dep.assets.Valid() {
|
|
||||||
paths = append(paths, dep.assets.Path())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return paths
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// aaptLibs collects libraries from dependencies and sdk_version and converts them into paths
|
// aaptLibs collects libraries from dependencies and sdk_version and converts them into paths
|
||||||
func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoaderContexts dexpreopt.ClassLoaderContextMap) (
|
func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoaderContexts dexpreopt.ClassLoaderContextMap) (
|
||||||
staticResourcesNodes *android.DepSet[resourcesNode], staticRRODirs *android.DepSet[rroDir],
|
transitiveStaticLibs, transitiveStaticLibManifests android.Paths, staticRRODirs []rroDir, assets, deps android.Paths, flags []string) {
|
||||||
staticManifests *android.DepSet[android.Path], sharedLibs android.Paths, flags []string) {
|
|
||||||
|
var sharedLibs android.Paths
|
||||||
|
|
||||||
if classLoaderContexts == nil {
|
if classLoaderContexts == nil {
|
||||||
// Not all callers need to compute class loader context, those who don't just pass nil.
|
// Not all callers need to compute class loader context, those who don't just pass nil.
|
||||||
@@ -509,10 +447,6 @@ func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoa
|
|||||||
sharedLibs = append(sharedLibs, sdkDep.jars...)
|
sharedLibs = append(sharedLibs, sdkDep.jars...)
|
||||||
}
|
}
|
||||||
|
|
||||||
var resourcesNodeDepSets []*android.DepSet[resourcesNode]
|
|
||||||
rroDirsDepSetBuilder := android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL)
|
|
||||||
manifestsDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
|
|
||||||
|
|
||||||
ctx.VisitDirectDeps(func(module android.Module) {
|
ctx.VisitDirectDeps(func(module android.Module) {
|
||||||
depTag := ctx.OtherModuleDependencyTag(module)
|
depTag := ctx.OtherModuleDependencyTag(module)
|
||||||
|
|
||||||
@@ -535,28 +469,32 @@ func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoa
|
|||||||
}
|
}
|
||||||
case staticLibTag:
|
case staticLibTag:
|
||||||
if exportPackage != nil {
|
if exportPackage != nil {
|
||||||
resourcesNodeDepSets = append(resourcesNodeDepSets, aarDep.ResourcesNodeDepSet())
|
transitiveStaticLibs = append(transitiveStaticLibs, aarDep.ExportedStaticPackages()...)
|
||||||
rroDirsDepSetBuilder.Transitive(aarDep.RRODirsDepSet())
|
transitiveStaticLibs = append(transitiveStaticLibs, exportPackage)
|
||||||
manifestsDepSetBuilder.Transitive(aarDep.ManifestsDepSet())
|
transitiveStaticLibManifests = append(transitiveStaticLibManifests, aarDep.ExportedManifests()...)
|
||||||
|
if aarDep.ExportedAssets().Valid() {
|
||||||
|
assets = append(assets, aarDep.ExportedAssets().Path())
|
||||||
|
}
|
||||||
|
|
||||||
|
outer:
|
||||||
|
for _, d := range aarDep.ExportedRRODirs() {
|
||||||
|
for _, e := range staticRRODirs {
|
||||||
|
if d.path == e.path {
|
||||||
|
continue outer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
staticRRODirs = append(staticRRODirs, d)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addCLCFromDep(ctx, module, classLoaderContexts)
|
addCLCFromDep(ctx, module, classLoaderContexts)
|
||||||
})
|
})
|
||||||
|
|
||||||
// AAPT2 overlays are in lowest to highest priority order, the topological order will be reversed later.
|
deps = append(deps, sharedLibs...)
|
||||||
// Reverse the dependency order now going into the depset so that it comes out in order after the second
|
deps = append(deps, transitiveStaticLibs...)
|
||||||
// reverse later.
|
|
||||||
// NOTE: this is legacy and probably incorrect behavior, for most other cases (e.g. conflicting classes in
|
|
||||||
// dependencies) the highest priority dependency is listed first, but for resources the highest priority
|
|
||||||
// dependency has to be listed last.
|
|
||||||
staticResourcesNodes = android.NewDepSet(android.TOPOLOGICAL, nil,
|
|
||||||
android.ReverseSliceInPlace(resourcesNodeDepSets))
|
|
||||||
|
|
||||||
staticRRODirs = rroDirsDepSetBuilder.Build()
|
if len(transitiveStaticLibs) > 0 {
|
||||||
staticManifests = manifestsDepSetBuilder.Build()
|
|
||||||
|
|
||||||
if len(staticResourcesNodes.ToList()) > 0 {
|
|
||||||
flags = append(flags, "--auto-add-overlay")
|
flags = append(flags, "--auto-add-overlay")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -564,7 +502,10 @@ func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoa
|
|||||||
flags = append(flags, "-I "+sharedLib.String())
|
flags = append(flags, "-I "+sharedLib.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
return staticResourcesNodes, staticRRODirs, staticManifests, sharedLibs, flags
|
transitiveStaticLibs = android.FirstUniquePaths(transitiveStaticLibs)
|
||||||
|
transitiveStaticLibManifests = android.FirstUniquePaths(transitiveStaticLibManifests)
|
||||||
|
|
||||||
|
return transitiveStaticLibs, transitiveStaticLibManifests, staticRRODirs, assets, deps, flags
|
||||||
}
|
}
|
||||||
|
|
||||||
type AndroidLibrary struct {
|
type AndroidLibrary struct {
|
||||||
@@ -575,6 +516,8 @@ type AndroidLibrary struct {
|
|||||||
androidLibraryProperties androidLibraryProperties
|
androidLibraryProperties androidLibraryProperties
|
||||||
|
|
||||||
aarFile android.WritablePath
|
aarFile android.WritablePath
|
||||||
|
|
||||||
|
exportedStaticPackages android.Paths
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ android.OutputFileProducer = (*AndroidLibrary)(nil)
|
var _ android.OutputFileProducer = (*AndroidLibrary)(nil)
|
||||||
@@ -589,6 +532,10 @@ func (a *AndroidLibrary) OutputFiles(tag string) (android.Paths, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *AndroidLibrary) ExportedStaticPackages() android.Paths {
|
||||||
|
return a.exportedStaticPackages
|
||||||
|
}
|
||||||
|
|
||||||
var _ AndroidLibraryDependency = (*AndroidLibrary)(nil)
|
var _ AndroidLibraryDependency = (*AndroidLibrary)(nil)
|
||||||
|
|
||||||
func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
|
func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
|
||||||
@@ -632,15 +579,19 @@ func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext)
|
|||||||
|
|
||||||
a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles,
|
a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles,
|
||||||
android.PathsForModuleSrc(ctx, a.dexProperties.Optimize.Proguard_flags_files)...)
|
android.PathsForModuleSrc(ctx, a.dexProperties.Optimize.Proguard_flags_files)...)
|
||||||
|
|
||||||
ctx.VisitDirectDeps(func(m android.Module) {
|
ctx.VisitDirectDeps(func(m android.Module) {
|
||||||
if ctx.OtherModuleDependencyTag(m) == staticLibTag {
|
if ctx.OtherModuleDependencyTag(m) == staticLibTag {
|
||||||
if lib, ok := m.(LibraryDependency); ok {
|
if lib, ok := m.(LibraryDependency); ok {
|
||||||
a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles, lib.ExportedProguardFlagFiles()...)
|
a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles, lib.ExportedProguardFlagFiles()...)
|
||||||
}
|
}
|
||||||
|
if alib, ok := m.(AndroidLibraryDependency); ok {
|
||||||
|
a.exportedStaticPackages = append(a.exportedStaticPackages, alib.ExportPackage())
|
||||||
|
a.exportedStaticPackages = append(a.exportedStaticPackages, alib.ExportedStaticPackages()...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
a.exportedProguardFlagFiles = android.FirstUniquePaths(a.exportedProguardFlagFiles)
|
a.exportedProguardFlagFiles = android.FirstUniquePaths(a.exportedProguardFlagFiles)
|
||||||
|
a.exportedStaticPackages = android.FirstUniquePaths(a.exportedStaticPackages)
|
||||||
|
|
||||||
prebuiltJniPackages := android.Paths{}
|
prebuiltJniPackages := android.Paths{}
|
||||||
ctx.VisitDirectDeps(func(module android.Module) {
|
ctx.VisitDirectDeps(func(module android.Module) {
|
||||||
@@ -730,8 +681,7 @@ type AARImport struct {
|
|||||||
manifest android.WritablePath
|
manifest android.WritablePath
|
||||||
assetsPackage android.WritablePath
|
assetsPackage android.WritablePath
|
||||||
|
|
||||||
resourcesNodesDepSet *android.DepSet[resourcesNode]
|
exportedStaticPackages android.Paths
|
||||||
manifestsDepSet *android.DepSet[android.Path]
|
|
||||||
|
|
||||||
hideApexVariantFromMake bool
|
hideApexVariantFromMake bool
|
||||||
|
|
||||||
@@ -788,20 +738,25 @@ var _ AndroidLibraryDependency = (*AARImport)(nil)
|
|||||||
func (a *AARImport) ExportPackage() android.Path {
|
func (a *AARImport) ExportPackage() android.Path {
|
||||||
return a.exportPackage
|
return a.exportPackage
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AARImport) ExportedProguardFlagFiles() android.Paths {
|
func (a *AARImport) ExportedProguardFlagFiles() android.Paths {
|
||||||
return android.Paths{a.proguardFlags}
|
return android.Paths{a.proguardFlags}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AARImport) ResourcesNodeDepSet() *android.DepSet[resourcesNode] {
|
func (a *AARImport) ExportedRRODirs() []rroDir {
|
||||||
return a.resourcesNodesDepSet
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AARImport) RRODirsDepSet() *android.DepSet[rroDir] {
|
func (a *AARImport) ExportedStaticPackages() android.Paths {
|
||||||
return android.NewDepSet[rroDir](android.TOPOLOGICAL, nil, nil)
|
return a.exportedStaticPackages
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AARImport) ManifestsDepSet() *android.DepSet[android.Path] {
|
func (a *AARImport) ExportedManifests() android.Paths {
|
||||||
return a.manifestsDepSet
|
return android.Paths{a.manifest}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AARImport) ExportedAssets() android.OptionalPath {
|
||||||
|
return android.OptionalPathForPath(a.assetsPackage)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RRO enforcement is not available on aar_import since its RRO dirs are not
|
// RRO enforcement is not available on aar_import since its RRO dirs are not
|
||||||
@@ -936,44 +891,32 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
linkFlags = append(linkFlags, "--manifest "+a.manifest.String())
|
linkFlags = append(linkFlags, "--manifest "+a.manifest.String())
|
||||||
linkDeps = append(linkDeps, a.manifest)
|
linkDeps = append(linkDeps, a.manifest)
|
||||||
|
|
||||||
staticResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedLibs, libFlags :=
|
transitiveStaticLibs, staticLibManifests, staticRRODirs, transitiveAssets, libDeps, libFlags :=
|
||||||
aaptLibs(ctx, android.SdkContext(a), nil)
|
aaptLibs(ctx, android.SdkContext(a), nil)
|
||||||
|
|
||||||
_ = staticRRODirsDepSet
|
_ = staticLibManifests
|
||||||
staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
|
_ = staticRRODirs
|
||||||
|
|
||||||
// AAPT2 overlays are in lowest to highest priority order, reverse the topological order
|
linkDeps = append(linkDeps, libDeps...)
|
||||||
// of transitiveStaticLibs.
|
|
||||||
transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages())
|
|
||||||
|
|
||||||
linkDeps = append(linkDeps, sharedLibs...)
|
|
||||||
linkDeps = append(linkDeps, transitiveStaticLibs...)
|
|
||||||
linkFlags = append(linkFlags, libFlags...)
|
linkFlags = append(linkFlags, libFlags...)
|
||||||
|
|
||||||
overlayRes := append(android.Paths{flata}, transitiveStaticLibs...)
|
overlayRes := append(android.Paths{flata}, transitiveStaticLibs...)
|
||||||
|
|
||||||
transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets())
|
|
||||||
aapt2Link(ctx, a.exportPackage, srcJar, proguardOptionsFile, rTxt, a.extraAaptPackagesFile,
|
aapt2Link(ctx, a.exportPackage, srcJar, proguardOptionsFile, rTxt, a.extraAaptPackagesFile,
|
||||||
linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil)
|
linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil)
|
||||||
|
|
||||||
resourcesNodesDepSetBuilder := android.NewDepSetBuilder[resourcesNode](android.TOPOLOGICAL)
|
// Merge this import's assets with its dependencies' assets (if there are any).
|
||||||
resourcesNodesDepSetBuilder.Direct(resourcesNode{
|
if len(transitiveAssets) > 0 {
|
||||||
resPackage: a.exportPackage,
|
mergedAssets := android.PathForModuleOut(ctx, "merged-assets.zip")
|
||||||
manifest: a.manifest,
|
inputZips := append(android.Paths{a.assetsPackage}, transitiveAssets...)
|
||||||
assets: android.OptionalPathForPath(a.assetsPackage),
|
ctx.Build(pctx, android.BuildParams{
|
||||||
})
|
Rule: mergeAssetsRule,
|
||||||
resourcesNodesDepSetBuilder.Transitive(staticResourcesNodesDepSet)
|
Inputs: inputZips,
|
||||||
a.resourcesNodesDepSet = resourcesNodesDepSetBuilder.Build()
|
Output: mergedAssets,
|
||||||
|
Description: "merge assets from dependencies and self",
|
||||||
manifestDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).Direct(a.manifest)
|
})
|
||||||
// TODO(b/288358614): Soong has historically not merged manifests from dependencies of android_library_import
|
a.assetsPackage = mergedAssets
|
||||||
// modules. Merging manifests from dependencies could remove the need for pom2bp to generate the "-nodeps" copies
|
}
|
||||||
// of androidx libraries, but doing so triggers errors due to errors introduced by existing dependencies of
|
|
||||||
// android_library_import modules. If this is fixed, AndroidLibraryDependency.ManifestsDepSet can be dropped
|
|
||||||
// completely in favor of AndroidLibraryDependency.ResourceNodesDepSet.manifest
|
|
||||||
//manifestDepSetBuilder.Transitive(transitiveStaticDeps.manifests)
|
|
||||||
_ = staticManifestsDepSet
|
|
||||||
a.manifestsDepSet = manifestDepSetBuilder.Build()
|
|
||||||
|
|
||||||
a.collectTransitiveHeaderJars(ctx)
|
a.collectTransitiveHeaderJars(ctx)
|
||||||
ctx.SetProvider(JavaInfoProvider, JavaInfo{
|
ctx.SetProvider(JavaInfoProvider, JavaInfo{
|
||||||
|
@@ -368,13 +368,8 @@ func (app *AndroidApp) AndroidMkEntries() []android.AndroidMkEntries {
|
|||||||
|
|
||||||
filterRRO := func(filter overlayType) android.Paths {
|
filterRRO := func(filter overlayType) android.Paths {
|
||||||
var paths android.Paths
|
var paths android.Paths
|
||||||
seen := make(map[android.Path]bool)
|
for _, d := range app.rroDirs {
|
||||||
for _, d := range app.rroDirsDepSet.ToList() {
|
|
||||||
if d.overlayType == filter {
|
if d.overlayType == filter {
|
||||||
if seen[d.path] {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
seen[d.path] = true
|
|
||||||
paths = append(paths, d.path)
|
paths = append(paths, d.path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -204,8 +204,8 @@ func (a *AndroidApp) ExportedProguardFlagFiles() android.Paths {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AndroidApp) ResourcesNodeDepSet() *android.DepSet[resourcesNode] {
|
func (a *AndroidApp) ExportedStaticPackages() android.Paths {
|
||||||
return a.aapt.resourcesNodesDepSet
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AndroidApp) OutputFile() android.Path {
|
func (a *AndroidApp) OutputFile() android.Path {
|
||||||
|
@@ -599,7 +599,7 @@ func TestLibraryAssets(t *testing.T) {
|
|||||||
android_library {
|
android_library {
|
||||||
name: "lib3",
|
name: "lib3",
|
||||||
sdk_version: "current",
|
sdk_version: "current",
|
||||||
static_libs: ["lib4", "import"],
|
static_libs: ["lib4"],
|
||||||
}
|
}
|
||||||
|
|
||||||
android_library {
|
android_library {
|
||||||
@@ -607,12 +607,6 @@ func TestLibraryAssets(t *testing.T) {
|
|||||||
sdk_version: "current",
|
sdk_version: "current",
|
||||||
asset_dirs: ["assets_b"],
|
asset_dirs: ["assets_b"],
|
||||||
}
|
}
|
||||||
|
|
||||||
android_library_import {
|
|
||||||
name: "import",
|
|
||||||
sdk_version: "current",
|
|
||||||
aars: ["import.aar"],
|
|
||||||
}
|
|
||||||
`
|
`
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
@@ -622,12 +616,11 @@ func TestLibraryAssets(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "foo",
|
name: "foo",
|
||||||
// lib1 has its own assets. lib3 doesn't have any, but lib4 and import have assets.
|
// lib1 has its own asset. lib3 doesn't have any, but provides lib4's transitively.
|
||||||
assetPackages: []string{
|
assetPackages: []string{
|
||||||
"out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
|
"out/soong/.intermediates/foo/android_common/aapt2/package-res.apk",
|
||||||
"out/soong/.intermediates/lib1/android_common/assets.zip",
|
"out/soong/.intermediates/lib1/android_common/assets.zip",
|
||||||
"out/soong/.intermediates/lib4/android_common/assets.zip",
|
"out/soong/.intermediates/lib3/android_common/assets.zip",
|
||||||
"out/soong/.intermediates/import/android_common/assets.zip",
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -639,6 +632,10 @@ func TestLibraryAssets(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "lib3",
|
name: "lib3",
|
||||||
|
assetPackages: []string{
|
||||||
|
"out/soong/.intermediates/lib3/android_common/aapt2/package-res.apk",
|
||||||
|
"out/soong/.intermediates/lib4/android_common/assets.zip",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "lib4",
|
name: "lib4",
|
||||||
@@ -764,14 +761,11 @@ func TestAndroidResourceProcessor(t *testing.T) {
|
|||||||
appResources: nil,
|
appResources: nil,
|
||||||
appOverlays: []string{
|
appOverlays: []string{
|
||||||
"out/soong/.intermediates/transitive/android_common/package-res.apk",
|
"out/soong/.intermediates/transitive/android_common/package-res.apk",
|
||||||
"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
|
|
||||||
"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
|
"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
|
||||||
"out/soong/.intermediates/direct/android_common/package-res.apk",
|
"out/soong/.intermediates/direct/android_common/package-res.apk",
|
||||||
"out/soong/.intermediates/direct_import_dep/android_common/package-res.apk",
|
|
||||||
"out/soong/.intermediates/direct_import/android_common/package-res.apk",
|
"out/soong/.intermediates/direct_import/android_common/package-res.apk",
|
||||||
"out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
|
"out/soong/.intermediates/app/android_common/aapt2/app/res/values_strings.arsc.flat",
|
||||||
},
|
},
|
||||||
|
|
||||||
appImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
|
appImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
|
||||||
appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
|
appSrcJars: []string{"out/soong/.intermediates/app/android_common/gen/android/R.srcjar"},
|
||||||
appClasspath: []string{
|
appClasspath: []string{
|
||||||
@@ -788,11 +782,9 @@ func TestAndroidResourceProcessor(t *testing.T) {
|
|||||||
directResources: nil,
|
directResources: nil,
|
||||||
directOverlays: []string{
|
directOverlays: []string{
|
||||||
"out/soong/.intermediates/transitive/android_common/package-res.apk",
|
"out/soong/.intermediates/transitive/android_common/package-res.apk",
|
||||||
"out/soong/.intermediates/transitive_import_dep/android_common/package-res.apk",
|
|
||||||
"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
|
"out/soong/.intermediates/transitive_import/android_common/package-res.apk",
|
||||||
"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
|
"out/soong/.intermediates/direct/android_common/aapt2/direct/res/values_strings.arsc.flat",
|
||||||
},
|
},
|
||||||
|
|
||||||
directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
|
directImports: []string{"out/soong/.intermediates/default/java/framework-res/android_common/package-res.apk"},
|
||||||
directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
|
directSrcJars: []string{"out/soong/.intermediates/direct/android_common/gen/android/R.srcjar"},
|
||||||
directClasspath: []string{
|
directClasspath: []string{
|
||||||
@@ -1206,7 +1198,7 @@ func TestAndroidResourceOverlays(t *testing.T) {
|
|||||||
overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
|
overlayFiles = resourceListToFiles(module, android.PathsRelativeToTop(overlayList.Inputs))
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, d := range module.Module().(AndroidLibraryDependency).RRODirsDepSet().ToList() {
|
for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
|
||||||
var prefix string
|
var prefix string
|
||||||
if d.overlayType == device {
|
if d.overlayType == device {
|
||||||
prefix = "device:"
|
prefix = "device:"
|
||||||
|
Reference in New Issue
Block a user