blob: f8375b23efb7e6a622706232dcfa8f2b7450eddf [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"
Ulya Trafimovich31e444e2020-08-14 17:32:16 +010025 "android/soong/dexpreopt"
Jihoon Kangfe914ed2024-02-12 22:49:21 +000026
Colin Crossfabb6082018-02-20 17:22:23 -080027 "github.com/google/blueprint"
Colin Crossa97c5d32018-03-28 14:58:31 -070028 "github.com/google/blueprint/proptools"
Colin Crossfabb6082018-02-20 17:22:23 -080029)
30
Colin Crossa97c5d32018-03-28 14:58:31 -070031type AndroidLibraryDependency interface {
Colin Crossa97c5d32018-03-28 14:58:31 -070032 ExportPackage() android.Path
Colin Crossab8d1382023-07-14 17:23:41 +000033 ResourcesNodeDepSet() *android.DepSet[*resourcesNode]
34 RRODirsDepSet() *android.DepSet[rroDir]
35 ManifestsDepSet() *android.DepSet[android.Path]
Jaewoong Jungc779cd42020-10-06 18:56:10 -070036 SetRROEnforcedForDependent(enforce bool)
37 IsRROEnforced(ctx android.BaseModuleContext) bool
Colin Crossa97c5d32018-03-28 14:58:31 -070038}
39
40func init() {
Paul Duffinf9b1da02019-12-18 19:51:55 +000041 RegisterAARBuildComponents(android.InitRegistrationContext)
42}
43
44func RegisterAARBuildComponents(ctx android.RegistrationContext) {
45 ctx.RegisterModuleType("android_library_import", AARImportFactory)
46 ctx.RegisterModuleType("android_library", AndroidLibraryFactory)
Paul Duffin04ba70d2021-03-22 13:56:43 +000047 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Cross7e6a9012024-01-17 14:58:38 -080048 ctx.TopDown("propagate_rro_enforcement", propagateRROEnforcementMutator)
Paul Duffin04ba70d2021-03-22 13:56:43 +000049 })
Colin Crossa97c5d32018-03-28 14:58:31 -070050}
51
52//
53// AAR (android library)
54//
55
56type androidLibraryProperties struct {
57 BuildAAR bool `blueprint:"mutated"`
58}
59
60type aaptProperties struct {
61 // flags passed to aapt when creating the apk
62 Aaptflags []string
63
Dan Willemsen72be5902018-10-24 20:24:57 -070064 // include all resource configurations, not just the product-configured
65 // ones.
66 Aapt_include_all_resources *bool
67
Jiakai Zhangba82e282023-10-13 18:08:59 +010068 // list of files to use as assets.
69 Assets []string `android:"path"`
70
Colin Crossa97c5d32018-03-28 14:58:31 -070071 // list of directories relative to the Blueprints file containing assets.
Colin Cross0ddae7f2019-02-07 15:30:01 -080072 // Defaults to ["assets"] if a directory called assets exists. Set to []
73 // to disable the default.
Colin Crossa97c5d32018-03-28 14:58:31 -070074 Asset_dirs []string
75
76 // list of directories relative to the Blueprints file containing
Colin Cross0ddae7f2019-02-07 15:30:01 -080077 // Android resources. Defaults to ["res"] if a directory called res exists.
78 // Set to [] to disable the default.
Colin Crossa97c5d32018-03-28 14:58:31 -070079 Resource_dirs []string
80
Colin Crossa592e3e2019-02-19 16:59:53 -080081 // list of zip files containing Android resources.
Colin Cross27b922f2019-03-04 22:35:41 -080082 Resource_zips []string `android:"path"`
Colin Crossa592e3e2019-02-19 16:59:53 -080083
Colin Crossa97c5d32018-03-28 14:58:31 -070084 // path to AndroidManifest.xml. If unset, defaults to "AndroidManifest.xml".
Colin Cross27b922f2019-03-04 22:35:41 -080085 Manifest *string `android:"path"`
changho.shinb5432b72019-08-08 18:37:17 +090086
87 // paths to additional manifest files to merge with main manifest.
88 Additional_manifests []string `android:"path"`
Sasha Smundak541056c2019-10-28 15:50:06 -070089
90 // do not include AndroidManifest from dependent libraries
91 Dont_merge_manifests *bool
Jaewoong Jungc779cd42020-10-06 18:56:10 -070092
Colin Cross4eae06d2023-06-20 22:40:02 -070093 // If use_resource_processor is set, use Bazel's resource processor instead of aapt2 to generate R.class files.
94 // The resource processor produces more optimal R.class files that only list resources in the package of the
95 // library that provided them, as opposed to aapt2 which produces R.java files for every package containing
96 // every resource. Using the resource processor can provide significant build time speedups, but requires
97 // fixing the module to use the correct package to reference each resource, and to avoid having any other
98 // libraries in the tree that use the same package name. Defaults to false, but will default to true in the
99 // future.
100 Use_resource_processor *bool
101
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700102 // true if RRO is enforced for any of the dependent modules
103 RROEnforcedForDependent bool `blueprint:"mutated"`
Inseob Kim34dc4cd2023-11-07 13:37:14 +0900104
105 // Filter only specified product and ignore other products
106 Filter_product *string `blueprint:"mutated"`
Jihoon Kang9049c272024-03-19 21:57:36 +0000107
108 // Names of aconfig_declarations modules that specify aconfig flags that the module depends on.
109 Flags_packages []string
Colin Crossa97c5d32018-03-28 14:58:31 -0700110}
111
112type aapt struct {
Colin Cross312634e2023-11-21 15:13:56 -0800113 aaptSrcJar android.Path
114 transitiveAaptRJars android.Paths
115 transitiveAaptResourcePackagesFile android.Path
116 exportPackage android.Path
117 manifestPath android.Path
118 proguardOptionsFile android.Path
119 rTxt android.Path
120 rJar android.Path
121 extraAaptPackagesFile android.Path
122 mergedManifestFile android.Path
123 noticeFile android.OptionalPath
124 assetPackage android.OptionalPath
125 isLibrary bool
126 defaultManifestVersion string
127 useEmbeddedNativeLibs bool
128 useEmbeddedDex bool
129 usesNonSdkApis bool
130 hasNoCode bool
131 LoggingParent string
132 resourceFiles android.Paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700133
Colin Crosse560c4a2019-03-19 16:03:11 -0700134 splitNames []string
135 splits []split
136
Colin Crossa97c5d32018-03-28 14:58:31 -0700137 aaptProperties aaptProperties
Colin Crossab8d1382023-07-14 17:23:41 +0000138
139 resourcesNodesDepSet *android.DepSet[*resourcesNode]
140 rroDirsDepSet *android.DepSet[rroDir]
141 manifestsDepSet *android.DepSet[android.Path]
Alix96ea88452023-08-31 15:48:23 +0000142
143 manifestValues struct {
144 applicationId string
145 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700146}
147
Colin Crosse560c4a2019-03-19 16:03:11 -0700148type split struct {
149 name string
150 suffix string
151 path android.Path
152}
153
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700154// Propagate RRO enforcement flag to static lib dependencies transitively.
155func propagateRROEnforcementMutator(ctx android.TopDownMutatorContext) {
156 m := ctx.Module()
157 if d, ok := m.(AndroidLibraryDependency); ok && d.IsRROEnforced(ctx) {
158 ctx.VisitDirectDepsWithTag(staticLibTag, func(d android.Module) {
159 if a, ok := d.(AndroidLibraryDependency); ok {
160 a.SetRROEnforcedForDependent(true)
161 }
162 })
163 }
164}
165
Colin Cross8f1b0332024-01-25 13:39:06 -0800166func (a *aapt) useResourceProcessorBusyBox(ctx android.BaseModuleContext) bool {
Colin Crosseee4ab12024-03-27 11:54:10 -0700167 return BoolDefault(a.aaptProperties.Use_resource_processor, ctx.Config().UseResourceProcessorByDefault()) &&
168 // TODO(b/331641946): remove this when ResourceProcessorBusyBox supports generating shared libraries.
Spandan Dasa62d9562024-08-06 00:13:31 +0000169 !slices.Contains(a.aaptProperties.Aaptflags, "--shared-lib") &&
170 // Use the legacy resource processor in kythe builds.
171 // The legacy resource processor creates an R.srcjar, which kythe can use for generating crossrefs.
172 // TODO(b/354854007): Re-enable BusyBox in kythe builds
173 !ctx.Config().EmitXrefRules()
Colin Cross4eae06d2023-06-20 22:40:02 -0700174}
175
Inseob Kim34dc4cd2023-11-07 13:37:14 +0900176func (a *aapt) filterProduct() string {
177 return String(a.aaptProperties.Filter_product)
178}
179
Colin Crossa97c5d32018-03-28 14:58:31 -0700180func (a *aapt) ExportPackage() android.Path {
181 return a.exportPackage
182}
Colin Crossab8d1382023-07-14 17:23:41 +0000183func (a *aapt) ResourcesNodeDepSet() *android.DepSet[*resourcesNode] {
184 return a.resourcesNodesDepSet
Colin Crossc1c37552019-01-31 11:42:41 -0800185}
186
Colin Crossab8d1382023-07-14 17:23:41 +0000187func (a *aapt) RRODirsDepSet() *android.DepSet[rroDir] {
188 return a.rroDirsDepSet
Colin Crossc1c37552019-01-31 11:42:41 -0800189}
190
Colin Crossab8d1382023-07-14 17:23:41 +0000191func (a *aapt) ManifestsDepSet() *android.DepSet[android.Path] {
192 return a.manifestsDepSet
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800193}
194
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700195func (a *aapt) SetRROEnforcedForDependent(enforce bool) {
196 a.aaptProperties.RROEnforcedForDependent = enforce
197}
198
199func (a *aapt) IsRROEnforced(ctx android.BaseModuleContext) bool {
200 // True if RRO is enforced for this module or...
201 return ctx.Config().EnforceRROForModule(ctx.ModuleName()) ||
Jeongik Chacee5ba92021-02-19 12:11:51 +0900202 // if RRO is enforced for any of its dependents.
203 a.aaptProperties.RROEnforcedForDependent
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700204}
205
Jiyong Parkf1691d22021-03-29 20:11:58 +0900206func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext android.SdkContext,
Colin Crossa0ba2f52019-06-22 12:59:27 -0700207 manifestPath android.Path) (compileFlags, linkFlags []string, linkDeps android.Paths,
208 resDirs, overlayDirs []globbedResourceDir, rroDirs []rroDir, resZips android.Paths) {
Colin Crossa97c5d32018-03-28 14:58:31 -0700209
Jaewoong Jung3aff5782020-02-11 07:54:35 -0800210 hasVersionCode := android.PrefixInList(a.aaptProperties.Aaptflags, "--version-code")
211 hasVersionName := android.PrefixInList(a.aaptProperties.Aaptflags, "--version-name")
Colin Crossa97c5d32018-03-28 14:58:31 -0700212
Colin Crossa97c5d32018-03-28 14:58:31 -0700213 // Flags specified in Android.bp
214 linkFlags = append(linkFlags, a.aaptProperties.Aaptflags...)
215
Eric Miao40eab202023-03-30 16:57:17 +0000216 linkFlags = append(linkFlags, "--enable-compact-entries")
Colin Crossa97c5d32018-03-28 14:58:31 -0700217
218 // Find implicit or explicit asset and resource dirs
Jiakai Zhangba82e282023-10-13 18:08:59 +0100219 assets := android.PathsRelativeToModuleSourceDir(android.SourceInput{
220 Context: ctx,
221 Paths: a.aaptProperties.Assets,
222 IncludeDirs: false,
223 })
Colin Crossa97c5d32018-03-28 14:58:31 -0700224 assetDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Asset_dirs, "assets")
225 resourceDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res")
Colin Cross8a497952019-03-05 22:25:09 -0800226 resourceZips := android.PathsForModuleSrc(ctx, a.aaptProperties.Resource_zips)
Colin Crossa97c5d32018-03-28 14:58:31 -0700227
Colin Crossa97c5d32018-03-28 14:58:31 -0700228 // Glob directories into lists of paths
229 for _, dir := range resourceDirs {
230 resDirs = append(resDirs, globbedResourceDir{
231 dir: dir,
232 files: androidResourceGlob(ctx, dir),
233 })
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700234 resOverlayDirs, resRRODirs := overlayResourceGlob(ctx, a, dir)
Colin Crossa97c5d32018-03-28 14:58:31 -0700235 overlayDirs = append(overlayDirs, resOverlayDirs...)
236 rroDirs = append(rroDirs, resRRODirs...)
237 }
238
Colin Crossc20dc852020-11-10 12:27:45 -0800239 var assetDeps android.Paths
240 for i, dir := range assetDirs {
241 // Add a dependency on every file in the asset directory. This ensures the aapt2
242 // rule will be rerun if one of the files in the asset directory is modified.
243 assetDeps = append(assetDeps, androidResourceGlob(ctx, dir)...)
244
245 // Add a dependency on a file that contains a list of all the files in the asset directory.
246 // This ensures the aapt2 rule will be run if a file is removed from the asset directory,
247 // or a file is added whose timestamp is older than the output of aapt2.
248 assetFileListFile := android.PathForModuleOut(ctx, "asset_dir_globs", strconv.Itoa(i)+".glob")
249 androidResourceGlobList(ctx, dir, assetFileListFile)
250 assetDeps = append(assetDeps, assetFileListFile)
Colin Crossa97c5d32018-03-28 14:58:31 -0700251 }
252
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700253 assetDirStrings := assetDirs.Strings()
254 if a.noticeFile.Valid() {
255 assetDirStrings = append(assetDirStrings, filepath.Dir(a.noticeFile.Path().String()))
Colin Crossc20dc852020-11-10 12:27:45 -0800256 assetDeps = append(assetDeps, a.noticeFile.Path())
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700257 }
Jiakai Zhangba82e282023-10-13 18:08:59 +0100258 if len(assets) > 0 {
259 // aapt2 doesn't support adding individual asset files. Create a temp directory to hold asset
260 // files and pass it to aapt2.
261 tmpAssetDir := android.PathForModuleOut(ctx, "tmp_asset_dir")
262
263 rule := android.NewRuleBuilder(pctx, ctx)
264 rule.Command().
265 Text("rm -rf").Text(tmpAssetDir.String()).
266 Text("&&").
267 Text("mkdir -p").Text(tmpAssetDir.String())
268
269 for _, asset := range assets {
270 output := tmpAssetDir.Join(ctx, asset.Rel())
271 assetDeps = append(assetDeps, output)
272 rule.Command().Text("mkdir -p").Text(filepath.Dir(output.String()))
273 rule.Command().Text("cp").Input(asset).Output(output)
274 }
275
276 rule.Build("tmp_asset_dir", "tmp_asset_dir")
277
278 assetDirStrings = append(assetDirStrings, tmpAssetDir.String())
279 }
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700280
Colin Crossa97c5d32018-03-28 14:58:31 -0700281 linkFlags = append(linkFlags, "--manifest "+manifestPath.String())
282 linkDeps = append(linkDeps, manifestPath)
283
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700284 linkFlags = append(linkFlags, android.JoinWithPrefix(assetDirStrings, "-A "))
Colin Crossc20dc852020-11-10 12:27:45 -0800285 linkDeps = append(linkDeps, assetDeps...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700286
Spandan Das50885c02023-02-23 21:31:33 +0000287 // Returns the effective version for {min|target}_sdk_version
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000288 effectiveVersionString := func(sdkVersion android.SdkSpec, minSdkVersion android.ApiLevel) string {
Spandan Das50885c02023-02-23 21:31:33 +0000289 // If {min|target}_sdk_version is current, use sdk_version to determine the effective level
290 // This is necessary for vendor modules.
291 // The effective version does not _only_ depend on {min|target}_sdk_version(level),
292 // but also on the sdk_version (kind+level)
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000293 if minSdkVersion.IsCurrent() {
Spandan Das50885c02023-02-23 21:31:33 +0000294 ret, err := sdkVersion.EffectiveVersionString(ctx)
295 if err != nil {
296 ctx.ModuleErrorf("invalid sdk_version: %s", err)
297 }
298 return ret
299 }
300 ret, err := minSdkVersion.EffectiveVersionString(ctx)
301 if err != nil {
302 ctx.ModuleErrorf("invalid min_sdk_version: %s", err)
303 }
304 return ret
Jiyong Park6a927c42020-01-21 02:03:43 +0900305 }
Spandan Das50885c02023-02-23 21:31:33 +0000306 // SDK version flags
307 sdkVersion := sdkContext.SdkVersion(ctx)
308 minSdkVersion := effectiveVersionString(sdkVersion, sdkContext.MinSdkVersion(ctx))
Colin Crossa97c5d32018-03-28 14:58:31 -0700309
Colin Cross83bb3162018-06-25 15:48:06 -0700310 linkFlags = append(linkFlags, "--min-sdk-version "+minSdkVersion)
Spandan Das6450b552023-02-23 19:27:07 +0000311 // Use minSdkVersion for target-sdk-version, even if `target_sdk_version` is set
312 // This behavior has been copied from Make.
Colin Cross83bb3162018-06-25 15:48:06 -0700313 linkFlags = append(linkFlags, "--target-sdk-version "+minSdkVersion)
Colin Crossa97c5d32018-03-28 14:58:31 -0700314
Colin Crossa97c5d32018-03-28 14:58:31 -0700315 // Version code
316 if !hasVersionCode {
Dan Albert4f378d72020-07-23 17:32:15 -0700317 linkFlags = append(linkFlags, "--version-code", ctx.Config().PlatformSdkVersion().String())
Colin Crossa97c5d32018-03-28 14:58:31 -0700318 }
319
320 if !hasVersionName {
Colin Cross402d5e02018-04-25 14:54:06 -0700321 var versionName string
322 if ctx.ModuleName() == "framework-res" {
323 // Some builds set AppsDefaultVersionName() to include the build number ("O-123456"). aapt2 copies the
324 // version name of framework-res into app manifests as compileSdkVersionCodename, which confuses things
Colin Crossbfd347d2018-05-09 11:11:35 -0700325 // if it contains the build number. Use the PlatformVersionName instead.
326 versionName = ctx.Config().PlatformVersionName()
Colin Cross402d5e02018-04-25 14:54:06 -0700327 } else {
328 versionName = ctx.Config().AppsDefaultVersionName()
329 }
Colin Cross0b9f31f2019-02-28 11:00:01 -0800330 versionName = proptools.NinjaEscape(versionName)
Colin Crossa97c5d32018-03-28 14:58:31 -0700331 linkFlags = append(linkFlags, "--version-name ", versionName)
332 }
333
Colin Crossa0ba2f52019-06-22 12:59:27 -0700334 linkFlags, compileFlags = android.FilterList(linkFlags, []string{"--legacy"})
335
336 // Always set --pseudo-localize, it will be stripped out later for release
337 // builds that don't want it.
338 compileFlags = append(compileFlags, "--pseudo-localize")
339
340 return compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resourceZips
Colin Crossa97c5d32018-03-28 14:58:31 -0700341}
342
Paul Duffin250e6192019-06-07 10:44:37 +0100343func (a *aapt) deps(ctx android.BottomUpMutatorContext, sdkDep sdkDep) {
Colin Cross42308aa2018-11-14 21:44:17 -0800344 if sdkDep.frameworkResModule != "" {
345 ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
Colin Crossa97c5d32018-03-28 14:58:31 -0700346 }
347}
348
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800349var extractAssetsRule = pctx.AndroidStaticRule("extractAssets",
350 blueprint.RuleParams{
351 Command: `${config.Zip2ZipCmd} -i ${in} -o ${out} "assets/**/*"`,
352 CommandDeps: []string{"${config.Zip2ZipCmd}"},
353 })
354
Alixf7a10272023-09-27 16:47:56 +0000355type aaptBuildActionOptions struct {
356 sdkContext android.SdkContext
357 classLoaderContexts dexpreopt.ClassLoaderContextMap
358 excludedLibs []string
359 enforceDefaultTargetSdkVersion bool
Rico Winda2fa2632024-03-13 13:09:17 +0100360 forceNonFinalResourceIDs bool
Alixf7a10272023-09-27 16:47:56 +0000361 extraLinkFlags []string
Jihoon Kang84b25892023-12-01 22:01:06 +0000362 aconfigTextFiles android.Paths
Jiakai Zhang36937082024-04-15 11:15:50 +0000363 usesLibrary *usesLibrary
Alixf7a10272023-09-27 16:47:56 +0000364}
365
366func (a *aapt) buildActions(ctx android.ModuleContext, opts aaptBuildActionOptions) {
Colin Cross5446e882019-05-22 10:46:27 -0700367
Colin Cross8676c8c2023-10-12 15:58:57 -0700368 staticResourcesNodesDepSet, sharedResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedExportPackages, libFlags :=
Jiakai Zhang36937082024-04-15 11:15:50 +0000369 aaptLibs(ctx, opts.sdkContext, opts.classLoaderContexts, opts.usesLibrary)
Ulya Trafimovich31e444e2020-08-14 17:32:16 +0100370
Paul Duffin06530572022-02-03 17:54:15 +0000371 // Exclude any libraries from the supplied list.
Alixf7a10272023-09-27 16:47:56 +0000372 opts.classLoaderContexts = opts.classLoaderContexts.ExcludeLibs(opts.excludedLibs)
Paul Duffin06530572022-02-03 17:54:15 +0000373
Colin Cross31656952018-05-24 16:11:20 -0700374 // App manifest file
375 manifestFile := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")
376 manifestSrcPath := android.PathForModuleSrc(ctx, manifestFile)
377
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000378 manifestPath := ManifestFixer(ctx, manifestSrcPath, ManifestFixerParams{
Alixf7a10272023-09-27 16:47:56 +0000379 SdkContext: opts.sdkContext,
380 ClassLoaderContexts: opts.classLoaderContexts,
Harshit Mahajan5b8b7302022-06-10 11:24:05 +0000381 IsLibrary: a.isLibrary,
382 DefaultManifestVersion: a.defaultManifestVersion,
383 UseEmbeddedNativeLibs: a.useEmbeddedNativeLibs,
384 UsesNonSdkApis: a.usesNonSdkApis,
385 UseEmbeddedDex: a.useEmbeddedDex,
386 HasNoCode: a.hasNoCode,
387 LoggingParent: a.LoggingParent,
Alixf7a10272023-09-27 16:47:56 +0000388 EnforceDefaultTargetSdkVersion: opts.enforceDefaultTargetSdkVersion,
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000389 })
Colin Cross90c25c62019-04-19 16:22:57 -0700390
Colin Crossab8d1382023-07-14 17:23:41 +0000391 staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
Colin Cross8676c8c2023-10-12 15:58:57 -0700392 sharedDeps := transitiveAarDeps(sharedResourcesNodesDepSet.ToList())
Colin Crossab8d1382023-07-14 17:23:41 +0000393
Luca Stefanifd898822019-09-10 22:13:31 +0200394 // Add additional manifest files to transitive manifests.
395 additionalManifests := android.PathsForModuleSrc(ctx, a.aaptProperties.Additional_manifests)
Colin Crossab8d1382023-07-14 17:23:41 +0000396 transitiveManifestPaths := append(android.Paths{manifestPath}, additionalManifests...)
Colin Crossab8d1382023-07-14 17:23:41 +0000397 transitiveManifestPaths = append(transitiveManifestPaths, staticManifestsDepSet.ToList()...)
Colin Cross90c25c62019-04-19 16:22:57 -0700398
Colin Crossab8d1382023-07-14 17:23:41 +0000399 if len(transitiveManifestPaths) > 1 && !Bool(a.aaptProperties.Dont_merge_manifests) {
Alixf7a10272023-09-27 16:47:56 +0000400 manifestMergerParams := ManifestMergerParams{
401 staticLibManifests: transitiveManifestPaths[1:],
Alix96ea88452023-08-31 15:48:23 +0000402 isLibrary: a.isLibrary,
403 packageName: a.manifestValues.applicationId,
404 }
Alixf7a10272023-09-27 16:47:56 +0000405 a.mergedManifestFile = manifestMerger(ctx, transitiveManifestPaths[0], manifestMergerParams)
Colin Cross90c25c62019-04-19 16:22:57 -0700406 if !a.isLibrary {
407 // Only use the merged manifest for applications. For libraries, the transitive closure of manifests
408 // will be propagated to the final application and merged there. The merged manifest for libraries is
409 // only passed to Make, which can't handle transitive dependencies.
410 manifestPath = a.mergedManifestFile
411 }
412 } else {
413 a.mergedManifestFile = manifestPath
414 }
Colin Cross31656952018-05-24 16:11:20 -0700415
Alixf7a10272023-09-27 16:47:56 +0000416 compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, opts.sdkContext, manifestPath)
Colin Cross31656952018-05-24 16:11:20 -0700417
418 linkFlags = append(linkFlags, libFlags...)
Colin Cross8676c8c2023-10-12 15:58:57 -0700419 linkDeps = append(linkDeps, sharedExportPackages...)
Colin Crossab8d1382023-07-14 17:23:41 +0000420 linkDeps = append(linkDeps, staticDeps.resPackages()...)
Alixf7a10272023-09-27 16:47:56 +0000421 linkFlags = append(linkFlags, opts.extraLinkFlags...)
Colin Cross1b6a3cf2018-07-24 14:51:30 -0700422 if a.isLibrary {
423 linkFlags = append(linkFlags, "--static-lib")
424 }
Rico Wind7152e822024-04-19 08:14:15 +0200425 if opts.forceNonFinalResourceIDs {
426 linkFlags = append(linkFlags, "--non-final-ids")
427 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700428
Colin Cross7c4dc5d2024-02-13 14:29:45 -0800429 linkFlags = append(linkFlags, "--no-static-lib-packages")
Colin Cross8f1b0332024-01-25 13:39:06 -0800430 if a.isLibrary && a.useResourceProcessorBusyBox(ctx) {
Colin Cross7c4dc5d2024-02-13 14:29:45 -0800431 // When building an android_library using ResourceProcessorBusyBox pass --merge-only to skip resource
432 // references validation until the final app link step when all static libraries are present.
Colin Cross4eae06d2023-06-20 22:40:02 -0700433 linkFlags = append(linkFlags, "--merge-only")
Colin Cross4eae06d2023-06-20 22:40:02 -0700434 }
435
Colin Crossa97c5d32018-03-28 14:58:31 -0700436 packageRes := android.PathForModuleOut(ctx, "package-res.apk")
Colin Crossa97c5d32018-03-28 14:58:31 -0700437 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
438 rTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -0700439 // This file isn't used by Soong, but is generated for exporting
440 extraPackages := android.PathForModuleOut(ctx, "extra_packages")
Colin Cross4eae06d2023-06-20 22:40:02 -0700441 var transitiveRJars android.Paths
Colin Crossf3b7bad2023-08-02 15:49:00 -0700442 var srcJar android.WritablePath
Colin Crossa97c5d32018-03-28 14:58:31 -0700443
Colin Cross4aaa84a2018-08-21 15:14:37 -0700444 var compiledResDirs []android.Paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700445 for _, dir := range resDirs {
Colin Cross014489c2020-06-02 20:09:13 -0700446 a.resourceFiles = append(a.resourceFiles, dir.files...)
Jihoon Kang98ea8362024-07-16 18:20:03 +0000447 compiledResDirs = append(compiledResDirs, aapt2Compile(ctx, dir.dir, dir.files,
448 compileFlags, a.filterProduct(), opts.aconfigTextFiles).Paths())
Colin Crossa97c5d32018-03-28 14:58:31 -0700449 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700450
Colin Crossa592e3e2019-02-19 16:59:53 -0800451 for i, zip := range resZips {
452 flata := android.PathForModuleOut(ctx, fmt.Sprintf("reszip.%d.flata", i))
Colin Crossa0ba2f52019-06-22 12:59:27 -0700453 aapt2CompileZip(ctx, flata, zip, "", compileFlags)
Colin Crossa592e3e2019-02-19 16:59:53 -0800454 compiledResDirs = append(compiledResDirs, android.Paths{flata})
455 }
456
Colin Cross4aaa84a2018-08-21 15:14:37 -0700457 var compiledRes, compiledOverlay android.Paths
458
Colin Crossab8d1382023-07-14 17:23:41 +0000459 // AAPT2 overlays are in lowest to highest priority order, reverse the topological order
460 // of transitiveStaticLibs.
461 transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages())
462
Colin Cross8f1b0332024-01-25 13:39:06 -0800463 if a.isLibrary && a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700464 // When building an android_library with ResourceProcessorBusyBox enabled treat static library dependencies
465 // as imports. The resources from dependencies will not be merged into this module's package-res.apk, and
466 // instead modules depending on this module will reference package-res.apk from all transitive static
467 // dependencies.
Colin Cross1d3f5902024-03-05 11:51:54 -0800468 for _, sharedDep := range sharedDeps {
469 if sharedDep.usedResourceProcessor {
470 transitiveRJars = append(transitiveRJars, sharedDep.rJar)
471 }
472 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700473 for _, staticDep := range staticDeps {
474 linkDeps = append(linkDeps, staticDep.resPackage)
475 linkFlags = append(linkFlags, "-I "+staticDep.resPackage.String())
476 if staticDep.usedResourceProcessor {
477 transitiveRJars = append(transitiveRJars, staticDep.rJar)
478 }
479 }
480 } else {
481 // When building an app or building a library without ResourceProcessorBusyBox enabled all static
482 // dependencies are compiled into this module's package-res.apk as overlays.
483 compiledOverlay = append(compiledOverlay, transitiveStaticLibs...)
484 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700485
Colin Crossbec85302019-02-13 13:15:46 -0800486 if len(transitiveStaticLibs) > 0 {
Colin Cross4aaa84a2018-08-21 15:14:37 -0700487 // If we are using static android libraries, every source file becomes an overlay.
488 // This is to emulate old AAPT behavior which simulated library support.
489 for _, compiledResDir := range compiledResDirs {
490 compiledOverlay = append(compiledOverlay, compiledResDir...)
491 }
Colin Crossbec85302019-02-13 13:15:46 -0800492 } else if a.isLibrary {
493 // Otherwise, for a static library we treat all the resources equally with no overlay.
494 for _, compiledResDir := range compiledResDirs {
495 compiledRes = append(compiledRes, compiledResDir...)
496 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700497 } else if len(compiledResDirs) > 0 {
498 // Without static libraries, the first directory is our directory, which can then be
499 // overlaid by the rest.
500 compiledRes = append(compiledRes, compiledResDirs[0]...)
501 for _, compiledResDir := range compiledResDirs[1:] {
502 compiledOverlay = append(compiledOverlay, compiledResDir...)
503 }
504 }
505
Colin Crossa97c5d32018-03-28 14:58:31 -0700506 for _, dir := range overlayDirs {
Jihoon Kang98ea8362024-07-16 18:20:03 +0000507 compiledOverlay = append(compiledOverlay, aapt2Compile(ctx, dir.dir, dir.files,
508 compileFlags, a.filterProduct(), opts.aconfigTextFiles).Paths()...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700509 }
510
Colin Crosse560c4a2019-03-19 16:03:11 -0700511 var splitPackages android.WritablePaths
512 var splits []split
513
514 for _, s := range a.splitNames {
515 suffix := strings.Replace(s, ",", "_", -1)
516 path := android.PathForModuleOut(ctx, "package_"+suffix+".apk")
517 linkFlags = append(linkFlags, "--split", path.String()+":"+s)
518 splitPackages = append(splitPackages, path)
519 splits = append(splits, split{
520 name: s,
521 suffix: suffix,
522 path: path,
523 })
524 }
525
Colin Cross8f1b0332024-01-25 13:39:06 -0800526 if !a.useResourceProcessorBusyBox(ctx) {
Colin Crossf3b7bad2023-08-02 15:49:00 -0700527 // the subdir "android" is required to be filtered by package names
528 srcJar = android.PathForModuleGen(ctx, "android", "R.srcjar")
529 }
530
Colin Crossab8d1382023-07-14 17:23:41 +0000531 // No need to specify assets from dependencies to aapt2Link for libraries, all transitive assets will be
532 // provided to the final app aapt2Link step.
533 var transitiveAssets android.Paths
534 if !a.isLibrary {
535 transitiveAssets = android.ReverseSliceInPlace(staticDeps.assets())
536 }
Colin Crossf3b7bad2023-08-02 15:49:00 -0700537 aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt,
Jihoon Kang84b25892023-12-01 22:01:06 +0000538 linkFlags, linkDeps, compiledRes, compiledOverlay, transitiveAssets, splitPackages,
539 opts.aconfigTextFiles)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800540 // Extract assets from the resource package output so that they can be used later in aapt2link
541 // for modules that depend on this one.
Colin Crossab8d1382023-07-14 17:23:41 +0000542 if android.PrefixInList(linkFlags, "-A ") {
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800543 assets := android.PathForModuleOut(ctx, "assets.zip")
544 ctx.Build(pctx, android.BuildParams{
545 Rule: extractAssetsRule,
546 Input: packageRes,
547 Output: assets,
548 Description: "extract assets from built resource file",
549 })
550 a.assetPackage = android.OptionalPathForPath(assets)
551 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700552
Colin Cross8f1b0332024-01-25 13:39:06 -0800553 if a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700554 rJar := android.PathForModuleOut(ctx, "busybox/R.jar")
Rico Winda2fa2632024-03-13 13:09:17 +0100555 resourceProcessorBusyBoxGenerateBinaryR(ctx, rTxt, a.mergedManifestFile, rJar, staticDeps, a.isLibrary, a.aaptProperties.Aaptflags,
556 opts.forceNonFinalResourceIDs)
Colin Crossf3b7bad2023-08-02 15:49:00 -0700557 aapt2ExtractExtraPackages(ctx, extraPackages, rJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700558 transitiveRJars = append(transitiveRJars, rJar)
559 a.rJar = rJar
Colin Crossf3b7bad2023-08-02 15:49:00 -0700560 } else {
561 aapt2ExtractExtraPackages(ctx, extraPackages, srcJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700562 }
563
Colin Cross312634e2023-11-21 15:13:56 -0800564 transitiveAaptResourcePackages := staticDeps.resPackages().Strings()
565 transitiveAaptResourcePackages = slices.DeleteFunc(transitiveAaptResourcePackages, func(p string) bool {
566 return p == packageRes.String()
567 })
568 transitiveAaptResourcePackagesFile := android.PathForModuleOut(ctx, "transitive-res-packages")
569 android.WriteFileRule(ctx, transitiveAaptResourcePackagesFile, strings.Join(transitiveAaptResourcePackages, "\n"))
570
Colin Cross1d3f5902024-03-05 11:51:54 -0800571 // Reverse the list of R.jar files so that the current module comes first, and direct dependencies come before
572 // transitive dependencies.
573 transitiveRJars = android.ReversePaths(transitiveRJars)
574
Colin Crossa97c5d32018-03-28 14:58:31 -0700575 a.aaptSrcJar = srcJar
Colin Cross4eae06d2023-06-20 22:40:02 -0700576 a.transitiveAaptRJars = transitiveRJars
Colin Cross312634e2023-11-21 15:13:56 -0800577 a.transitiveAaptResourcePackagesFile = transitiveAaptResourcePackagesFile
Colin Crossa97c5d32018-03-28 14:58:31 -0700578 a.exportPackage = packageRes
579 a.manifestPath = manifestPath
580 a.proguardOptionsFile = proguardOptionsFile
Colin Cross66f78822018-05-02 12:58:28 -0700581 a.extraAaptPackagesFile = extraPackages
Colin Crossa97c5d32018-03-28 14:58:31 -0700582 a.rTxt = rTxt
Colin Crosse560c4a2019-03-19 16:03:11 -0700583 a.splits = splits
Colin Crossab8d1382023-07-14 17:23:41 +0000584 a.resourcesNodesDepSet = android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL).
585 Direct(&resourcesNode{
586 resPackage: a.exportPackage,
587 manifest: a.manifestPath,
588 additionalManifests: additionalManifests,
Colin Cross4eae06d2023-06-20 22:40:02 -0700589 rTxt: a.rTxt,
590 rJar: a.rJar,
Colin Crossab8d1382023-07-14 17:23:41 +0000591 assets: a.assetPackage,
Colin Cross4eae06d2023-06-20 22:40:02 -0700592
Colin Cross8f1b0332024-01-25 13:39:06 -0800593 usedResourceProcessor: a.useResourceProcessorBusyBox(ctx),
Colin Crossab8d1382023-07-14 17:23:41 +0000594 }).
595 Transitive(staticResourcesNodesDepSet).Build()
596 a.rroDirsDepSet = android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL).
597 Direct(rroDirs...).
598 Transitive(staticRRODirsDepSet).Build()
599 a.manifestsDepSet = android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).
600 Direct(a.manifestPath).
601 DirectSlice(additionalManifests).
602 Transitive(staticManifestsDepSet).Build()
603}
604
Colin Cross4eae06d2023-06-20 22:40:02 -0700605var resourceProcessorBusyBox = pctx.AndroidStaticRule("resourceProcessorBusyBox",
606 blueprint.RuleParams{
607 Command: "${config.JavaCmd} -cp ${config.ResourceProcessorBusyBox} " +
608 "com.google.devtools.build.android.ResourceProcessorBusyBox --tool=GENERATE_BINARY_R -- @${out}.args && " +
609 "if cmp -s ${out}.tmp ${out} ; then rm ${out}.tmp ; else mv ${out}.tmp ${out}; fi",
610 CommandDeps: []string{"${config.ResourceProcessorBusyBox}"},
611 Rspfile: "${out}.args",
612 RspfileContent: "--primaryRTxt ${rTxt} --primaryManifest ${manifest} --classJarOutput ${out}.tmp ${args}",
613 Restat: true,
614 }, "rTxt", "manifest", "args")
615
616// resourceProcessorBusyBoxGenerateBinaryR converts the R.txt file produced by aapt2 into R.class files
617// using Bazel's ResourceProcessorBusyBox tool, which is faster than compiling the R.java files and
618// supports producing classes for static dependencies that only include resources from that dependency.
619func resourceProcessorBusyBoxGenerateBinaryR(ctx android.ModuleContext, rTxt, manifest android.Path,
Rico Winda2fa2632024-03-13 13:09:17 +0100620 rJar android.WritablePath, transitiveDeps transitiveAarDeps, isLibrary bool, aaptFlags []string,
621 forceNonFinalIds bool) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700622
623 var args []string
624 var deps android.Paths
625
626 if !isLibrary {
627 // When compiling an app, pass all R.txt and AndroidManifest.xml from transitive static library dependencies
628 // to ResourceProcessorBusyBox so that it can regenerate R.class files with the final resource IDs for each
629 // package.
630 args, deps = transitiveDeps.resourceProcessorDeps()
Rico Winda2fa2632024-03-13 13:09:17 +0100631 if forceNonFinalIds {
632 args = append(args, "--finalFields=false")
633 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700634 } else {
635 // When compiling a library don't pass any dependencies as it only needs to generate an R.class file for this
636 // library. Pass --finalFields=false so that the R.class file contains non-final fields so they don't get
637 // inlined into the library before the final IDs are assigned during app compilation.
638 args = append(args, "--finalFields=false")
639 }
640
Colin Crossd3f7d1a2024-01-03 19:42:25 -0800641 for i, arg := range aaptFlags {
642 const AAPT_CUSTOM_PACKAGE = "--custom-package"
643 if strings.HasPrefix(arg, AAPT_CUSTOM_PACKAGE) {
644 pkg := strings.TrimSpace(strings.TrimPrefix(arg, AAPT_CUSTOM_PACKAGE))
645 if pkg == "" && i+1 < len(aaptFlags) {
646 pkg = aaptFlags[i+1]
647 }
648 args = append(args, "--packageForR "+pkg)
649 }
650 }
651
Colin Cross4eae06d2023-06-20 22:40:02 -0700652 deps = append(deps, rTxt, manifest)
653
654 ctx.Build(pctx, android.BuildParams{
655 Rule: resourceProcessorBusyBox,
656 Output: rJar,
657 Implicits: deps,
658 Description: "ResourceProcessorBusyBox",
659 Args: map[string]string{
660 "rTxt": rTxt.String(),
661 "manifest": manifest.String(),
662 "args": strings.Join(args, " "),
663 },
664 })
665}
666
Colin Crossab8d1382023-07-14 17:23:41 +0000667type resourcesNode struct {
668 resPackage android.Path
669 manifest android.Path
670 additionalManifests android.Paths
Colin Cross4eae06d2023-06-20 22:40:02 -0700671 rTxt android.Path
672 rJar android.Path
Colin Crossab8d1382023-07-14 17:23:41 +0000673 assets android.OptionalPath
Colin Cross4eae06d2023-06-20 22:40:02 -0700674
675 usedResourceProcessor bool
Colin Crossab8d1382023-07-14 17:23:41 +0000676}
677
678type transitiveAarDeps []*resourcesNode
679
680func (t transitiveAarDeps) resPackages() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700681 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000682 for _, dep := range t {
683 paths = append(paths, dep.resPackage)
684 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700685 return paths
Colin Crossab8d1382023-07-14 17:23:41 +0000686}
687
688func (t transitiveAarDeps) manifests() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700689 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000690 for _, dep := range t {
691 paths = append(paths, dep.manifest)
692 paths = append(paths, dep.additionalManifests...)
693 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700694 return paths
695}
696
697func (t transitiveAarDeps) resourceProcessorDeps() (args []string, deps android.Paths) {
698 for _, dep := range t {
699 args = append(args, "--library="+dep.rTxt.String()+","+dep.manifest.String())
700 deps = append(deps, dep.rTxt, dep.manifest)
701 }
702 return args, deps
Colin Crossab8d1382023-07-14 17:23:41 +0000703}
704
705func (t transitiveAarDeps) assets() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700706 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000707 for _, dep := range t {
708 if dep.assets.Valid() {
709 paths = append(paths, dep.assets.Path())
710 }
711 }
712 return paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700713}
714
715// aaptLibs collects libraries from dependencies and sdk_version and converts them into paths
Jiakai Zhang36937082024-04-15 11:15:50 +0000716func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext,
717 classLoaderContexts dexpreopt.ClassLoaderContextMap, usesLibrary *usesLibrary) (
Colin Cross8676c8c2023-10-12 15:58:57 -0700718 staticResourcesNodes, sharedResourcesNodes *android.DepSet[*resourcesNode], staticRRODirs *android.DepSet[rroDir],
Colin Crossab8d1382023-07-14 17:23:41 +0000719 staticManifests *android.DepSet[android.Path], sharedLibs android.Paths, flags []string) {
Colin Crossa97c5d32018-03-28 14:58:31 -0700720
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100721 if classLoaderContexts == nil {
Ulya Trafimovich18554242020-11-03 15:55:11 +0000722 // Not all callers need to compute class loader context, those who don't just pass nil.
723 // Create a temporary class loader context here (it will be computed, but not used).
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100724 classLoaderContexts = make(dexpreopt.ClassLoaderContextMap)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000725 }
726
Colin Cross83bb3162018-06-25 15:48:06 -0700727 sdkDep := decodeSdkDep(ctx, sdkContext)
Colin Crossa97c5d32018-03-28 14:58:31 -0700728 if sdkDep.useFiles {
Colin Cross86a60ae2018-05-29 14:44:55 -0700729 sharedLibs = append(sharedLibs, sdkDep.jars...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700730 }
731
Colin Cross8676c8c2023-10-12 15:58:57 -0700732 var staticResourcesNodeDepSets []*android.DepSet[*resourcesNode]
733 var sharedResourcesNodeDepSets []*android.DepSet[*resourcesNode]
Colin Crossab8d1382023-07-14 17:23:41 +0000734 rroDirsDepSetBuilder := android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL)
735 manifestsDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
736
Colin Crossa97c5d32018-03-28 14:58:31 -0700737 ctx.VisitDirectDeps(func(module android.Module) {
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000738 depTag := ctx.OtherModuleDependencyTag(module)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000739
Colin Crossa97c5d32018-03-28 14:58:31 -0700740 var exportPackage android.Path
Colin Cross66f78822018-05-02 12:58:28 -0700741 aarDep, _ := module.(AndroidLibraryDependency)
742 if aarDep != nil {
Colin Crossa97c5d32018-03-28 14:58:31 -0700743 exportPackage = aarDep.ExportPackage()
744 }
745
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000746 switch depTag {
Colin Cross4b964c02018-10-15 16:18:06 -0700747 case instrumentationForTag:
748 // Nothing, instrumentationForTag is treated as libTag for javac but not for aapt2.
Liz Kammeref28a4c2022-09-23 16:50:56 -0400749 case sdkLibTag, libTag:
Colin Cross5446e882019-05-22 10:46:27 -0700750 if exportPackage != nil {
Colin Cross8676c8c2023-10-12 15:58:57 -0700751 sharedResourcesNodeDepSets = append(sharedResourcesNodeDepSets, aarDep.ResourcesNodeDepSet())
Colin Cross5446e882019-05-22 10:46:27 -0700752 sharedLibs = append(sharedLibs, exportPackage)
753 }
Colin Cross5446e882019-05-22 10:46:27 -0700754 case frameworkResTag:
Colin Crossa97c5d32018-03-28 14:58:31 -0700755 if exportPackage != nil {
756 sharedLibs = append(sharedLibs, exportPackage)
757 }
758 case staticLibTag:
759 if exportPackage != nil {
Colin Cross8676c8c2023-10-12 15:58:57 -0700760 staticResourcesNodeDepSets = append(staticResourcesNodeDepSets, aarDep.ResourcesNodeDepSet())
Colin Crossab8d1382023-07-14 17:23:41 +0000761 rroDirsDepSetBuilder.Transitive(aarDep.RRODirsDepSet())
762 manifestsDepSetBuilder.Transitive(aarDep.ManifestsDepSet())
Colin Crossa97c5d32018-03-28 14:58:31 -0700763 }
764 }
Ulya Trafimovich18554242020-11-03 15:55:11 +0000765
Ulya Trafimovich88bb6f62020-12-16 16:16:11 +0000766 addCLCFromDep(ctx, module, classLoaderContexts)
Jiakai Zhang36937082024-04-15 11:15:50 +0000767 if usesLibrary != nil {
768 addMissingOptionalUsesLibsFromDep(ctx, module, usesLibrary)
769 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700770 })
771
Colin Crossab8d1382023-07-14 17:23:41 +0000772 // AAPT2 overlays are in lowest to highest priority order, the topological order will be reversed later.
773 // Reverse the dependency order now going into the depset so that it comes out in order after the second
774 // reverse later.
775 // NOTE: this is legacy and probably incorrect behavior, for most other cases (e.g. conflicting classes in
776 // dependencies) the highest priority dependency is listed first, but for resources the highest priority
Colin Cross9055e212024-03-23 04:43:41 +0000777 // dependency has to be listed last. This is also inconsistent with the way manifests from the same
778 // transitive dependencies are merged.
Colin Crossab8d1382023-07-14 17:23:41 +0000779 staticResourcesNodes = android.NewDepSet(android.TOPOLOGICAL, nil,
Colin Cross8676c8c2023-10-12 15:58:57 -0700780 android.ReverseSliceInPlace(staticResourcesNodeDepSets))
781 sharedResourcesNodes = android.NewDepSet(android.TOPOLOGICAL, nil,
782 android.ReverseSliceInPlace(sharedResourcesNodeDepSets))
Colin Crossa97c5d32018-03-28 14:58:31 -0700783
Colin Crossab8d1382023-07-14 17:23:41 +0000784 staticRRODirs = rroDirsDepSetBuilder.Build()
785 staticManifests = manifestsDepSetBuilder.Build()
786
787 if len(staticResourcesNodes.ToList()) > 0 {
Colin Crossa97c5d32018-03-28 14:58:31 -0700788 flags = append(flags, "--auto-add-overlay")
789 }
790
791 for _, sharedLib := range sharedLibs {
792 flags = append(flags, "-I "+sharedLib.String())
793 }
794
Colin Cross8676c8c2023-10-12 15:58:57 -0700795 return staticResourcesNodes, sharedResourcesNodes, staticRRODirs, staticManifests, sharedLibs, flags
Colin Crossa97c5d32018-03-28 14:58:31 -0700796}
797
798type AndroidLibrary struct {
799 Library
800 aapt
801
802 androidLibraryProperties androidLibraryProperties
803
804 aarFile android.WritablePath
Colin Cross89c31582018-04-30 15:55:11 -0700805}
806
Colin Crossa97c5d32018-03-28 14:58:31 -0700807var _ AndroidLibraryDependency = (*AndroidLibrary)(nil)
808
809func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
Jiakai Zhangf98da192024-04-15 11:15:41 +0000810 a.usesLibrary.deps(ctx, false)
Colin Crossa97c5d32018-03-28 14:58:31 -0700811 a.Module.deps(ctx)
Jiyong Parkf1691d22021-03-29 20:11:58 +0900812 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Paul Duffin250e6192019-06-07 10:44:37 +0100813 if sdkDep.hasFrameworkLibs() {
814 a.aapt.deps(ctx, sdkDep)
Colin Crossa97c5d32018-03-28 14:58:31 -0700815 }
Jihoon Kang9049c272024-03-19 21:57:36 +0000816
817 for _, aconfig_declaration := range a.aaptProperties.Flags_packages {
818 ctx.AddDependency(ctx.Module(), aconfigDeclarationTag, aconfig_declaration)
819 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700820}
821
822func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Crosse4246ab2019-02-05 21:55:21 -0800823 a.aapt.isLibrary = true
Ulya Trafimovich42c7f0d2021-08-17 16:20:29 +0100824 a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx)
Spandan Das0727ba72024-02-13 16:37:43 +0000825 if a.usesLibrary.shouldDisableDexpreopt {
826 a.dexpreopter.disableDexpreopt()
827 }
Jihoon Kang9aef7772024-06-14 23:45:06 +0000828 aconfigTextFilePaths := getAconfigFilePaths(ctx)
Alixf7a10272023-09-27 16:47:56 +0000829 a.aapt.buildActions(ctx,
830 aaptBuildActionOptions{
831 sdkContext: android.SdkContext(a),
832 classLoaderContexts: a.classLoaderContexts,
833 enforceDefaultTargetSdkVersion: false,
Jihoon Kang9aef7772024-06-14 23:45:06 +0000834 aconfigTextFiles: aconfigTextFilePaths,
Jiakai Zhang36937082024-04-15 11:15:50 +0000835 usesLibrary: &a.usesLibrary,
Alixf7a10272023-09-27 16:47:56 +0000836 },
837 )
Colin Crossa97c5d32018-03-28 14:58:31 -0700838
Colin Crossff694a82023-12-13 15:54:49 -0800839 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
840 a.hideApexVariantFromMake = !apexInfo.IsForPlatform()
Colin Cross56a83212020-09-15 18:30:11 -0700841
yangbill2af0b6e2024-03-15 09:29:29 +0000842 a.stem = proptools.StringDefault(a.overridableProperties.Stem, ctx.ModuleName())
Jihoon Kang1bfb6f22023-07-01 00:13:47 +0000843
Colin Cross4eae06d2023-06-20 22:40:02 -0700844 ctx.CheckbuildFile(a.aapt.proguardOptionsFile)
845 ctx.CheckbuildFile(a.aapt.exportPackage)
Colin Cross8f1b0332024-01-25 13:39:06 -0800846 if a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700847 ctx.CheckbuildFile(a.aapt.rJar)
Colin Crossf3b7bad2023-08-02 15:49:00 -0700848 } else {
849 ctx.CheckbuildFile(a.aapt.aaptSrcJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700850 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700851
852 // apps manifests are handled by aapt, don't let Module see them
853 a.properties.Manifest = nil
854
Colin Cross014489c2020-06-02 20:09:13 -0700855 a.linter.mergedManifest = a.aapt.mergedManifestFile
856 a.linter.manifest = a.aapt.manifestPath
857 a.linter.resources = a.aapt.resourceFiles
858
Sam Delmericoc8e040c2023-10-31 17:27:02 +0000859 proguardSpecInfo := a.collectProguardSpecInfo(ctx)
Colin Cross40213022023-12-13 15:19:49 -0800860 android.SetProvider(ctx, ProguardSpecInfoProvider, proguardSpecInfo)
Colin Cross312634e2023-11-21 15:13:56 -0800861 exportedProguardFlagsFiles := proguardSpecInfo.ProguardFlagsFiles.ToList()
862 a.extraProguardFlagsFiles = append(a.extraProguardFlagsFiles, exportedProguardFlagsFiles...)
863 a.extraProguardFlagsFiles = append(a.extraProguardFlagsFiles, a.proguardOptionsFile)
864
865 combinedExportedProguardFlagFile := android.PathForModuleOut(ctx, "export_proguard_flags")
866 writeCombinedProguardFlagsFile(ctx, combinedExportedProguardFlagFile, exportedProguardFlagsFiles)
867 a.combinedExportedProguardFlagsFile = combinedExportedProguardFlagFile
Colin Crossa97c5d32018-03-28 14:58:31 -0700868
Colin Cross4eae06d2023-06-20 22:40:02 -0700869 var extraSrcJars android.Paths
870 var extraCombinedJars android.Paths
871 var extraClasspathJars android.Paths
Colin Cross8f1b0332024-01-25 13:39:06 -0800872 if a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700873 // When building a library with ResourceProcessorBusyBox enabled ResourceProcessorBusyBox for this
874 // library and each of the transitive static android_library dependencies has already created an
875 // R.class file for the appropriate package. Add all of those R.class files to the classpath.
876 extraClasspathJars = a.transitiveAaptRJars
877 } else {
878 // When building a library without ResourceProcessorBusyBox the aapt2 rule creates R.srcjar containing
879 // R.java files for the library's package and the packages from all transitive static android_library
880 // dependencies. Compile the srcjar alongside the rest of the sources.
881 extraSrcJars = android.Paths{a.aapt.aaptSrcJar}
882 }
883
884 a.Module.compile(ctx, extraSrcJars, extraClasspathJars, extraCombinedJars)
Colin Crossa97c5d32018-03-28 14:58:31 -0700885
Colin Crossf57c5782019-01-25 13:20:38 -0800886 a.aarFile = android.PathForModuleOut(ctx, ctx.ModuleName()+".aar")
Colin Crossa97c5d32018-03-28 14:58:31 -0700887 var res android.Paths
888 if a.androidLibraryProperties.BuildAAR {
889 BuildAAR(ctx, a.aarFile, a.outputFile, a.manifestPath, a.rTxt, res)
890 ctx.CheckbuildFile(a.aarFile)
891 }
Colin Cross89c31582018-04-30 15:55:11 -0700892
Sam Delmerico82602492022-06-10 17:05:42 +0000893 prebuiltJniPackages := android.Paths{}
894 ctx.VisitDirectDeps(func(module android.Module) {
Colin Cross313aa542023-12-13 13:47:44 -0800895 if info, ok := android.OtherModuleProvider(ctx, module, JniPackageProvider); ok {
Sam Delmerico82602492022-06-10 17:05:42 +0000896 prebuiltJniPackages = append(prebuiltJniPackages, info.JniPackages...)
897 }
898 })
899 if len(prebuiltJniPackages) > 0 {
Colin Cross40213022023-12-13 15:19:49 -0800900 android.SetProvider(ctx, JniPackageProvider, JniPackageInfo{
Sam Delmerico82602492022-06-10 17:05:42 +0000901 JniPackages: prebuiltJniPackages,
902 })
903 }
Jihoon Kang9aef7772024-06-14 23:45:06 +0000904
905 android.SetProvider(ctx, FlagsPackagesProvider, FlagsPackages{
906 AconfigTextFiles: aconfigTextFilePaths,
907 })
mrziwang9f7b9f42024-07-10 12:18:06 -0700908
909 a.setOutputFiles(ctx)
910}
911
912func (a *AndroidLibrary) setOutputFiles(ctx android.ModuleContext) {
913 ctx.SetOutputFiles([]android.Path{a.aarFile}, ".aar")
914 setOutputFiles(ctx, a.Library.Module)
Colin Crossa97c5d32018-03-28 14:58:31 -0700915}
916
Colin Cross95b53b82023-10-17 13:21:02 -0700917func (a *AndroidLibrary) IDEInfo(dpInfo *android.IdeInfo) {
918 a.Library.IDEInfo(dpInfo)
919 a.aapt.IDEInfo(dpInfo)
920}
921
922func (a *aapt) IDEInfo(dpInfo *android.IdeInfo) {
Colin Cross8f1b0332024-01-25 13:39:06 -0800923 if a.rJar != nil {
Colin Cross95b53b82023-10-17 13:21:02 -0700924 dpInfo.Jars = append(dpInfo.Jars, a.rJar.String())
925 }
926}
927
Colin Cross1b16b0e2019-02-12 14:41:32 -0800928// android_library builds and links sources into a `.jar` file for the device along with Android resources.
929//
930// An android_library has a single variant that produces a `.jar` file containing `.class` files that were
Sam Delmerico82602492022-06-10 17:05:42 +0000931// compiled against the device bootclasspath, along with a `package-res.apk` file containing Android resources compiled
Colin Cross1b16b0e2019-02-12 14:41:32 -0800932// with aapt2. This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
933// an android_app module.
Colin Crossa97c5d32018-03-28 14:58:31 -0700934func AndroidLibraryFactory() android.Module {
935 module := &AndroidLibrary{}
936
Colin Crossce6734e2020-06-15 16:09:53 -0700937 module.Module.addHostAndDeviceProperties()
Colin Crossa97c5d32018-03-28 14:58:31 -0700938 module.AddProperties(
Colin Crossa97c5d32018-03-28 14:58:31 -0700939 &module.aaptProperties,
Ronald Braunsteincdc66f42024-04-12 11:23:19 -0700940 &module.androidLibraryProperties,
941 &module.sourceProperties)
Colin Crossa97c5d32018-03-28 14:58:31 -0700942
943 module.androidLibraryProperties.BuildAAR = true
Colin Cross014489c2020-06-02 20:09:13 -0700944 module.Module.linter.library = true
Colin Crossa97c5d32018-03-28 14:58:31 -0700945
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900946 android.InitApexModule(module)
Colin Cross48de9a42018-10-02 13:53:33 -0700947 InitJavaModule(module, android.DeviceSupported)
Colin Crossa97c5d32018-03-28 14:58:31 -0700948 return module
949}
950
Colin Crossfabb6082018-02-20 17:22:23 -0800951//
952// AAR (android library) prebuilts
953//
Colin Crossfabb6082018-02-20 17:22:23 -0800954
Vinh Trance0781f2022-04-13 01:30:44 +0000955// Properties for android_library_import
Colin Crossfabb6082018-02-20 17:22:23 -0800956type AARImportProperties struct {
Vinh Trance0781f2022-04-13 01:30:44 +0000957 // ARR (android library prebuilt) filepath. Exactly one ARR is required.
Colin Cross27b922f2019-03-04 22:35:41 -0800958 Aars []string `android:"path"`
Vinh Trance0781f2022-04-13 01:30:44 +0000959 // If not blank, set to the version of the sdk to compile against.
960 // Defaults to private.
961 // Values are of one of the following forms:
962 // 1) numerical API level, "current", "none", or "core_platform"
963 // 2) An SDK kind with an API level: "<sdk kind>_<API level>"
964 // See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds.
965 // If the SDK kind is empty, it will be set to public
966 Sdk_version *string
967 // If not blank, set the minimum version of the sdk that the compiled artifacts will run against.
968 // Defaults to sdk_version if not set. See sdk_version for possible values.
Colin Cross479884c2018-07-10 13:39:30 -0700969 Min_sdk_version *string
Vinh Trance0781f2022-04-13 01:30:44 +0000970 // List of java static libraries that the included ARR (android library prebuilts) has dependencies to.
Colin Crossa97c5d32018-03-28 14:58:31 -0700971 Static_libs []string
Vinh Trance0781f2022-04-13 01:30:44 +0000972 // List of java libraries that the included ARR (android library prebuilts) has dependencies to.
973 Libs []string
974 // If set to true, run Jetifier against .aar file. Defaults to false.
Colin Cross1001a792019-03-21 22:21:39 -0700975 Jetifier *bool
Sam Delmerico82602492022-06-10 17:05:42 +0000976 // If true, extract JNI libs from AAR archive. These libs will be accessible to android_app modules and
977 // will be passed transitively through android_libraries to an android_app.
978 //TODO(b/241138093) evaluate whether we can have this flag default to true for Bazel conversion
979 Extract_jni *bool
Colin Cross21ed4692024-04-24 20:23:38 +0000980
981 // If set, overrides the manifest extracted from the AAR with the provided path.
982 Manifest *string `android:"path"`
Colin Crossfabb6082018-02-20 17:22:23 -0800983}
984
985type AARImport struct {
986 android.ModuleBase
Colin Cross48de9a42018-10-02 13:53:33 -0700987 android.DefaultableModuleBase
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900988 android.ApexModuleBase
Colin Crossfabb6082018-02-20 17:22:23 -0800989 prebuilt android.Prebuilt
990
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900991 // Functionality common to Module and Import.
992 embeddableInModuleAndImport
993
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500994 providesTransitiveHeaderJars
995
Colin Crossfabb6082018-02-20 17:22:23 -0800996 properties AARImportProperties
997
Colin Cross9055e212024-03-23 04:43:41 +0000998 headerJarFile android.WritablePath
999 implementationJarFile android.WritablePath
Colin Cross607bbd62024-04-12 13:44:45 -07001000 implementationAndResourcesJarFile android.WritablePath
Colin Cross312634e2023-11-21 15:13:56 -08001001 proguardFlags android.WritablePath
1002 exportPackage android.WritablePath
1003 transitiveAaptResourcePackagesFile android.Path
1004 extraAaptPackagesFile android.WritablePath
Colin Cross21ed4692024-04-24 20:23:38 +00001005 manifest android.Path
Colin Cross312634e2023-11-21 15:13:56 -08001006 assetsPackage android.WritablePath
1007 rTxt android.WritablePath
1008 rJar android.WritablePath
Colin Cross66f78822018-05-02 12:58:28 -07001009
Colin Crossab8d1382023-07-14 17:23:41 +00001010 resourcesNodesDepSet *android.DepSet[*resourcesNode]
1011 manifestsDepSet *android.DepSet[android.Path]
Colin Cross56a83212020-09-15 18:30:11 -07001012
1013 hideApexVariantFromMake bool
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001014
Sam Delmerico82602492022-06-10 17:05:42 +00001015 aarPath android.Path
1016 jniPackages android.Paths
Jiyong Park92315372021-04-02 08:45:46 +09001017
1018 sdkVersion android.SdkSpec
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001019 minSdkVersion android.ApiLevel
LaMont Jonesafe7baf2024-01-09 22:47:39 +00001020
Colin Cross9055e212024-03-23 04:43:41 +00001021 usesLibrary
1022 classLoaderContexts dexpreopt.ClassLoaderContextMap
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001023}
1024
Jiyong Park92315372021-04-02 08:45:46 +09001025func (a *AARImport) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
1026 return android.SdkSpecFrom(ctx, String(a.properties.Sdk_version))
Colin Cross83bb3162018-06-25 15:48:06 -07001027}
1028
Jiyong Parkf1691d22021-03-29 20:11:58 +09001029func (a *AARImport) SystemModules() string {
Paul Duffine25c6442019-10-11 13:50:28 +01001030 return ""
1031}
1032
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001033func (a *AARImport) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
Colin Cross479884c2018-07-10 13:39:30 -07001034 if a.properties.Min_sdk_version != nil {
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001035 return android.ApiLevelFrom(ctx, *a.properties.Min_sdk_version)
Colin Cross479884c2018-07-10 13:39:30 -07001036 }
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001037 return a.SdkVersion(ctx).ApiLevel
Colin Cross83bb3162018-06-25 15:48:06 -07001038}
1039
Spandan Dasa26eda72023-03-02 00:56:06 +00001040func (a *AARImport) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
1041 return android.SdkSpecFrom(ctx, "").ApiLevel
William Loh5a082f92022-05-17 20:21:50 +00001042}
1043
Spandan Dasca70fc42023-03-01 23:38:49 +00001044func (a *AARImport) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
1045 return a.SdkVersion(ctx).ApiLevel
Dan Willemsen419290a2018-10-31 15:28:47 -07001046}
1047
Colin Cross1e743852019-10-28 11:37:20 -07001048func (a *AARImport) javaVersion() string {
1049 return ""
1050}
1051
Colin Crossa97c5d32018-03-28 14:58:31 -07001052var _ AndroidLibraryDependency = (*AARImport)(nil)
1053
1054func (a *AARImport) ExportPackage() android.Path {
1055 return a.exportPackage
1056}
Colin Crossab8d1382023-07-14 17:23:41 +00001057func (a *AARImport) ResourcesNodeDepSet() *android.DepSet[*resourcesNode] {
1058 return a.resourcesNodesDepSet
Colin Crossc1c37552019-01-31 11:42:41 -08001059}
1060
Colin Crossab8d1382023-07-14 17:23:41 +00001061func (a *AARImport) RRODirsDepSet() *android.DepSet[rroDir] {
1062 return android.NewDepSet[rroDir](android.TOPOLOGICAL, nil, nil)
Colin Cross66f78822018-05-02 12:58:28 -07001063}
1064
Colin Crossab8d1382023-07-14 17:23:41 +00001065func (a *AARImport) ManifestsDepSet() *android.DepSet[android.Path] {
1066 return a.manifestsDepSet
Jaewoong Jung6431ca72020-01-15 14:15:10 -08001067}
1068
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001069// RRO enforcement is not available on aar_import since its RRO dirs are not
1070// exported.
1071func (a *AARImport) SetRROEnforcedForDependent(enforce bool) {
1072}
1073
1074// RRO enforcement is not available on aar_import since its RRO dirs are not
1075// exported.
1076func (a *AARImport) IsRROEnforced(ctx android.BaseModuleContext) bool {
1077 return false
1078}
1079
Colin Crossfabb6082018-02-20 17:22:23 -08001080func (a *AARImport) Prebuilt() *android.Prebuilt {
1081 return &a.prebuilt
1082}
1083
1084func (a *AARImport) Name() string {
1085 return a.prebuilt.Name(a.ModuleBase.Name())
1086}
1087
Jiyong Park618922e2020-01-08 13:35:43 +09001088func (a *AARImport) JacocoReportClassesFile() android.Path {
1089 return nil
1090}
1091
Colin Crossfabb6082018-02-20 17:22:23 -08001092func (a *AARImport) DepsMutator(ctx android.BottomUpMutatorContext) {
Jeongik Cha816a23a2020-07-08 01:09:23 +09001093 if !ctx.Config().AlwaysUsePrebuiltSdks() {
Jiyong Parkf1691d22021-03-29 20:11:58 +09001094 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Colin Crossa97c5d32018-03-28 14:58:31 -07001095 if sdkDep.useModule && sdkDep.frameworkResModule != "" {
Colin Cross42d48b72018-08-29 14:10:52 -07001096 ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
Colin Crossfabb6082018-02-20 17:22:23 -08001097 }
1098 }
Colin Crossa97c5d32018-03-28 14:58:31 -07001099
Colin Cross42d48b72018-08-29 14:10:52 -07001100 ctx.AddVariationDependencies(nil, libTag, a.properties.Libs...)
1101 ctx.AddVariationDependencies(nil, staticLibTag, a.properties.Static_libs...)
Colin Cross9055e212024-03-23 04:43:41 +00001102
1103 a.usesLibrary.deps(ctx, false)
Colin Crossfabb6082018-02-20 17:22:23 -08001104}
1105
Sam Delmerico82602492022-06-10 17:05:42 +00001106type JniPackageInfo struct {
1107 // List of zip files containing JNI libraries
1108 // Zip files should have directory structure jni/<arch>/*.so
1109 JniPackages android.Paths
1110}
1111
Colin Crossbc7d76c2023-12-12 16:39:03 -08001112var JniPackageProvider = blueprint.NewProvider[JniPackageInfo]()
Sam Delmerico82602492022-06-10 17:05:42 +00001113
1114// Unzip an AAR and extract the JNI libs for $archString.
1115var extractJNI = pctx.AndroidStaticRule("extractJNI",
1116 blueprint.RuleParams{
1117 Command: `rm -rf $out $outDir && touch $out && ` +
1118 `unzip -qoDD -d $outDir $in "jni/${archString}/*" && ` +
1119 `jni_files=$$(find $outDir/jni -type f) && ` +
1120 // print error message if there are no JNI libs for this arch
1121 `[ -n "$$jni_files" ] || (echo "ERROR: no JNI libs found for arch ${archString}" && exit 1) && ` +
Sam Delmerico80ee45c2023-06-22 15:36:02 -04001122 `${config.SoongZipCmd} -o $out -L 0 -P 'lib/${archString}' ` +
Sam Delmerico82602492022-06-10 17:05:42 +00001123 `-C $outDir/jni/${archString} $$(echo $$jni_files | xargs -n1 printf " -f %s")`,
1124 CommandDeps: []string{"${config.SoongZipCmd}"},
1125 },
1126 "outDir", "archString")
1127
Colin Crossfabb6082018-02-20 17:22:23 -08001128// 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 -07001129// 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 -08001130var unzipAAR = pctx.AndroidStaticRule("unzipAAR",
1131 blueprint.RuleParams{
Dan Willemsen304cfec2019-05-28 14:49:06 -07001132 Command: `rm -rf $outDir && mkdir -p $outDir && ` +
Colin Cross205e9112020-08-06 13:20:17 -07001133 `unzip -qoDD -d $outDir $in && rm -rf $outDir/res && touch $out && ` +
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001134 `${config.Zip2ZipCmd} -i $in -o $assetsPackage 'assets/**/*' && ` +
Colin Cross205e9112020-08-06 13:20:17 -07001135 `${config.MergeZipsCmd} $combinedClassesJar $$(ls $outDir/classes.jar 2> /dev/null) $$(ls $outDir/libs/*.jar 2> /dev/null)`,
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001136 CommandDeps: []string{"${config.MergeZipsCmd}", "${config.Zip2ZipCmd}"},
Colin Crossfabb6082018-02-20 17:22:23 -08001137 },
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001138 "outDir", "combinedClassesJar", "assetsPackage")
Colin Crossfabb6082018-02-20 17:22:23 -08001139
1140func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1141 if len(a.properties.Aars) != 1 {
1142 ctx.PropertyErrorf("aars", "exactly one aar is required")
1143 return
1144 }
1145
Jiyong Park92315372021-04-02 08:45:46 +09001146 a.sdkVersion = a.SdkVersion(ctx)
1147 a.minSdkVersion = a.MinSdkVersion(ctx)
1148
Colin Crossff694a82023-12-13 15:54:49 -08001149 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
1150 a.hideApexVariantFromMake = !apexInfo.IsForPlatform()
Colin Cross56a83212020-09-15 18:30:11 -07001151
Nan Zhang4c819fb2018-08-27 18:31:46 -07001152 aarName := ctx.ModuleName() + ".aar"
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001153 a.aarPath = android.PathForModuleSrc(ctx, a.properties.Aars[0])
1154
Colin Cross1001a792019-03-21 22:21:39 -07001155 if Bool(a.properties.Jetifier) {
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001156 inputFile := a.aarPath
1157 a.aarPath = android.PathForModuleOut(ctx, "jetifier", aarName)
1158 TransformJetifier(ctx, a.aarPath.(android.WritablePath), inputFile)
Nan Zhang4c819fb2018-08-27 18:31:46 -07001159 }
Colin Crossfabb6082018-02-20 17:22:23 -08001160
Colin Cross607bbd62024-04-12 13:44:45 -07001161 jarName := ctx.ModuleName() + ".jar"
Colin Crossfabb6082018-02-20 17:22:23 -08001162 extractedAARDir := android.PathForModuleOut(ctx, "aar")
Colin Cross607bbd62024-04-12 13:44:45 -07001163 classpathFile := extractedAARDir.Join(ctx, jarName)
Colin Cross21ed4692024-04-24 20:23:38 +00001164
1165 extractedManifest := extractedAARDir.Join(ctx, "AndroidManifest.xml")
1166 providedManifest := android.OptionalPathForModuleSrc(ctx, a.properties.Manifest)
1167 if providedManifest.Valid() {
1168 a.manifest = providedManifest.Path()
1169 } else {
1170 a.manifest = extractedManifest
1171 }
1172
Colin Crossbb77d8e2024-02-15 14:43:47 -08001173 a.rTxt = extractedAARDir.Join(ctx, "R.txt")
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001174 a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip")
Sam Delmerico95d70942023-08-02 18:00:35 -04001175 a.proguardFlags = extractedAARDir.Join(ctx, "proguard.txt")
Colin Crosscde55342024-03-27 14:11:51 -07001176 transitiveProguardFlags, transitiveUnconditionalExportedFlags := collectDepProguardSpecInfo(ctx)
Colin Cross40213022023-12-13 15:19:49 -08001177 android.SetProvider(ctx, ProguardSpecInfoProvider, ProguardSpecInfo{
Sam Delmerico95d70942023-08-02 18:00:35 -04001178 ProguardFlagsFiles: android.NewDepSet[android.Path](
1179 android.POSTORDER,
1180 android.Paths{a.proguardFlags},
Colin Crosscde55342024-03-27 14:11:51 -07001181 transitiveProguardFlags,
1182 ),
1183 UnconditionallyExportedProguardFlags: android.NewDepSet[android.Path](
1184 android.POSTORDER,
Sam Delmerico95d70942023-08-02 18:00:35 -04001185 nil,
Colin Crosscde55342024-03-27 14:11:51 -07001186 transitiveUnconditionalExportedFlags,
Sam Delmerico95d70942023-08-02 18:00:35 -04001187 ),
1188 })
Colin Crossfabb6082018-02-20 17:22:23 -08001189
1190 ctx.Build(pctx, android.BuildParams{
1191 Rule: unzipAAR,
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001192 Input: a.aarPath,
Colin Cross21ed4692024-04-24 20:23:38 +00001193 Outputs: android.WritablePaths{classpathFile, a.proguardFlags, extractedManifest, a.assetsPackage, a.rTxt},
Colin Crossfabb6082018-02-20 17:22:23 -08001194 Description: "unzip AAR",
1195 Args: map[string]string{
Colin Cross205e9112020-08-06 13:20:17 -07001196 "outDir": extractedAARDir.String(),
Colin Cross9055e212024-03-23 04:43:41 +00001197 "combinedClassesJar": classpathFile.String(),
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001198 "assetsPackage": a.assetsPackage.String(),
Colin Crossfabb6082018-02-20 17:22:23 -08001199 },
1200 })
1201
Colin Crossa0ba2f52019-06-22 12:59:27 -07001202 // Always set --pseudo-localize, it will be stripped out later for release
1203 // builds that don't want it.
1204 compileFlags := []string{"--pseudo-localize"}
Colin Crossfabb6082018-02-20 17:22:23 -08001205 compiledResDir := android.PathForModuleOut(ctx, "flat-res")
Colin Crossfabb6082018-02-20 17:22:23 -08001206 flata := compiledResDir.Join(ctx, "gen_res.flata")
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001207 aapt2CompileZip(ctx, flata, a.aarPath, "res", compileFlags)
Colin Crossfabb6082018-02-20 17:22:23 -08001208
1209 a.exportPackage = android.PathForModuleOut(ctx, "package-res.apk")
Colin Crossfabb6082018-02-20 17:22:23 -08001210 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
Colin Crossbb77d8e2024-02-15 14:43:47 -08001211 aaptRTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -07001212 a.extraAaptPackagesFile = android.PathForModuleOut(ctx, "extra_packages")
Colin Crossfabb6082018-02-20 17:22:23 -08001213
1214 var linkDeps android.Paths
1215
1216 linkFlags := []string{
1217 "--static-lib",
Colin Cross4eae06d2023-06-20 22:40:02 -07001218 "--merge-only",
Colin Crossfabb6082018-02-20 17:22:23 -08001219 "--auto-add-overlay",
Colin Cross7c4dc5d2024-02-13 14:29:45 -08001220 "--no-static-lib-packages",
Colin Crossfabb6082018-02-20 17:22:23 -08001221 }
1222
Colin Cross10f7c4a2018-05-23 10:59:28 -07001223 linkFlags = append(linkFlags, "--manifest "+a.manifest.String())
1224 linkDeps = append(linkDeps, a.manifest)
Colin Crossfabb6082018-02-20 17:22:23 -08001225
Colin Cross8676c8c2023-10-12 15:58:57 -07001226 staticResourcesNodesDepSet, sharedResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedLibs, libFlags :=
Jiakai Zhang36937082024-04-15 11:15:50 +00001227 aaptLibs(ctx, android.SdkContext(a), nil, nil)
Colin Cross31656952018-05-24 16:11:20 -07001228
Colin Cross8676c8c2023-10-12 15:58:57 -07001229 _ = sharedResourcesNodesDepSet
Colin Crossab8d1382023-07-14 17:23:41 +00001230 _ = staticRRODirsDepSet
Colin Cross8676c8c2023-10-12 15:58:57 -07001231
Colin Crossab8d1382023-07-14 17:23:41 +00001232 staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
Colin Crossfabb6082018-02-20 17:22:23 -08001233
Colin Crossab8d1382023-07-14 17:23:41 +00001234 linkDeps = append(linkDeps, sharedLibs...)
Colin Cross4eae06d2023-06-20 22:40:02 -07001235 linkDeps = append(linkDeps, staticDeps.resPackages()...)
Colin Crossa97c5d32018-03-28 14:58:31 -07001236 linkFlags = append(linkFlags, libFlags...)
Colin Crossfabb6082018-02-20 17:22:23 -08001237
Colin Cross4eae06d2023-06-20 22:40:02 -07001238 overlayRes := android.Paths{flata}
1239
1240 // Treat static library dependencies of static libraries as imports.
1241 transitiveStaticLibs := staticDeps.resPackages()
1242 linkDeps = append(linkDeps, transitiveStaticLibs...)
1243 for _, staticLib := range transitiveStaticLibs {
1244 linkFlags = append(linkFlags, "-I "+staticLib.String())
1245 }
Colin Crossfabb6082018-02-20 17:22:23 -08001246
Colin Crossab8d1382023-07-14 17:23:41 +00001247 transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets())
Colin Crossbb77d8e2024-02-15 14:43:47 -08001248 aapt2Link(ctx, a.exportPackage, nil, proguardOptionsFile, aaptRTxt,
Jihoon Kang84b25892023-12-01 22:01:06 +00001249 linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil, nil)
Colin Crossfabb6082018-02-20 17:22:23 -08001250
Colin Cross4eae06d2023-06-20 22:40:02 -07001251 a.rJar = android.PathForModuleOut(ctx, "busybox/R.jar")
Rico Winda2fa2632024-03-13 13:09:17 +01001252 resourceProcessorBusyBoxGenerateBinaryR(ctx, a.rTxt, a.manifest, a.rJar, nil, true, nil, false)
Colin Cross4eae06d2023-06-20 22:40:02 -07001253
Colin Crossf3b7bad2023-08-02 15:49:00 -07001254 aapt2ExtractExtraPackages(ctx, a.extraAaptPackagesFile, a.rJar)
1255
Colin Crossab8d1382023-07-14 17:23:41 +00001256 resourcesNodesDepSetBuilder := android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL)
1257 resourcesNodesDepSetBuilder.Direct(&resourcesNode{
1258 resPackage: a.exportPackage,
1259 manifest: a.manifest,
Colin Cross4eae06d2023-06-20 22:40:02 -07001260 rTxt: a.rTxt,
1261 rJar: a.rJar,
Colin Crossab8d1382023-07-14 17:23:41 +00001262 assets: android.OptionalPathForPath(a.assetsPackage),
Colin Cross4eae06d2023-06-20 22:40:02 -07001263
1264 usedResourceProcessor: true,
Colin Crossab8d1382023-07-14 17:23:41 +00001265 })
1266 resourcesNodesDepSetBuilder.Transitive(staticResourcesNodesDepSet)
1267 a.resourcesNodesDepSet = resourcesNodesDepSetBuilder.Build()
1268
1269 manifestDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).Direct(a.manifest)
Colin Cross9055e212024-03-23 04:43:41 +00001270 manifestDepSetBuilder.Transitive(staticManifestsDepSet)
Colin Crossab8d1382023-07-14 17:23:41 +00001271 a.manifestsDepSet = manifestDepSetBuilder.Build()
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001272
Colin Cross312634e2023-11-21 15:13:56 -08001273 transitiveAaptResourcePackages := staticDeps.resPackages().Strings()
1274 transitiveAaptResourcePackages = slices.DeleteFunc(transitiveAaptResourcePackages, func(p string) bool {
1275 return p == a.exportPackage.String()
1276 })
1277 transitiveAaptResourcePackagesFile := android.PathForModuleOut(ctx, "transitive-res-packages")
1278 android.WriteFileRule(ctx, transitiveAaptResourcePackagesFile, strings.Join(transitiveAaptResourcePackages, "\n"))
1279 a.transitiveAaptResourcePackagesFile = transitiveAaptResourcePackagesFile
Colin Cross4eae06d2023-06-20 22:40:02 -07001280
Sam Delmerico9f9c0a22022-11-29 11:19:37 -05001281 a.collectTransitiveHeaderJars(ctx)
Colin Cross9055e212024-03-23 04:43:41 +00001282
1283 a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx)
1284
1285 var staticJars android.Paths
1286 var staticHeaderJars android.Paths
Colin Cross607bbd62024-04-12 13:44:45 -07001287 var staticResourceJars android.Paths
Colin Cross9055e212024-03-23 04:43:41 +00001288 ctx.VisitDirectDeps(func(module android.Module) {
1289 if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
1290 tag := ctx.OtherModuleDependencyTag(module)
1291 switch tag {
1292 case staticLibTag:
1293 staticJars = append(staticJars, dep.ImplementationJars...)
1294 staticHeaderJars = append(staticHeaderJars, dep.HeaderJars...)
Colin Cross607bbd62024-04-12 13:44:45 -07001295 staticResourceJars = append(staticResourceJars, dep.ResourceJars...)
Colin Cross9055e212024-03-23 04:43:41 +00001296 }
1297 }
1298 addCLCFromDep(ctx, module, a.classLoaderContexts)
Jiakai Zhang36937082024-04-15 11:15:50 +00001299 addMissingOptionalUsesLibsFromDep(ctx, module, &a.usesLibrary)
Colin Cross9055e212024-03-23 04:43:41 +00001300 })
1301
Colin Cross28ac2ff2024-04-02 12:21:34 -07001302 var implementationJarFile android.OutputPath
Colin Cross9055e212024-03-23 04:43:41 +00001303 if len(staticJars) > 0 {
1304 combineJars := append(android.Paths{classpathFile}, staticJars...)
Colin Cross607bbd62024-04-12 13:44:45 -07001305 implementationJarFile = android.PathForModuleOut(ctx, "combined", jarName).OutputPath
Colin Cross28ac2ff2024-04-02 12:21:34 -07001306 TransformJarsToJar(ctx, implementationJarFile, "combine", combineJars, android.OptionalPath{}, false, nil, nil)
Colin Cross9055e212024-03-23 04:43:41 +00001307 } else {
Colin Cross28ac2ff2024-04-02 12:21:34 -07001308 implementationJarFile = classpathFile
Colin Cross9055e212024-03-23 04:43:41 +00001309 }
1310
Colin Cross607bbd62024-04-12 13:44:45 -07001311 var resourceJarFile android.Path
1312 if len(staticResourceJars) > 1 {
1313 combinedJar := android.PathForModuleOut(ctx, "res-combined", jarName)
1314 TransformJarsToJar(ctx, combinedJar, "for resources", staticResourceJars, android.OptionalPath{},
1315 false, nil, nil)
1316 resourceJarFile = combinedJar
1317 } else if len(staticResourceJars) == 1 {
1318 resourceJarFile = staticResourceJars[0]
1319 }
1320
1321 // merge implementation jar with resources if necessary
1322 implementationAndResourcesJar := implementationJarFile
1323 if resourceJarFile != nil {
1324 jars := android.Paths{resourceJarFile, implementationAndResourcesJar}
1325 combinedJar := android.PathForModuleOut(ctx, "withres", jarName).OutputPath
1326 TransformJarsToJar(ctx, combinedJar, "for resources", jars, android.OptionalPath{},
1327 false, nil, nil)
1328 implementationAndResourcesJar = combinedJar
1329 }
1330
1331 a.implementationJarFile = implementationJarFile
Colin Cross28ac2ff2024-04-02 12:21:34 -07001332 // Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource
Colin Cross607bbd62024-04-12 13:44:45 -07001333 a.implementationAndResourcesJarFile = implementationAndResourcesJar.WithoutRel()
Colin Cross28ac2ff2024-04-02 12:21:34 -07001334
Colin Cross9055e212024-03-23 04:43:41 +00001335 if len(staticHeaderJars) > 0 {
1336 combineJars := append(android.Paths{classpathFile}, staticHeaderJars...)
Colin Cross607bbd62024-04-12 13:44:45 -07001337 a.headerJarFile = android.PathForModuleOut(ctx, "turbine-combined", jarName)
Colin Cross9055e212024-03-23 04:43:41 +00001338 TransformJarsToJar(ctx, a.headerJarFile, "combine header jars", combineJars, android.OptionalPath{}, false, nil, nil)
1339 } else {
1340 a.headerJarFile = classpathFile
1341 }
1342
Colin Cross40213022023-12-13 15:19:49 -08001343 android.SetProvider(ctx, JavaInfoProvider, JavaInfo{
Colin Cross9055e212024-03-23 04:43:41 +00001344 HeaderJars: android.PathsIfNonNil(a.headerJarFile),
Colin Cross607bbd62024-04-12 13:44:45 -07001345 ResourceJars: android.PathsIfNonNil(resourceJarFile),
Sam Delmerico9f9c0a22022-11-29 11:19:37 -05001346 TransitiveLibsHeaderJars: a.transitiveLibsHeaderJars,
1347 TransitiveStaticLibsHeaderJars: a.transitiveStaticLibsHeaderJars,
Colin Cross607bbd62024-04-12 13:44:45 -07001348 ImplementationAndResourcesJars: android.PathsIfNonNil(a.implementationAndResourcesJarFile),
Colin Cross9055e212024-03-23 04:43:41 +00001349 ImplementationJars: android.PathsIfNonNil(a.implementationJarFile),
Jihoon Kangfe914ed2024-02-12 22:49:21 +00001350 StubsLinkType: Implementation,
Joe Onorato6fe59eb2023-07-16 13:20:33 -07001351 // TransitiveAconfigFiles: // TODO(b/289117800): LOCAL_ACONFIG_FILES for prebuilts
Colin Crossdcf71b22021-02-01 13:59:03 -08001352 })
Sam Delmerico82602492022-06-10 17:05:42 +00001353
1354 if proptools.Bool(a.properties.Extract_jni) {
1355 for _, t := range ctx.MultiTargets() {
1356 arch := t.Arch.Abi[0]
1357 path := android.PathForModuleOut(ctx, arch+"_jni.zip")
1358 a.jniPackages = append(a.jniPackages, path)
1359
1360 outDir := android.PathForModuleOut(ctx, "aarForJni")
1361 aarPath := android.PathForModuleSrc(ctx, a.properties.Aars[0])
1362 ctx.Build(pctx, android.BuildParams{
1363 Rule: extractJNI,
1364 Input: aarPath,
1365 Outputs: android.WritablePaths{path},
1366 Description: "extract JNI from AAR",
1367 Args: map[string]string{
1368 "outDir": outDir.String(),
1369 "archString": arch,
1370 },
1371 })
1372 }
Sam Delmerico82602492022-06-10 17:05:42 +00001373 }
Colin Crosse8eeec92023-12-14 14:50:05 -08001374
Colin Cross40213022023-12-13 15:19:49 -08001375 android.SetProvider(ctx, JniPackageProvider, JniPackageInfo{
Colin Crosse8eeec92023-12-14 14:50:05 -08001376 JniPackages: a.jniPackages,
1377 })
mrziwang68786d82024-07-09 10:41:55 -07001378
1379 ctx.SetOutputFiles([]android.Path{a.implementationAndResourcesJarFile}, "")
1380 ctx.SetOutputFiles([]android.Path{a.aarPath}, ".aar")
Colin Crossdcf71b22021-02-01 13:59:03 -08001381}
Colin Crossfabb6082018-02-20 17:22:23 -08001382
1383func (a *AARImport) HeaderJars() android.Paths {
Colin Cross9055e212024-03-23 04:43:41 +00001384 return android.Paths{a.headerJarFile}
Colin Crossfabb6082018-02-20 17:22:23 -08001385}
1386
Colin Cross331a1212018-08-15 20:40:52 -07001387func (a *AARImport) ImplementationAndResourcesJars() android.Paths {
Colin Cross607bbd62024-04-12 13:44:45 -07001388 return android.Paths{a.implementationAndResourcesJarFile}
Colin Cross331a1212018-08-15 20:40:52 -07001389}
1390
Colin Cross9055e212024-03-23 04:43:41 +00001391func (a *AARImport) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath {
1392 return OptionalDexJarPath{}
Colin Crossf24a22a2019-01-31 14:12:44 -08001393}
1394
Ulya Trafimovich9f3052c2020-06-09 14:31:19 +01001395func (a *AARImport) DexJarInstallPath() android.Path {
1396 return nil
1397}
1398
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +01001399func (a *AARImport) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap {
Colin Cross9055e212024-03-23 04:43:41 +00001400 return a.classLoaderContexts
Jiyong Park1be96912018-05-28 18:02:19 +09001401}
1402
Colin Cross9055e212024-03-23 04:43:41 +00001403var _ UsesLibraryDependency = (*AARImport)(nil)
1404
Jiyong Park45bf82e2020-12-15 22:29:02 +09001405var _ android.ApexModule = (*AARImport)(nil)
1406
1407// Implements android.ApexModule
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001408func (a *AARImport) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
1409 return a.depIsInSameApex(ctx, dep)
1410}
1411
Jiyong Park45bf82e2020-12-15 22:29:02 +09001412// Implements android.ApexModule
Colin Cross9055e212024-03-23 04:43:41 +00001413func (a *AARImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
Dan Albertc8060532020-07-22 22:32:17 -07001414 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09001415 return nil
1416}
1417
Sam Delmericoaf8bb702022-07-25 15:39:32 -04001418var _ android.PrebuiltInterface = (*AARImport)(nil)
Colin Crossfabb6082018-02-20 17:22:23 -08001419
Jiakai Zhangf98da192024-04-15 11:15:41 +00001420func (a *AARImport) UsesLibrary() *usesLibrary {
1421 return &a.usesLibrary
1422}
1423
1424var _ ModuleWithUsesLibrary = (*AARImport)(nil)
1425
Colin Cross1b16b0e2019-02-12 14:41:32 -08001426// android_library_import imports an `.aar` file into the build graph as if it was built with android_library.
1427//
1428// This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
1429// an android_app module.
Colin Crossfabb6082018-02-20 17:22:23 -08001430func AARImportFactory() android.Module {
1431 module := &AARImport{}
1432
Colin Cross9055e212024-03-23 04:43:41 +00001433 module.AddProperties(
1434 &module.properties,
1435 &module.usesLibrary.usesLibraryProperties,
1436 )
Colin Crossfabb6082018-02-20 17:22:23 -08001437
1438 android.InitPrebuiltModule(module, &module.properties.Aars)
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001439 android.InitApexModule(module)
Sam Delmerico82602492022-06-10 17:05:42 +00001440 InitJavaModuleMultiTargets(module, android.DeviceSupported)
Colin Crossfabb6082018-02-20 17:22:23 -08001441 return module
1442}