blob: 57a05d47baf1612edd627ac931b3cead375d9d84 [file] [log] [blame]
Colin Crossfabb6082018-02-20 17:22:23 -08001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package java
16
17import (
Colin Crossa592e3e2019-02-19 16:59:53 -080018 "fmt"
Jaewoong Jung5b425e22019-06-17 17:40:56 -070019 "path/filepath"
Colin Cross312634e2023-11-21 15:13:56 -080020 "slices"
Colin Crossc20dc852020-11-10 12:27:45 -080021 "strconv"
Colin Crossa97c5d32018-03-28 14:58:31 -070022 "strings"
Colin Crossfabb6082018-02-20 17:22:23 -080023
Jaewoong Jung9befb0c2020-01-18 10:33:43 -080024 "android/soong/android"
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -050025 "android/soong/bazel"
Ulya Trafimovich31e444e2020-08-14 17:32:16 +010026 "android/soong/dexpreopt"
Romain Jobredeaux7a71e072023-08-16 17:39:12 -040027 "android/soong/ui/metrics/bp2build_metrics_proto"
Jaewoong Jung9befb0c2020-01-18 10:33:43 -080028
Colin Crossfabb6082018-02-20 17:22:23 -080029 "github.com/google/blueprint"
Colin Crossa97c5d32018-03-28 14:58:31 -070030 "github.com/google/blueprint/proptools"
Colin Crossfabb6082018-02-20 17:22:23 -080031)
32
Colin Crossa97c5d32018-03-28 14:58:31 -070033type AndroidLibraryDependency interface {
Colin Crossa97c5d32018-03-28 14:58:31 -070034 ExportPackage() android.Path
Colin Crossab8d1382023-07-14 17:23:41 +000035 ResourcesNodeDepSet() *android.DepSet[*resourcesNode]
36 RRODirsDepSet() *android.DepSet[rroDir]
37 ManifestsDepSet() *android.DepSet[android.Path]
Jaewoong Jungc779cd42020-10-06 18:56:10 -070038 SetRROEnforcedForDependent(enforce bool)
39 IsRROEnforced(ctx android.BaseModuleContext) bool
Colin Crossa97c5d32018-03-28 14:58:31 -070040}
41
42func init() {
Paul Duffinf9b1da02019-12-18 19:51:55 +000043 RegisterAARBuildComponents(android.InitRegistrationContext)
44}
45
46func RegisterAARBuildComponents(ctx android.RegistrationContext) {
47 ctx.RegisterModuleType("android_library_import", AARImportFactory)
48 ctx.RegisterModuleType("android_library", AndroidLibraryFactory)
Paul Duffin04ba70d2021-03-22 13:56:43 +000049 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
50 ctx.TopDown("propagate_rro_enforcement", propagateRROEnforcementMutator).Parallel()
51 })
Colin Crossa97c5d32018-03-28 14:58:31 -070052}
53
54//
55// AAR (android library)
56//
57
58type androidLibraryProperties struct {
59 BuildAAR bool `blueprint:"mutated"`
60}
61
62type aaptProperties struct {
63 // flags passed to aapt when creating the apk
64 Aaptflags []string
65
Dan Willemsen72be5902018-10-24 20:24:57 -070066 // include all resource configurations, not just the product-configured
67 // ones.
68 Aapt_include_all_resources *bool
69
Jiakai Zhangba82e282023-10-13 18:08:59 +010070 // list of files to use as assets.
71 Assets []string `android:"path"`
72
Colin Crossa97c5d32018-03-28 14:58:31 -070073 // list of directories relative to the Blueprints file containing assets.
Colin Cross0ddae7f2019-02-07 15:30:01 -080074 // Defaults to ["assets"] if a directory called assets exists. Set to []
75 // to disable the default.
Colin Crossa97c5d32018-03-28 14:58:31 -070076 Asset_dirs []string
77
78 // list of directories relative to the Blueprints file containing
Colin Cross0ddae7f2019-02-07 15:30:01 -080079 // Android resources. Defaults to ["res"] if a directory called res exists.
80 // Set to [] to disable the default.
Colin Crossa97c5d32018-03-28 14:58:31 -070081 Resource_dirs []string
82
Colin Crossa592e3e2019-02-19 16:59:53 -080083 // list of zip files containing Android resources.
Colin Cross27b922f2019-03-04 22:35:41 -080084 Resource_zips []string `android:"path"`
Colin Crossa592e3e2019-02-19 16:59:53 -080085
Colin Crossa97c5d32018-03-28 14:58:31 -070086 // path to AndroidManifest.xml. If unset, defaults to "AndroidManifest.xml".
Colin Cross27b922f2019-03-04 22:35:41 -080087 Manifest *string `android:"path"`
changho.shinb5432b72019-08-08 18:37:17 +090088
89 // paths to additional manifest files to merge with main manifest.
90 Additional_manifests []string `android:"path"`
Sasha Smundak541056c2019-10-28 15:50:06 -070091
92 // do not include AndroidManifest from dependent libraries
93 Dont_merge_manifests *bool
Jaewoong Jungc779cd42020-10-06 18:56:10 -070094
Colin Cross4eae06d2023-06-20 22:40:02 -070095 // If use_resource_processor is set, use Bazel's resource processor instead of aapt2 to generate R.class files.
96 // The resource processor produces more optimal R.class files that only list resources in the package of the
97 // library that provided them, as opposed to aapt2 which produces R.java files for every package containing
98 // every resource. Using the resource processor can provide significant build time speedups, but requires
99 // fixing the module to use the correct package to reference each resource, and to avoid having any other
100 // libraries in the tree that use the same package name. Defaults to false, but will default to true in the
101 // future.
102 Use_resource_processor *bool
103
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700104 // true if RRO is enforced for any of the dependent modules
105 RROEnforcedForDependent bool `blueprint:"mutated"`
Inseob Kim34dc4cd2023-11-07 13:37:14 +0900106
107 // Filter only specified product and ignore other products
108 Filter_product *string `blueprint:"mutated"`
Colin Crossa97c5d32018-03-28 14:58:31 -0700109}
110
111type aapt struct {
Colin Cross312634e2023-11-21 15:13:56 -0800112 aaptSrcJar android.Path
113 transitiveAaptRJars android.Paths
114 transitiveAaptResourcePackagesFile android.Path
115 exportPackage android.Path
116 manifestPath android.Path
117 proguardOptionsFile android.Path
118 rTxt android.Path
119 rJar android.Path
120 extraAaptPackagesFile android.Path
121 mergedManifestFile android.Path
122 noticeFile android.OptionalPath
123 assetPackage android.OptionalPath
124 isLibrary bool
125 defaultManifestVersion string
126 useEmbeddedNativeLibs bool
127 useEmbeddedDex bool
128 usesNonSdkApis bool
129 hasNoCode bool
130 LoggingParent string
131 resourceFiles android.Paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700132
Colin Crosse560c4a2019-03-19 16:03:11 -0700133 splitNames []string
134 splits []split
135
Colin Crossa97c5d32018-03-28 14:58:31 -0700136 aaptProperties aaptProperties
Colin Crossab8d1382023-07-14 17:23:41 +0000137
138 resourcesNodesDepSet *android.DepSet[*resourcesNode]
139 rroDirsDepSet *android.DepSet[rroDir]
140 manifestsDepSet *android.DepSet[android.Path]
Alix96ea88452023-08-31 15:48:23 +0000141
142 manifestValues struct {
143 applicationId string
144 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700145}
146
Colin Crosse560c4a2019-03-19 16:03:11 -0700147type split struct {
148 name string
149 suffix string
150 path android.Path
151}
152
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700153// Propagate RRO enforcement flag to static lib dependencies transitively.
154func propagateRROEnforcementMutator(ctx android.TopDownMutatorContext) {
155 m := ctx.Module()
156 if d, ok := m.(AndroidLibraryDependency); ok && d.IsRROEnforced(ctx) {
157 ctx.VisitDirectDepsWithTag(staticLibTag, func(d android.Module) {
158 if a, ok := d.(AndroidLibraryDependency); ok {
159 a.SetRROEnforcedForDependent(true)
160 }
161 })
162 }
163}
164
Colin Cross4eae06d2023-06-20 22:40:02 -0700165func (a *aapt) useResourceProcessorBusyBox() bool {
166 return BoolDefault(a.aaptProperties.Use_resource_processor, false)
167}
168
Inseob Kim34dc4cd2023-11-07 13:37:14 +0900169func (a *aapt) filterProduct() string {
170 return String(a.aaptProperties.Filter_product)
171}
172
Colin Crossa97c5d32018-03-28 14:58:31 -0700173func (a *aapt) ExportPackage() android.Path {
174 return a.exportPackage
175}
Colin Crossab8d1382023-07-14 17:23:41 +0000176func (a *aapt) ResourcesNodeDepSet() *android.DepSet[*resourcesNode] {
177 return a.resourcesNodesDepSet
Colin Crossc1c37552019-01-31 11:42:41 -0800178}
179
Colin Crossab8d1382023-07-14 17:23:41 +0000180func (a *aapt) RRODirsDepSet() *android.DepSet[rroDir] {
181 return a.rroDirsDepSet
Colin Crossc1c37552019-01-31 11:42:41 -0800182}
183
Colin Crossab8d1382023-07-14 17:23:41 +0000184func (a *aapt) ManifestsDepSet() *android.DepSet[android.Path] {
185 return a.manifestsDepSet
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800186}
187
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700188func (a *aapt) SetRROEnforcedForDependent(enforce bool) {
189 a.aaptProperties.RROEnforcedForDependent = enforce
190}
191
192func (a *aapt) IsRROEnforced(ctx android.BaseModuleContext) bool {
193 // True if RRO is enforced for this module or...
194 return ctx.Config().EnforceRROForModule(ctx.ModuleName()) ||
Jeongik Chacee5ba92021-02-19 12:11:51 +0900195 // if RRO is enforced for any of its dependents.
196 a.aaptProperties.RROEnforcedForDependent
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700197}
198
Jiyong Parkf1691d22021-03-29 20:11:58 +0900199func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext android.SdkContext,
Colin Crossa0ba2f52019-06-22 12:59:27 -0700200 manifestPath android.Path) (compileFlags, linkFlags []string, linkDeps android.Paths,
201 resDirs, overlayDirs []globbedResourceDir, rroDirs []rroDir, resZips android.Paths) {
Colin Crossa97c5d32018-03-28 14:58:31 -0700202
Jaewoong Jung3aff5782020-02-11 07:54:35 -0800203 hasVersionCode := android.PrefixInList(a.aaptProperties.Aaptflags, "--version-code")
204 hasVersionName := android.PrefixInList(a.aaptProperties.Aaptflags, "--version-name")
Colin Crossa97c5d32018-03-28 14:58:31 -0700205
Colin Crossa97c5d32018-03-28 14:58:31 -0700206 // Flags specified in Android.bp
207 linkFlags = append(linkFlags, a.aaptProperties.Aaptflags...)
208
Colin Crossa97c5d32018-03-28 14:58:31 -0700209 // Find implicit or explicit asset and resource dirs
Jiakai Zhangba82e282023-10-13 18:08:59 +0100210 assets := android.PathsRelativeToModuleSourceDir(android.SourceInput{
211 Context: ctx,
212 Paths: a.aaptProperties.Assets,
213 IncludeDirs: false,
214 })
Colin Crossa97c5d32018-03-28 14:58:31 -0700215 assetDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Asset_dirs, "assets")
216 resourceDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res")
Colin Cross8a497952019-03-05 22:25:09 -0800217 resourceZips := android.PathsForModuleSrc(ctx, a.aaptProperties.Resource_zips)
Colin Crossa97c5d32018-03-28 14:58:31 -0700218
Colin Crossa97c5d32018-03-28 14:58:31 -0700219 // Glob directories into lists of paths
220 for _, dir := range resourceDirs {
221 resDirs = append(resDirs, globbedResourceDir{
222 dir: dir,
223 files: androidResourceGlob(ctx, dir),
224 })
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700225 resOverlayDirs, resRRODirs := overlayResourceGlob(ctx, a, dir)
Colin Crossa97c5d32018-03-28 14:58:31 -0700226 overlayDirs = append(overlayDirs, resOverlayDirs...)
227 rroDirs = append(rroDirs, resRRODirs...)
228 }
229
Colin Crossc20dc852020-11-10 12:27:45 -0800230 var assetDeps android.Paths
231 for i, dir := range assetDirs {
232 // Add a dependency on every file in the asset directory. This ensures the aapt2
233 // rule will be rerun if one of the files in the asset directory is modified.
234 assetDeps = append(assetDeps, androidResourceGlob(ctx, dir)...)
235
236 // Add a dependency on a file that contains a list of all the files in the asset directory.
237 // This ensures the aapt2 rule will be run if a file is removed from the asset directory,
238 // or a file is added whose timestamp is older than the output of aapt2.
239 assetFileListFile := android.PathForModuleOut(ctx, "asset_dir_globs", strconv.Itoa(i)+".glob")
240 androidResourceGlobList(ctx, dir, assetFileListFile)
241 assetDeps = append(assetDeps, assetFileListFile)
Colin Crossa97c5d32018-03-28 14:58:31 -0700242 }
243
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700244 assetDirStrings := assetDirs.Strings()
245 if a.noticeFile.Valid() {
246 assetDirStrings = append(assetDirStrings, filepath.Dir(a.noticeFile.Path().String()))
Colin Crossc20dc852020-11-10 12:27:45 -0800247 assetDeps = append(assetDeps, a.noticeFile.Path())
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700248 }
Jiakai Zhangba82e282023-10-13 18:08:59 +0100249 if len(assets) > 0 {
250 // aapt2 doesn't support adding individual asset files. Create a temp directory to hold asset
251 // files and pass it to aapt2.
252 tmpAssetDir := android.PathForModuleOut(ctx, "tmp_asset_dir")
253
254 rule := android.NewRuleBuilder(pctx, ctx)
255 rule.Command().
256 Text("rm -rf").Text(tmpAssetDir.String()).
257 Text("&&").
258 Text("mkdir -p").Text(tmpAssetDir.String())
259
260 for _, asset := range assets {
261 output := tmpAssetDir.Join(ctx, asset.Rel())
262 assetDeps = append(assetDeps, output)
263 rule.Command().Text("mkdir -p").Text(filepath.Dir(output.String()))
264 rule.Command().Text("cp").Input(asset).Output(output)
265 }
266
267 rule.Build("tmp_asset_dir", "tmp_asset_dir")
268
269 assetDirStrings = append(assetDirStrings, tmpAssetDir.String())
270 }
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700271
Colin Crossa97c5d32018-03-28 14:58:31 -0700272 linkFlags = append(linkFlags, "--manifest "+manifestPath.String())
273 linkDeps = append(linkDeps, manifestPath)
274
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700275 linkFlags = append(linkFlags, android.JoinWithPrefix(assetDirStrings, "-A "))
Colin Crossc20dc852020-11-10 12:27:45 -0800276 linkDeps = append(linkDeps, assetDeps...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700277
Spandan Das50885c02023-02-23 21:31:33 +0000278 // Returns the effective version for {min|target}_sdk_version
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000279 effectiveVersionString := func(sdkVersion android.SdkSpec, minSdkVersion android.ApiLevel) string {
Spandan Das50885c02023-02-23 21:31:33 +0000280 // If {min|target}_sdk_version is current, use sdk_version to determine the effective level
281 // This is necessary for vendor modules.
282 // The effective version does not _only_ depend on {min|target}_sdk_version(level),
283 // but also on the sdk_version (kind+level)
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000284 if minSdkVersion.IsCurrent() {
Spandan Das50885c02023-02-23 21:31:33 +0000285 ret, err := sdkVersion.EffectiveVersionString(ctx)
286 if err != nil {
287 ctx.ModuleErrorf("invalid sdk_version: %s", err)
288 }
289 return ret
290 }
291 ret, err := minSdkVersion.EffectiveVersionString(ctx)
292 if err != nil {
293 ctx.ModuleErrorf("invalid min_sdk_version: %s", err)
294 }
295 return ret
Jiyong Park6a927c42020-01-21 02:03:43 +0900296 }
Spandan Das50885c02023-02-23 21:31:33 +0000297 // SDK version flags
298 sdkVersion := sdkContext.SdkVersion(ctx)
299 minSdkVersion := effectiveVersionString(sdkVersion, sdkContext.MinSdkVersion(ctx))
Colin Crossa97c5d32018-03-28 14:58:31 -0700300
Colin Cross83bb3162018-06-25 15:48:06 -0700301 linkFlags = append(linkFlags, "--min-sdk-version "+minSdkVersion)
Spandan Das6450b552023-02-23 19:27:07 +0000302 // Use minSdkVersion for target-sdk-version, even if `target_sdk_version` is set
303 // This behavior has been copied from Make.
Colin Cross83bb3162018-06-25 15:48:06 -0700304 linkFlags = append(linkFlags, "--target-sdk-version "+minSdkVersion)
Colin Crossa97c5d32018-03-28 14:58:31 -0700305
Colin Crossa97c5d32018-03-28 14:58:31 -0700306 // Version code
307 if !hasVersionCode {
Dan Albert4f378d72020-07-23 17:32:15 -0700308 linkFlags = append(linkFlags, "--version-code", ctx.Config().PlatformSdkVersion().String())
Colin Crossa97c5d32018-03-28 14:58:31 -0700309 }
310
311 if !hasVersionName {
Colin Cross402d5e02018-04-25 14:54:06 -0700312 var versionName string
313 if ctx.ModuleName() == "framework-res" {
314 // Some builds set AppsDefaultVersionName() to include the build number ("O-123456"). aapt2 copies the
315 // version name of framework-res into app manifests as compileSdkVersionCodename, which confuses things
Colin Crossbfd347d2018-05-09 11:11:35 -0700316 // if it contains the build number. Use the PlatformVersionName instead.
317 versionName = ctx.Config().PlatformVersionName()
Colin Cross402d5e02018-04-25 14:54:06 -0700318 } else {
319 versionName = ctx.Config().AppsDefaultVersionName()
320 }
Colin Cross0b9f31f2019-02-28 11:00:01 -0800321 versionName = proptools.NinjaEscape(versionName)
Colin Crossa97c5d32018-03-28 14:58:31 -0700322 linkFlags = append(linkFlags, "--version-name ", versionName)
323 }
324
Colin Crossa0ba2f52019-06-22 12:59:27 -0700325 linkFlags, compileFlags = android.FilterList(linkFlags, []string{"--legacy"})
326
327 // Always set --pseudo-localize, it will be stripped out later for release
328 // builds that don't want it.
329 compileFlags = append(compileFlags, "--pseudo-localize")
330
331 return compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resourceZips
Colin Crossa97c5d32018-03-28 14:58:31 -0700332}
333
Paul Duffin250e6192019-06-07 10:44:37 +0100334func (a *aapt) deps(ctx android.BottomUpMutatorContext, sdkDep sdkDep) {
Colin Cross42308aa2018-11-14 21:44:17 -0800335 if sdkDep.frameworkResModule != "" {
336 ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
Colin Crossa97c5d32018-03-28 14:58:31 -0700337 }
338}
339
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800340var extractAssetsRule = pctx.AndroidStaticRule("extractAssets",
341 blueprint.RuleParams{
342 Command: `${config.Zip2ZipCmd} -i ${in} -o ${out} "assets/**/*"`,
343 CommandDeps: []string{"${config.Zip2ZipCmd}"},
344 })
345
Alixf7a10272023-09-27 16:47:56 +0000346type aaptBuildActionOptions struct {
347 sdkContext android.SdkContext
348 classLoaderContexts dexpreopt.ClassLoaderContextMap
349 excludedLibs []string
350 enforceDefaultTargetSdkVersion bool
351 extraLinkFlags []string
352}
353
354func (a *aapt) buildActions(ctx android.ModuleContext, opts aaptBuildActionOptions) {
Colin Cross5446e882019-05-22 10:46:27 -0700355
Colin Cross8676c8c2023-10-12 15:58:57 -0700356 staticResourcesNodesDepSet, sharedResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedExportPackages, libFlags :=
Alixf7a10272023-09-27 16:47:56 +0000357 aaptLibs(ctx, opts.sdkContext, opts.classLoaderContexts)
Ulya Trafimovich31e444e2020-08-14 17:32:16 +0100358
Paul Duffin06530572022-02-03 17:54:15 +0000359 // Exclude any libraries from the supplied list.
Alixf7a10272023-09-27 16:47:56 +0000360 opts.classLoaderContexts = opts.classLoaderContexts.ExcludeLibs(opts.excludedLibs)
Paul Duffin06530572022-02-03 17:54:15 +0000361
Colin Cross31656952018-05-24 16:11:20 -0700362 // App manifest file
363 manifestFile := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")
364 manifestSrcPath := android.PathForModuleSrc(ctx, manifestFile)
365
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000366 manifestPath := ManifestFixer(ctx, manifestSrcPath, ManifestFixerParams{
Alixf7a10272023-09-27 16:47:56 +0000367 SdkContext: opts.sdkContext,
368 ClassLoaderContexts: opts.classLoaderContexts,
Harshit Mahajan5b8b7302022-06-10 11:24:05 +0000369 IsLibrary: a.isLibrary,
370 DefaultManifestVersion: a.defaultManifestVersion,
371 UseEmbeddedNativeLibs: a.useEmbeddedNativeLibs,
372 UsesNonSdkApis: a.usesNonSdkApis,
373 UseEmbeddedDex: a.useEmbeddedDex,
374 HasNoCode: a.hasNoCode,
375 LoggingParent: a.LoggingParent,
Alixf7a10272023-09-27 16:47:56 +0000376 EnforceDefaultTargetSdkVersion: opts.enforceDefaultTargetSdkVersion,
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000377 })
Colin Cross90c25c62019-04-19 16:22:57 -0700378
Colin Crossab8d1382023-07-14 17:23:41 +0000379 staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
Colin Cross8676c8c2023-10-12 15:58:57 -0700380 sharedDeps := transitiveAarDeps(sharedResourcesNodesDepSet.ToList())
Colin Crossab8d1382023-07-14 17:23:41 +0000381
Luca Stefanifd898822019-09-10 22:13:31 +0200382 // Add additional manifest files to transitive manifests.
383 additionalManifests := android.PathsForModuleSrc(ctx, a.aaptProperties.Additional_manifests)
Colin Crossab8d1382023-07-14 17:23:41 +0000384 transitiveManifestPaths := append(android.Paths{manifestPath}, additionalManifests...)
385 // TODO(b/288358614): Soong has historically not merged manifests from dependencies of android_library_import
386 // modules. Merging manifests from dependencies could remove the need for pom2bp to generate the "-nodeps" copies
387 // of androidx libraries, but doing so triggers errors due to errors introduced by existing dependencies of
388 // android_library_import modules. If this is fixed, staticManifestsDepSet can be dropped completely in favor of
389 // staticResourcesNodesDepSet.manifests()
390 transitiveManifestPaths = append(transitiveManifestPaths, staticManifestsDepSet.ToList()...)
Colin Cross90c25c62019-04-19 16:22:57 -0700391
Colin Crossab8d1382023-07-14 17:23:41 +0000392 if len(transitiveManifestPaths) > 1 && !Bool(a.aaptProperties.Dont_merge_manifests) {
Alixf7a10272023-09-27 16:47:56 +0000393 manifestMergerParams := ManifestMergerParams{
394 staticLibManifests: transitiveManifestPaths[1:],
Alix96ea88452023-08-31 15:48:23 +0000395 isLibrary: a.isLibrary,
396 packageName: a.manifestValues.applicationId,
397 }
Alixf7a10272023-09-27 16:47:56 +0000398 a.mergedManifestFile = manifestMerger(ctx, transitiveManifestPaths[0], manifestMergerParams)
Colin Cross90c25c62019-04-19 16:22:57 -0700399 if !a.isLibrary {
400 // Only use the merged manifest for applications. For libraries, the transitive closure of manifests
401 // will be propagated to the final application and merged there. The merged manifest for libraries is
402 // only passed to Make, which can't handle transitive dependencies.
403 manifestPath = a.mergedManifestFile
404 }
405 } else {
406 a.mergedManifestFile = manifestPath
407 }
Colin Cross31656952018-05-24 16:11:20 -0700408
Alixf7a10272023-09-27 16:47:56 +0000409 compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, opts.sdkContext, manifestPath)
Colin Cross31656952018-05-24 16:11:20 -0700410
411 linkFlags = append(linkFlags, libFlags...)
Colin Cross8676c8c2023-10-12 15:58:57 -0700412 linkDeps = append(linkDeps, sharedExportPackages...)
Colin Crossab8d1382023-07-14 17:23:41 +0000413 linkDeps = append(linkDeps, staticDeps.resPackages()...)
Alixf7a10272023-09-27 16:47:56 +0000414 linkFlags = append(linkFlags, opts.extraLinkFlags...)
Colin Cross1b6a3cf2018-07-24 14:51:30 -0700415 if a.isLibrary {
416 linkFlags = append(linkFlags, "--static-lib")
417 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700418
Colin Cross4eae06d2023-06-20 22:40:02 -0700419 if a.isLibrary && a.useResourceProcessorBusyBox() {
420 // When building an android_library using ResourceProcessorBusyBox the resources are merged into
421 // package-res.apk with --merge-only, but --no-static-lib-packages is not used so that R.txt only
422 // contains resources from this library.
423 linkFlags = append(linkFlags, "--merge-only")
424 } else {
425 // When building and app or when building an android_library without ResourceProcessorBusyBox
426 // --no-static-lib-packages is used to put all the resources into the app. If ResourceProcessorBusyBox
427 // is used then the app's R.txt will be post-processed along with the R.txt files from dependencies to
428 // sort resources into the right packages in R.class.
429 linkFlags = append(linkFlags, "--no-static-lib-packages")
430 }
431
Colin Crossa97c5d32018-03-28 14:58:31 -0700432 packageRes := android.PathForModuleOut(ctx, "package-res.apk")
Colin Crossa97c5d32018-03-28 14:58:31 -0700433 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
434 rTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -0700435 // This file isn't used by Soong, but is generated for exporting
436 extraPackages := android.PathForModuleOut(ctx, "extra_packages")
Colin Cross4eae06d2023-06-20 22:40:02 -0700437 var transitiveRJars android.Paths
Colin Crossf3b7bad2023-08-02 15:49:00 -0700438 var srcJar android.WritablePath
Colin Crossa97c5d32018-03-28 14:58:31 -0700439
Colin Cross4aaa84a2018-08-21 15:14:37 -0700440 var compiledResDirs []android.Paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700441 for _, dir := range resDirs {
Colin Cross014489c2020-06-02 20:09:13 -0700442 a.resourceFiles = append(a.resourceFiles, dir.files...)
Inseob Kim34dc4cd2023-11-07 13:37:14 +0900443 compiledResDirs = append(compiledResDirs, aapt2Compile(ctx, dir.dir, dir.files, compileFlags, a.filterProduct()).Paths())
Colin Crossa97c5d32018-03-28 14:58:31 -0700444 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700445
Colin Crossa592e3e2019-02-19 16:59:53 -0800446 for i, zip := range resZips {
447 flata := android.PathForModuleOut(ctx, fmt.Sprintf("reszip.%d.flata", i))
Colin Crossa0ba2f52019-06-22 12:59:27 -0700448 aapt2CompileZip(ctx, flata, zip, "", compileFlags)
Colin Crossa592e3e2019-02-19 16:59:53 -0800449 compiledResDirs = append(compiledResDirs, android.Paths{flata})
450 }
451
Colin Cross4aaa84a2018-08-21 15:14:37 -0700452 var compiledRes, compiledOverlay android.Paths
453
Colin Crossab8d1382023-07-14 17:23:41 +0000454 // AAPT2 overlays are in lowest to highest priority order, reverse the topological order
455 // of transitiveStaticLibs.
456 transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages())
457
Colin Cross4eae06d2023-06-20 22:40:02 -0700458 if a.isLibrary && a.useResourceProcessorBusyBox() {
459 // When building an android_library with ResourceProcessorBusyBox enabled treat static library dependencies
460 // as imports. The resources from dependencies will not be merged into this module's package-res.apk, and
461 // instead modules depending on this module will reference package-res.apk from all transitive static
462 // dependencies.
463 for _, staticDep := range staticDeps {
464 linkDeps = append(linkDeps, staticDep.resPackage)
465 linkFlags = append(linkFlags, "-I "+staticDep.resPackage.String())
466 if staticDep.usedResourceProcessor {
467 transitiveRJars = append(transitiveRJars, staticDep.rJar)
468 }
469 }
Colin Cross8676c8c2023-10-12 15:58:57 -0700470 for _, sharedDep := range sharedDeps {
471 if sharedDep.usedResourceProcessor {
472 transitiveRJars = append(transitiveRJars, sharedDep.rJar)
473 }
474 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700475 } else {
476 // When building an app or building a library without ResourceProcessorBusyBox enabled all static
477 // dependencies are compiled into this module's package-res.apk as overlays.
478 compiledOverlay = append(compiledOverlay, transitiveStaticLibs...)
479 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700480
Colin Crossbec85302019-02-13 13:15:46 -0800481 if len(transitiveStaticLibs) > 0 {
Colin Cross4aaa84a2018-08-21 15:14:37 -0700482 // If we are using static android libraries, every source file becomes an overlay.
483 // This is to emulate old AAPT behavior which simulated library support.
484 for _, compiledResDir := range compiledResDirs {
485 compiledOverlay = append(compiledOverlay, compiledResDir...)
486 }
Colin Crossbec85302019-02-13 13:15:46 -0800487 } else if a.isLibrary {
488 // Otherwise, for a static library we treat all the resources equally with no overlay.
489 for _, compiledResDir := range compiledResDirs {
490 compiledRes = append(compiledRes, compiledResDir...)
491 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700492 } else if len(compiledResDirs) > 0 {
493 // Without static libraries, the first directory is our directory, which can then be
494 // overlaid by the rest.
495 compiledRes = append(compiledRes, compiledResDirs[0]...)
496 for _, compiledResDir := range compiledResDirs[1:] {
497 compiledOverlay = append(compiledOverlay, compiledResDir...)
498 }
499 }
500
Colin Crossa97c5d32018-03-28 14:58:31 -0700501 for _, dir := range overlayDirs {
Inseob Kim34dc4cd2023-11-07 13:37:14 +0900502 compiledOverlay = append(compiledOverlay, aapt2Compile(ctx, dir.dir, dir.files, compileFlags, a.filterProduct()).Paths()...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700503 }
504
Colin Crosse560c4a2019-03-19 16:03:11 -0700505 var splitPackages android.WritablePaths
506 var splits []split
507
508 for _, s := range a.splitNames {
509 suffix := strings.Replace(s, ",", "_", -1)
510 path := android.PathForModuleOut(ctx, "package_"+suffix+".apk")
511 linkFlags = append(linkFlags, "--split", path.String()+":"+s)
512 splitPackages = append(splitPackages, path)
513 splits = append(splits, split{
514 name: s,
515 suffix: suffix,
516 path: path,
517 })
518 }
519
Colin Crossf3b7bad2023-08-02 15:49:00 -0700520 if !a.useResourceProcessorBusyBox() {
521 // the subdir "android" is required to be filtered by package names
522 srcJar = android.PathForModuleGen(ctx, "android", "R.srcjar")
523 }
524
Colin Crossab8d1382023-07-14 17:23:41 +0000525 // No need to specify assets from dependencies to aapt2Link for libraries, all transitive assets will be
526 // provided to the final app aapt2Link step.
527 var transitiveAssets android.Paths
528 if !a.isLibrary {
529 transitiveAssets = android.ReverseSliceInPlace(staticDeps.assets())
530 }
Colin Crossf3b7bad2023-08-02 15:49:00 -0700531 aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt,
Colin Crossab8d1382023-07-14 17:23:41 +0000532 linkFlags, linkDeps, compiledRes, compiledOverlay, transitiveAssets, splitPackages)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800533 // Extract assets from the resource package output so that they can be used later in aapt2link
534 // for modules that depend on this one.
Colin Crossab8d1382023-07-14 17:23:41 +0000535 if android.PrefixInList(linkFlags, "-A ") {
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800536 assets := android.PathForModuleOut(ctx, "assets.zip")
537 ctx.Build(pctx, android.BuildParams{
538 Rule: extractAssetsRule,
539 Input: packageRes,
540 Output: assets,
541 Description: "extract assets from built resource file",
542 })
543 a.assetPackage = android.OptionalPathForPath(assets)
544 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700545
Colin Cross4eae06d2023-06-20 22:40:02 -0700546 if a.useResourceProcessorBusyBox() {
547 rJar := android.PathForModuleOut(ctx, "busybox/R.jar")
548 resourceProcessorBusyBoxGenerateBinaryR(ctx, rTxt, a.mergedManifestFile, rJar, staticDeps, a.isLibrary)
Colin Crossf3b7bad2023-08-02 15:49:00 -0700549 aapt2ExtractExtraPackages(ctx, extraPackages, rJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700550 transitiveRJars = append(transitiveRJars, rJar)
551 a.rJar = rJar
Colin Crossf3b7bad2023-08-02 15:49:00 -0700552 } else {
553 aapt2ExtractExtraPackages(ctx, extraPackages, srcJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700554 }
555
Colin Cross312634e2023-11-21 15:13:56 -0800556 transitiveAaptResourcePackages := staticDeps.resPackages().Strings()
557 transitiveAaptResourcePackages = slices.DeleteFunc(transitiveAaptResourcePackages, func(p string) bool {
558 return p == packageRes.String()
559 })
560 transitiveAaptResourcePackagesFile := android.PathForModuleOut(ctx, "transitive-res-packages")
561 android.WriteFileRule(ctx, transitiveAaptResourcePackagesFile, strings.Join(transitiveAaptResourcePackages, "\n"))
562
Colin Crossa97c5d32018-03-28 14:58:31 -0700563 a.aaptSrcJar = srcJar
Colin Cross4eae06d2023-06-20 22:40:02 -0700564 a.transitiveAaptRJars = transitiveRJars
Colin Cross312634e2023-11-21 15:13:56 -0800565 a.transitiveAaptResourcePackagesFile = transitiveAaptResourcePackagesFile
Colin Crossa97c5d32018-03-28 14:58:31 -0700566 a.exportPackage = packageRes
567 a.manifestPath = manifestPath
568 a.proguardOptionsFile = proguardOptionsFile
Colin Cross66f78822018-05-02 12:58:28 -0700569 a.extraAaptPackagesFile = extraPackages
Colin Crossa97c5d32018-03-28 14:58:31 -0700570 a.rTxt = rTxt
Colin Crosse560c4a2019-03-19 16:03:11 -0700571 a.splits = splits
Colin Crossab8d1382023-07-14 17:23:41 +0000572 a.resourcesNodesDepSet = android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL).
573 Direct(&resourcesNode{
574 resPackage: a.exportPackage,
575 manifest: a.manifestPath,
576 additionalManifests: additionalManifests,
Colin Cross4eae06d2023-06-20 22:40:02 -0700577 rTxt: a.rTxt,
578 rJar: a.rJar,
Colin Crossab8d1382023-07-14 17:23:41 +0000579 assets: a.assetPackage,
Colin Cross4eae06d2023-06-20 22:40:02 -0700580
581 usedResourceProcessor: a.useResourceProcessorBusyBox(),
Colin Crossab8d1382023-07-14 17:23:41 +0000582 }).
583 Transitive(staticResourcesNodesDepSet).Build()
584 a.rroDirsDepSet = android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL).
585 Direct(rroDirs...).
586 Transitive(staticRRODirsDepSet).Build()
587 a.manifestsDepSet = android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).
588 Direct(a.manifestPath).
589 DirectSlice(additionalManifests).
590 Transitive(staticManifestsDepSet).Build()
591}
592
Colin Cross4eae06d2023-06-20 22:40:02 -0700593var resourceProcessorBusyBox = pctx.AndroidStaticRule("resourceProcessorBusyBox",
594 blueprint.RuleParams{
595 Command: "${config.JavaCmd} -cp ${config.ResourceProcessorBusyBox} " +
596 "com.google.devtools.build.android.ResourceProcessorBusyBox --tool=GENERATE_BINARY_R -- @${out}.args && " +
597 "if cmp -s ${out}.tmp ${out} ; then rm ${out}.tmp ; else mv ${out}.tmp ${out}; fi",
598 CommandDeps: []string{"${config.ResourceProcessorBusyBox}"},
599 Rspfile: "${out}.args",
600 RspfileContent: "--primaryRTxt ${rTxt} --primaryManifest ${manifest} --classJarOutput ${out}.tmp ${args}",
601 Restat: true,
602 }, "rTxt", "manifest", "args")
603
604// resourceProcessorBusyBoxGenerateBinaryR converts the R.txt file produced by aapt2 into R.class files
605// using Bazel's ResourceProcessorBusyBox tool, which is faster than compiling the R.java files and
606// supports producing classes for static dependencies that only include resources from that dependency.
607func resourceProcessorBusyBoxGenerateBinaryR(ctx android.ModuleContext, rTxt, manifest android.Path,
608 rJar android.WritablePath, transitiveDeps transitiveAarDeps, isLibrary bool) {
609
610 var args []string
611 var deps android.Paths
612
613 if !isLibrary {
614 // When compiling an app, pass all R.txt and AndroidManifest.xml from transitive static library dependencies
615 // to ResourceProcessorBusyBox so that it can regenerate R.class files with the final resource IDs for each
616 // package.
617 args, deps = transitiveDeps.resourceProcessorDeps()
618 } else {
619 // When compiling a library don't pass any dependencies as it only needs to generate an R.class file for this
620 // library. Pass --finalFields=false so that the R.class file contains non-final fields so they don't get
621 // inlined into the library before the final IDs are assigned during app compilation.
622 args = append(args, "--finalFields=false")
623 }
624
625 deps = append(deps, rTxt, manifest)
626
627 ctx.Build(pctx, android.BuildParams{
628 Rule: resourceProcessorBusyBox,
629 Output: rJar,
630 Implicits: deps,
631 Description: "ResourceProcessorBusyBox",
632 Args: map[string]string{
633 "rTxt": rTxt.String(),
634 "manifest": manifest.String(),
635 "args": strings.Join(args, " "),
636 },
637 })
638}
639
Colin Crossab8d1382023-07-14 17:23:41 +0000640type resourcesNode struct {
641 resPackage android.Path
642 manifest android.Path
643 additionalManifests android.Paths
Colin Cross4eae06d2023-06-20 22:40:02 -0700644 rTxt android.Path
645 rJar android.Path
Colin Crossab8d1382023-07-14 17:23:41 +0000646 assets android.OptionalPath
Colin Cross4eae06d2023-06-20 22:40:02 -0700647
648 usedResourceProcessor bool
Colin Crossab8d1382023-07-14 17:23:41 +0000649}
650
651type transitiveAarDeps []*resourcesNode
652
653func (t transitiveAarDeps) resPackages() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700654 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000655 for _, dep := range t {
656 paths = append(paths, dep.resPackage)
657 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700658 return paths
Colin Crossab8d1382023-07-14 17:23:41 +0000659}
660
661func (t transitiveAarDeps) manifests() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700662 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000663 for _, dep := range t {
664 paths = append(paths, dep.manifest)
665 paths = append(paths, dep.additionalManifests...)
666 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700667 return paths
668}
669
670func (t transitiveAarDeps) resourceProcessorDeps() (args []string, deps android.Paths) {
671 for _, dep := range t {
672 args = append(args, "--library="+dep.rTxt.String()+","+dep.manifest.String())
673 deps = append(deps, dep.rTxt, dep.manifest)
674 }
675 return args, deps
Colin Crossab8d1382023-07-14 17:23:41 +0000676}
677
678func (t transitiveAarDeps) assets() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700679 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000680 for _, dep := range t {
681 if dep.assets.Valid() {
682 paths = append(paths, dep.assets.Path())
683 }
684 }
685 return paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700686}
687
688// aaptLibs collects libraries from dependencies and sdk_version and converts them into paths
Jiyong Parkf1691d22021-03-29 20:11:58 +0900689func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoaderContexts dexpreopt.ClassLoaderContextMap) (
Colin Cross8676c8c2023-10-12 15:58:57 -0700690 staticResourcesNodes, sharedResourcesNodes *android.DepSet[*resourcesNode], staticRRODirs *android.DepSet[rroDir],
Colin Crossab8d1382023-07-14 17:23:41 +0000691 staticManifests *android.DepSet[android.Path], sharedLibs android.Paths, flags []string) {
Colin Crossa97c5d32018-03-28 14:58:31 -0700692
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100693 if classLoaderContexts == nil {
Ulya Trafimovich18554242020-11-03 15:55:11 +0000694 // Not all callers need to compute class loader context, those who don't just pass nil.
695 // Create a temporary class loader context here (it will be computed, but not used).
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100696 classLoaderContexts = make(dexpreopt.ClassLoaderContextMap)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000697 }
698
Colin Cross83bb3162018-06-25 15:48:06 -0700699 sdkDep := decodeSdkDep(ctx, sdkContext)
Colin Crossa97c5d32018-03-28 14:58:31 -0700700 if sdkDep.useFiles {
Colin Cross86a60ae2018-05-29 14:44:55 -0700701 sharedLibs = append(sharedLibs, sdkDep.jars...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700702 }
703
Colin Cross8676c8c2023-10-12 15:58:57 -0700704 var staticResourcesNodeDepSets []*android.DepSet[*resourcesNode]
705 var sharedResourcesNodeDepSets []*android.DepSet[*resourcesNode]
Colin Crossab8d1382023-07-14 17:23:41 +0000706 rroDirsDepSetBuilder := android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL)
707 manifestsDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
708
Colin Crossa97c5d32018-03-28 14:58:31 -0700709 ctx.VisitDirectDeps(func(module android.Module) {
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000710 depTag := ctx.OtherModuleDependencyTag(module)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000711
Colin Crossa97c5d32018-03-28 14:58:31 -0700712 var exportPackage android.Path
Colin Cross66f78822018-05-02 12:58:28 -0700713 aarDep, _ := module.(AndroidLibraryDependency)
714 if aarDep != nil {
Colin Crossa97c5d32018-03-28 14:58:31 -0700715 exportPackage = aarDep.ExportPackage()
716 }
717
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000718 switch depTag {
Colin Cross4b964c02018-10-15 16:18:06 -0700719 case instrumentationForTag:
720 // Nothing, instrumentationForTag is treated as libTag for javac but not for aapt2.
Liz Kammeref28a4c2022-09-23 16:50:56 -0400721 case sdkLibTag, libTag:
Colin Cross5446e882019-05-22 10:46:27 -0700722 if exportPackage != nil {
Colin Cross8676c8c2023-10-12 15:58:57 -0700723 sharedResourcesNodeDepSets = append(sharedResourcesNodeDepSets, aarDep.ResourcesNodeDepSet())
Colin Cross5446e882019-05-22 10:46:27 -0700724 sharedLibs = append(sharedLibs, exportPackage)
725 }
Colin Cross5446e882019-05-22 10:46:27 -0700726 case frameworkResTag:
Colin Crossa97c5d32018-03-28 14:58:31 -0700727 if exportPackage != nil {
728 sharedLibs = append(sharedLibs, exportPackage)
729 }
730 case staticLibTag:
731 if exportPackage != nil {
Colin Cross8676c8c2023-10-12 15:58:57 -0700732 staticResourcesNodeDepSets = append(staticResourcesNodeDepSets, aarDep.ResourcesNodeDepSet())
Colin Crossab8d1382023-07-14 17:23:41 +0000733 rroDirsDepSetBuilder.Transitive(aarDep.RRODirsDepSet())
734 manifestsDepSetBuilder.Transitive(aarDep.ManifestsDepSet())
Colin Crossa97c5d32018-03-28 14:58:31 -0700735 }
736 }
Ulya Trafimovich18554242020-11-03 15:55:11 +0000737
Ulya Trafimovich88bb6f62020-12-16 16:16:11 +0000738 addCLCFromDep(ctx, module, classLoaderContexts)
Colin Crossa97c5d32018-03-28 14:58:31 -0700739 })
740
Colin Crossab8d1382023-07-14 17:23:41 +0000741 // AAPT2 overlays are in lowest to highest priority order, the topological order will be reversed later.
742 // Reverse the dependency order now going into the depset so that it comes out in order after the second
743 // reverse later.
744 // NOTE: this is legacy and probably incorrect behavior, for most other cases (e.g. conflicting classes in
745 // dependencies) the highest priority dependency is listed first, but for resources the highest priority
746 // dependency has to be listed last.
747 staticResourcesNodes = android.NewDepSet(android.TOPOLOGICAL, nil,
Colin Cross8676c8c2023-10-12 15:58:57 -0700748 android.ReverseSliceInPlace(staticResourcesNodeDepSets))
749 sharedResourcesNodes = android.NewDepSet(android.TOPOLOGICAL, nil,
750 android.ReverseSliceInPlace(sharedResourcesNodeDepSets))
Colin Crossa97c5d32018-03-28 14:58:31 -0700751
Colin Crossab8d1382023-07-14 17:23:41 +0000752 staticRRODirs = rroDirsDepSetBuilder.Build()
753 staticManifests = manifestsDepSetBuilder.Build()
754
755 if len(staticResourcesNodes.ToList()) > 0 {
Colin Crossa97c5d32018-03-28 14:58:31 -0700756 flags = append(flags, "--auto-add-overlay")
757 }
758
759 for _, sharedLib := range sharedLibs {
760 flags = append(flags, "-I "+sharedLib.String())
761 }
762
Colin Cross8676c8c2023-10-12 15:58:57 -0700763 return staticResourcesNodes, sharedResourcesNodes, staticRRODirs, staticManifests, sharedLibs, flags
Colin Crossa97c5d32018-03-28 14:58:31 -0700764}
765
766type AndroidLibrary struct {
767 Library
768 aapt
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -0500769 android.BazelModuleBase
Colin Crossa97c5d32018-03-28 14:58:31 -0700770
771 androidLibraryProperties androidLibraryProperties
772
773 aarFile android.WritablePath
Colin Cross89c31582018-04-30 15:55:11 -0700774}
775
Saeid Farivar Asanjan1fca3012021-09-14 18:40:19 +0000776var _ android.OutputFileProducer = (*AndroidLibrary)(nil)
777
778// For OutputFileProducer interface
779func (a *AndroidLibrary) OutputFiles(tag string) (android.Paths, error) {
780 switch tag {
781 case ".aar":
782 return []android.Path{a.aarFile}, nil
783 default:
784 return a.Library.OutputFiles(tag)
785 }
786}
787
Colin Crossa97c5d32018-03-28 14:58:31 -0700788var _ AndroidLibraryDependency = (*AndroidLibrary)(nil)
789
790func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
791 a.Module.deps(ctx)
Jiyong Parkf1691d22021-03-29 20:11:58 +0900792 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Paul Duffin250e6192019-06-07 10:44:37 +0100793 if sdkDep.hasFrameworkLibs() {
794 a.aapt.deps(ctx, sdkDep)
Colin Crossa97c5d32018-03-28 14:58:31 -0700795 }
Colin Cross4a80a152022-12-21 21:51:52 -0800796 a.usesLibrary.deps(ctx, false)
Colin Crossa97c5d32018-03-28 14:58:31 -0700797}
798
799func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Crosse4246ab2019-02-05 21:55:21 -0800800 a.aapt.isLibrary = true
Ulya Trafimovich42c7f0d2021-08-17 16:20:29 +0100801 a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx)
Alixf7a10272023-09-27 16:47:56 +0000802 a.aapt.buildActions(ctx,
803 aaptBuildActionOptions{
804 sdkContext: android.SdkContext(a),
805 classLoaderContexts: a.classLoaderContexts,
806 enforceDefaultTargetSdkVersion: false,
807 },
808 )
Colin Crossa97c5d32018-03-28 14:58:31 -0700809
Colin Cross56a83212020-09-15 18:30:11 -0700810 a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
811
Jihoon Kang1bfb6f22023-07-01 00:13:47 +0000812 a.stem = proptools.StringDefault(a.overridableDeviceProperties.Stem, ctx.ModuleName())
813
Colin Cross4eae06d2023-06-20 22:40:02 -0700814 ctx.CheckbuildFile(a.aapt.proguardOptionsFile)
815 ctx.CheckbuildFile(a.aapt.exportPackage)
Colin Cross4eae06d2023-06-20 22:40:02 -0700816 if a.useResourceProcessorBusyBox() {
817 ctx.CheckbuildFile(a.aapt.rJar)
Colin Crossf3b7bad2023-08-02 15:49:00 -0700818 } else {
819 ctx.CheckbuildFile(a.aapt.aaptSrcJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700820 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700821
822 // apps manifests are handled by aapt, don't let Module see them
823 a.properties.Manifest = nil
824
Colin Cross014489c2020-06-02 20:09:13 -0700825 a.linter.mergedManifest = a.aapt.mergedManifestFile
826 a.linter.manifest = a.aapt.manifestPath
827 a.linter.resources = a.aapt.resourceFiles
828
Sam Delmericoc8e040c2023-10-31 17:27:02 +0000829 proguardSpecInfo := a.collectProguardSpecInfo(ctx)
830 ctx.SetProvider(ProguardSpecInfoProvider, proguardSpecInfo)
Colin Cross312634e2023-11-21 15:13:56 -0800831 exportedProguardFlagsFiles := proguardSpecInfo.ProguardFlagsFiles.ToList()
832 a.extraProguardFlagsFiles = append(a.extraProguardFlagsFiles, exportedProguardFlagsFiles...)
833 a.extraProguardFlagsFiles = append(a.extraProguardFlagsFiles, a.proguardOptionsFile)
834
835 combinedExportedProguardFlagFile := android.PathForModuleOut(ctx, "export_proguard_flags")
836 writeCombinedProguardFlagsFile(ctx, combinedExportedProguardFlagFile, exportedProguardFlagsFiles)
837 a.combinedExportedProguardFlagsFile = combinedExportedProguardFlagFile
Colin Crossa97c5d32018-03-28 14:58:31 -0700838
Colin Cross4eae06d2023-06-20 22:40:02 -0700839 var extraSrcJars android.Paths
840 var extraCombinedJars android.Paths
841 var extraClasspathJars android.Paths
842 if a.useResourceProcessorBusyBox() {
843 // When building a library with ResourceProcessorBusyBox enabled ResourceProcessorBusyBox for this
844 // library and each of the transitive static android_library dependencies has already created an
845 // R.class file for the appropriate package. Add all of those R.class files to the classpath.
846 extraClasspathJars = a.transitiveAaptRJars
847 } else {
848 // When building a library without ResourceProcessorBusyBox the aapt2 rule creates R.srcjar containing
849 // R.java files for the library's package and the packages from all transitive static android_library
850 // dependencies. Compile the srcjar alongside the rest of the sources.
851 extraSrcJars = android.Paths{a.aapt.aaptSrcJar}
852 }
853
854 a.Module.compile(ctx, extraSrcJars, extraClasspathJars, extraCombinedJars)
Colin Crossa97c5d32018-03-28 14:58:31 -0700855
Colin Crossf57c5782019-01-25 13:20:38 -0800856 a.aarFile = android.PathForModuleOut(ctx, ctx.ModuleName()+".aar")
Colin Crossa97c5d32018-03-28 14:58:31 -0700857 var res android.Paths
858 if a.androidLibraryProperties.BuildAAR {
859 BuildAAR(ctx, a.aarFile, a.outputFile, a.manifestPath, a.rTxt, res)
860 ctx.CheckbuildFile(a.aarFile)
861 }
Colin Cross89c31582018-04-30 15:55:11 -0700862
Sam Delmerico82602492022-06-10 17:05:42 +0000863 prebuiltJniPackages := android.Paths{}
864 ctx.VisitDirectDeps(func(module android.Module) {
865 if info, ok := ctx.OtherModuleProvider(module, JniPackageProvider).(JniPackageInfo); ok {
866 prebuiltJniPackages = append(prebuiltJniPackages, info.JniPackages...)
867 }
868 })
869 if len(prebuiltJniPackages) > 0 {
870 ctx.SetProvider(JniPackageProvider, JniPackageInfo{
871 JniPackages: prebuiltJniPackages,
872 })
873 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700874}
875
Colin Cross95b53b82023-10-17 13:21:02 -0700876func (a *AndroidLibrary) IDEInfo(dpInfo *android.IdeInfo) {
877 a.Library.IDEInfo(dpInfo)
878 a.aapt.IDEInfo(dpInfo)
879}
880
881func (a *aapt) IDEInfo(dpInfo *android.IdeInfo) {
882 if a.useResourceProcessorBusyBox() {
883 dpInfo.Jars = append(dpInfo.Jars, a.rJar.String())
884 }
885}
886
Colin Cross1b16b0e2019-02-12 14:41:32 -0800887// android_library builds and links sources into a `.jar` file for the device along with Android resources.
888//
889// An android_library has a single variant that produces a `.jar` file containing `.class` files that were
Sam Delmerico82602492022-06-10 17:05:42 +0000890// compiled against the device bootclasspath, along with a `package-res.apk` file containing Android resources compiled
Colin Cross1b16b0e2019-02-12 14:41:32 -0800891// with aapt2. This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
892// an android_app module.
Colin Crossa97c5d32018-03-28 14:58:31 -0700893func AndroidLibraryFactory() android.Module {
894 module := &AndroidLibrary{}
895
Colin Crossce6734e2020-06-15 16:09:53 -0700896 module.Module.addHostAndDeviceProperties()
Colin Crossa97c5d32018-03-28 14:58:31 -0700897 module.AddProperties(
Colin Crossa97c5d32018-03-28 14:58:31 -0700898 &module.aaptProperties,
899 &module.androidLibraryProperties)
900
901 module.androidLibraryProperties.BuildAAR = true
Colin Cross014489c2020-06-02 20:09:13 -0700902 module.Module.linter.library = true
Colin Crossa97c5d32018-03-28 14:58:31 -0700903
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900904 android.InitApexModule(module)
Colin Cross48de9a42018-10-02 13:53:33 -0700905 InitJavaModule(module, android.DeviceSupported)
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -0500906 android.InitBazelModule(module)
Colin Crossa97c5d32018-03-28 14:58:31 -0700907 return module
908}
909
Colin Crossfabb6082018-02-20 17:22:23 -0800910//
911// AAR (android library) prebuilts
912//
Colin Crossfabb6082018-02-20 17:22:23 -0800913
Vinh Trance0781f2022-04-13 01:30:44 +0000914// Properties for android_library_import
Colin Crossfabb6082018-02-20 17:22:23 -0800915type AARImportProperties struct {
Vinh Trance0781f2022-04-13 01:30:44 +0000916 // ARR (android library prebuilt) filepath. Exactly one ARR is required.
Colin Cross27b922f2019-03-04 22:35:41 -0800917 Aars []string `android:"path"`
Vinh Trance0781f2022-04-13 01:30:44 +0000918 // If not blank, set to the version of the sdk to compile against.
919 // Defaults to private.
920 // Values are of one of the following forms:
921 // 1) numerical API level, "current", "none", or "core_platform"
922 // 2) An SDK kind with an API level: "<sdk kind>_<API level>"
923 // See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds.
924 // If the SDK kind is empty, it will be set to public
925 Sdk_version *string
926 // If not blank, set the minimum version of the sdk that the compiled artifacts will run against.
927 // Defaults to sdk_version if not set. See sdk_version for possible values.
Colin Cross479884c2018-07-10 13:39:30 -0700928 Min_sdk_version *string
Vinh Trance0781f2022-04-13 01:30:44 +0000929 // List of java static libraries that the included ARR (android library prebuilts) has dependencies to.
Colin Crossa97c5d32018-03-28 14:58:31 -0700930 Static_libs []string
Vinh Trance0781f2022-04-13 01:30:44 +0000931 // List of java libraries that the included ARR (android library prebuilts) has dependencies to.
932 Libs []string
933 // If set to true, run Jetifier against .aar file. Defaults to false.
Colin Cross1001a792019-03-21 22:21:39 -0700934 Jetifier *bool
Sam Delmerico82602492022-06-10 17:05:42 +0000935 // If true, extract JNI libs from AAR archive. These libs will be accessible to android_app modules and
936 // will be passed transitively through android_libraries to an android_app.
937 //TODO(b/241138093) evaluate whether we can have this flag default to true for Bazel conversion
938 Extract_jni *bool
Colin Crossfabb6082018-02-20 17:22:23 -0800939}
940
941type AARImport struct {
942 android.ModuleBase
Colin Cross48de9a42018-10-02 13:53:33 -0700943 android.DefaultableModuleBase
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900944 android.ApexModuleBase
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -0500945 android.BazelModuleBase
Colin Crossfabb6082018-02-20 17:22:23 -0800946 prebuilt android.Prebuilt
947
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900948 // Functionality common to Module and Import.
949 embeddableInModuleAndImport
950
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500951 providesTransitiveHeaderJars
952
Colin Crossfabb6082018-02-20 17:22:23 -0800953 properties AARImportProperties
954
Colin Cross312634e2023-11-21 15:13:56 -0800955 classpathFile android.WritablePath
956 proguardFlags android.WritablePath
957 exportPackage android.WritablePath
958 transitiveAaptResourcePackagesFile android.Path
959 extraAaptPackagesFile android.WritablePath
960 manifest android.WritablePath
961 assetsPackage android.WritablePath
962 rTxt android.WritablePath
963 rJar android.WritablePath
Colin Cross66f78822018-05-02 12:58:28 -0700964
Colin Crossab8d1382023-07-14 17:23:41 +0000965 resourcesNodesDepSet *android.DepSet[*resourcesNode]
966 manifestsDepSet *android.DepSet[android.Path]
Colin Cross56a83212020-09-15 18:30:11 -0700967
968 hideApexVariantFromMake bool
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000969
Sam Delmerico82602492022-06-10 17:05:42 +0000970 aarPath android.Path
971 jniPackages android.Paths
Jiyong Park92315372021-04-02 08:45:46 +0900972
973 sdkVersion android.SdkSpec
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000974 minSdkVersion android.ApiLevel
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000975}
976
977var _ android.OutputFileProducer = (*AARImport)(nil)
978
979// For OutputFileProducer interface
980func (a *AARImport) OutputFiles(tag string) (android.Paths, error) {
981 switch tag {
982 case ".aar":
983 return []android.Path{a.aarPath}, nil
984 case "":
985 return []android.Path{a.classpathFile}, nil
986 default:
987 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
988 }
Colin Crossfabb6082018-02-20 17:22:23 -0800989}
990
Jiyong Park92315372021-04-02 08:45:46 +0900991func (a *AARImport) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
992 return android.SdkSpecFrom(ctx, String(a.properties.Sdk_version))
Colin Cross83bb3162018-06-25 15:48:06 -0700993}
994
Jiyong Parkf1691d22021-03-29 20:11:58 +0900995func (a *AARImport) SystemModules() string {
Paul Duffine25c6442019-10-11 13:50:28 +0100996 return ""
997}
998
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000999func (a *AARImport) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
Colin Cross479884c2018-07-10 13:39:30 -07001000 if a.properties.Min_sdk_version != nil {
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001001 return android.ApiLevelFrom(ctx, *a.properties.Min_sdk_version)
Colin Cross479884c2018-07-10 13:39:30 -07001002 }
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001003 return a.SdkVersion(ctx).ApiLevel
Colin Cross83bb3162018-06-25 15:48:06 -07001004}
1005
Spandan Dasa26eda72023-03-02 00:56:06 +00001006func (a *AARImport) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
1007 return android.SdkSpecFrom(ctx, "").ApiLevel
William Loh5a082f92022-05-17 20:21:50 +00001008}
1009
Spandan Dasca70fc42023-03-01 23:38:49 +00001010func (a *AARImport) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
1011 return a.SdkVersion(ctx).ApiLevel
Dan Willemsen419290a2018-10-31 15:28:47 -07001012}
1013
Colin Cross1e743852019-10-28 11:37:20 -07001014func (a *AARImport) javaVersion() string {
1015 return ""
1016}
1017
Colin Crossa97c5d32018-03-28 14:58:31 -07001018var _ AndroidLibraryDependency = (*AARImport)(nil)
1019
1020func (a *AARImport) ExportPackage() android.Path {
1021 return a.exportPackage
1022}
Colin Crossab8d1382023-07-14 17:23:41 +00001023func (a *AARImport) ResourcesNodeDepSet() *android.DepSet[*resourcesNode] {
1024 return a.resourcesNodesDepSet
Colin Crossc1c37552019-01-31 11:42:41 -08001025}
1026
Colin Crossab8d1382023-07-14 17:23:41 +00001027func (a *AARImport) RRODirsDepSet() *android.DepSet[rroDir] {
1028 return android.NewDepSet[rroDir](android.TOPOLOGICAL, nil, nil)
Colin Cross66f78822018-05-02 12:58:28 -07001029}
1030
Colin Crossab8d1382023-07-14 17:23:41 +00001031func (a *AARImport) ManifestsDepSet() *android.DepSet[android.Path] {
1032 return a.manifestsDepSet
Jaewoong Jung6431ca72020-01-15 14:15:10 -08001033}
1034
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001035// RRO enforcement is not available on aar_import since its RRO dirs are not
1036// exported.
1037func (a *AARImport) SetRROEnforcedForDependent(enforce bool) {
1038}
1039
1040// RRO enforcement is not available on aar_import since its RRO dirs are not
1041// exported.
1042func (a *AARImport) IsRROEnforced(ctx android.BaseModuleContext) bool {
1043 return false
1044}
1045
Colin Crossfabb6082018-02-20 17:22:23 -08001046func (a *AARImport) Prebuilt() *android.Prebuilt {
1047 return &a.prebuilt
1048}
1049
1050func (a *AARImport) Name() string {
1051 return a.prebuilt.Name(a.ModuleBase.Name())
1052}
1053
Jiyong Park618922e2020-01-08 13:35:43 +09001054func (a *AARImport) JacocoReportClassesFile() android.Path {
1055 return nil
1056}
1057
Colin Crossfabb6082018-02-20 17:22:23 -08001058func (a *AARImport) DepsMutator(ctx android.BottomUpMutatorContext) {
Jeongik Cha816a23a2020-07-08 01:09:23 +09001059 if !ctx.Config().AlwaysUsePrebuiltSdks() {
Jiyong Parkf1691d22021-03-29 20:11:58 +09001060 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Colin Crossa97c5d32018-03-28 14:58:31 -07001061 if sdkDep.useModule && sdkDep.frameworkResModule != "" {
Colin Cross42d48b72018-08-29 14:10:52 -07001062 ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
Colin Crossfabb6082018-02-20 17:22:23 -08001063 }
1064 }
Colin Crossa97c5d32018-03-28 14:58:31 -07001065
Colin Cross42d48b72018-08-29 14:10:52 -07001066 ctx.AddVariationDependencies(nil, libTag, a.properties.Libs...)
1067 ctx.AddVariationDependencies(nil, staticLibTag, a.properties.Static_libs...)
Colin Crossfabb6082018-02-20 17:22:23 -08001068}
1069
Sam Delmerico82602492022-06-10 17:05:42 +00001070type JniPackageInfo struct {
1071 // List of zip files containing JNI libraries
1072 // Zip files should have directory structure jni/<arch>/*.so
1073 JniPackages android.Paths
1074}
1075
1076var JniPackageProvider = blueprint.NewProvider(JniPackageInfo{})
1077
1078// Unzip an AAR and extract the JNI libs for $archString.
1079var extractJNI = pctx.AndroidStaticRule("extractJNI",
1080 blueprint.RuleParams{
1081 Command: `rm -rf $out $outDir && touch $out && ` +
1082 `unzip -qoDD -d $outDir $in "jni/${archString}/*" && ` +
1083 `jni_files=$$(find $outDir/jni -type f) && ` +
1084 // print error message if there are no JNI libs for this arch
1085 `[ -n "$$jni_files" ] || (echo "ERROR: no JNI libs found for arch ${archString}" && exit 1) && ` +
Sam Delmerico80ee45c2023-06-22 15:36:02 -04001086 `${config.SoongZipCmd} -o $out -L 0 -P 'lib/${archString}' ` +
Sam Delmerico82602492022-06-10 17:05:42 +00001087 `-C $outDir/jni/${archString} $$(echo $$jni_files | xargs -n1 printf " -f %s")`,
1088 CommandDeps: []string{"${config.SoongZipCmd}"},
1089 },
1090 "outDir", "archString")
1091
Colin Crossfabb6082018-02-20 17:22:23 -08001092// Unzip an AAR into its constituent files and directories. Any files in Outputs that don't exist in the AAR will be
Dan Willemsen304cfec2019-05-28 14:49:06 -07001093// touched to create an empty file. The res directory is not extracted, as it will be extracted in its own rule.
Colin Crossfabb6082018-02-20 17:22:23 -08001094var unzipAAR = pctx.AndroidStaticRule("unzipAAR",
1095 blueprint.RuleParams{
Dan Willemsen304cfec2019-05-28 14:49:06 -07001096 Command: `rm -rf $outDir && mkdir -p $outDir && ` +
Colin Cross205e9112020-08-06 13:20:17 -07001097 `unzip -qoDD -d $outDir $in && rm -rf $outDir/res && touch $out && ` +
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001098 `${config.Zip2ZipCmd} -i $in -o $assetsPackage 'assets/**/*' && ` +
Colin Cross205e9112020-08-06 13:20:17 -07001099 `${config.MergeZipsCmd} $combinedClassesJar $$(ls $outDir/classes.jar 2> /dev/null) $$(ls $outDir/libs/*.jar 2> /dev/null)`,
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001100 CommandDeps: []string{"${config.MergeZipsCmd}", "${config.Zip2ZipCmd}"},
Colin Crossfabb6082018-02-20 17:22:23 -08001101 },
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001102 "outDir", "combinedClassesJar", "assetsPackage")
Colin Crossfabb6082018-02-20 17:22:23 -08001103
1104func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1105 if len(a.properties.Aars) != 1 {
1106 ctx.PropertyErrorf("aars", "exactly one aar is required")
1107 return
1108 }
1109
Jiyong Park92315372021-04-02 08:45:46 +09001110 a.sdkVersion = a.SdkVersion(ctx)
1111 a.minSdkVersion = a.MinSdkVersion(ctx)
1112
Colin Cross56a83212020-09-15 18:30:11 -07001113 a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
1114
Nan Zhang4c819fb2018-08-27 18:31:46 -07001115 aarName := ctx.ModuleName() + ".aar"
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001116 a.aarPath = android.PathForModuleSrc(ctx, a.properties.Aars[0])
1117
Colin Cross1001a792019-03-21 22:21:39 -07001118 if Bool(a.properties.Jetifier) {
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001119 inputFile := a.aarPath
1120 a.aarPath = android.PathForModuleOut(ctx, "jetifier", aarName)
1121 TransformJetifier(ctx, a.aarPath.(android.WritablePath), inputFile)
Nan Zhang4c819fb2018-08-27 18:31:46 -07001122 }
Colin Crossfabb6082018-02-20 17:22:23 -08001123
1124 extractedAARDir := android.PathForModuleOut(ctx, "aar")
Colin Cross205e9112020-08-06 13:20:17 -07001125 a.classpathFile = extractedAARDir.Join(ctx, "classes-combined.jar")
Colin Cross10f7c4a2018-05-23 10:59:28 -07001126 a.manifest = extractedAARDir.Join(ctx, "AndroidManifest.xml")
Colin Cross4eae06d2023-06-20 22:40:02 -07001127 aarRTxt := extractedAARDir.Join(ctx, "R.txt")
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001128 a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip")
Sam Delmerico95d70942023-08-02 18:00:35 -04001129 a.proguardFlags = extractedAARDir.Join(ctx, "proguard.txt")
1130 ctx.SetProvider(ProguardSpecInfoProvider, ProguardSpecInfo{
1131 ProguardFlagsFiles: android.NewDepSet[android.Path](
1132 android.POSTORDER,
1133 android.Paths{a.proguardFlags},
1134 nil,
1135 ),
1136 })
Colin Crossfabb6082018-02-20 17:22:23 -08001137
1138 ctx.Build(pctx, android.BuildParams{
1139 Rule: unzipAAR,
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001140 Input: a.aarPath,
Colin Cross4eae06d2023-06-20 22:40:02 -07001141 Outputs: android.WritablePaths{a.classpathFile, a.proguardFlags, a.manifest, a.assetsPackage, aarRTxt},
Colin Crossfabb6082018-02-20 17:22:23 -08001142 Description: "unzip AAR",
1143 Args: map[string]string{
Colin Cross205e9112020-08-06 13:20:17 -07001144 "outDir": extractedAARDir.String(),
1145 "combinedClassesJar": a.classpathFile.String(),
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001146 "assetsPackage": a.assetsPackage.String(),
Colin Crossfabb6082018-02-20 17:22:23 -08001147 },
1148 })
1149
Colin Crossa0ba2f52019-06-22 12:59:27 -07001150 // Always set --pseudo-localize, it will be stripped out later for release
1151 // builds that don't want it.
1152 compileFlags := []string{"--pseudo-localize"}
Colin Crossfabb6082018-02-20 17:22:23 -08001153 compiledResDir := android.PathForModuleOut(ctx, "flat-res")
Colin Crossfabb6082018-02-20 17:22:23 -08001154 flata := compiledResDir.Join(ctx, "gen_res.flata")
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001155 aapt2CompileZip(ctx, flata, a.aarPath, "res", compileFlags)
Colin Crossfabb6082018-02-20 17:22:23 -08001156
1157 a.exportPackage = android.PathForModuleOut(ctx, "package-res.apk")
Colin Crossfabb6082018-02-20 17:22:23 -08001158 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
Colin Cross4eae06d2023-06-20 22:40:02 -07001159 a.rTxt = android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -07001160 a.extraAaptPackagesFile = android.PathForModuleOut(ctx, "extra_packages")
Colin Crossfabb6082018-02-20 17:22:23 -08001161
1162 var linkDeps android.Paths
1163
1164 linkFlags := []string{
1165 "--static-lib",
Colin Cross4eae06d2023-06-20 22:40:02 -07001166 "--merge-only",
Colin Crossfabb6082018-02-20 17:22:23 -08001167 "--auto-add-overlay",
1168 }
1169
Colin Cross10f7c4a2018-05-23 10:59:28 -07001170 linkFlags = append(linkFlags, "--manifest "+a.manifest.String())
1171 linkDeps = append(linkDeps, a.manifest)
Colin Crossfabb6082018-02-20 17:22:23 -08001172
Colin Cross8676c8c2023-10-12 15:58:57 -07001173 staticResourcesNodesDepSet, sharedResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedLibs, libFlags :=
Jiyong Parkf1691d22021-03-29 20:11:58 +09001174 aaptLibs(ctx, android.SdkContext(a), nil)
Colin Cross31656952018-05-24 16:11:20 -07001175
Colin Cross8676c8c2023-10-12 15:58:57 -07001176 _ = sharedResourcesNodesDepSet
Colin Crossab8d1382023-07-14 17:23:41 +00001177 _ = staticRRODirsDepSet
Colin Cross8676c8c2023-10-12 15:58:57 -07001178
Colin Crossab8d1382023-07-14 17:23:41 +00001179 staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
Colin Crossfabb6082018-02-20 17:22:23 -08001180
Colin Crossab8d1382023-07-14 17:23:41 +00001181 linkDeps = append(linkDeps, sharedLibs...)
Colin Cross4eae06d2023-06-20 22:40:02 -07001182 linkDeps = append(linkDeps, staticDeps.resPackages()...)
Colin Crossa97c5d32018-03-28 14:58:31 -07001183 linkFlags = append(linkFlags, libFlags...)
Colin Crossfabb6082018-02-20 17:22:23 -08001184
Colin Cross4eae06d2023-06-20 22:40:02 -07001185 overlayRes := android.Paths{flata}
1186
1187 // Treat static library dependencies of static libraries as imports.
1188 transitiveStaticLibs := staticDeps.resPackages()
1189 linkDeps = append(linkDeps, transitiveStaticLibs...)
1190 for _, staticLib := range transitiveStaticLibs {
1191 linkFlags = append(linkFlags, "-I "+staticLib.String())
1192 }
Colin Crossfabb6082018-02-20 17:22:23 -08001193
Colin Crossab8d1382023-07-14 17:23:41 +00001194 transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets())
Colin Crossf3b7bad2023-08-02 15:49:00 -07001195 aapt2Link(ctx, a.exportPackage, nil, proguardOptionsFile, a.rTxt,
Jaewoong Jung6431ca72020-01-15 14:15:10 -08001196 linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil)
Colin Crossfabb6082018-02-20 17:22:23 -08001197
Colin Cross4eae06d2023-06-20 22:40:02 -07001198 a.rJar = android.PathForModuleOut(ctx, "busybox/R.jar")
1199 resourceProcessorBusyBoxGenerateBinaryR(ctx, a.rTxt, a.manifest, a.rJar, nil, true)
1200
Colin Crossf3b7bad2023-08-02 15:49:00 -07001201 aapt2ExtractExtraPackages(ctx, a.extraAaptPackagesFile, a.rJar)
1202
Colin Crossab8d1382023-07-14 17:23:41 +00001203 resourcesNodesDepSetBuilder := android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL)
1204 resourcesNodesDepSetBuilder.Direct(&resourcesNode{
1205 resPackage: a.exportPackage,
1206 manifest: a.manifest,
Colin Cross4eae06d2023-06-20 22:40:02 -07001207 rTxt: a.rTxt,
1208 rJar: a.rJar,
Colin Crossab8d1382023-07-14 17:23:41 +00001209 assets: android.OptionalPathForPath(a.assetsPackage),
Colin Cross4eae06d2023-06-20 22:40:02 -07001210
1211 usedResourceProcessor: true,
Colin Crossab8d1382023-07-14 17:23:41 +00001212 })
1213 resourcesNodesDepSetBuilder.Transitive(staticResourcesNodesDepSet)
1214 a.resourcesNodesDepSet = resourcesNodesDepSetBuilder.Build()
1215
1216 manifestDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).Direct(a.manifest)
1217 // TODO(b/288358614): Soong has historically not merged manifests from dependencies of android_library_import
1218 // modules. Merging manifests from dependencies could remove the need for pom2bp to generate the "-nodeps" copies
1219 // of androidx libraries, but doing so triggers errors due to errors introduced by existing dependencies of
1220 // android_library_import modules. If this is fixed, AndroidLibraryDependency.ManifestsDepSet can be dropped
1221 // completely in favor of AndroidLibraryDependency.ResourceNodesDepSet.manifest
1222 //manifestDepSetBuilder.Transitive(transitiveStaticDeps.manifests)
1223 _ = staticManifestsDepSet
1224 a.manifestsDepSet = manifestDepSetBuilder.Build()
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001225
Colin Cross312634e2023-11-21 15:13:56 -08001226 transitiveAaptResourcePackages := staticDeps.resPackages().Strings()
1227 transitiveAaptResourcePackages = slices.DeleteFunc(transitiveAaptResourcePackages, func(p string) bool {
1228 return p == a.exportPackage.String()
1229 })
1230 transitiveAaptResourcePackagesFile := android.PathForModuleOut(ctx, "transitive-res-packages")
1231 android.WriteFileRule(ctx, transitiveAaptResourcePackagesFile, strings.Join(transitiveAaptResourcePackages, "\n"))
1232 a.transitiveAaptResourcePackagesFile = transitiveAaptResourcePackagesFile
Colin Cross4eae06d2023-06-20 22:40:02 -07001233
Sam Delmerico9f9c0a22022-11-29 11:19:37 -05001234 a.collectTransitiveHeaderJars(ctx)
Colin Crossdcf71b22021-02-01 13:59:03 -08001235 ctx.SetProvider(JavaInfoProvider, JavaInfo{
1236 HeaderJars: android.PathsIfNonNil(a.classpathFile),
Sam Delmerico9f9c0a22022-11-29 11:19:37 -05001237 TransitiveLibsHeaderJars: a.transitiveLibsHeaderJars,
1238 TransitiveStaticLibsHeaderJars: a.transitiveStaticLibsHeaderJars,
Colin Crossdcf71b22021-02-01 13:59:03 -08001239 ImplementationAndResourcesJars: android.PathsIfNonNil(a.classpathFile),
1240 ImplementationJars: android.PathsIfNonNil(a.classpathFile),
Joe Onorato6fe59eb2023-07-16 13:20:33 -07001241 // TransitiveAconfigFiles: // TODO(b/289117800): LOCAL_ACONFIG_FILES for prebuilts
Colin Crossdcf71b22021-02-01 13:59:03 -08001242 })
Sam Delmerico82602492022-06-10 17:05:42 +00001243
1244 if proptools.Bool(a.properties.Extract_jni) {
1245 for _, t := range ctx.MultiTargets() {
1246 arch := t.Arch.Abi[0]
1247 path := android.PathForModuleOut(ctx, arch+"_jni.zip")
1248 a.jniPackages = append(a.jniPackages, path)
1249
1250 outDir := android.PathForModuleOut(ctx, "aarForJni")
1251 aarPath := android.PathForModuleSrc(ctx, a.properties.Aars[0])
1252 ctx.Build(pctx, android.BuildParams{
1253 Rule: extractJNI,
1254 Input: aarPath,
1255 Outputs: android.WritablePaths{path},
1256 Description: "extract JNI from AAR",
1257 Args: map[string]string{
1258 "outDir": outDir.String(),
1259 "archString": arch,
1260 },
1261 })
1262 }
1263
1264 ctx.SetProvider(JniPackageProvider, JniPackageInfo{
1265 JniPackages: a.jniPackages,
1266 })
1267 }
Colin Crossdcf71b22021-02-01 13:59:03 -08001268}
Colin Crossfabb6082018-02-20 17:22:23 -08001269
1270func (a *AARImport) HeaderJars() android.Paths {
1271 return android.Paths{a.classpathFile}
1272}
1273
Colin Cross331a1212018-08-15 20:40:52 -07001274func (a *AARImport) ImplementationAndResourcesJars() android.Paths {
1275 return android.Paths{a.classpathFile}
1276}
1277
Ulyana Trafimovich5539e7b2020-06-04 14:08:17 +00001278func (a *AARImport) DexJarBuildPath() android.Path {
Colin Crossf24a22a2019-01-31 14:12:44 -08001279 return nil
1280}
1281
Ulya Trafimovich9f3052c2020-06-09 14:31:19 +01001282func (a *AARImport) DexJarInstallPath() android.Path {
1283 return nil
1284}
1285
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +01001286func (a *AARImport) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap {
Jiyong Park1be96912018-05-28 18:02:19 +09001287 return nil
1288}
1289
Jiyong Park45bf82e2020-12-15 22:29:02 +09001290var _ android.ApexModule = (*AARImport)(nil)
1291
1292// Implements android.ApexModule
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001293func (a *AARImport) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
1294 return a.depIsInSameApex(ctx, dep)
1295}
1296
Jiyong Park45bf82e2020-12-15 22:29:02 +09001297// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07001298func (g *AARImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
1299 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09001300 return nil
1301}
1302
Sam Delmericoaf8bb702022-07-25 15:39:32 -04001303var _ android.PrebuiltInterface = (*AARImport)(nil)
Colin Crossfabb6082018-02-20 17:22:23 -08001304
Colin Cross1b16b0e2019-02-12 14:41:32 -08001305// android_library_import imports an `.aar` file into the build graph as if it was built with android_library.
1306//
1307// This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
1308// an android_app module.
Colin Crossfabb6082018-02-20 17:22:23 -08001309func AARImportFactory() android.Module {
1310 module := &AARImport{}
1311
1312 module.AddProperties(&module.properties)
1313
1314 android.InitPrebuiltModule(module, &module.properties.Aars)
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001315 android.InitApexModule(module)
Sam Delmerico82602492022-06-10 17:05:42 +00001316 InitJavaModuleMultiTargets(module, android.DeviceSupported)
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001317 android.InitBazelModule(module)
Colin Crossfabb6082018-02-20 17:22:23 -08001318 return module
1319}
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001320
1321type bazelAapt struct {
1322 Manifest bazel.Label
1323 Resource_files bazel.LabelListAttribute
Romain Jobredeaux9c06ef32023-08-21 18:05:29 -04001324 Resource_zips bazel.LabelListAttribute
Romain Jobredeaux7a71e072023-08-16 17:39:12 -04001325 Assets_dir bazel.StringAttribute
1326 Assets bazel.LabelListAttribute
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001327}
1328
1329type bazelAndroidLibrary struct {
1330 *javaLibraryAttributes
1331 *bazelAapt
1332}
1333
1334type bazelAndroidLibraryImport struct {
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001335 Aar bazel.Label
1336 Deps bazel.LabelListAttribute
1337 Exports bazel.LabelListAttribute
1338 Sdk_version bazel.StringAttribute
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001339}
1340
Chris Parsons637458d2023-09-19 20:09:00 +00001341func (a *aapt) convertAaptAttrsWithBp2Build(ctx android.Bp2buildMutatorContext) (*bazelAapt, bool) {
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001342 manifest := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")
1343
1344 resourceFiles := bazel.LabelList{
1345 Includes: []bazel.Label{},
1346 }
1347 for _, dir := range android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res") {
1348 files := android.RootToModuleRelativePaths(ctx, androidResourceGlob(ctx, dir))
1349 resourceFiles.Includes = append(resourceFiles.Includes, files...)
1350 }
Romain Jobredeaux7a71e072023-08-16 17:39:12 -04001351
1352 assetsDir := bazel.StringAttribute{}
1353 var assets bazel.LabelList
1354 for i, dir := range android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Asset_dirs, "assets") {
1355 if i > 0 {
1356 ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_PROPERTY_UNSUPPORTED, "multiple asset_dirs")
1357 return &bazelAapt{}, false
1358 }
1359 // Assets_dirs are relative to the module dir when specified, but if the default in used in
1360 // PathsWithOptionalDefaultForModuleSrc, then dir is relative to the top.
1361 assetsRelDir, error := filepath.Rel(ctx.ModuleDir(), dir.Rel())
1362 if error != nil {
1363 assetsRelDir = dir.Rel()
1364 }
1365 assetsDir.Value = proptools.StringPtr(assetsRelDir)
1366 assets = bazel.MakeLabelList(android.RootToModuleRelativePaths(ctx, androidResourceGlob(ctx, dir)))
1367
1368 }
Romain Jobredeaux9c06ef32023-08-21 18:05:29 -04001369 var resourceZips bazel.LabelList
1370 if len(a.aaptProperties.Resource_zips) > 0 {
1371 if ctx.ModuleName() == "framework-res" {
1372 resourceZips = android.BazelLabelForModuleSrc(ctx, a.aaptProperties.Resource_zips)
1373 } else {
1374 //TODO: b/301593550 - Implement support for this
1375 ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_PROPERTY_UNSUPPORTED, "resource_zips")
1376 return &bazelAapt{}, false
1377 }
1378 }
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001379 return &bazelAapt{
1380 android.BazelLabelForModuleSrcSingle(ctx, manifest),
1381 bazel.MakeLabelListAttribute(resourceFiles),
Romain Jobredeaux9c06ef32023-08-21 18:05:29 -04001382 bazel.MakeLabelListAttribute(resourceZips),
Romain Jobredeaux7a71e072023-08-16 17:39:12 -04001383 assetsDir,
1384 bazel.MakeLabelListAttribute(assets),
1385 }, true
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001386}
1387
Chris Parsons637458d2023-09-19 20:09:00 +00001388func (a *AARImport) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) {
Romain Jobredeauxafc5d272023-09-21 11:07:30 -04001389 if len(a.properties.Aars) == 0 {
1390 ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_PROPERTY_UNSUPPORTED, "aars can't be empty")
1391 return
1392 }
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001393 aars := android.BazelLabelForModuleSrcExcludes(ctx, a.properties.Aars, []string{})
1394 exportableStaticLibs := []string{}
1395 // TODO(b/240716882): investigate and handle static_libs deps that are not imports. They are not supported for export by Bazel.
1396 for _, depName := range a.properties.Static_libs {
1397 if dep, ok := ctx.ModuleFromName(depName); ok {
1398 switch dep.(type) {
1399 case *AARImport, *Import:
1400 exportableStaticLibs = append(exportableStaticLibs, depName)
1401 }
1402 }
1403 }
1404 name := android.RemoveOptionalPrebuiltPrefix(a.Name())
1405 deps := android.BazelLabelForModuleDeps(ctx, android.LastUniqueStrings(android.CopyOf(append(a.properties.Static_libs, a.properties.Libs...))))
1406 exports := android.BazelLabelForModuleDeps(ctx, android.LastUniqueStrings(exportableStaticLibs))
1407
1408 ctx.CreateBazelTargetModule(
1409 bazel.BazelTargetModuleProperties{
1410 Rule_class: "aar_import",
Alixa381cd12023-05-10 14:49:38 +00001411 Bzl_load_location: "//build/bazel/rules/android:aar_import.bzl",
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001412 },
1413 android.CommonAttributes{Name: name},
1414 &bazelAndroidLibraryImport{
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001415 Aar: aars.Includes[0],
1416 Deps: bazel.MakeLabelListAttribute(deps),
1417 Exports: bazel.MakeLabelListAttribute(exports),
1418 Sdk_version: bazel.StringAttribute{Value: a.properties.Sdk_version},
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001419 },
1420 )
1421
Alix14101de2023-01-06 03:42:07 +00001422 neverlink := true
1423 ctx.CreateBazelTargetModule(
Alix32540022023-03-16 21:06:13 +00001424 AndroidLibraryBazelTargetModuleProperties(),
Alix14101de2023-01-06 03:42:07 +00001425 android.CommonAttributes{Name: name + "-neverlink"},
1426 &bazelAndroidLibrary{
1427 javaLibraryAttributes: &javaLibraryAttributes{
1428 Neverlink: bazel.BoolAttribute{Value: &neverlink},
1429 Exports: bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + name}),
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001430 javaCommonAttributes: &javaCommonAttributes{
1431 Sdk_version: bazel.StringAttribute{Value: a.properties.Sdk_version},
1432 },
Alix14101de2023-01-06 03:42:07 +00001433 },
1434 },
1435 )
1436
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001437}
Alix32540022023-03-16 21:06:13 +00001438func AndroidLibraryBazelTargetModuleProperties() bazel.BazelTargetModuleProperties {
1439 return bazel.BazelTargetModuleProperties{
1440 Rule_class: "android_library",
Alixa381cd12023-05-10 14:49:38 +00001441 Bzl_load_location: "//build/bazel/rules/android:android_library.bzl",
Alix32540022023-03-16 21:06:13 +00001442 }
1443}
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001444
Chris Parsons637458d2023-09-19 20:09:00 +00001445func (a *AndroidLibrary) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) {
Liz Kammer7f375862023-08-04 16:37:42 -04001446 commonAttrs, bp2buildInfo, supported := a.convertLibraryAttrsBp2Build(ctx)
1447 if !supported {
1448 return
1449 }
1450
Alix8062f4d2022-11-14 21:38:07 +00001451 depLabels := bp2buildInfo.DepLabels
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001452
1453 deps := depLabels.Deps
1454 if !commonAttrs.Srcs.IsEmpty() {
1455 deps.Append(depLabels.StaticDeps) // we should only append these if there are sources to use them
1456 } else if !depLabels.Deps.IsEmpty() {
Zi Wang10664792023-09-27 12:29:34 -07001457 // android_library does not accept deps when there are no srcs because
1458 // there is no compilation happening, but it accepts exports.
1459 // The non-empty deps here are unnecessary as deps on the android_library
1460 // since they aren't being propagated to any dependencies.
1461 // So we can drop deps here.
1462 deps = bazel.LabelListAttribute{}
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001463 }
Alix82fb94e2022-10-26 20:40:18 +00001464 name := a.Name()
Alix32540022023-03-16 21:06:13 +00001465 props := AndroidLibraryBazelTargetModuleProperties()
Alix82fb94e2022-10-26 20:40:18 +00001466
Romain Jobredeaux7a71e072023-08-16 17:39:12 -04001467 aaptAttrs, supported := a.convertAaptAttrsWithBp2Build(ctx)
1468 if !supported {
1469 return
1470 }
Alixee51bd62023-08-29 16:01:46 +00001471 if hasJavaResources := aaptAttrs.ConvertJavaResources(ctx, commonAttrs); hasJavaResources {
1472 return
1473 }
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001474 ctx.CreateBazelTargetModule(
Alix82fb94e2022-10-26 20:40:18 +00001475 props,
1476 android.CommonAttributes{Name: name},
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001477 &bazelAndroidLibrary{
1478 &javaLibraryAttributes{
1479 javaCommonAttributes: commonAttrs,
1480 Deps: deps,
1481 Exports: depLabels.StaticDeps,
1482 },
Romain Jobredeaux7a71e072023-08-16 17:39:12 -04001483 aaptAttrs,
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001484 },
1485 )
Alix82fb94e2022-10-26 20:40:18 +00001486
1487 neverlink := true
1488 ctx.CreateBazelTargetModule(
1489 props,
1490 android.CommonAttributes{Name: name + "-neverlink"},
1491 &bazelAndroidLibrary{
1492 javaLibraryAttributes: &javaLibraryAttributes{
1493 Neverlink: bazel.BoolAttribute{Value: &neverlink},
1494 Exports: bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + name}),
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001495 javaCommonAttributes: &javaCommonAttributes{
1496 Sdk_version: bazel.StringAttribute{Value: a.deviceProperties.Sdk_version},
1497 Java_version: bazel.StringAttribute{Value: a.properties.Java_version},
1498 },
Alix82fb94e2022-10-26 20:40:18 +00001499 },
1500 },
1501 )
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001502}