Loading java/aar.go +106 −163 Original line number Diff line number Diff line Loading @@ -31,9 +31,10 @@ import ( type AndroidLibraryDependency interface { LibraryDependency ExportPackage() android.Path ResourcesNodeDepSet() *android.DepSet[resourcesNode] RRODirsDepSet() *android.DepSet[rroDir] ManifestsDepSet() *android.DepSet[android.Path] ExportedRRODirs() []rroDir ExportedStaticPackages() android.Paths ExportedManifests() android.Paths ExportedAssets() android.OptionalPath SetRROEnforcedForDependent(enforce bool) IsRROEnforced(ctx android.BaseModuleContext) bool } Loading Loading @@ -96,7 +97,9 @@ type aapt struct { aaptSrcJar android.Path exportPackage android.Path manifestPath android.Path transitiveManifestPaths android.Paths proguardOptionsFile android.Path rroDirs []rroDir rTxt android.Path extraAaptPackagesFile android.Path mergedManifestFile android.Path Loading @@ -115,10 +118,6 @@ type aapt struct { splits []split aaptProperties aaptProperties resourcesNodesDepSet *android.DepSet[resourcesNode] rroDirsDepSet *android.DepSet[rroDir] manifestsDepSet *android.DepSet[android.Path] } type split struct { Loading @@ -142,16 +141,17 @@ func propagateRROEnforcementMutator(ctx android.TopDownMutatorContext) { func (a *aapt) ExportPackage() android.Path { 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] { return a.rroDirsDepSet func (a *aapt) ExportedManifests() android.Paths { return a.transitiveManifestPaths } func (a *aapt) ManifestsDepSet() *android.DepSet[android.Path] { return a.manifestsDepSet func (a *aapt) ExportedAssets() android.OptionalPath { return a.assetPackage } func (a *aapt) SetRROEnforcedForDependent(enforce bool) { Loading Loading @@ -291,7 +291,7 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon classLoaderContexts dexpreopt.ClassLoaderContextMap, excludedLibs []string, enforceDefaultTargetSdkVersion bool, extraLinkFlags ...string) { staticResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedDeps, libFlags := transitiveStaticLibs, transitiveStaticLibManifests, staticRRODirs, assetPackages, libDeps, libFlags := aaptLibs(ctx, sdkContext, classLoaderContexts) // Exclude any libraries from the supplied list. Loading @@ -314,20 +314,13 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon EnforceDefaultTargetSdkVersion: enforceDefaultTargetSdkVersion, }) staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList()) // Add additional manifest files to transitive manifests. additionalManifests := android.PathsForModuleSrc(ctx, a.aaptProperties.Additional_manifests) transitiveManifestPaths := append(android.Paths{manifestPath}, additionalManifests...) // TODO(b/288358614): Soong has historically not merged manifests from dependencies of android_library_import // 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) { a.mergedManifestFile = manifestMerger(ctx, transitiveManifestPaths[0], transitiveManifestPaths[1:], a.isLibrary) a.transitiveManifestPaths = append(android.Paths{manifestPath}, additionalManifests...) a.transitiveManifestPaths = append(a.transitiveManifestPaths, transitiveStaticLibManifests...) if len(a.transitiveManifestPaths) > 1 && !Bool(a.aaptProperties.Dont_merge_manifests) { a.mergedManifestFile = manifestMerger(ctx, a.transitiveManifestPaths[0], a.transitiveManifestPaths[1:], a.isLibrary) if !a.isLibrary { // 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 Loading @@ -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) rroDirs = append(rroDirs, staticRRODirs...) linkFlags = append(linkFlags, libFlags...) linkDeps = append(linkDeps, sharedDeps...) linkDeps = append(linkDeps, staticDeps.resPackages()...) linkDeps = append(linkDeps, libDeps...) linkFlags = append(linkFlags, extraLinkFlags...) if a.isLibrary { linkFlags = append(linkFlags, "--static-lib") Loading Loading @@ -370,10 +363,6 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon 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...) if len(transitiveStaticLibs) > 0 { Loading Loading @@ -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, 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 // 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") ctx.Build(pctx, android.BuildParams{ Rule: extractAssetsRule, Loading @@ -441,62 +424,17 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon a.exportPackage = packageRes a.manifestPath = manifestPath a.proguardOptionsFile = proguardOptionsFile a.rroDirs = rroDirs a.extraAaptPackagesFile = extraPackages a.rTxt = rTxt 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 func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoaderContexts dexpreopt.ClassLoaderContextMap) ( staticResourcesNodes *android.DepSet[resourcesNode], staticRRODirs *android.DepSet[rroDir], staticManifests *android.DepSet[android.Path], sharedLibs android.Paths, flags []string) { transitiveStaticLibs, transitiveStaticLibManifests android.Paths, staticRRODirs []rroDir, assets, deps android.Paths, flags []string) { var sharedLibs android.Paths if classLoaderContexts == nil { // Not all callers need to compute class loader context, those who don't just pass nil. Loading @@ -509,10 +447,6 @@ func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoa 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) { depTag := ctx.OtherModuleDependencyTag(module) Loading @@ -535,28 +469,32 @@ func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoa } case staticLibTag: if exportPackage != nil { resourcesNodeDepSets = append(resourcesNodeDepSets, aarDep.ResourcesNodeDepSet()) rroDirsDepSetBuilder.Transitive(aarDep.RRODirsDepSet()) manifestsDepSetBuilder.Transitive(aarDep.ManifestsDepSet()) transitiveStaticLibs = append(transitiveStaticLibs, aarDep.ExportedStaticPackages()...) transitiveStaticLibs = append(transitiveStaticLibs, exportPackage) 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) }) // AAPT2 overlays are in lowest to highest priority order, the topological order will be reversed later. // Reverse the dependency order now going into the depset so that it comes out in order after the second // 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)) deps = append(deps, sharedLibs...) deps = append(deps, transitiveStaticLibs...) staticRRODirs = rroDirsDepSetBuilder.Build() staticManifests = manifestsDepSetBuilder.Build() if len(staticResourcesNodes.ToList()) > 0 { if len(transitiveStaticLibs) > 0 { flags = append(flags, "--auto-add-overlay") } Loading @@ -564,7 +502,10 @@ func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoa 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 { Loading @@ -575,6 +516,8 @@ type AndroidLibrary struct { androidLibraryProperties androidLibraryProperties aarFile android.WritablePath exportedStaticPackages android.Paths } var _ android.OutputFileProducer = (*AndroidLibrary)(nil) Loading @@ -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) func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { Loading Loading @@ -632,15 +579,19 @@ func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles, android.PathsForModuleSrc(ctx, a.dexProperties.Optimize.Proguard_flags_files)...) ctx.VisitDirectDeps(func(m android.Module) { if ctx.OtherModuleDependencyTag(m) == staticLibTag { if lib, ok := m.(LibraryDependency); ok { 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.exportedStaticPackages = android.FirstUniquePaths(a.exportedStaticPackages) prebuiltJniPackages := android.Paths{} ctx.VisitDirectDeps(func(module android.Module) { Loading Loading @@ -730,8 +681,7 @@ type AARImport struct { manifest android.WritablePath assetsPackage android.WritablePath resourcesNodesDepSet *android.DepSet[resourcesNode] manifestsDepSet *android.DepSet[android.Path] exportedStaticPackages android.Paths hideApexVariantFromMake bool Loading Loading @@ -788,20 +738,25 @@ var _ AndroidLibraryDependency = (*AARImport)(nil) func (a *AARImport) ExportPackage() android.Path { return a.exportPackage } func (a *AARImport) ExportedProguardFlagFiles() android.Paths { return android.Paths{a.proguardFlags} } func (a *AARImport) ResourcesNodeDepSet() *android.DepSet[resourcesNode] { return a.resourcesNodesDepSet func (a *AARImport) ExportedRRODirs() []rroDir { return nil } func (a *AARImport) ExportedStaticPackages() android.Paths { return a.exportedStaticPackages } func (a *AARImport) RRODirsDepSet() *android.DepSet[rroDir] { return android.NewDepSet[rroDir](android.TOPOLOGICAL, nil, nil) func (a *AARImport) ExportedManifests() android.Paths { return android.Paths{a.manifest} } func (a *AARImport) ManifestsDepSet() *android.DepSet[android.Path] { return a.manifestsDepSet 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 Loading Loading @@ -936,44 +891,32 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { linkFlags = append(linkFlags, "--manifest "+a.manifest.String()) linkDeps = append(linkDeps, a.manifest) staticResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedLibs, libFlags := transitiveStaticLibs, staticLibManifests, staticRRODirs, transitiveAssets, libDeps, libFlags := aaptLibs(ctx, android.SdkContext(a), nil) _ = staticRRODirsDepSet staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList()) // AAPT2 overlays are in lowest to highest priority order, reverse the topological order // of transitiveStaticLibs. transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages()) _ = staticLibManifests _ = staticRRODirs linkDeps = append(linkDeps, sharedLibs...) linkDeps = append(linkDeps, transitiveStaticLibs...) linkDeps = append(linkDeps, libDeps...) linkFlags = append(linkFlags, libFlags...) overlayRes := append(android.Paths{flata}, transitiveStaticLibs...) transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets()) aapt2Link(ctx, a.exportPackage, srcJar, proguardOptionsFile, rTxt, a.extraAaptPackagesFile, linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil) resourcesNodesDepSetBuilder := android.NewDepSetBuilder[resourcesNode](android.TOPOLOGICAL) resourcesNodesDepSetBuilder.Direct(resourcesNode{ resPackage: a.exportPackage, manifest: a.manifest, assets: android.OptionalPathForPath(a.assetsPackage), // Merge this import's assets with its dependencies' assets (if there are any). if len(transitiveAssets) > 0 { mergedAssets := android.PathForModuleOut(ctx, "merged-assets.zip") inputZips := append(android.Paths{a.assetsPackage}, transitiveAssets...) ctx.Build(pctx, android.BuildParams{ Rule: mergeAssetsRule, Inputs: inputZips, Output: mergedAssets, Description: "merge assets from dependencies and self", }) resourcesNodesDepSetBuilder.Transitive(staticResourcesNodesDepSet) a.resourcesNodesDepSet = resourcesNodesDepSetBuilder.Build() 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 // 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.assetsPackage = mergedAssets } a.collectTransitiveHeaderJars(ctx) ctx.SetProvider(JavaInfoProvider, JavaInfo{ Loading java/androidmk.go +1 −6 Original line number Diff line number Diff line Loading @@ -368,13 +368,8 @@ func (app *AndroidApp) AndroidMkEntries() []android.AndroidMkEntries { filterRRO := func(filter overlayType) android.Paths { var paths android.Paths seen := make(map[android.Path]bool) for _, d := range app.rroDirsDepSet.ToList() { for _, d := range app.rroDirs { if d.overlayType == filter { if seen[d.path] { continue } seen[d.path] = true paths = append(paths, d.path) } } Loading java/app.go +2 −2 Original line number Diff line number Diff line Loading @@ -204,8 +204,8 @@ func (a *AndroidApp) ExportedProguardFlagFiles() android.Paths { return nil } func (a *AndroidApp) ResourcesNodeDepSet() *android.DepSet[resourcesNode] { return a.aapt.resourcesNodesDepSet func (a *AndroidApp) ExportedStaticPackages() android.Paths { return nil } func (a *AndroidApp) OutputFile() android.Path { Loading java/app_test.go +8 −16 Original line number Diff line number Diff line Loading @@ -599,7 +599,7 @@ func TestLibraryAssets(t *testing.T) { android_library { name: "lib3", sdk_version: "current", static_libs: ["lib4", "import"], static_libs: ["lib4"], } android_library { Loading @@ -607,12 +607,6 @@ func TestLibraryAssets(t *testing.T) { sdk_version: "current", asset_dirs: ["assets_b"], } android_library_import { name: "import", sdk_version: "current", aars: ["import.aar"], } ` testCases := []struct { Loading @@ -622,12 +616,11 @@ func TestLibraryAssets(t *testing.T) { }{ { 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{ "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk", "out/soong/.intermediates/lib1/android_common/assets.zip", "out/soong/.intermediates/lib4/android_common/assets.zip", "out/soong/.intermediates/import/android_common/assets.zip", "out/soong/.intermediates/lib3/android_common/assets.zip", }, }, { Loading @@ -639,6 +632,10 @@ func TestLibraryAssets(t *testing.T) { }, { name: "lib3", assetPackages: []string{ "out/soong/.intermediates/lib3/android_common/aapt2/package-res.apk", "out/soong/.intermediates/lib4/android_common/assets.zip", }, }, { name: "lib4", Loading Loading @@ -764,14 +761,11 @@ func TestAndroidResourceProcessor(t *testing.T) { appResources: nil, appOverlays: []string{ "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/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/app/android_common/aapt2/app/res/values_strings.arsc.flat", }, 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"}, appClasspath: []string{ Loading @@ -788,11 +782,9 @@ func TestAndroidResourceProcessor(t *testing.T) { directResources: nil, directOverlays: []string{ "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/direct/android_common/aapt2/direct/res/values_strings.arsc.flat", }, 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"}, directClasspath: []string{ Loading Loading @@ -1206,7 +1198,7 @@ func TestAndroidResourceOverlays(t *testing.T) { 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 if d.overlayType == device { prefix = "device:" Loading Loading
java/aar.go +106 −163 Original line number Diff line number Diff line Loading @@ -31,9 +31,10 @@ import ( type AndroidLibraryDependency interface { LibraryDependency ExportPackage() android.Path ResourcesNodeDepSet() *android.DepSet[resourcesNode] RRODirsDepSet() *android.DepSet[rroDir] ManifestsDepSet() *android.DepSet[android.Path] ExportedRRODirs() []rroDir ExportedStaticPackages() android.Paths ExportedManifests() android.Paths ExportedAssets() android.OptionalPath SetRROEnforcedForDependent(enforce bool) IsRROEnforced(ctx android.BaseModuleContext) bool } Loading Loading @@ -96,7 +97,9 @@ type aapt struct { aaptSrcJar android.Path exportPackage android.Path manifestPath android.Path transitiveManifestPaths android.Paths proguardOptionsFile android.Path rroDirs []rroDir rTxt android.Path extraAaptPackagesFile android.Path mergedManifestFile android.Path Loading @@ -115,10 +118,6 @@ type aapt struct { splits []split aaptProperties aaptProperties resourcesNodesDepSet *android.DepSet[resourcesNode] rroDirsDepSet *android.DepSet[rroDir] manifestsDepSet *android.DepSet[android.Path] } type split struct { Loading @@ -142,16 +141,17 @@ func propagateRROEnforcementMutator(ctx android.TopDownMutatorContext) { func (a *aapt) ExportPackage() android.Path { 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] { return a.rroDirsDepSet func (a *aapt) ExportedManifests() android.Paths { return a.transitiveManifestPaths } func (a *aapt) ManifestsDepSet() *android.DepSet[android.Path] { return a.manifestsDepSet func (a *aapt) ExportedAssets() android.OptionalPath { return a.assetPackage } func (a *aapt) SetRROEnforcedForDependent(enforce bool) { Loading Loading @@ -291,7 +291,7 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon classLoaderContexts dexpreopt.ClassLoaderContextMap, excludedLibs []string, enforceDefaultTargetSdkVersion bool, extraLinkFlags ...string) { staticResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedDeps, libFlags := transitiveStaticLibs, transitiveStaticLibManifests, staticRRODirs, assetPackages, libDeps, libFlags := aaptLibs(ctx, sdkContext, classLoaderContexts) // Exclude any libraries from the supplied list. Loading @@ -314,20 +314,13 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon EnforceDefaultTargetSdkVersion: enforceDefaultTargetSdkVersion, }) staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList()) // Add additional manifest files to transitive manifests. additionalManifests := android.PathsForModuleSrc(ctx, a.aaptProperties.Additional_manifests) transitiveManifestPaths := append(android.Paths{manifestPath}, additionalManifests...) // TODO(b/288358614): Soong has historically not merged manifests from dependencies of android_library_import // 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) { a.mergedManifestFile = manifestMerger(ctx, transitiveManifestPaths[0], transitiveManifestPaths[1:], a.isLibrary) a.transitiveManifestPaths = append(android.Paths{manifestPath}, additionalManifests...) a.transitiveManifestPaths = append(a.transitiveManifestPaths, transitiveStaticLibManifests...) if len(a.transitiveManifestPaths) > 1 && !Bool(a.aaptProperties.Dont_merge_manifests) { a.mergedManifestFile = manifestMerger(ctx, a.transitiveManifestPaths[0], a.transitiveManifestPaths[1:], a.isLibrary) if !a.isLibrary { // 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 Loading @@ -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) rroDirs = append(rroDirs, staticRRODirs...) linkFlags = append(linkFlags, libFlags...) linkDeps = append(linkDeps, sharedDeps...) linkDeps = append(linkDeps, staticDeps.resPackages()...) linkDeps = append(linkDeps, libDeps...) linkFlags = append(linkFlags, extraLinkFlags...) if a.isLibrary { linkFlags = append(linkFlags, "--static-lib") Loading Loading @@ -370,10 +363,6 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon 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...) if len(transitiveStaticLibs) > 0 { Loading Loading @@ -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, 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 // 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") ctx.Build(pctx, android.BuildParams{ Rule: extractAssetsRule, Loading @@ -441,62 +424,17 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkCon a.exportPackage = packageRes a.manifestPath = manifestPath a.proguardOptionsFile = proguardOptionsFile a.rroDirs = rroDirs a.extraAaptPackagesFile = extraPackages a.rTxt = rTxt 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 func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoaderContexts dexpreopt.ClassLoaderContextMap) ( staticResourcesNodes *android.DepSet[resourcesNode], staticRRODirs *android.DepSet[rroDir], staticManifests *android.DepSet[android.Path], sharedLibs android.Paths, flags []string) { transitiveStaticLibs, transitiveStaticLibManifests android.Paths, staticRRODirs []rroDir, assets, deps android.Paths, flags []string) { var sharedLibs android.Paths if classLoaderContexts == nil { // Not all callers need to compute class loader context, those who don't just pass nil. Loading @@ -509,10 +447,6 @@ func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoa 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) { depTag := ctx.OtherModuleDependencyTag(module) Loading @@ -535,28 +469,32 @@ func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoa } case staticLibTag: if exportPackage != nil { resourcesNodeDepSets = append(resourcesNodeDepSets, aarDep.ResourcesNodeDepSet()) rroDirsDepSetBuilder.Transitive(aarDep.RRODirsDepSet()) manifestsDepSetBuilder.Transitive(aarDep.ManifestsDepSet()) transitiveStaticLibs = append(transitiveStaticLibs, aarDep.ExportedStaticPackages()...) transitiveStaticLibs = append(transitiveStaticLibs, exportPackage) 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) }) // AAPT2 overlays are in lowest to highest priority order, the topological order will be reversed later. // Reverse the dependency order now going into the depset so that it comes out in order after the second // 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)) deps = append(deps, sharedLibs...) deps = append(deps, transitiveStaticLibs...) staticRRODirs = rroDirsDepSetBuilder.Build() staticManifests = manifestsDepSetBuilder.Build() if len(staticResourcesNodes.ToList()) > 0 { if len(transitiveStaticLibs) > 0 { flags = append(flags, "--auto-add-overlay") } Loading @@ -564,7 +502,10 @@ func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoa 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 { Loading @@ -575,6 +516,8 @@ type AndroidLibrary struct { androidLibraryProperties androidLibraryProperties aarFile android.WritablePath exportedStaticPackages android.Paths } var _ android.OutputFileProducer = (*AndroidLibrary)(nil) Loading @@ -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) func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { Loading Loading @@ -632,15 +579,19 @@ func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles, android.PathsForModuleSrc(ctx, a.dexProperties.Optimize.Proguard_flags_files)...) ctx.VisitDirectDeps(func(m android.Module) { if ctx.OtherModuleDependencyTag(m) == staticLibTag { if lib, ok := m.(LibraryDependency); ok { 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.exportedStaticPackages = android.FirstUniquePaths(a.exportedStaticPackages) prebuiltJniPackages := android.Paths{} ctx.VisitDirectDeps(func(module android.Module) { Loading Loading @@ -730,8 +681,7 @@ type AARImport struct { manifest android.WritablePath assetsPackage android.WritablePath resourcesNodesDepSet *android.DepSet[resourcesNode] manifestsDepSet *android.DepSet[android.Path] exportedStaticPackages android.Paths hideApexVariantFromMake bool Loading Loading @@ -788,20 +738,25 @@ var _ AndroidLibraryDependency = (*AARImport)(nil) func (a *AARImport) ExportPackage() android.Path { return a.exportPackage } func (a *AARImport) ExportedProguardFlagFiles() android.Paths { return android.Paths{a.proguardFlags} } func (a *AARImport) ResourcesNodeDepSet() *android.DepSet[resourcesNode] { return a.resourcesNodesDepSet func (a *AARImport) ExportedRRODirs() []rroDir { return nil } func (a *AARImport) ExportedStaticPackages() android.Paths { return a.exportedStaticPackages } func (a *AARImport) RRODirsDepSet() *android.DepSet[rroDir] { return android.NewDepSet[rroDir](android.TOPOLOGICAL, nil, nil) func (a *AARImport) ExportedManifests() android.Paths { return android.Paths{a.manifest} } func (a *AARImport) ManifestsDepSet() *android.DepSet[android.Path] { return a.manifestsDepSet 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 Loading Loading @@ -936,44 +891,32 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { linkFlags = append(linkFlags, "--manifest "+a.manifest.String()) linkDeps = append(linkDeps, a.manifest) staticResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedLibs, libFlags := transitiveStaticLibs, staticLibManifests, staticRRODirs, transitiveAssets, libDeps, libFlags := aaptLibs(ctx, android.SdkContext(a), nil) _ = staticRRODirsDepSet staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList()) // AAPT2 overlays are in lowest to highest priority order, reverse the topological order // of transitiveStaticLibs. transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages()) _ = staticLibManifests _ = staticRRODirs linkDeps = append(linkDeps, sharedLibs...) linkDeps = append(linkDeps, transitiveStaticLibs...) linkDeps = append(linkDeps, libDeps...) linkFlags = append(linkFlags, libFlags...) overlayRes := append(android.Paths{flata}, transitiveStaticLibs...) transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets()) aapt2Link(ctx, a.exportPackage, srcJar, proguardOptionsFile, rTxt, a.extraAaptPackagesFile, linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil) resourcesNodesDepSetBuilder := android.NewDepSetBuilder[resourcesNode](android.TOPOLOGICAL) resourcesNodesDepSetBuilder.Direct(resourcesNode{ resPackage: a.exportPackage, manifest: a.manifest, assets: android.OptionalPathForPath(a.assetsPackage), // Merge this import's assets with its dependencies' assets (if there are any). if len(transitiveAssets) > 0 { mergedAssets := android.PathForModuleOut(ctx, "merged-assets.zip") inputZips := append(android.Paths{a.assetsPackage}, transitiveAssets...) ctx.Build(pctx, android.BuildParams{ Rule: mergeAssetsRule, Inputs: inputZips, Output: mergedAssets, Description: "merge assets from dependencies and self", }) resourcesNodesDepSetBuilder.Transitive(staticResourcesNodesDepSet) a.resourcesNodesDepSet = resourcesNodesDepSetBuilder.Build() 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 // 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.assetsPackage = mergedAssets } a.collectTransitiveHeaderJars(ctx) ctx.SetProvider(JavaInfoProvider, JavaInfo{ Loading
java/androidmk.go +1 −6 Original line number Diff line number Diff line Loading @@ -368,13 +368,8 @@ func (app *AndroidApp) AndroidMkEntries() []android.AndroidMkEntries { filterRRO := func(filter overlayType) android.Paths { var paths android.Paths seen := make(map[android.Path]bool) for _, d := range app.rroDirsDepSet.ToList() { for _, d := range app.rroDirs { if d.overlayType == filter { if seen[d.path] { continue } seen[d.path] = true paths = append(paths, d.path) } } Loading
java/app.go +2 −2 Original line number Diff line number Diff line Loading @@ -204,8 +204,8 @@ func (a *AndroidApp) ExportedProguardFlagFiles() android.Paths { return nil } func (a *AndroidApp) ResourcesNodeDepSet() *android.DepSet[resourcesNode] { return a.aapt.resourcesNodesDepSet func (a *AndroidApp) ExportedStaticPackages() android.Paths { return nil } func (a *AndroidApp) OutputFile() android.Path { Loading
java/app_test.go +8 −16 Original line number Diff line number Diff line Loading @@ -599,7 +599,7 @@ func TestLibraryAssets(t *testing.T) { android_library { name: "lib3", sdk_version: "current", static_libs: ["lib4", "import"], static_libs: ["lib4"], } android_library { Loading @@ -607,12 +607,6 @@ func TestLibraryAssets(t *testing.T) { sdk_version: "current", asset_dirs: ["assets_b"], } android_library_import { name: "import", sdk_version: "current", aars: ["import.aar"], } ` testCases := []struct { Loading @@ -622,12 +616,11 @@ func TestLibraryAssets(t *testing.T) { }{ { 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{ "out/soong/.intermediates/foo/android_common/aapt2/package-res.apk", "out/soong/.intermediates/lib1/android_common/assets.zip", "out/soong/.intermediates/lib4/android_common/assets.zip", "out/soong/.intermediates/import/android_common/assets.zip", "out/soong/.intermediates/lib3/android_common/assets.zip", }, }, { Loading @@ -639,6 +632,10 @@ func TestLibraryAssets(t *testing.T) { }, { name: "lib3", assetPackages: []string{ "out/soong/.intermediates/lib3/android_common/aapt2/package-res.apk", "out/soong/.intermediates/lib4/android_common/assets.zip", }, }, { name: "lib4", Loading Loading @@ -764,14 +761,11 @@ func TestAndroidResourceProcessor(t *testing.T) { appResources: nil, appOverlays: []string{ "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/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/app/android_common/aapt2/app/res/values_strings.arsc.flat", }, 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"}, appClasspath: []string{ Loading @@ -788,11 +782,9 @@ func TestAndroidResourceProcessor(t *testing.T) { directResources: nil, directOverlays: []string{ "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/direct/android_common/aapt2/direct/res/values_strings.arsc.flat", }, 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"}, directClasspath: []string{ Loading Loading @@ -1206,7 +1198,7 @@ func TestAndroidResourceOverlays(t *testing.T) { 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 if d.overlayType == device { prefix = "device:" Loading