blob: 42866f8b641b2b53aa5c0156a791eb466e973d67 [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.
Cole Faustd65add22024-07-31 16:42:33 -070079 Resource_dirs []string `android:"path"`
Colin Crossa97c5d32018-03-28 14:58:31 -070080
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 Crossa6182ab2024-08-21 10:47:44 -0700406 ctx.CheckbuildFile(a.mergedManifestFile)
Colin Cross90c25c62019-04-19 16:22:57 -0700407 if !a.isLibrary {
408 // Only use the merged manifest for applications. For libraries, the transitive closure of manifests
409 // will be propagated to the final application and merged there. The merged manifest for libraries is
410 // only passed to Make, which can't handle transitive dependencies.
411 manifestPath = a.mergedManifestFile
412 }
413 } else {
414 a.mergedManifestFile = manifestPath
415 }
Colin Cross31656952018-05-24 16:11:20 -0700416
Alixf7a10272023-09-27 16:47:56 +0000417 compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, opts.sdkContext, manifestPath)
Colin Cross31656952018-05-24 16:11:20 -0700418
419 linkFlags = append(linkFlags, libFlags...)
Colin Cross8676c8c2023-10-12 15:58:57 -0700420 linkDeps = append(linkDeps, sharedExportPackages...)
Colin Crossab8d1382023-07-14 17:23:41 +0000421 linkDeps = append(linkDeps, staticDeps.resPackages()...)
Alixf7a10272023-09-27 16:47:56 +0000422 linkFlags = append(linkFlags, opts.extraLinkFlags...)
Colin Cross1b6a3cf2018-07-24 14:51:30 -0700423 if a.isLibrary {
424 linkFlags = append(linkFlags, "--static-lib")
425 }
Rico Wind7152e822024-04-19 08:14:15 +0200426 if opts.forceNonFinalResourceIDs {
427 linkFlags = append(linkFlags, "--non-final-ids")
428 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700429
Colin Cross7c4dc5d2024-02-13 14:29:45 -0800430 linkFlags = append(linkFlags, "--no-static-lib-packages")
Colin Cross8f1b0332024-01-25 13:39:06 -0800431 if a.isLibrary && a.useResourceProcessorBusyBox(ctx) {
Colin Cross7c4dc5d2024-02-13 14:29:45 -0800432 // When building an android_library using ResourceProcessorBusyBox pass --merge-only to skip resource
433 // references validation until the final app link step when all static libraries are present.
Colin Cross4eae06d2023-06-20 22:40:02 -0700434 linkFlags = append(linkFlags, "--merge-only")
Colin Cross4eae06d2023-06-20 22:40:02 -0700435 }
436
Colin Crossa97c5d32018-03-28 14:58:31 -0700437 packageRes := android.PathForModuleOut(ctx, "package-res.apk")
Colin Crossa97c5d32018-03-28 14:58:31 -0700438 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
439 rTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -0700440 // This file isn't used by Soong, but is generated for exporting
441 extraPackages := android.PathForModuleOut(ctx, "extra_packages")
Colin Cross4eae06d2023-06-20 22:40:02 -0700442 var transitiveRJars android.Paths
Colin Crossf3b7bad2023-08-02 15:49:00 -0700443 var srcJar android.WritablePath
Colin Crossa97c5d32018-03-28 14:58:31 -0700444
Colin Cross4aaa84a2018-08-21 15:14:37 -0700445 var compiledResDirs []android.Paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700446 for _, dir := range resDirs {
Colin Cross014489c2020-06-02 20:09:13 -0700447 a.resourceFiles = append(a.resourceFiles, dir.files...)
Jihoon Kang98ea8362024-07-16 18:20:03 +0000448 compiledResDirs = append(compiledResDirs, aapt2Compile(ctx, dir.dir, dir.files,
449 compileFlags, a.filterProduct(), opts.aconfigTextFiles).Paths())
Colin Crossa97c5d32018-03-28 14:58:31 -0700450 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700451
Colin Crossa592e3e2019-02-19 16:59:53 -0800452 for i, zip := range resZips {
453 flata := android.PathForModuleOut(ctx, fmt.Sprintf("reszip.%d.flata", i))
Colin Crossa0ba2f52019-06-22 12:59:27 -0700454 aapt2CompileZip(ctx, flata, zip, "", compileFlags)
Colin Crossa592e3e2019-02-19 16:59:53 -0800455 compiledResDirs = append(compiledResDirs, android.Paths{flata})
456 }
457
Colin Cross4aaa84a2018-08-21 15:14:37 -0700458 var compiledRes, compiledOverlay android.Paths
459
Colin Crossab8d1382023-07-14 17:23:41 +0000460 // AAPT2 overlays are in lowest to highest priority order, reverse the topological order
461 // of transitiveStaticLibs.
462 transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages())
463
Colin Cross8f1b0332024-01-25 13:39:06 -0800464 if a.isLibrary && a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700465 // When building an android_library with ResourceProcessorBusyBox enabled treat static library dependencies
466 // as imports. The resources from dependencies will not be merged into this module's package-res.apk, and
467 // instead modules depending on this module will reference package-res.apk from all transitive static
468 // dependencies.
Colin Cross1d3f5902024-03-05 11:51:54 -0800469 for _, sharedDep := range sharedDeps {
470 if sharedDep.usedResourceProcessor {
471 transitiveRJars = append(transitiveRJars, sharedDep.rJar)
472 }
473 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700474 for _, staticDep := range staticDeps {
475 linkDeps = append(linkDeps, staticDep.resPackage)
476 linkFlags = append(linkFlags, "-I "+staticDep.resPackage.String())
477 if staticDep.usedResourceProcessor {
478 transitiveRJars = append(transitiveRJars, staticDep.rJar)
479 }
480 }
481 } else {
482 // When building an app or building a library without ResourceProcessorBusyBox enabled all static
483 // dependencies are compiled into this module's package-res.apk as overlays.
484 compiledOverlay = append(compiledOverlay, transitiveStaticLibs...)
485 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700486
Colin Crossbec85302019-02-13 13:15:46 -0800487 if len(transitiveStaticLibs) > 0 {
Colin Cross4aaa84a2018-08-21 15:14:37 -0700488 // If we are using static android libraries, every source file becomes an overlay.
489 // This is to emulate old AAPT behavior which simulated library support.
490 for _, compiledResDir := range compiledResDirs {
491 compiledOverlay = append(compiledOverlay, compiledResDir...)
492 }
Colin Crossbec85302019-02-13 13:15:46 -0800493 } else if a.isLibrary {
494 // Otherwise, for a static library we treat all the resources equally with no overlay.
495 for _, compiledResDir := range compiledResDirs {
496 compiledRes = append(compiledRes, compiledResDir...)
497 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700498 } else if len(compiledResDirs) > 0 {
499 // Without static libraries, the first directory is our directory, which can then be
500 // overlaid by the rest.
501 compiledRes = append(compiledRes, compiledResDirs[0]...)
502 for _, compiledResDir := range compiledResDirs[1:] {
503 compiledOverlay = append(compiledOverlay, compiledResDir...)
504 }
505 }
506
Colin Crossa97c5d32018-03-28 14:58:31 -0700507 for _, dir := range overlayDirs {
Jihoon Kang98ea8362024-07-16 18:20:03 +0000508 compiledOverlay = append(compiledOverlay, aapt2Compile(ctx, dir.dir, dir.files,
509 compileFlags, a.filterProduct(), opts.aconfigTextFiles).Paths()...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700510 }
511
Colin Crosse560c4a2019-03-19 16:03:11 -0700512 var splitPackages android.WritablePaths
513 var splits []split
514
515 for _, s := range a.splitNames {
516 suffix := strings.Replace(s, ",", "_", -1)
517 path := android.PathForModuleOut(ctx, "package_"+suffix+".apk")
518 linkFlags = append(linkFlags, "--split", path.String()+":"+s)
519 splitPackages = append(splitPackages, path)
520 splits = append(splits, split{
521 name: s,
522 suffix: suffix,
523 path: path,
524 })
525 }
526
Colin Cross8f1b0332024-01-25 13:39:06 -0800527 if !a.useResourceProcessorBusyBox(ctx) {
Colin Crossf3b7bad2023-08-02 15:49:00 -0700528 // the subdir "android" is required to be filtered by package names
529 srcJar = android.PathForModuleGen(ctx, "android", "R.srcjar")
530 }
531
Colin Crossab8d1382023-07-14 17:23:41 +0000532 // No need to specify assets from dependencies to aapt2Link for libraries, all transitive assets will be
533 // provided to the final app aapt2Link step.
534 var transitiveAssets android.Paths
535 if !a.isLibrary {
536 transitiveAssets = android.ReverseSliceInPlace(staticDeps.assets())
537 }
Colin Crossf3b7bad2023-08-02 15:49:00 -0700538 aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt,
Jihoon Kang84b25892023-12-01 22:01:06 +0000539 linkFlags, linkDeps, compiledRes, compiledOverlay, transitiveAssets, splitPackages,
540 opts.aconfigTextFiles)
Colin Crossa6182ab2024-08-21 10:47:44 -0700541 ctx.CheckbuildFile(packageRes)
542
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800543 // Extract assets from the resource package output so that they can be used later in aapt2link
544 // for modules that depend on this one.
Colin Crossab8d1382023-07-14 17:23:41 +0000545 if android.PrefixInList(linkFlags, "-A ") {
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800546 assets := android.PathForModuleOut(ctx, "assets.zip")
547 ctx.Build(pctx, android.BuildParams{
548 Rule: extractAssetsRule,
549 Input: packageRes,
550 Output: assets,
551 Description: "extract assets from built resource file",
552 })
553 a.assetPackage = android.OptionalPathForPath(assets)
554 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700555
Colin Cross8f1b0332024-01-25 13:39:06 -0800556 if a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700557 rJar := android.PathForModuleOut(ctx, "busybox/R.jar")
Rico Winda2fa2632024-03-13 13:09:17 +0100558 resourceProcessorBusyBoxGenerateBinaryR(ctx, rTxt, a.mergedManifestFile, rJar, staticDeps, a.isLibrary, a.aaptProperties.Aaptflags,
559 opts.forceNonFinalResourceIDs)
Colin Crossf3b7bad2023-08-02 15:49:00 -0700560 aapt2ExtractExtraPackages(ctx, extraPackages, rJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700561 transitiveRJars = append(transitiveRJars, rJar)
562 a.rJar = rJar
Colin Crossf3b7bad2023-08-02 15:49:00 -0700563 } else {
564 aapt2ExtractExtraPackages(ctx, extraPackages, srcJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700565 }
566
Colin Cross312634e2023-11-21 15:13:56 -0800567 transitiveAaptResourcePackages := staticDeps.resPackages().Strings()
568 transitiveAaptResourcePackages = slices.DeleteFunc(transitiveAaptResourcePackages, func(p string) bool {
569 return p == packageRes.String()
570 })
571 transitiveAaptResourcePackagesFile := android.PathForModuleOut(ctx, "transitive-res-packages")
572 android.WriteFileRule(ctx, transitiveAaptResourcePackagesFile, strings.Join(transitiveAaptResourcePackages, "\n"))
573
Colin Cross1d3f5902024-03-05 11:51:54 -0800574 // Reverse the list of R.jar files so that the current module comes first, and direct dependencies come before
575 // transitive dependencies.
576 transitiveRJars = android.ReversePaths(transitiveRJars)
577
Colin Crossa97c5d32018-03-28 14:58:31 -0700578 a.aaptSrcJar = srcJar
Colin Cross4eae06d2023-06-20 22:40:02 -0700579 a.transitiveAaptRJars = transitiveRJars
Colin Cross312634e2023-11-21 15:13:56 -0800580 a.transitiveAaptResourcePackagesFile = transitiveAaptResourcePackagesFile
Colin Crossa97c5d32018-03-28 14:58:31 -0700581 a.exportPackage = packageRes
582 a.manifestPath = manifestPath
583 a.proguardOptionsFile = proguardOptionsFile
Colin Cross66f78822018-05-02 12:58:28 -0700584 a.extraAaptPackagesFile = extraPackages
Colin Crossa97c5d32018-03-28 14:58:31 -0700585 a.rTxt = rTxt
Colin Crosse560c4a2019-03-19 16:03:11 -0700586 a.splits = splits
Colin Crossab8d1382023-07-14 17:23:41 +0000587 a.resourcesNodesDepSet = android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL).
588 Direct(&resourcesNode{
589 resPackage: a.exportPackage,
590 manifest: a.manifestPath,
591 additionalManifests: additionalManifests,
Colin Cross4eae06d2023-06-20 22:40:02 -0700592 rTxt: a.rTxt,
593 rJar: a.rJar,
Colin Crossab8d1382023-07-14 17:23:41 +0000594 assets: a.assetPackage,
Colin Cross4eae06d2023-06-20 22:40:02 -0700595
Colin Cross8f1b0332024-01-25 13:39:06 -0800596 usedResourceProcessor: a.useResourceProcessorBusyBox(ctx),
Colin Crossab8d1382023-07-14 17:23:41 +0000597 }).
598 Transitive(staticResourcesNodesDepSet).Build()
599 a.rroDirsDepSet = android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL).
600 Direct(rroDirs...).
601 Transitive(staticRRODirsDepSet).Build()
602 a.manifestsDepSet = android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).
603 Direct(a.manifestPath).
604 DirectSlice(additionalManifests).
605 Transitive(staticManifestsDepSet).Build()
606}
607
Colin Cross4eae06d2023-06-20 22:40:02 -0700608var resourceProcessorBusyBox = pctx.AndroidStaticRule("resourceProcessorBusyBox",
609 blueprint.RuleParams{
610 Command: "${config.JavaCmd} -cp ${config.ResourceProcessorBusyBox} " +
611 "com.google.devtools.build.android.ResourceProcessorBusyBox --tool=GENERATE_BINARY_R -- @${out}.args && " +
612 "if cmp -s ${out}.tmp ${out} ; then rm ${out}.tmp ; else mv ${out}.tmp ${out}; fi",
613 CommandDeps: []string{"${config.ResourceProcessorBusyBox}"},
614 Rspfile: "${out}.args",
615 RspfileContent: "--primaryRTxt ${rTxt} --primaryManifest ${manifest} --classJarOutput ${out}.tmp ${args}",
616 Restat: true,
617 }, "rTxt", "manifest", "args")
618
619// resourceProcessorBusyBoxGenerateBinaryR converts the R.txt file produced by aapt2 into R.class files
620// using Bazel's ResourceProcessorBusyBox tool, which is faster than compiling the R.java files and
621// supports producing classes for static dependencies that only include resources from that dependency.
622func resourceProcessorBusyBoxGenerateBinaryR(ctx android.ModuleContext, rTxt, manifest android.Path,
Rico Winda2fa2632024-03-13 13:09:17 +0100623 rJar android.WritablePath, transitiveDeps transitiveAarDeps, isLibrary bool, aaptFlags []string,
624 forceNonFinalIds bool) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700625
626 var args []string
627 var deps android.Paths
628
629 if !isLibrary {
630 // When compiling an app, pass all R.txt and AndroidManifest.xml from transitive static library dependencies
631 // to ResourceProcessorBusyBox so that it can regenerate R.class files with the final resource IDs for each
632 // package.
633 args, deps = transitiveDeps.resourceProcessorDeps()
Rico Winda2fa2632024-03-13 13:09:17 +0100634 if forceNonFinalIds {
635 args = append(args, "--finalFields=false")
636 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700637 } else {
638 // When compiling a library don't pass any dependencies as it only needs to generate an R.class file for this
639 // library. Pass --finalFields=false so that the R.class file contains non-final fields so they don't get
640 // inlined into the library before the final IDs are assigned during app compilation.
641 args = append(args, "--finalFields=false")
642 }
643
Colin Crossd3f7d1a2024-01-03 19:42:25 -0800644 for i, arg := range aaptFlags {
645 const AAPT_CUSTOM_PACKAGE = "--custom-package"
646 if strings.HasPrefix(arg, AAPT_CUSTOM_PACKAGE) {
647 pkg := strings.TrimSpace(strings.TrimPrefix(arg, AAPT_CUSTOM_PACKAGE))
648 if pkg == "" && i+1 < len(aaptFlags) {
649 pkg = aaptFlags[i+1]
650 }
651 args = append(args, "--packageForR "+pkg)
652 }
653 }
654
Colin Cross4eae06d2023-06-20 22:40:02 -0700655 deps = append(deps, rTxt, manifest)
656
657 ctx.Build(pctx, android.BuildParams{
658 Rule: resourceProcessorBusyBox,
659 Output: rJar,
660 Implicits: deps,
661 Description: "ResourceProcessorBusyBox",
662 Args: map[string]string{
663 "rTxt": rTxt.String(),
664 "manifest": manifest.String(),
665 "args": strings.Join(args, " "),
666 },
667 })
668}
669
Colin Crossab8d1382023-07-14 17:23:41 +0000670type resourcesNode struct {
671 resPackage android.Path
672 manifest android.Path
673 additionalManifests android.Paths
Colin Cross4eae06d2023-06-20 22:40:02 -0700674 rTxt android.Path
675 rJar android.Path
Colin Crossab8d1382023-07-14 17:23:41 +0000676 assets android.OptionalPath
Colin Cross4eae06d2023-06-20 22:40:02 -0700677
678 usedResourceProcessor bool
Colin Crossab8d1382023-07-14 17:23:41 +0000679}
680
681type transitiveAarDeps []*resourcesNode
682
683func (t transitiveAarDeps) resPackages() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700684 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000685 for _, dep := range t {
686 paths = append(paths, dep.resPackage)
687 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700688 return paths
Colin Crossab8d1382023-07-14 17:23:41 +0000689}
690
691func (t transitiveAarDeps) manifests() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700692 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000693 for _, dep := range t {
694 paths = append(paths, dep.manifest)
695 paths = append(paths, dep.additionalManifests...)
696 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700697 return paths
698}
699
700func (t transitiveAarDeps) resourceProcessorDeps() (args []string, deps android.Paths) {
701 for _, dep := range t {
702 args = append(args, "--library="+dep.rTxt.String()+","+dep.manifest.String())
703 deps = append(deps, dep.rTxt, dep.manifest)
704 }
705 return args, deps
Colin Crossab8d1382023-07-14 17:23:41 +0000706}
707
708func (t transitiveAarDeps) assets() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700709 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000710 for _, dep := range t {
711 if dep.assets.Valid() {
712 paths = append(paths, dep.assets.Path())
713 }
714 }
715 return paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700716}
717
718// aaptLibs collects libraries from dependencies and sdk_version and converts them into paths
Jiakai Zhang36937082024-04-15 11:15:50 +0000719func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext,
720 classLoaderContexts dexpreopt.ClassLoaderContextMap, usesLibrary *usesLibrary) (
Colin Cross8676c8c2023-10-12 15:58:57 -0700721 staticResourcesNodes, sharedResourcesNodes *android.DepSet[*resourcesNode], staticRRODirs *android.DepSet[rroDir],
Colin Crossab8d1382023-07-14 17:23:41 +0000722 staticManifests *android.DepSet[android.Path], sharedLibs android.Paths, flags []string) {
Colin Crossa97c5d32018-03-28 14:58:31 -0700723
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100724 if classLoaderContexts == nil {
Ulya Trafimovich18554242020-11-03 15:55:11 +0000725 // Not all callers need to compute class loader context, those who don't just pass nil.
726 // Create a temporary class loader context here (it will be computed, but not used).
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100727 classLoaderContexts = make(dexpreopt.ClassLoaderContextMap)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000728 }
729
Colin Cross83bb3162018-06-25 15:48:06 -0700730 sdkDep := decodeSdkDep(ctx, sdkContext)
Colin Crossa97c5d32018-03-28 14:58:31 -0700731 if sdkDep.useFiles {
Colin Cross86a60ae2018-05-29 14:44:55 -0700732 sharedLibs = append(sharedLibs, sdkDep.jars...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700733 }
734
Colin Cross8676c8c2023-10-12 15:58:57 -0700735 var staticResourcesNodeDepSets []*android.DepSet[*resourcesNode]
736 var sharedResourcesNodeDepSets []*android.DepSet[*resourcesNode]
Colin Crossab8d1382023-07-14 17:23:41 +0000737 rroDirsDepSetBuilder := android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL)
738 manifestsDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
739
Colin Crossa97c5d32018-03-28 14:58:31 -0700740 ctx.VisitDirectDeps(func(module android.Module) {
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000741 depTag := ctx.OtherModuleDependencyTag(module)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000742
Colin Crossa97c5d32018-03-28 14:58:31 -0700743 var exportPackage android.Path
Colin Cross66f78822018-05-02 12:58:28 -0700744 aarDep, _ := module.(AndroidLibraryDependency)
745 if aarDep != nil {
Colin Crossa97c5d32018-03-28 14:58:31 -0700746 exportPackage = aarDep.ExportPackage()
747 }
748
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000749 switch depTag {
Colin Cross4b964c02018-10-15 16:18:06 -0700750 case instrumentationForTag:
751 // Nothing, instrumentationForTag is treated as libTag for javac but not for aapt2.
Liz Kammeref28a4c2022-09-23 16:50:56 -0400752 case sdkLibTag, libTag:
Colin Cross5446e882019-05-22 10:46:27 -0700753 if exportPackage != nil {
Colin Cross8676c8c2023-10-12 15:58:57 -0700754 sharedResourcesNodeDepSets = append(sharedResourcesNodeDepSets, aarDep.ResourcesNodeDepSet())
Colin Cross5446e882019-05-22 10:46:27 -0700755 sharedLibs = append(sharedLibs, exportPackage)
756 }
Colin Cross5446e882019-05-22 10:46:27 -0700757 case frameworkResTag:
Colin Crossa97c5d32018-03-28 14:58:31 -0700758 if exportPackage != nil {
759 sharedLibs = append(sharedLibs, exportPackage)
760 }
761 case staticLibTag:
762 if exportPackage != nil {
Colin Cross8676c8c2023-10-12 15:58:57 -0700763 staticResourcesNodeDepSets = append(staticResourcesNodeDepSets, aarDep.ResourcesNodeDepSet())
Colin Crossab8d1382023-07-14 17:23:41 +0000764 rroDirsDepSetBuilder.Transitive(aarDep.RRODirsDepSet())
765 manifestsDepSetBuilder.Transitive(aarDep.ManifestsDepSet())
Colin Crossa97c5d32018-03-28 14:58:31 -0700766 }
767 }
Ulya Trafimovich18554242020-11-03 15:55:11 +0000768
Ulya Trafimovich88bb6f62020-12-16 16:16:11 +0000769 addCLCFromDep(ctx, module, classLoaderContexts)
Jiakai Zhang36937082024-04-15 11:15:50 +0000770 if usesLibrary != nil {
771 addMissingOptionalUsesLibsFromDep(ctx, module, usesLibrary)
772 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700773 })
774
Colin Crossab8d1382023-07-14 17:23:41 +0000775 // AAPT2 overlays are in lowest to highest priority order, the topological order will be reversed later.
776 // Reverse the dependency order now going into the depset so that it comes out in order after the second
777 // reverse later.
778 // NOTE: this is legacy and probably incorrect behavior, for most other cases (e.g. conflicting classes in
779 // dependencies) the highest priority dependency is listed first, but for resources the highest priority
Colin Cross9055e212024-03-23 04:43:41 +0000780 // dependency has to be listed last. This is also inconsistent with the way manifests from the same
781 // transitive dependencies are merged.
Colin Crossab8d1382023-07-14 17:23:41 +0000782 staticResourcesNodes = android.NewDepSet(android.TOPOLOGICAL, nil,
Colin Cross8676c8c2023-10-12 15:58:57 -0700783 android.ReverseSliceInPlace(staticResourcesNodeDepSets))
784 sharedResourcesNodes = android.NewDepSet(android.TOPOLOGICAL, nil,
785 android.ReverseSliceInPlace(sharedResourcesNodeDepSets))
Colin Crossa97c5d32018-03-28 14:58:31 -0700786
Colin Crossab8d1382023-07-14 17:23:41 +0000787 staticRRODirs = rroDirsDepSetBuilder.Build()
788 staticManifests = manifestsDepSetBuilder.Build()
789
790 if len(staticResourcesNodes.ToList()) > 0 {
Colin Crossa97c5d32018-03-28 14:58:31 -0700791 flags = append(flags, "--auto-add-overlay")
792 }
793
794 for _, sharedLib := range sharedLibs {
795 flags = append(flags, "-I "+sharedLib.String())
796 }
797
Colin Cross8676c8c2023-10-12 15:58:57 -0700798 return staticResourcesNodes, sharedResourcesNodes, staticRRODirs, staticManifests, sharedLibs, flags
Colin Crossa97c5d32018-03-28 14:58:31 -0700799}
800
801type AndroidLibrary struct {
802 Library
803 aapt
804
805 androidLibraryProperties androidLibraryProperties
806
807 aarFile android.WritablePath
Colin Cross89c31582018-04-30 15:55:11 -0700808}
809
Colin Crossa97c5d32018-03-28 14:58:31 -0700810var _ AndroidLibraryDependency = (*AndroidLibrary)(nil)
811
812func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
Jiakai Zhangf98da192024-04-15 11:15:41 +0000813 a.usesLibrary.deps(ctx, false)
Colin Crossa97c5d32018-03-28 14:58:31 -0700814 a.Module.deps(ctx)
Jiyong Parkf1691d22021-03-29 20:11:58 +0900815 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Paul Duffin250e6192019-06-07 10:44:37 +0100816 if sdkDep.hasFrameworkLibs() {
817 a.aapt.deps(ctx, sdkDep)
Colin Crossa97c5d32018-03-28 14:58:31 -0700818 }
Jihoon Kang9049c272024-03-19 21:57:36 +0000819
820 for _, aconfig_declaration := range a.aaptProperties.Flags_packages {
821 ctx.AddDependency(ctx.Module(), aconfigDeclarationTag, aconfig_declaration)
822 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700823}
824
825func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Crosse4246ab2019-02-05 21:55:21 -0800826 a.aapt.isLibrary = true
Ulya Trafimovich42c7f0d2021-08-17 16:20:29 +0100827 a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx)
Spandan Das0727ba72024-02-13 16:37:43 +0000828 if a.usesLibrary.shouldDisableDexpreopt {
829 a.dexpreopter.disableDexpreopt()
830 }
Jihoon Kang9aef7772024-06-14 23:45:06 +0000831 aconfigTextFilePaths := getAconfigFilePaths(ctx)
Alixf7a10272023-09-27 16:47:56 +0000832 a.aapt.buildActions(ctx,
833 aaptBuildActionOptions{
834 sdkContext: android.SdkContext(a),
835 classLoaderContexts: a.classLoaderContexts,
836 enforceDefaultTargetSdkVersion: false,
Jihoon Kang9aef7772024-06-14 23:45:06 +0000837 aconfigTextFiles: aconfigTextFilePaths,
Jiakai Zhang36937082024-04-15 11:15:50 +0000838 usesLibrary: &a.usesLibrary,
Alixf7a10272023-09-27 16:47:56 +0000839 },
840 )
Colin Crossa97c5d32018-03-28 14:58:31 -0700841
Colin Crossff694a82023-12-13 15:54:49 -0800842 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
843 a.hideApexVariantFromMake = !apexInfo.IsForPlatform()
Colin Cross56a83212020-09-15 18:30:11 -0700844
yangbill2af0b6e2024-03-15 09:29:29 +0000845 a.stem = proptools.StringDefault(a.overridableProperties.Stem, ctx.ModuleName())
Jihoon Kang1bfb6f22023-07-01 00:13:47 +0000846
Colin Cross4eae06d2023-06-20 22:40:02 -0700847 ctx.CheckbuildFile(a.aapt.proguardOptionsFile)
848 ctx.CheckbuildFile(a.aapt.exportPackage)
Colin Cross8f1b0332024-01-25 13:39:06 -0800849 if a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700850 ctx.CheckbuildFile(a.aapt.rJar)
Colin Crossf3b7bad2023-08-02 15:49:00 -0700851 } else {
852 ctx.CheckbuildFile(a.aapt.aaptSrcJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700853 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700854
855 // apps manifests are handled by aapt, don't let Module see them
856 a.properties.Manifest = nil
857
Colin Cross014489c2020-06-02 20:09:13 -0700858 a.linter.mergedManifest = a.aapt.mergedManifestFile
859 a.linter.manifest = a.aapt.manifestPath
860 a.linter.resources = a.aapt.resourceFiles
861
Sam Delmericoc8e040c2023-10-31 17:27:02 +0000862 proguardSpecInfo := a.collectProguardSpecInfo(ctx)
Colin Cross40213022023-12-13 15:19:49 -0800863 android.SetProvider(ctx, ProguardSpecInfoProvider, proguardSpecInfo)
Colin Cross312634e2023-11-21 15:13:56 -0800864 exportedProguardFlagsFiles := proguardSpecInfo.ProguardFlagsFiles.ToList()
865 a.extraProguardFlagsFiles = append(a.extraProguardFlagsFiles, exportedProguardFlagsFiles...)
866 a.extraProguardFlagsFiles = append(a.extraProguardFlagsFiles, a.proguardOptionsFile)
867
868 combinedExportedProguardFlagFile := android.PathForModuleOut(ctx, "export_proguard_flags")
869 writeCombinedProguardFlagsFile(ctx, combinedExportedProguardFlagFile, exportedProguardFlagsFiles)
870 a.combinedExportedProguardFlagsFile = combinedExportedProguardFlagFile
Colin Crossa97c5d32018-03-28 14:58:31 -0700871
Colin Cross4eae06d2023-06-20 22:40:02 -0700872 var extraSrcJars android.Paths
873 var extraCombinedJars android.Paths
874 var extraClasspathJars android.Paths
Colin Cross8f1b0332024-01-25 13:39:06 -0800875 if a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700876 // When building a library with ResourceProcessorBusyBox enabled ResourceProcessorBusyBox for this
877 // library and each of the transitive static android_library dependencies has already created an
878 // R.class file for the appropriate package. Add all of those R.class files to the classpath.
879 extraClasspathJars = a.transitiveAaptRJars
880 } else {
881 // When building a library without ResourceProcessorBusyBox the aapt2 rule creates R.srcjar containing
882 // R.java files for the library's package and the packages from all transitive static android_library
883 // dependencies. Compile the srcjar alongside the rest of the sources.
884 extraSrcJars = android.Paths{a.aapt.aaptSrcJar}
885 }
886
887 a.Module.compile(ctx, extraSrcJars, extraClasspathJars, extraCombinedJars)
Colin Crossa97c5d32018-03-28 14:58:31 -0700888
Colin Crossf57c5782019-01-25 13:20:38 -0800889 a.aarFile = android.PathForModuleOut(ctx, ctx.ModuleName()+".aar")
Colin Crossa97c5d32018-03-28 14:58:31 -0700890 var res android.Paths
891 if a.androidLibraryProperties.BuildAAR {
892 BuildAAR(ctx, a.aarFile, a.outputFile, a.manifestPath, a.rTxt, res)
Colin Crossa97c5d32018-03-28 14:58:31 -0700893 }
Colin Cross89c31582018-04-30 15:55:11 -0700894
Sam Delmerico82602492022-06-10 17:05:42 +0000895 prebuiltJniPackages := android.Paths{}
896 ctx.VisitDirectDeps(func(module android.Module) {
Colin Cross313aa542023-12-13 13:47:44 -0800897 if info, ok := android.OtherModuleProvider(ctx, module, JniPackageProvider); ok {
Sam Delmerico82602492022-06-10 17:05:42 +0000898 prebuiltJniPackages = append(prebuiltJniPackages, info.JniPackages...)
899 }
900 })
901 if len(prebuiltJniPackages) > 0 {
Colin Cross40213022023-12-13 15:19:49 -0800902 android.SetProvider(ctx, JniPackageProvider, JniPackageInfo{
Sam Delmerico82602492022-06-10 17:05:42 +0000903 JniPackages: prebuiltJniPackages,
904 })
905 }
Jihoon Kang9aef7772024-06-14 23:45:06 +0000906
907 android.SetProvider(ctx, FlagsPackagesProvider, FlagsPackages{
908 AconfigTextFiles: aconfigTextFilePaths,
909 })
mrziwang9f7b9f42024-07-10 12:18:06 -0700910
911 a.setOutputFiles(ctx)
912}
913
914func (a *AndroidLibrary) setOutputFiles(ctx android.ModuleContext) {
915 ctx.SetOutputFiles([]android.Path{a.aarFile}, ".aar")
916 setOutputFiles(ctx, a.Library.Module)
Colin Crossa97c5d32018-03-28 14:58:31 -0700917}
918
Cole Faustb36d31d2024-08-27 16:04:28 -0700919func (a *AndroidLibrary) IDEInfo(ctx android.BaseModuleContext, dpInfo *android.IdeInfo) {
920 a.Library.IDEInfo(ctx, dpInfo)
921 a.aapt.IDEInfo(ctx, dpInfo)
Colin Cross95b53b82023-10-17 13:21:02 -0700922}
923
Cole Faustb36d31d2024-08-27 16:04:28 -0700924func (a *aapt) IDEInfo(ctx android.BaseModuleContext, dpInfo *android.IdeInfo) {
Colin Cross8f1b0332024-01-25 13:39:06 -0800925 if a.rJar != nil {
Colin Cross95b53b82023-10-17 13:21:02 -0700926 dpInfo.Jars = append(dpInfo.Jars, a.rJar.String())
927 }
928}
929
Colin Cross1b16b0e2019-02-12 14:41:32 -0800930// android_library builds and links sources into a `.jar` file for the device along with Android resources.
931//
932// An android_library has a single variant that produces a `.jar` file containing `.class` files that were
Sam Delmerico82602492022-06-10 17:05:42 +0000933// compiled against the device bootclasspath, along with a `package-res.apk` file containing Android resources compiled
Colin Cross1b16b0e2019-02-12 14:41:32 -0800934// with aapt2. This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
935// an android_app module.
Colin Crossa97c5d32018-03-28 14:58:31 -0700936func AndroidLibraryFactory() android.Module {
937 module := &AndroidLibrary{}
938
Colin Crossce6734e2020-06-15 16:09:53 -0700939 module.Module.addHostAndDeviceProperties()
Colin Crossa97c5d32018-03-28 14:58:31 -0700940 module.AddProperties(
Colin Crossa97c5d32018-03-28 14:58:31 -0700941 &module.aaptProperties,
Ronald Braunsteincdc66f42024-04-12 11:23:19 -0700942 &module.androidLibraryProperties,
943 &module.sourceProperties)
Colin Crossa97c5d32018-03-28 14:58:31 -0700944
945 module.androidLibraryProperties.BuildAAR = true
Colin Cross014489c2020-06-02 20:09:13 -0700946 module.Module.linter.library = true
Colin Crossa97c5d32018-03-28 14:58:31 -0700947
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900948 android.InitApexModule(module)
Colin Cross48de9a42018-10-02 13:53:33 -0700949 InitJavaModule(module, android.DeviceSupported)
Colin Crossa97c5d32018-03-28 14:58:31 -0700950 return module
951}
952
Colin Crossfabb6082018-02-20 17:22:23 -0800953//
954// AAR (android library) prebuilts
955//
Colin Crossfabb6082018-02-20 17:22:23 -0800956
Vinh Trance0781f2022-04-13 01:30:44 +0000957// Properties for android_library_import
Colin Crossfabb6082018-02-20 17:22:23 -0800958type AARImportProperties struct {
Vinh Trance0781f2022-04-13 01:30:44 +0000959 // ARR (android library prebuilt) filepath. Exactly one ARR is required.
Colin Cross27b922f2019-03-04 22:35:41 -0800960 Aars []string `android:"path"`
Vinh Trance0781f2022-04-13 01:30:44 +0000961 // If not blank, set to the version of the sdk to compile against.
962 // Defaults to private.
963 // Values are of one of the following forms:
964 // 1) numerical API level, "current", "none", or "core_platform"
965 // 2) An SDK kind with an API level: "<sdk kind>_<API level>"
966 // See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds.
967 // If the SDK kind is empty, it will be set to public
968 Sdk_version *string
969 // If not blank, set the minimum version of the sdk that the compiled artifacts will run against.
970 // Defaults to sdk_version if not set. See sdk_version for possible values.
Colin Cross479884c2018-07-10 13:39:30 -0700971 Min_sdk_version *string
Vinh Trance0781f2022-04-13 01:30:44 +0000972 // List of java static libraries that the included ARR (android library prebuilts) has dependencies to.
Colin Crossa97c5d32018-03-28 14:58:31 -0700973 Static_libs []string
Vinh Trance0781f2022-04-13 01:30:44 +0000974 // List of java libraries that the included ARR (android library prebuilts) has dependencies to.
975 Libs []string
976 // If set to true, run Jetifier against .aar file. Defaults to false.
Colin Cross1001a792019-03-21 22:21:39 -0700977 Jetifier *bool
Sam Delmerico82602492022-06-10 17:05:42 +0000978 // If true, extract JNI libs from AAR archive. These libs will be accessible to android_app modules and
979 // will be passed transitively through android_libraries to an android_app.
980 //TODO(b/241138093) evaluate whether we can have this flag default to true for Bazel conversion
981 Extract_jni *bool
Colin Cross21ed4692024-04-24 20:23:38 +0000982
983 // If set, overrides the manifest extracted from the AAR with the provided path.
984 Manifest *string `android:"path"`
Colin Crossfabb6082018-02-20 17:22:23 -0800985}
986
987type AARImport struct {
988 android.ModuleBase
Colin Cross48de9a42018-10-02 13:53:33 -0700989 android.DefaultableModuleBase
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900990 android.ApexModuleBase
Colin Crossfabb6082018-02-20 17:22:23 -0800991 prebuilt android.Prebuilt
992
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900993 // Functionality common to Module and Import.
994 embeddableInModuleAndImport
995
Colin Cross9ffaf282024-08-12 13:50:09 -0700996 providesTransitiveHeaderJarsForR8
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500997
Colin Crossfabb6082018-02-20 17:22:23 -0800998 properties AARImportProperties
999
Colin Cross7707b242024-07-26 12:02:36 -07001000 headerJarFile android.Path
1001 implementationJarFile android.Path
1002 implementationAndResourcesJarFile android.Path
1003 proguardFlags android.Path
1004 exportPackage android.Path
Colin Cross312634e2023-11-21 15:13:56 -08001005 transitiveAaptResourcePackagesFile android.Path
Colin Cross7707b242024-07-26 12:02:36 -07001006 extraAaptPackagesFile android.Path
Colin Cross21ed4692024-04-24 20:23:38 +00001007 manifest android.Path
Colin Cross7707b242024-07-26 12:02:36 -07001008 assetsPackage android.Path
1009 rTxt android.Path
1010 rJar android.Path
Colin Cross66f78822018-05-02 12:58:28 -07001011
Colin Crossab8d1382023-07-14 17:23:41 +00001012 resourcesNodesDepSet *android.DepSet[*resourcesNode]
1013 manifestsDepSet *android.DepSet[android.Path]
Colin Cross56a83212020-09-15 18:30:11 -07001014
1015 hideApexVariantFromMake bool
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001016
Sam Delmerico82602492022-06-10 17:05:42 +00001017 aarPath android.Path
1018 jniPackages android.Paths
Jiyong Park92315372021-04-02 08:45:46 +09001019
1020 sdkVersion android.SdkSpec
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001021 minSdkVersion android.ApiLevel
LaMont Jonesafe7baf2024-01-09 22:47:39 +00001022
Colin Cross9055e212024-03-23 04:43:41 +00001023 usesLibrary
1024 classLoaderContexts dexpreopt.ClassLoaderContextMap
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001025}
1026
Jiyong Park92315372021-04-02 08:45:46 +09001027func (a *AARImport) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
1028 return android.SdkSpecFrom(ctx, String(a.properties.Sdk_version))
Colin Cross83bb3162018-06-25 15:48:06 -07001029}
1030
Jiyong Parkf1691d22021-03-29 20:11:58 +09001031func (a *AARImport) SystemModules() string {
Paul Duffine25c6442019-10-11 13:50:28 +01001032 return ""
1033}
1034
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001035func (a *AARImport) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
Colin Cross479884c2018-07-10 13:39:30 -07001036 if a.properties.Min_sdk_version != nil {
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001037 return android.ApiLevelFrom(ctx, *a.properties.Min_sdk_version)
Colin Cross479884c2018-07-10 13:39:30 -07001038 }
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001039 return a.SdkVersion(ctx).ApiLevel
Colin Cross83bb3162018-06-25 15:48:06 -07001040}
1041
Spandan Dasa26eda72023-03-02 00:56:06 +00001042func (a *AARImport) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
1043 return android.SdkSpecFrom(ctx, "").ApiLevel
William Loh5a082f92022-05-17 20:21:50 +00001044}
1045
Spandan Dasca70fc42023-03-01 23:38:49 +00001046func (a *AARImport) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
1047 return a.SdkVersion(ctx).ApiLevel
Dan Willemsen419290a2018-10-31 15:28:47 -07001048}
1049
Colin Cross1e743852019-10-28 11:37:20 -07001050func (a *AARImport) javaVersion() string {
1051 return ""
1052}
1053
Colin Crossa97c5d32018-03-28 14:58:31 -07001054var _ AndroidLibraryDependency = (*AARImport)(nil)
1055
1056func (a *AARImport) ExportPackage() android.Path {
1057 return a.exportPackage
1058}
Colin Crossab8d1382023-07-14 17:23:41 +00001059func (a *AARImport) ResourcesNodeDepSet() *android.DepSet[*resourcesNode] {
1060 return a.resourcesNodesDepSet
Colin Crossc1c37552019-01-31 11:42:41 -08001061}
1062
Colin Crossab8d1382023-07-14 17:23:41 +00001063func (a *AARImport) RRODirsDepSet() *android.DepSet[rroDir] {
1064 return android.NewDepSet[rroDir](android.TOPOLOGICAL, nil, nil)
Colin Cross66f78822018-05-02 12:58:28 -07001065}
1066
Colin Crossab8d1382023-07-14 17:23:41 +00001067func (a *AARImport) ManifestsDepSet() *android.DepSet[android.Path] {
1068 return a.manifestsDepSet
Jaewoong Jung6431ca72020-01-15 14:15:10 -08001069}
1070
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001071// RRO enforcement is not available on aar_import since its RRO dirs are not
1072// exported.
1073func (a *AARImport) SetRROEnforcedForDependent(enforce bool) {
1074}
1075
1076// RRO enforcement is not available on aar_import since its RRO dirs are not
1077// exported.
1078func (a *AARImport) IsRROEnforced(ctx android.BaseModuleContext) bool {
1079 return false
1080}
1081
Colin Crossfabb6082018-02-20 17:22:23 -08001082func (a *AARImport) Prebuilt() *android.Prebuilt {
1083 return &a.prebuilt
1084}
1085
1086func (a *AARImport) Name() string {
1087 return a.prebuilt.Name(a.ModuleBase.Name())
1088}
1089
Jiyong Park618922e2020-01-08 13:35:43 +09001090func (a *AARImport) JacocoReportClassesFile() android.Path {
1091 return nil
1092}
1093
Colin Crossfabb6082018-02-20 17:22:23 -08001094func (a *AARImport) DepsMutator(ctx android.BottomUpMutatorContext) {
Jeongik Cha816a23a2020-07-08 01:09:23 +09001095 if !ctx.Config().AlwaysUsePrebuiltSdks() {
Jiyong Parkf1691d22021-03-29 20:11:58 +09001096 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Colin Crossa97c5d32018-03-28 14:58:31 -07001097 if sdkDep.useModule && sdkDep.frameworkResModule != "" {
Colin Cross42d48b72018-08-29 14:10:52 -07001098 ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
Colin Crossfabb6082018-02-20 17:22:23 -08001099 }
1100 }
Colin Crossa97c5d32018-03-28 14:58:31 -07001101
Colin Cross42d48b72018-08-29 14:10:52 -07001102 ctx.AddVariationDependencies(nil, libTag, a.properties.Libs...)
1103 ctx.AddVariationDependencies(nil, staticLibTag, a.properties.Static_libs...)
Colin Cross9055e212024-03-23 04:43:41 +00001104
1105 a.usesLibrary.deps(ctx, false)
Colin Crossfabb6082018-02-20 17:22:23 -08001106}
1107
Sam Delmerico82602492022-06-10 17:05:42 +00001108type JniPackageInfo struct {
1109 // List of zip files containing JNI libraries
1110 // Zip files should have directory structure jni/<arch>/*.so
1111 JniPackages android.Paths
1112}
1113
Colin Crossbc7d76c2023-12-12 16:39:03 -08001114var JniPackageProvider = blueprint.NewProvider[JniPackageInfo]()
Sam Delmerico82602492022-06-10 17:05:42 +00001115
1116// Unzip an AAR and extract the JNI libs for $archString.
1117var extractJNI = pctx.AndroidStaticRule("extractJNI",
1118 blueprint.RuleParams{
1119 Command: `rm -rf $out $outDir && touch $out && ` +
1120 `unzip -qoDD -d $outDir $in "jni/${archString}/*" && ` +
1121 `jni_files=$$(find $outDir/jni -type f) && ` +
1122 // print error message if there are no JNI libs for this arch
1123 `[ -n "$$jni_files" ] || (echo "ERROR: no JNI libs found for arch ${archString}" && exit 1) && ` +
Sam Delmerico80ee45c2023-06-22 15:36:02 -04001124 `${config.SoongZipCmd} -o $out -L 0 -P 'lib/${archString}' ` +
Sam Delmerico82602492022-06-10 17:05:42 +00001125 `-C $outDir/jni/${archString} $$(echo $$jni_files | xargs -n1 printf " -f %s")`,
1126 CommandDeps: []string{"${config.SoongZipCmd}"},
1127 },
1128 "outDir", "archString")
1129
Colin Crossfabb6082018-02-20 17:22:23 -08001130// 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 -07001131// 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 -08001132var unzipAAR = pctx.AndroidStaticRule("unzipAAR",
1133 blueprint.RuleParams{
Dan Willemsen304cfec2019-05-28 14:49:06 -07001134 Command: `rm -rf $outDir && mkdir -p $outDir && ` +
Colin Cross205e9112020-08-06 13:20:17 -07001135 `unzip -qoDD -d $outDir $in && rm -rf $outDir/res && touch $out && ` +
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001136 `${config.Zip2ZipCmd} -i $in -o $assetsPackage 'assets/**/*' && ` +
Colin Cross205e9112020-08-06 13:20:17 -07001137 `${config.MergeZipsCmd} $combinedClassesJar $$(ls $outDir/classes.jar 2> /dev/null) $$(ls $outDir/libs/*.jar 2> /dev/null)`,
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001138 CommandDeps: []string{"${config.MergeZipsCmd}", "${config.Zip2ZipCmd}"},
Colin Crossfabb6082018-02-20 17:22:23 -08001139 },
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001140 "outDir", "combinedClassesJar", "assetsPackage")
Colin Crossfabb6082018-02-20 17:22:23 -08001141
1142func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1143 if len(a.properties.Aars) != 1 {
1144 ctx.PropertyErrorf("aars", "exactly one aar is required")
1145 return
1146 }
1147
Jiyong Park92315372021-04-02 08:45:46 +09001148 a.sdkVersion = a.SdkVersion(ctx)
1149 a.minSdkVersion = a.MinSdkVersion(ctx)
1150
Colin Crossff694a82023-12-13 15:54:49 -08001151 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
1152 a.hideApexVariantFromMake = !apexInfo.IsForPlatform()
Colin Cross56a83212020-09-15 18:30:11 -07001153
Nan Zhang4c819fb2018-08-27 18:31:46 -07001154 aarName := ctx.ModuleName() + ".aar"
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001155 a.aarPath = android.PathForModuleSrc(ctx, a.properties.Aars[0])
1156
Colin Cross1001a792019-03-21 22:21:39 -07001157 if Bool(a.properties.Jetifier) {
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001158 inputFile := a.aarPath
Colin Cross77965d92024-08-15 17:11:08 -07001159 jetifierPath := android.PathForModuleOut(ctx, "jetifier", aarName)
1160 TransformJetifier(ctx, jetifierPath, inputFile)
1161 a.aarPath = jetifierPath
Nan Zhang4c819fb2018-08-27 18:31:46 -07001162 }
Colin Crossfabb6082018-02-20 17:22:23 -08001163
Colin Cross607bbd62024-04-12 13:44:45 -07001164 jarName := ctx.ModuleName() + ".jar"
Colin Crossfabb6082018-02-20 17:22:23 -08001165 extractedAARDir := android.PathForModuleOut(ctx, "aar")
Colin Cross607bbd62024-04-12 13:44:45 -07001166 classpathFile := extractedAARDir.Join(ctx, jarName)
Colin Cross21ed4692024-04-24 20:23:38 +00001167
1168 extractedManifest := extractedAARDir.Join(ctx, "AndroidManifest.xml")
1169 providedManifest := android.OptionalPathForModuleSrc(ctx, a.properties.Manifest)
1170 if providedManifest.Valid() {
1171 a.manifest = providedManifest.Path()
1172 } else {
1173 a.manifest = extractedManifest
1174 }
1175
Colin Cross7707b242024-07-26 12:02:36 -07001176 rTxt := extractedAARDir.Join(ctx, "R.txt")
1177 assetsPackage := android.PathForModuleOut(ctx, "assets.zip")
1178 proguardFlags := extractedAARDir.Join(ctx, "proguard.txt")
Colin Crosscde55342024-03-27 14:11:51 -07001179 transitiveProguardFlags, transitiveUnconditionalExportedFlags := collectDepProguardSpecInfo(ctx)
Colin Cross40213022023-12-13 15:19:49 -08001180 android.SetProvider(ctx, ProguardSpecInfoProvider, ProguardSpecInfo{
Sam Delmerico95d70942023-08-02 18:00:35 -04001181 ProguardFlagsFiles: android.NewDepSet[android.Path](
1182 android.POSTORDER,
Colin Cross7707b242024-07-26 12:02:36 -07001183 android.Paths{proguardFlags},
Colin Crosscde55342024-03-27 14:11:51 -07001184 transitiveProguardFlags,
1185 ),
1186 UnconditionallyExportedProguardFlags: android.NewDepSet[android.Path](
1187 android.POSTORDER,
Sam Delmerico95d70942023-08-02 18:00:35 -04001188 nil,
Colin Crosscde55342024-03-27 14:11:51 -07001189 transitiveUnconditionalExportedFlags,
Sam Delmerico95d70942023-08-02 18:00:35 -04001190 ),
1191 })
Colin Crossfabb6082018-02-20 17:22:23 -08001192
1193 ctx.Build(pctx, android.BuildParams{
1194 Rule: unzipAAR,
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001195 Input: a.aarPath,
Colin Cross7707b242024-07-26 12:02:36 -07001196 Outputs: android.WritablePaths{classpathFile, proguardFlags, extractedManifest, assetsPackage, rTxt},
Colin Crossfabb6082018-02-20 17:22:23 -08001197 Description: "unzip AAR",
1198 Args: map[string]string{
Colin Cross205e9112020-08-06 13:20:17 -07001199 "outDir": extractedAARDir.String(),
Colin Cross9055e212024-03-23 04:43:41 +00001200 "combinedClassesJar": classpathFile.String(),
Colin Cross7707b242024-07-26 12:02:36 -07001201 "assetsPackage": assetsPackage.String(),
Colin Crossfabb6082018-02-20 17:22:23 -08001202 },
1203 })
1204
Colin Cross7707b242024-07-26 12:02:36 -07001205 a.proguardFlags = proguardFlags
1206 a.assetsPackage = assetsPackage
1207 a.rTxt = rTxt
1208
Colin Crossa0ba2f52019-06-22 12:59:27 -07001209 // Always set --pseudo-localize, it will be stripped out later for release
1210 // builds that don't want it.
1211 compileFlags := []string{"--pseudo-localize"}
Colin Crossfabb6082018-02-20 17:22:23 -08001212 compiledResDir := android.PathForModuleOut(ctx, "flat-res")
Colin Crossfabb6082018-02-20 17:22:23 -08001213 flata := compiledResDir.Join(ctx, "gen_res.flata")
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001214 aapt2CompileZip(ctx, flata, a.aarPath, "res", compileFlags)
Colin Crossfabb6082018-02-20 17:22:23 -08001215
Colin Cross7707b242024-07-26 12:02:36 -07001216 exportPackage := android.PathForModuleOut(ctx, "package-res.apk")
Colin Crossfabb6082018-02-20 17:22:23 -08001217 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
Colin Crossbb77d8e2024-02-15 14:43:47 -08001218 aaptRTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross7707b242024-07-26 12:02:36 -07001219 extraAaptPackagesFile := android.PathForModuleOut(ctx, "extra_packages")
Colin Crossfabb6082018-02-20 17:22:23 -08001220
1221 var linkDeps android.Paths
1222
1223 linkFlags := []string{
1224 "--static-lib",
Colin Cross4eae06d2023-06-20 22:40:02 -07001225 "--merge-only",
Colin Crossfabb6082018-02-20 17:22:23 -08001226 "--auto-add-overlay",
Colin Cross7c4dc5d2024-02-13 14:29:45 -08001227 "--no-static-lib-packages",
Colin Crossfabb6082018-02-20 17:22:23 -08001228 }
1229
Colin Cross10f7c4a2018-05-23 10:59:28 -07001230 linkFlags = append(linkFlags, "--manifest "+a.manifest.String())
1231 linkDeps = append(linkDeps, a.manifest)
Colin Crossfabb6082018-02-20 17:22:23 -08001232
Colin Cross8676c8c2023-10-12 15:58:57 -07001233 staticResourcesNodesDepSet, sharedResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedLibs, libFlags :=
Jiakai Zhang36937082024-04-15 11:15:50 +00001234 aaptLibs(ctx, android.SdkContext(a), nil, nil)
Colin Cross31656952018-05-24 16:11:20 -07001235
Colin Cross8676c8c2023-10-12 15:58:57 -07001236 _ = sharedResourcesNodesDepSet
Colin Crossab8d1382023-07-14 17:23:41 +00001237 _ = staticRRODirsDepSet
Colin Cross8676c8c2023-10-12 15:58:57 -07001238
Colin Crossab8d1382023-07-14 17:23:41 +00001239 staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
Colin Crossfabb6082018-02-20 17:22:23 -08001240
Colin Crossab8d1382023-07-14 17:23:41 +00001241 linkDeps = append(linkDeps, sharedLibs...)
Colin Cross4eae06d2023-06-20 22:40:02 -07001242 linkDeps = append(linkDeps, staticDeps.resPackages()...)
Colin Crossa97c5d32018-03-28 14:58:31 -07001243 linkFlags = append(linkFlags, libFlags...)
Colin Crossfabb6082018-02-20 17:22:23 -08001244
Colin Cross4eae06d2023-06-20 22:40:02 -07001245 overlayRes := android.Paths{flata}
1246
1247 // Treat static library dependencies of static libraries as imports.
1248 transitiveStaticLibs := staticDeps.resPackages()
1249 linkDeps = append(linkDeps, transitiveStaticLibs...)
1250 for _, staticLib := range transitiveStaticLibs {
1251 linkFlags = append(linkFlags, "-I "+staticLib.String())
1252 }
Colin Crossfabb6082018-02-20 17:22:23 -08001253
Colin Crossab8d1382023-07-14 17:23:41 +00001254 transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets())
Colin Cross7707b242024-07-26 12:02:36 -07001255 aapt2Link(ctx, exportPackage, nil, proguardOptionsFile, aaptRTxt,
Jihoon Kang84b25892023-12-01 22:01:06 +00001256 linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil, nil)
Colin Crossa6182ab2024-08-21 10:47:44 -07001257 ctx.CheckbuildFile(exportPackage)
Colin Cross7707b242024-07-26 12:02:36 -07001258 a.exportPackage = exportPackage
Colin Crossfabb6082018-02-20 17:22:23 -08001259
Colin Cross7707b242024-07-26 12:02:36 -07001260 rJar := android.PathForModuleOut(ctx, "busybox/R.jar")
1261 resourceProcessorBusyBoxGenerateBinaryR(ctx, a.rTxt, a.manifest, rJar, nil, true, nil, false)
Colin Crossa6182ab2024-08-21 10:47:44 -07001262 ctx.CheckbuildFile(rJar)
Colin Cross7707b242024-07-26 12:02:36 -07001263 a.rJar = rJar
Colin Cross4eae06d2023-06-20 22:40:02 -07001264
Colin Cross7707b242024-07-26 12:02:36 -07001265 aapt2ExtractExtraPackages(ctx, extraAaptPackagesFile, a.rJar)
1266 a.extraAaptPackagesFile = extraAaptPackagesFile
Colin Crossf3b7bad2023-08-02 15:49:00 -07001267
Colin Crossab8d1382023-07-14 17:23:41 +00001268 resourcesNodesDepSetBuilder := android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL)
1269 resourcesNodesDepSetBuilder.Direct(&resourcesNode{
1270 resPackage: a.exportPackage,
1271 manifest: a.manifest,
Colin Cross4eae06d2023-06-20 22:40:02 -07001272 rTxt: a.rTxt,
1273 rJar: a.rJar,
Colin Crossab8d1382023-07-14 17:23:41 +00001274 assets: android.OptionalPathForPath(a.assetsPackage),
Colin Cross4eae06d2023-06-20 22:40:02 -07001275
1276 usedResourceProcessor: true,
Colin Crossab8d1382023-07-14 17:23:41 +00001277 })
1278 resourcesNodesDepSetBuilder.Transitive(staticResourcesNodesDepSet)
1279 a.resourcesNodesDepSet = resourcesNodesDepSetBuilder.Build()
1280
1281 manifestDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).Direct(a.manifest)
Colin Cross9055e212024-03-23 04:43:41 +00001282 manifestDepSetBuilder.Transitive(staticManifestsDepSet)
Colin Crossab8d1382023-07-14 17:23:41 +00001283 a.manifestsDepSet = manifestDepSetBuilder.Build()
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001284
Colin Cross312634e2023-11-21 15:13:56 -08001285 transitiveAaptResourcePackages := staticDeps.resPackages().Strings()
1286 transitiveAaptResourcePackages = slices.DeleteFunc(transitiveAaptResourcePackages, func(p string) bool {
1287 return p == a.exportPackage.String()
1288 })
1289 transitiveAaptResourcePackagesFile := android.PathForModuleOut(ctx, "transitive-res-packages")
1290 android.WriteFileRule(ctx, transitiveAaptResourcePackagesFile, strings.Join(transitiveAaptResourcePackages, "\n"))
1291 a.transitiveAaptResourcePackagesFile = transitiveAaptResourcePackagesFile
Colin Cross4eae06d2023-06-20 22:40:02 -07001292
Colin Cross9ffaf282024-08-12 13:50:09 -07001293 a.collectTransitiveHeaderJarsForR8(ctx)
Colin Cross9055e212024-03-23 04:43:41 +00001294
1295 a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx)
1296
1297 var staticJars android.Paths
1298 var staticHeaderJars android.Paths
Colin Cross607bbd62024-04-12 13:44:45 -07001299 var staticResourceJars android.Paths
Colin Cross9055e212024-03-23 04:43:41 +00001300 ctx.VisitDirectDeps(func(module android.Module) {
1301 if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
1302 tag := ctx.OtherModuleDependencyTag(module)
1303 switch tag {
1304 case staticLibTag:
1305 staticJars = append(staticJars, dep.ImplementationJars...)
1306 staticHeaderJars = append(staticHeaderJars, dep.HeaderJars...)
Colin Cross607bbd62024-04-12 13:44:45 -07001307 staticResourceJars = append(staticResourceJars, dep.ResourceJars...)
Colin Cross9055e212024-03-23 04:43:41 +00001308 }
1309 }
1310 addCLCFromDep(ctx, module, a.classLoaderContexts)
Jiakai Zhang36937082024-04-15 11:15:50 +00001311 addMissingOptionalUsesLibsFromDep(ctx, module, &a.usesLibrary)
Colin Cross9055e212024-03-23 04:43:41 +00001312 })
1313
Colin Cross77965d92024-08-15 17:11:08 -07001314 var implementationJarFile android.Path
Colin Cross9055e212024-03-23 04:43:41 +00001315 if len(staticJars) > 0 {
1316 combineJars := append(android.Paths{classpathFile}, staticJars...)
Colin Cross77965d92024-08-15 17:11:08 -07001317 combinedImplementationJar := android.PathForModuleOut(ctx, "combined", jarName).OutputPath
1318 TransformJarsToJar(ctx, combinedImplementationJar, "combine", combineJars, android.OptionalPath{}, false, nil, nil)
1319 implementationJarFile = combinedImplementationJar
Colin Cross9055e212024-03-23 04:43:41 +00001320 } else {
Colin Cross28ac2ff2024-04-02 12:21:34 -07001321 implementationJarFile = classpathFile
Colin Cross9055e212024-03-23 04:43:41 +00001322 }
1323
Colin Cross607bbd62024-04-12 13:44:45 -07001324 var resourceJarFile android.Path
1325 if len(staticResourceJars) > 1 {
1326 combinedJar := android.PathForModuleOut(ctx, "res-combined", jarName)
1327 TransformJarsToJar(ctx, combinedJar, "for resources", staticResourceJars, android.OptionalPath{},
1328 false, nil, nil)
1329 resourceJarFile = combinedJar
1330 } else if len(staticResourceJars) == 1 {
1331 resourceJarFile = staticResourceJars[0]
1332 }
1333
1334 // merge implementation jar with resources if necessary
1335 implementationAndResourcesJar := implementationJarFile
1336 if resourceJarFile != nil {
1337 jars := android.Paths{resourceJarFile, implementationAndResourcesJar}
Colin Cross77965d92024-08-15 17:11:08 -07001338 combinedJar := android.PathForModuleOut(ctx, "withres", jarName)
Colin Cross607bbd62024-04-12 13:44:45 -07001339 TransformJarsToJar(ctx, combinedJar, "for resources", jars, android.OptionalPath{},
1340 false, nil, nil)
1341 implementationAndResourcesJar = combinedJar
1342 }
1343
1344 a.implementationJarFile = implementationJarFile
Colin Cross28ac2ff2024-04-02 12:21:34 -07001345 // 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 -07001346 a.implementationAndResourcesJarFile = implementationAndResourcesJar.WithoutRel()
Colin Cross28ac2ff2024-04-02 12:21:34 -07001347
Colin Cross9055e212024-03-23 04:43:41 +00001348 if len(staticHeaderJars) > 0 {
1349 combineJars := append(android.Paths{classpathFile}, staticHeaderJars...)
Colin Cross7707b242024-07-26 12:02:36 -07001350 headerJarFile := android.PathForModuleOut(ctx, "turbine-combined", jarName)
1351 TransformJarsToJar(ctx, headerJarFile, "combine header jars", combineJars, android.OptionalPath{}, false, nil, nil)
1352 a.headerJarFile = headerJarFile
Colin Cross9055e212024-03-23 04:43:41 +00001353 } else {
1354 a.headerJarFile = classpathFile
1355 }
1356
Colin Crossa6182ab2024-08-21 10:47:44 -07001357 ctx.CheckbuildFile(a.headerJarFile)
1358 ctx.CheckbuildFile(a.implementationJarFile)
1359
Colin Cross7727c7f2024-07-18 15:36:32 -07001360 android.SetProvider(ctx, JavaInfoProvider, &JavaInfo{
Colin Cross9ffaf282024-08-12 13:50:09 -07001361 HeaderJars: android.PathsIfNonNil(a.headerJarFile),
1362 ResourceJars: android.PathsIfNonNil(resourceJarFile),
1363 TransitiveLibsHeaderJarsForR8: a.transitiveLibsHeaderJarsForR8,
1364 TransitiveStaticLibsHeaderJarsForR8: a.transitiveStaticLibsHeaderJarsForR8,
1365 ImplementationAndResourcesJars: android.PathsIfNonNil(a.implementationAndResourcesJarFile),
1366 ImplementationJars: android.PathsIfNonNil(a.implementationJarFile),
1367 StubsLinkType: Implementation,
Joe Onorato6fe59eb2023-07-16 13:20:33 -07001368 // TransitiveAconfigFiles: // TODO(b/289117800): LOCAL_ACONFIG_FILES for prebuilts
Colin Crossdcf71b22021-02-01 13:59:03 -08001369 })
Sam Delmerico82602492022-06-10 17:05:42 +00001370
1371 if proptools.Bool(a.properties.Extract_jni) {
1372 for _, t := range ctx.MultiTargets() {
1373 arch := t.Arch.Abi[0]
1374 path := android.PathForModuleOut(ctx, arch+"_jni.zip")
1375 a.jniPackages = append(a.jniPackages, path)
1376
1377 outDir := android.PathForModuleOut(ctx, "aarForJni")
1378 aarPath := android.PathForModuleSrc(ctx, a.properties.Aars[0])
1379 ctx.Build(pctx, android.BuildParams{
1380 Rule: extractJNI,
1381 Input: aarPath,
1382 Outputs: android.WritablePaths{path},
1383 Description: "extract JNI from AAR",
1384 Args: map[string]string{
1385 "outDir": outDir.String(),
1386 "archString": arch,
1387 },
1388 })
1389 }
Sam Delmerico82602492022-06-10 17:05:42 +00001390 }
Colin Crosse8eeec92023-12-14 14:50:05 -08001391
Colin Cross40213022023-12-13 15:19:49 -08001392 android.SetProvider(ctx, JniPackageProvider, JniPackageInfo{
Colin Crosse8eeec92023-12-14 14:50:05 -08001393 JniPackages: a.jniPackages,
1394 })
mrziwang68786d82024-07-09 10:41:55 -07001395
1396 ctx.SetOutputFiles([]android.Path{a.implementationAndResourcesJarFile}, "")
1397 ctx.SetOutputFiles([]android.Path{a.aarPath}, ".aar")
Colin Crossdcf71b22021-02-01 13:59:03 -08001398}
Colin Crossfabb6082018-02-20 17:22:23 -08001399
1400func (a *AARImport) HeaderJars() android.Paths {
Colin Cross9055e212024-03-23 04:43:41 +00001401 return android.Paths{a.headerJarFile}
Colin Crossfabb6082018-02-20 17:22:23 -08001402}
1403
Colin Cross331a1212018-08-15 20:40:52 -07001404func (a *AARImport) ImplementationAndResourcesJars() android.Paths {
Colin Cross607bbd62024-04-12 13:44:45 -07001405 return android.Paths{a.implementationAndResourcesJarFile}
Colin Cross331a1212018-08-15 20:40:52 -07001406}
1407
Colin Cross9055e212024-03-23 04:43:41 +00001408func (a *AARImport) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath {
1409 return OptionalDexJarPath{}
Colin Crossf24a22a2019-01-31 14:12:44 -08001410}
1411
Ulya Trafimovich9f3052c2020-06-09 14:31:19 +01001412func (a *AARImport) DexJarInstallPath() android.Path {
1413 return nil
1414}
1415
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +01001416func (a *AARImport) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap {
Colin Cross9055e212024-03-23 04:43:41 +00001417 return a.classLoaderContexts
Jiyong Park1be96912018-05-28 18:02:19 +09001418}
1419
Colin Cross9055e212024-03-23 04:43:41 +00001420var _ UsesLibraryDependency = (*AARImport)(nil)
1421
Jiyong Park45bf82e2020-12-15 22:29:02 +09001422var _ android.ApexModule = (*AARImport)(nil)
1423
1424// Implements android.ApexModule
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001425func (a *AARImport) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
1426 return a.depIsInSameApex(ctx, dep)
1427}
1428
Jiyong Park45bf82e2020-12-15 22:29:02 +09001429// Implements android.ApexModule
Colin Cross9055e212024-03-23 04:43:41 +00001430func (a *AARImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
Dan Albertc8060532020-07-22 22:32:17 -07001431 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09001432 return nil
1433}
1434
Sam Delmericoaf8bb702022-07-25 15:39:32 -04001435var _ android.PrebuiltInterface = (*AARImport)(nil)
Colin Crossfabb6082018-02-20 17:22:23 -08001436
Jiakai Zhangf98da192024-04-15 11:15:41 +00001437func (a *AARImport) UsesLibrary() *usesLibrary {
1438 return &a.usesLibrary
1439}
1440
1441var _ ModuleWithUsesLibrary = (*AARImport)(nil)
1442
Colin Cross1b16b0e2019-02-12 14:41:32 -08001443// android_library_import imports an `.aar` file into the build graph as if it was built with android_library.
1444//
1445// This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
1446// an android_app module.
Colin Crossfabb6082018-02-20 17:22:23 -08001447func AARImportFactory() android.Module {
1448 module := &AARImport{}
1449
Colin Cross9055e212024-03-23 04:43:41 +00001450 module.AddProperties(
1451 &module.properties,
1452 &module.usesLibrary.usesLibraryProperties,
1453 )
Colin Crossfabb6082018-02-20 17:22:23 -08001454
1455 android.InitPrebuiltModule(module, &module.properties.Aars)
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001456 android.InitApexModule(module)
Sam Delmerico82602492022-06-10 17:05:42 +00001457 InitJavaModuleMultiTargets(module, android.DeviceSupported)
Colin Crossfabb6082018-02-20 17:22:23 -08001458 return module
1459}
Spandan Dasb08bf772024-08-07 21:55:42 +00001460
Cole Faustb36d31d2024-08-27 16:04:28 -07001461func (a *AARImport) IDEInfo(ctx android.BaseModuleContext, dpInfo *android.IdeInfo) {
Spandan Dasb08bf772024-08-07 21:55:42 +00001462 dpInfo.Jars = append(dpInfo.Jars, a.headerJarFile.String(), a.rJar.String())
1463}