blob: 4691d704d899eec4848af048746a5442a5ea8ab3 [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.
169 !slices.Contains(a.aaptProperties.Aaptflags, "--shared-lib")
Colin Cross4eae06d2023-06-20 22:40:02 -0700170}
171
Inseob Kim34dc4cd2023-11-07 13:37:14 +0900172func (a *aapt) filterProduct() string {
173 return String(a.aaptProperties.Filter_product)
174}
175
Colin Crossa97c5d32018-03-28 14:58:31 -0700176func (a *aapt) ExportPackage() android.Path {
177 return a.exportPackage
178}
Colin Crossab8d1382023-07-14 17:23:41 +0000179func (a *aapt) ResourcesNodeDepSet() *android.DepSet[*resourcesNode] {
180 return a.resourcesNodesDepSet
Colin Crossc1c37552019-01-31 11:42:41 -0800181}
182
Colin Crossab8d1382023-07-14 17:23:41 +0000183func (a *aapt) RRODirsDepSet() *android.DepSet[rroDir] {
184 return a.rroDirsDepSet
Colin Crossc1c37552019-01-31 11:42:41 -0800185}
186
Colin Crossab8d1382023-07-14 17:23:41 +0000187func (a *aapt) ManifestsDepSet() *android.DepSet[android.Path] {
188 return a.manifestsDepSet
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800189}
190
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700191func (a *aapt) SetRROEnforcedForDependent(enforce bool) {
192 a.aaptProperties.RROEnforcedForDependent = enforce
193}
194
195func (a *aapt) IsRROEnforced(ctx android.BaseModuleContext) bool {
196 // True if RRO is enforced for this module or...
197 return ctx.Config().EnforceRROForModule(ctx.ModuleName()) ||
Jeongik Chacee5ba92021-02-19 12:11:51 +0900198 // if RRO is enforced for any of its dependents.
199 a.aaptProperties.RROEnforcedForDependent
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700200}
201
Jiyong Parkf1691d22021-03-29 20:11:58 +0900202func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext android.SdkContext,
Colin Crossa0ba2f52019-06-22 12:59:27 -0700203 manifestPath android.Path) (compileFlags, linkFlags []string, linkDeps android.Paths,
204 resDirs, overlayDirs []globbedResourceDir, rroDirs []rroDir, resZips android.Paths) {
Colin Crossa97c5d32018-03-28 14:58:31 -0700205
Jaewoong Jung3aff5782020-02-11 07:54:35 -0800206 hasVersionCode := android.PrefixInList(a.aaptProperties.Aaptflags, "--version-code")
207 hasVersionName := android.PrefixInList(a.aaptProperties.Aaptflags, "--version-name")
Colin Crossa97c5d32018-03-28 14:58:31 -0700208
Colin Crossa97c5d32018-03-28 14:58:31 -0700209 // Flags specified in Android.bp
210 linkFlags = append(linkFlags, a.aaptProperties.Aaptflags...)
211
Eric Miao40eab202023-03-30 16:57:17 +0000212 linkFlags = append(linkFlags, "--enable-compact-entries")
Colin Crossa97c5d32018-03-28 14:58:31 -0700213
214 // Find implicit or explicit asset and resource dirs
Jiakai Zhangba82e282023-10-13 18:08:59 +0100215 assets := android.PathsRelativeToModuleSourceDir(android.SourceInput{
216 Context: ctx,
217 Paths: a.aaptProperties.Assets,
218 IncludeDirs: false,
219 })
Colin Crossa97c5d32018-03-28 14:58:31 -0700220 assetDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Asset_dirs, "assets")
221 resourceDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res")
Colin Cross8a497952019-03-05 22:25:09 -0800222 resourceZips := android.PathsForModuleSrc(ctx, a.aaptProperties.Resource_zips)
Colin Crossa97c5d32018-03-28 14:58:31 -0700223
Colin Crossa97c5d32018-03-28 14:58:31 -0700224 // Glob directories into lists of paths
225 for _, dir := range resourceDirs {
226 resDirs = append(resDirs, globbedResourceDir{
227 dir: dir,
228 files: androidResourceGlob(ctx, dir),
229 })
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700230 resOverlayDirs, resRRODirs := overlayResourceGlob(ctx, a, dir)
Colin Crossa97c5d32018-03-28 14:58:31 -0700231 overlayDirs = append(overlayDirs, resOverlayDirs...)
232 rroDirs = append(rroDirs, resRRODirs...)
233 }
234
Colin Crossc20dc852020-11-10 12:27:45 -0800235 var assetDeps android.Paths
236 for i, dir := range assetDirs {
237 // Add a dependency on every file in the asset directory. This ensures the aapt2
238 // rule will be rerun if one of the files in the asset directory is modified.
239 assetDeps = append(assetDeps, androidResourceGlob(ctx, dir)...)
240
241 // Add a dependency on a file that contains a list of all the files in the asset directory.
242 // This ensures the aapt2 rule will be run if a file is removed from the asset directory,
243 // or a file is added whose timestamp is older than the output of aapt2.
244 assetFileListFile := android.PathForModuleOut(ctx, "asset_dir_globs", strconv.Itoa(i)+".glob")
245 androidResourceGlobList(ctx, dir, assetFileListFile)
246 assetDeps = append(assetDeps, assetFileListFile)
Colin Crossa97c5d32018-03-28 14:58:31 -0700247 }
248
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700249 assetDirStrings := assetDirs.Strings()
250 if a.noticeFile.Valid() {
251 assetDirStrings = append(assetDirStrings, filepath.Dir(a.noticeFile.Path().String()))
Colin Crossc20dc852020-11-10 12:27:45 -0800252 assetDeps = append(assetDeps, a.noticeFile.Path())
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700253 }
Jiakai Zhangba82e282023-10-13 18:08:59 +0100254 if len(assets) > 0 {
255 // aapt2 doesn't support adding individual asset files. Create a temp directory to hold asset
256 // files and pass it to aapt2.
257 tmpAssetDir := android.PathForModuleOut(ctx, "tmp_asset_dir")
258
259 rule := android.NewRuleBuilder(pctx, ctx)
260 rule.Command().
261 Text("rm -rf").Text(tmpAssetDir.String()).
262 Text("&&").
263 Text("mkdir -p").Text(tmpAssetDir.String())
264
265 for _, asset := range assets {
266 output := tmpAssetDir.Join(ctx, asset.Rel())
267 assetDeps = append(assetDeps, output)
268 rule.Command().Text("mkdir -p").Text(filepath.Dir(output.String()))
269 rule.Command().Text("cp").Input(asset).Output(output)
270 }
271
272 rule.Build("tmp_asset_dir", "tmp_asset_dir")
273
274 assetDirStrings = append(assetDirStrings, tmpAssetDir.String())
275 }
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700276
Colin Crossa97c5d32018-03-28 14:58:31 -0700277 linkFlags = append(linkFlags, "--manifest "+manifestPath.String())
278 linkDeps = append(linkDeps, manifestPath)
279
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700280 linkFlags = append(linkFlags, android.JoinWithPrefix(assetDirStrings, "-A "))
Colin Crossc20dc852020-11-10 12:27:45 -0800281 linkDeps = append(linkDeps, assetDeps...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700282
Spandan Das50885c02023-02-23 21:31:33 +0000283 // Returns the effective version for {min|target}_sdk_version
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000284 effectiveVersionString := func(sdkVersion android.SdkSpec, minSdkVersion android.ApiLevel) string {
Spandan Das50885c02023-02-23 21:31:33 +0000285 // If {min|target}_sdk_version is current, use sdk_version to determine the effective level
286 // This is necessary for vendor modules.
287 // The effective version does not _only_ depend on {min|target}_sdk_version(level),
288 // but also on the sdk_version (kind+level)
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000289 if minSdkVersion.IsCurrent() {
Spandan Das50885c02023-02-23 21:31:33 +0000290 ret, err := sdkVersion.EffectiveVersionString(ctx)
291 if err != nil {
292 ctx.ModuleErrorf("invalid sdk_version: %s", err)
293 }
294 return ret
295 }
296 ret, err := minSdkVersion.EffectiveVersionString(ctx)
297 if err != nil {
298 ctx.ModuleErrorf("invalid min_sdk_version: %s", err)
299 }
300 return ret
Jiyong Park6a927c42020-01-21 02:03:43 +0900301 }
Spandan Das50885c02023-02-23 21:31:33 +0000302 // SDK version flags
303 sdkVersion := sdkContext.SdkVersion(ctx)
304 minSdkVersion := effectiveVersionString(sdkVersion, sdkContext.MinSdkVersion(ctx))
Colin Crossa97c5d32018-03-28 14:58:31 -0700305
Colin Cross83bb3162018-06-25 15:48:06 -0700306 linkFlags = append(linkFlags, "--min-sdk-version "+minSdkVersion)
Spandan Das6450b552023-02-23 19:27:07 +0000307 // Use minSdkVersion for target-sdk-version, even if `target_sdk_version` is set
308 // This behavior has been copied from Make.
Colin Cross83bb3162018-06-25 15:48:06 -0700309 linkFlags = append(linkFlags, "--target-sdk-version "+minSdkVersion)
Colin Crossa97c5d32018-03-28 14:58:31 -0700310
Colin Crossa97c5d32018-03-28 14:58:31 -0700311 // Version code
312 if !hasVersionCode {
Dan Albert4f378d72020-07-23 17:32:15 -0700313 linkFlags = append(linkFlags, "--version-code", ctx.Config().PlatformSdkVersion().String())
Colin Crossa97c5d32018-03-28 14:58:31 -0700314 }
315
316 if !hasVersionName {
Colin Cross402d5e02018-04-25 14:54:06 -0700317 var versionName string
Rashed Abdel-Tawab5b948ab2018-08-09 14:08:53 -0700318 if ctx.ModuleName() == "framework-res" || ctx.ModuleName() == "omnirom-res" {
Colin Cross402d5e02018-04-25 14:54:06 -0700319 // Some builds set AppsDefaultVersionName() to include the build number ("O-123456"). aapt2 copies the
320 // version name of framework-res into app manifests as compileSdkVersionCodename, which confuses things
Colin Crossbfd347d2018-05-09 11:11:35 -0700321 // if it contains the build number. Use the PlatformVersionName instead.
322 versionName = ctx.Config().PlatformVersionName()
Colin Cross402d5e02018-04-25 14:54:06 -0700323 } else {
324 versionName = ctx.Config().AppsDefaultVersionName()
325 }
Colin Cross0b9f31f2019-02-28 11:00:01 -0800326 versionName = proptools.NinjaEscape(versionName)
Colin Crossa97c5d32018-03-28 14:58:31 -0700327 linkFlags = append(linkFlags, "--version-name ", versionName)
328 }
329
Colin Crossa0ba2f52019-06-22 12:59:27 -0700330 linkFlags, compileFlags = android.FilterList(linkFlags, []string{"--legacy"})
331
332 // Always set --pseudo-localize, it will be stripped out later for release
333 // builds that don't want it.
334 compileFlags = append(compileFlags, "--pseudo-localize")
335
336 return compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resourceZips
Colin Crossa97c5d32018-03-28 14:58:31 -0700337}
338
Paul Duffin250e6192019-06-07 10:44:37 +0100339func (a *aapt) deps(ctx android.BottomUpMutatorContext, sdkDep sdkDep) {
Colin Cross42308aa2018-11-14 21:44:17 -0800340 if sdkDep.frameworkResModule != "" {
341 ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
Colin Crossa97c5d32018-03-28 14:58:31 -0700342 }
Rashed Abdel-Tawab5b948ab2018-08-09 14:08:53 -0700343 if sdkDep.omniromResModule != "" {
344 ctx.AddVariationDependencies(nil, omniromResTag, sdkDep.omniromResModule)
345 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700346}
347
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800348var extractAssetsRule = pctx.AndroidStaticRule("extractAssets",
349 blueprint.RuleParams{
350 Command: `${config.Zip2ZipCmd} -i ${in} -o ${out} "assets/**/*"`,
351 CommandDeps: []string{"${config.Zip2ZipCmd}"},
352 })
353
Alixf7a10272023-09-27 16:47:56 +0000354type aaptBuildActionOptions struct {
355 sdkContext android.SdkContext
356 classLoaderContexts dexpreopt.ClassLoaderContextMap
357 excludedLibs []string
358 enforceDefaultTargetSdkVersion bool
Rico Winda2fa2632024-03-13 13:09:17 +0100359 forceNonFinalResourceIDs bool
Alixf7a10272023-09-27 16:47:56 +0000360 extraLinkFlags []string
Jihoon Kang84b25892023-12-01 22:01:06 +0000361 aconfigTextFiles android.Paths
Jiakai Zhang36937082024-04-15 11:15:50 +0000362 usesLibrary *usesLibrary
Alixf7a10272023-09-27 16:47:56 +0000363}
364
365func (a *aapt) buildActions(ctx android.ModuleContext, opts aaptBuildActionOptions) {
Colin Cross5446e882019-05-22 10:46:27 -0700366
Colin Cross8676c8c2023-10-12 15:58:57 -0700367 staticResourcesNodesDepSet, sharedResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedExportPackages, libFlags :=
Jiakai Zhang36937082024-04-15 11:15:50 +0000368 aaptLibs(ctx, opts.sdkContext, opts.classLoaderContexts, opts.usesLibrary)
Ulya Trafimovich31e444e2020-08-14 17:32:16 +0100369
Paul Duffin06530572022-02-03 17:54:15 +0000370 // Exclude any libraries from the supplied list.
Alixf7a10272023-09-27 16:47:56 +0000371 opts.classLoaderContexts = opts.classLoaderContexts.ExcludeLibs(opts.excludedLibs)
Paul Duffin06530572022-02-03 17:54:15 +0000372
Colin Cross31656952018-05-24 16:11:20 -0700373 // App manifest file
374 manifestFile := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")
375 manifestSrcPath := android.PathForModuleSrc(ctx, manifestFile)
376
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000377 manifestPath := ManifestFixer(ctx, manifestSrcPath, ManifestFixerParams{
Alixf7a10272023-09-27 16:47:56 +0000378 SdkContext: opts.sdkContext,
379 ClassLoaderContexts: opts.classLoaderContexts,
Harshit Mahajan5b8b7302022-06-10 11:24:05 +0000380 IsLibrary: a.isLibrary,
381 DefaultManifestVersion: a.defaultManifestVersion,
382 UseEmbeddedNativeLibs: a.useEmbeddedNativeLibs,
383 UsesNonSdkApis: a.usesNonSdkApis,
384 UseEmbeddedDex: a.useEmbeddedDex,
385 HasNoCode: a.hasNoCode,
386 LoggingParent: a.LoggingParent,
Alixf7a10272023-09-27 16:47:56 +0000387 EnforceDefaultTargetSdkVersion: opts.enforceDefaultTargetSdkVersion,
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000388 })
Colin Cross90c25c62019-04-19 16:22:57 -0700389
Colin Crossab8d1382023-07-14 17:23:41 +0000390 staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
Colin Cross8676c8c2023-10-12 15:58:57 -0700391 sharedDeps := transitiveAarDeps(sharedResourcesNodesDepSet.ToList())
Colin Crossab8d1382023-07-14 17:23:41 +0000392
Luca Stefanifd898822019-09-10 22:13:31 +0200393 // Add additional manifest files to transitive manifests.
394 additionalManifests := android.PathsForModuleSrc(ctx, a.aaptProperties.Additional_manifests)
Colin Crossab8d1382023-07-14 17:23:41 +0000395 transitiveManifestPaths := append(android.Paths{manifestPath}, additionalManifests...)
Colin Crossab8d1382023-07-14 17:23:41 +0000396 transitiveManifestPaths = append(transitiveManifestPaths, staticManifestsDepSet.ToList()...)
Colin Cross90c25c62019-04-19 16:22:57 -0700397
Colin Crossab8d1382023-07-14 17:23:41 +0000398 if len(transitiveManifestPaths) > 1 && !Bool(a.aaptProperties.Dont_merge_manifests) {
Alixf7a10272023-09-27 16:47:56 +0000399 manifestMergerParams := ManifestMergerParams{
400 staticLibManifests: transitiveManifestPaths[1:],
Alix96ea88452023-08-31 15:48:23 +0000401 isLibrary: a.isLibrary,
402 packageName: a.manifestValues.applicationId,
403 }
Alixf7a10272023-09-27 16:47:56 +0000404 a.mergedManifestFile = manifestMerger(ctx, transitiveManifestPaths[0], manifestMergerParams)
Colin Cross90c25c62019-04-19 16:22:57 -0700405 if !a.isLibrary {
406 // Only use the merged manifest for applications. For libraries, the transitive closure of manifests
407 // will be propagated to the final application and merged there. The merged manifest for libraries is
408 // only passed to Make, which can't handle transitive dependencies.
409 manifestPath = a.mergedManifestFile
410 }
411 } else {
412 a.mergedManifestFile = manifestPath
413 }
Colin Cross31656952018-05-24 16:11:20 -0700414
Alixf7a10272023-09-27 16:47:56 +0000415 compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, opts.sdkContext, manifestPath)
Colin Cross31656952018-05-24 16:11:20 -0700416
417 linkFlags = append(linkFlags, libFlags...)
Colin Cross8676c8c2023-10-12 15:58:57 -0700418 linkDeps = append(linkDeps, sharedExportPackages...)
Colin Crossab8d1382023-07-14 17:23:41 +0000419 linkDeps = append(linkDeps, staticDeps.resPackages()...)
Alixf7a10272023-09-27 16:47:56 +0000420 linkFlags = append(linkFlags, opts.extraLinkFlags...)
Colin Cross1b6a3cf2018-07-24 14:51:30 -0700421 if a.isLibrary {
422 linkFlags = append(linkFlags, "--static-lib")
423 }
Rico Wind7152e822024-04-19 08:14:15 +0200424 if opts.forceNonFinalResourceIDs {
425 linkFlags = append(linkFlags, "--non-final-ids")
426 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700427
Colin Cross7c4dc5d2024-02-13 14:29:45 -0800428 linkFlags = append(linkFlags, "--no-static-lib-packages")
Colin Cross8f1b0332024-01-25 13:39:06 -0800429 if a.isLibrary && a.useResourceProcessorBusyBox(ctx) {
Colin Cross7c4dc5d2024-02-13 14:29:45 -0800430 // When building an android_library using ResourceProcessorBusyBox pass --merge-only to skip resource
431 // references validation until the final app link step when all static libraries are present.
Colin Cross4eae06d2023-06-20 22:40:02 -0700432 linkFlags = append(linkFlags, "--merge-only")
Colin Cross4eae06d2023-06-20 22:40:02 -0700433 }
434
Colin Crossa97c5d32018-03-28 14:58:31 -0700435 packageRes := android.PathForModuleOut(ctx, "package-res.apk")
Colin Crossa97c5d32018-03-28 14:58:31 -0700436 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
437 rTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -0700438 // This file isn't used by Soong, but is generated for exporting
439 extraPackages := android.PathForModuleOut(ctx, "extra_packages")
Colin Cross4eae06d2023-06-20 22:40:02 -0700440 var transitiveRJars android.Paths
Colin Crossf3b7bad2023-08-02 15:49:00 -0700441 var srcJar android.WritablePath
Colin Crossa97c5d32018-03-28 14:58:31 -0700442
Colin Cross4aaa84a2018-08-21 15:14:37 -0700443 var compiledResDirs []android.Paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700444 for _, dir := range resDirs {
Colin Cross014489c2020-06-02 20:09:13 -0700445 a.resourceFiles = append(a.resourceFiles, dir.files...)
Inseob Kim34dc4cd2023-11-07 13:37:14 +0900446 compiledResDirs = append(compiledResDirs, aapt2Compile(ctx, dir.dir, dir.files, compileFlags, a.filterProduct()).Paths())
Colin Crossa97c5d32018-03-28 14:58:31 -0700447 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700448
Colin Crossa592e3e2019-02-19 16:59:53 -0800449 for i, zip := range resZips {
450 flata := android.PathForModuleOut(ctx, fmt.Sprintf("reszip.%d.flata", i))
Colin Crossa0ba2f52019-06-22 12:59:27 -0700451 aapt2CompileZip(ctx, flata, zip, "", compileFlags)
Colin Crossa592e3e2019-02-19 16:59:53 -0800452 compiledResDirs = append(compiledResDirs, android.Paths{flata})
453 }
454
Colin Cross4aaa84a2018-08-21 15:14:37 -0700455 var compiledRes, compiledOverlay android.Paths
456
Colin Crossab8d1382023-07-14 17:23:41 +0000457 // AAPT2 overlays are in lowest to highest priority order, reverse the topological order
458 // of transitiveStaticLibs.
459 transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages())
460
Colin Cross8f1b0332024-01-25 13:39:06 -0800461 if a.isLibrary && a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700462 // When building an android_library with ResourceProcessorBusyBox enabled treat static library dependencies
463 // as imports. The resources from dependencies will not be merged into this module's package-res.apk, and
464 // instead modules depending on this module will reference package-res.apk from all transitive static
465 // dependencies.
Colin Cross1d3f5902024-03-05 11:51:54 -0800466 for _, sharedDep := range sharedDeps {
467 if sharedDep.usedResourceProcessor {
468 transitiveRJars = append(transitiveRJars, sharedDep.rJar)
469 }
470 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700471 for _, staticDep := range staticDeps {
472 linkDeps = append(linkDeps, staticDep.resPackage)
473 linkFlags = append(linkFlags, "-I "+staticDep.resPackage.String())
474 if staticDep.usedResourceProcessor {
475 transitiveRJars = append(transitiveRJars, staticDep.rJar)
476 }
477 }
478 } else {
479 // When building an app or building a library without ResourceProcessorBusyBox enabled all static
480 // dependencies are compiled into this module's package-res.apk as overlays.
481 compiledOverlay = append(compiledOverlay, transitiveStaticLibs...)
482 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700483
Colin Crossbec85302019-02-13 13:15:46 -0800484 if len(transitiveStaticLibs) > 0 {
Colin Cross4aaa84a2018-08-21 15:14:37 -0700485 // If we are using static android libraries, every source file becomes an overlay.
486 // This is to emulate old AAPT behavior which simulated library support.
487 for _, compiledResDir := range compiledResDirs {
488 compiledOverlay = append(compiledOverlay, compiledResDir...)
489 }
Colin Crossbec85302019-02-13 13:15:46 -0800490 } else if a.isLibrary {
491 // Otherwise, for a static library we treat all the resources equally with no overlay.
492 for _, compiledResDir := range compiledResDirs {
493 compiledRes = append(compiledRes, compiledResDir...)
494 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700495 } else if len(compiledResDirs) > 0 {
496 // Without static libraries, the first directory is our directory, which can then be
497 // overlaid by the rest.
498 compiledRes = append(compiledRes, compiledResDirs[0]...)
499 for _, compiledResDir := range compiledResDirs[1:] {
500 compiledOverlay = append(compiledOverlay, compiledResDir...)
501 }
502 }
503
Colin Crossa97c5d32018-03-28 14:58:31 -0700504 for _, dir := range overlayDirs {
Inseob Kim34dc4cd2023-11-07 13:37:14 +0900505 compiledOverlay = append(compiledOverlay, aapt2Compile(ctx, dir.dir, dir.files, compileFlags, a.filterProduct()).Paths()...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700506 }
507
Colin Crosse560c4a2019-03-19 16:03:11 -0700508 var splitPackages android.WritablePaths
509 var splits []split
510
511 for _, s := range a.splitNames {
512 suffix := strings.Replace(s, ",", "_", -1)
513 path := android.PathForModuleOut(ctx, "package_"+suffix+".apk")
514 linkFlags = append(linkFlags, "--split", path.String()+":"+s)
515 splitPackages = append(splitPackages, path)
516 splits = append(splits, split{
517 name: s,
518 suffix: suffix,
519 path: path,
520 })
521 }
522
Colin Cross8f1b0332024-01-25 13:39:06 -0800523 if !a.useResourceProcessorBusyBox(ctx) {
Colin Crossf3b7bad2023-08-02 15:49:00 -0700524 // the subdir "android" is required to be filtered by package names
525 srcJar = android.PathForModuleGen(ctx, "android", "R.srcjar")
526 }
527
Colin Crossab8d1382023-07-14 17:23:41 +0000528 // No need to specify assets from dependencies to aapt2Link for libraries, all transitive assets will be
529 // provided to the final app aapt2Link step.
530 var transitiveAssets android.Paths
531 if !a.isLibrary {
532 transitiveAssets = android.ReverseSliceInPlace(staticDeps.assets())
533 }
Colin Crossf3b7bad2023-08-02 15:49:00 -0700534 aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt,
Jihoon Kang84b25892023-12-01 22:01:06 +0000535 linkFlags, linkDeps, compiledRes, compiledOverlay, transitiveAssets, splitPackages,
536 opts.aconfigTextFiles)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800537 // Extract assets from the resource package output so that they can be used later in aapt2link
538 // for modules that depend on this one.
Colin Crossab8d1382023-07-14 17:23:41 +0000539 if android.PrefixInList(linkFlags, "-A ") {
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800540 assets := android.PathForModuleOut(ctx, "assets.zip")
541 ctx.Build(pctx, android.BuildParams{
542 Rule: extractAssetsRule,
543 Input: packageRes,
544 Output: assets,
545 Description: "extract assets from built resource file",
546 })
547 a.assetPackage = android.OptionalPathForPath(assets)
548 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700549
Colin Cross8f1b0332024-01-25 13:39:06 -0800550 if a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700551 rJar := android.PathForModuleOut(ctx, "busybox/R.jar")
Rico Winda2fa2632024-03-13 13:09:17 +0100552 resourceProcessorBusyBoxGenerateBinaryR(ctx, rTxt, a.mergedManifestFile, rJar, staticDeps, a.isLibrary, a.aaptProperties.Aaptflags,
553 opts.forceNonFinalResourceIDs)
Colin Crossf3b7bad2023-08-02 15:49:00 -0700554 aapt2ExtractExtraPackages(ctx, extraPackages, rJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700555 transitiveRJars = append(transitiveRJars, rJar)
556 a.rJar = rJar
Colin Crossf3b7bad2023-08-02 15:49:00 -0700557 } else {
558 aapt2ExtractExtraPackages(ctx, extraPackages, srcJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700559 }
560
Colin Cross312634e2023-11-21 15:13:56 -0800561 transitiveAaptResourcePackages := staticDeps.resPackages().Strings()
562 transitiveAaptResourcePackages = slices.DeleteFunc(transitiveAaptResourcePackages, func(p string) bool {
563 return p == packageRes.String()
564 })
565 transitiveAaptResourcePackagesFile := android.PathForModuleOut(ctx, "transitive-res-packages")
566 android.WriteFileRule(ctx, transitiveAaptResourcePackagesFile, strings.Join(transitiveAaptResourcePackages, "\n"))
567
Colin Cross1d3f5902024-03-05 11:51:54 -0800568 // Reverse the list of R.jar files so that the current module comes first, and direct dependencies come before
569 // transitive dependencies.
570 transitiveRJars = android.ReversePaths(transitiveRJars)
571
Colin Crossa97c5d32018-03-28 14:58:31 -0700572 a.aaptSrcJar = srcJar
Colin Cross4eae06d2023-06-20 22:40:02 -0700573 a.transitiveAaptRJars = transitiveRJars
Colin Cross312634e2023-11-21 15:13:56 -0800574 a.transitiveAaptResourcePackagesFile = transitiveAaptResourcePackagesFile
Colin Crossa97c5d32018-03-28 14:58:31 -0700575 a.exportPackage = packageRes
576 a.manifestPath = manifestPath
577 a.proguardOptionsFile = proguardOptionsFile
Colin Cross66f78822018-05-02 12:58:28 -0700578 a.extraAaptPackagesFile = extraPackages
Colin Crossa97c5d32018-03-28 14:58:31 -0700579 a.rTxt = rTxt
Colin Crosse560c4a2019-03-19 16:03:11 -0700580 a.splits = splits
Colin Crossab8d1382023-07-14 17:23:41 +0000581 a.resourcesNodesDepSet = android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL).
582 Direct(&resourcesNode{
583 resPackage: a.exportPackage,
584 manifest: a.manifestPath,
585 additionalManifests: additionalManifests,
Colin Cross4eae06d2023-06-20 22:40:02 -0700586 rTxt: a.rTxt,
587 rJar: a.rJar,
Colin Crossab8d1382023-07-14 17:23:41 +0000588 assets: a.assetPackage,
Colin Cross4eae06d2023-06-20 22:40:02 -0700589
Colin Cross8f1b0332024-01-25 13:39:06 -0800590 usedResourceProcessor: a.useResourceProcessorBusyBox(ctx),
Colin Crossab8d1382023-07-14 17:23:41 +0000591 }).
592 Transitive(staticResourcesNodesDepSet).Build()
593 a.rroDirsDepSet = android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL).
594 Direct(rroDirs...).
595 Transitive(staticRRODirsDepSet).Build()
596 a.manifestsDepSet = android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).
597 Direct(a.manifestPath).
598 DirectSlice(additionalManifests).
599 Transitive(staticManifestsDepSet).Build()
600}
601
Colin Cross4eae06d2023-06-20 22:40:02 -0700602var resourceProcessorBusyBox = pctx.AndroidStaticRule("resourceProcessorBusyBox",
603 blueprint.RuleParams{
604 Command: "${config.JavaCmd} -cp ${config.ResourceProcessorBusyBox} " +
605 "com.google.devtools.build.android.ResourceProcessorBusyBox --tool=GENERATE_BINARY_R -- @${out}.args && " +
606 "if cmp -s ${out}.tmp ${out} ; then rm ${out}.tmp ; else mv ${out}.tmp ${out}; fi",
607 CommandDeps: []string{"${config.ResourceProcessorBusyBox}"},
608 Rspfile: "${out}.args",
609 RspfileContent: "--primaryRTxt ${rTxt} --primaryManifest ${manifest} --classJarOutput ${out}.tmp ${args}",
610 Restat: true,
611 }, "rTxt", "manifest", "args")
612
613// resourceProcessorBusyBoxGenerateBinaryR converts the R.txt file produced by aapt2 into R.class files
614// using Bazel's ResourceProcessorBusyBox tool, which is faster than compiling the R.java files and
615// supports producing classes for static dependencies that only include resources from that dependency.
616func resourceProcessorBusyBoxGenerateBinaryR(ctx android.ModuleContext, rTxt, manifest android.Path,
Rico Winda2fa2632024-03-13 13:09:17 +0100617 rJar android.WritablePath, transitiveDeps transitiveAarDeps, isLibrary bool, aaptFlags []string,
618 forceNonFinalIds bool) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700619
620 var args []string
621 var deps android.Paths
622
623 if !isLibrary {
624 // When compiling an app, pass all R.txt and AndroidManifest.xml from transitive static library dependencies
625 // to ResourceProcessorBusyBox so that it can regenerate R.class files with the final resource IDs for each
626 // package.
627 args, deps = transitiveDeps.resourceProcessorDeps()
Rico Winda2fa2632024-03-13 13:09:17 +0100628 if forceNonFinalIds {
629 args = append(args, "--finalFields=false")
630 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700631 } else {
632 // When compiling a library don't pass any dependencies as it only needs to generate an R.class file for this
633 // library. Pass --finalFields=false so that the R.class file contains non-final fields so they don't get
634 // inlined into the library before the final IDs are assigned during app compilation.
635 args = append(args, "--finalFields=false")
636 }
637
Colin Crossd3f7d1a2024-01-03 19:42:25 -0800638 for i, arg := range aaptFlags {
639 const AAPT_CUSTOM_PACKAGE = "--custom-package"
640 if strings.HasPrefix(arg, AAPT_CUSTOM_PACKAGE) {
641 pkg := strings.TrimSpace(strings.TrimPrefix(arg, AAPT_CUSTOM_PACKAGE))
642 if pkg == "" && i+1 < len(aaptFlags) {
643 pkg = aaptFlags[i+1]
644 }
645 args = append(args, "--packageForR "+pkg)
646 }
647 }
648
Colin Cross4eae06d2023-06-20 22:40:02 -0700649 deps = append(deps, rTxt, manifest)
650
651 ctx.Build(pctx, android.BuildParams{
652 Rule: resourceProcessorBusyBox,
653 Output: rJar,
654 Implicits: deps,
655 Description: "ResourceProcessorBusyBox",
656 Args: map[string]string{
657 "rTxt": rTxt.String(),
658 "manifest": manifest.String(),
659 "args": strings.Join(args, " "),
660 },
661 })
662}
663
Colin Crossab8d1382023-07-14 17:23:41 +0000664type resourcesNode struct {
665 resPackage android.Path
666 manifest android.Path
667 additionalManifests android.Paths
Colin Cross4eae06d2023-06-20 22:40:02 -0700668 rTxt android.Path
669 rJar android.Path
Colin Crossab8d1382023-07-14 17:23:41 +0000670 assets android.OptionalPath
Colin Cross4eae06d2023-06-20 22:40:02 -0700671
672 usedResourceProcessor bool
Colin Crossab8d1382023-07-14 17:23:41 +0000673}
674
675type transitiveAarDeps []*resourcesNode
676
677func (t transitiveAarDeps) resPackages() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700678 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000679 for _, dep := range t {
680 paths = append(paths, dep.resPackage)
681 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700682 return paths
Colin Crossab8d1382023-07-14 17:23:41 +0000683}
684
685func (t transitiveAarDeps) manifests() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700686 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000687 for _, dep := range t {
688 paths = append(paths, dep.manifest)
689 paths = append(paths, dep.additionalManifests...)
690 }
Colin Cross4eae06d2023-06-20 22:40:02 -0700691 return paths
692}
693
694func (t transitiveAarDeps) resourceProcessorDeps() (args []string, deps android.Paths) {
695 for _, dep := range t {
696 args = append(args, "--library="+dep.rTxt.String()+","+dep.manifest.String())
697 deps = append(deps, dep.rTxt, dep.manifest)
698 }
699 return args, deps
Colin Crossab8d1382023-07-14 17:23:41 +0000700}
701
702func (t transitiveAarDeps) assets() android.Paths {
Colin Cross4eae06d2023-06-20 22:40:02 -0700703 paths := make(android.Paths, 0, len(t))
Colin Crossab8d1382023-07-14 17:23:41 +0000704 for _, dep := range t {
705 if dep.assets.Valid() {
706 paths = append(paths, dep.assets.Path())
707 }
708 }
709 return paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700710}
711
712// aaptLibs collects libraries from dependencies and sdk_version and converts them into paths
Jiakai Zhang36937082024-04-15 11:15:50 +0000713func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext,
714 classLoaderContexts dexpreopt.ClassLoaderContextMap, usesLibrary *usesLibrary) (
Colin Cross8676c8c2023-10-12 15:58:57 -0700715 staticResourcesNodes, sharedResourcesNodes *android.DepSet[*resourcesNode], staticRRODirs *android.DepSet[rroDir],
Colin Crossab8d1382023-07-14 17:23:41 +0000716 staticManifests *android.DepSet[android.Path], sharedLibs android.Paths, flags []string) {
Colin Crossa97c5d32018-03-28 14:58:31 -0700717
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100718 if classLoaderContexts == nil {
Ulya Trafimovich18554242020-11-03 15:55:11 +0000719 // Not all callers need to compute class loader context, those who don't just pass nil.
720 // Create a temporary class loader context here (it will be computed, but not used).
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100721 classLoaderContexts = make(dexpreopt.ClassLoaderContextMap)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000722 }
723
Colin Cross83bb3162018-06-25 15:48:06 -0700724 sdkDep := decodeSdkDep(ctx, sdkContext)
Colin Crossa97c5d32018-03-28 14:58:31 -0700725 if sdkDep.useFiles {
Colin Cross86a60ae2018-05-29 14:44:55 -0700726 sharedLibs = append(sharedLibs, sdkDep.jars...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700727 }
728
Colin Cross8676c8c2023-10-12 15:58:57 -0700729 var staticResourcesNodeDepSets []*android.DepSet[*resourcesNode]
730 var sharedResourcesNodeDepSets []*android.DepSet[*resourcesNode]
Colin Crossab8d1382023-07-14 17:23:41 +0000731 rroDirsDepSetBuilder := android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL)
732 manifestsDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
733
Colin Crossa97c5d32018-03-28 14:58:31 -0700734 ctx.VisitDirectDeps(func(module android.Module) {
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000735 depTag := ctx.OtherModuleDependencyTag(module)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000736
Colin Crossa97c5d32018-03-28 14:58:31 -0700737 var exportPackage android.Path
Colin Cross66f78822018-05-02 12:58:28 -0700738 aarDep, _ := module.(AndroidLibraryDependency)
739 if aarDep != nil {
Colin Crossa97c5d32018-03-28 14:58:31 -0700740 exportPackage = aarDep.ExportPackage()
741 }
742
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000743 switch depTag {
Colin Cross4b964c02018-10-15 16:18:06 -0700744 case instrumentationForTag:
745 // Nothing, instrumentationForTag is treated as libTag for javac but not for aapt2.
Liz Kammeref28a4c2022-09-23 16:50:56 -0400746 case sdkLibTag, libTag:
Colin Cross5446e882019-05-22 10:46:27 -0700747 if exportPackage != nil {
Colin Cross8676c8c2023-10-12 15:58:57 -0700748 sharedResourcesNodeDepSets = append(sharedResourcesNodeDepSets, aarDep.ResourcesNodeDepSet())
Colin Cross5446e882019-05-22 10:46:27 -0700749 sharedLibs = append(sharedLibs, exportPackage)
750 }
Rashed Abdel-Tawab5b948ab2018-08-09 14:08:53 -0700751 case frameworkResTag, omniromResTag:
Colin Crossa97c5d32018-03-28 14:58:31 -0700752 if exportPackage != nil {
753 sharedLibs = append(sharedLibs, exportPackage)
754 }
755 case staticLibTag:
756 if exportPackage != nil {
Colin Cross8676c8c2023-10-12 15:58:57 -0700757 staticResourcesNodeDepSets = append(staticResourcesNodeDepSets, aarDep.ResourcesNodeDepSet())
Colin Crossab8d1382023-07-14 17:23:41 +0000758 rroDirsDepSetBuilder.Transitive(aarDep.RRODirsDepSet())
759 manifestsDepSetBuilder.Transitive(aarDep.ManifestsDepSet())
Colin Crossa97c5d32018-03-28 14:58:31 -0700760 }
761 }
Ulya Trafimovich18554242020-11-03 15:55:11 +0000762
Ulya Trafimovich88bb6f62020-12-16 16:16:11 +0000763 addCLCFromDep(ctx, module, classLoaderContexts)
Jiakai Zhang36937082024-04-15 11:15:50 +0000764 if usesLibrary != nil {
765 addMissingOptionalUsesLibsFromDep(ctx, module, usesLibrary)
766 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700767 })
768
Colin Crossab8d1382023-07-14 17:23:41 +0000769 // AAPT2 overlays are in lowest to highest priority order, the topological order will be reversed later.
770 // Reverse the dependency order now going into the depset so that it comes out in order after the second
771 // reverse later.
772 // NOTE: this is legacy and probably incorrect behavior, for most other cases (e.g. conflicting classes in
773 // dependencies) the highest priority dependency is listed first, but for resources the highest priority
Colin Cross9055e212024-03-23 04:43:41 +0000774 // dependency has to be listed last. This is also inconsistent with the way manifests from the same
775 // transitive dependencies are merged.
Colin Crossab8d1382023-07-14 17:23:41 +0000776 staticResourcesNodes = android.NewDepSet(android.TOPOLOGICAL, nil,
Colin Cross8676c8c2023-10-12 15:58:57 -0700777 android.ReverseSliceInPlace(staticResourcesNodeDepSets))
778 sharedResourcesNodes = android.NewDepSet(android.TOPOLOGICAL, nil,
779 android.ReverseSliceInPlace(sharedResourcesNodeDepSets))
Colin Crossa97c5d32018-03-28 14:58:31 -0700780
Colin Crossab8d1382023-07-14 17:23:41 +0000781 staticRRODirs = rroDirsDepSetBuilder.Build()
782 staticManifests = manifestsDepSetBuilder.Build()
783
784 if len(staticResourcesNodes.ToList()) > 0 {
Colin Crossa97c5d32018-03-28 14:58:31 -0700785 flags = append(flags, "--auto-add-overlay")
786 }
787
788 for _, sharedLib := range sharedLibs {
789 flags = append(flags, "-I "+sharedLib.String())
790 }
791
Colin Cross8676c8c2023-10-12 15:58:57 -0700792 return staticResourcesNodes, sharedResourcesNodes, staticRRODirs, staticManifests, sharedLibs, flags
Colin Crossa97c5d32018-03-28 14:58:31 -0700793}
794
795type AndroidLibrary struct {
796 Library
797 aapt
798
799 androidLibraryProperties androidLibraryProperties
800
801 aarFile android.WritablePath
Colin Cross89c31582018-04-30 15:55:11 -0700802}
803
Saeid Farivar Asanjan1fca3012021-09-14 18:40:19 +0000804var _ android.OutputFileProducer = (*AndroidLibrary)(nil)
805
806// For OutputFileProducer interface
807func (a *AndroidLibrary) OutputFiles(tag string) (android.Paths, error) {
808 switch tag {
809 case ".aar":
810 return []android.Path{a.aarFile}, nil
811 default:
812 return a.Library.OutputFiles(tag)
813 }
814}
815
Colin Crossa97c5d32018-03-28 14:58:31 -0700816var _ AndroidLibraryDependency = (*AndroidLibrary)(nil)
817
818func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
Jiakai Zhangf98da192024-04-15 11:15:41 +0000819 a.usesLibrary.deps(ctx, false)
Colin Crossa97c5d32018-03-28 14:58:31 -0700820 a.Module.deps(ctx)
Jiyong Parkf1691d22021-03-29 20:11:58 +0900821 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Paul Duffin250e6192019-06-07 10:44:37 +0100822 if sdkDep.hasFrameworkLibs() {
823 a.aapt.deps(ctx, sdkDep)
Colin Crossa97c5d32018-03-28 14:58:31 -0700824 }
Jihoon Kang9049c272024-03-19 21:57:36 +0000825
826 for _, aconfig_declaration := range a.aaptProperties.Flags_packages {
827 ctx.AddDependency(ctx.Module(), aconfigDeclarationTag, aconfig_declaration)
828 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700829}
830
831func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Crosse4246ab2019-02-05 21:55:21 -0800832 a.aapt.isLibrary = true
Ulya Trafimovich42c7f0d2021-08-17 16:20:29 +0100833 a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx)
Spandan Das0727ba72024-02-13 16:37:43 +0000834 if a.usesLibrary.shouldDisableDexpreopt {
835 a.dexpreopter.disableDexpreopt()
836 }
Alixf7a10272023-09-27 16:47:56 +0000837 a.aapt.buildActions(ctx,
838 aaptBuildActionOptions{
839 sdkContext: android.SdkContext(a),
840 classLoaderContexts: a.classLoaderContexts,
841 enforceDefaultTargetSdkVersion: false,
Jihoon Kang9049c272024-03-19 21:57:36 +0000842 aconfigTextFiles: getAconfigFilePaths(ctx),
Jiakai Zhang36937082024-04-15 11:15:50 +0000843 usesLibrary: &a.usesLibrary,
Alixf7a10272023-09-27 16:47:56 +0000844 },
845 )
Colin Crossa97c5d32018-03-28 14:58:31 -0700846
Colin Crossff694a82023-12-13 15:54:49 -0800847 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
848 a.hideApexVariantFromMake = !apexInfo.IsForPlatform()
Colin Cross56a83212020-09-15 18:30:11 -0700849
yangbill2af0b6e2024-03-15 09:29:29 +0000850 a.stem = proptools.StringDefault(a.overridableProperties.Stem, ctx.ModuleName())
Jihoon Kang1bfb6f22023-07-01 00:13:47 +0000851
Colin Cross4eae06d2023-06-20 22:40:02 -0700852 ctx.CheckbuildFile(a.aapt.proguardOptionsFile)
853 ctx.CheckbuildFile(a.aapt.exportPackage)
Colin Cross8f1b0332024-01-25 13:39:06 -0800854 if a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700855 ctx.CheckbuildFile(a.aapt.rJar)
Colin Crossf3b7bad2023-08-02 15:49:00 -0700856 } else {
857 ctx.CheckbuildFile(a.aapt.aaptSrcJar)
Colin Cross4eae06d2023-06-20 22:40:02 -0700858 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700859
860 // apps manifests are handled by aapt, don't let Module see them
861 a.properties.Manifest = nil
862
Colin Cross014489c2020-06-02 20:09:13 -0700863 a.linter.mergedManifest = a.aapt.mergedManifestFile
864 a.linter.manifest = a.aapt.manifestPath
865 a.linter.resources = a.aapt.resourceFiles
866
Sam Delmericoc8e040c2023-10-31 17:27:02 +0000867 proguardSpecInfo := a.collectProguardSpecInfo(ctx)
Colin Cross40213022023-12-13 15:19:49 -0800868 android.SetProvider(ctx, ProguardSpecInfoProvider, proguardSpecInfo)
Colin Cross312634e2023-11-21 15:13:56 -0800869 exportedProguardFlagsFiles := proguardSpecInfo.ProguardFlagsFiles.ToList()
870 a.extraProguardFlagsFiles = append(a.extraProguardFlagsFiles, exportedProguardFlagsFiles...)
871 a.extraProguardFlagsFiles = append(a.extraProguardFlagsFiles, a.proguardOptionsFile)
872
873 combinedExportedProguardFlagFile := android.PathForModuleOut(ctx, "export_proguard_flags")
874 writeCombinedProguardFlagsFile(ctx, combinedExportedProguardFlagFile, exportedProguardFlagsFiles)
875 a.combinedExportedProguardFlagsFile = combinedExportedProguardFlagFile
Colin Crossa97c5d32018-03-28 14:58:31 -0700876
Colin Cross4eae06d2023-06-20 22:40:02 -0700877 var extraSrcJars android.Paths
878 var extraCombinedJars android.Paths
879 var extraClasspathJars android.Paths
Colin Cross8f1b0332024-01-25 13:39:06 -0800880 if a.useResourceProcessorBusyBox(ctx) {
Colin Cross4eae06d2023-06-20 22:40:02 -0700881 // When building a library with ResourceProcessorBusyBox enabled ResourceProcessorBusyBox for this
882 // library and each of the transitive static android_library dependencies has already created an
883 // R.class file for the appropriate package. Add all of those R.class files to the classpath.
884 extraClasspathJars = a.transitiveAaptRJars
885 } else {
886 // When building a library without ResourceProcessorBusyBox the aapt2 rule creates R.srcjar containing
887 // R.java files for the library's package and the packages from all transitive static android_library
888 // dependencies. Compile the srcjar alongside the rest of the sources.
889 extraSrcJars = android.Paths{a.aapt.aaptSrcJar}
890 }
891
892 a.Module.compile(ctx, extraSrcJars, extraClasspathJars, extraCombinedJars)
Colin Crossa97c5d32018-03-28 14:58:31 -0700893
Colin Crossf57c5782019-01-25 13:20:38 -0800894 a.aarFile = android.PathForModuleOut(ctx, ctx.ModuleName()+".aar")
Colin Crossa97c5d32018-03-28 14:58:31 -0700895 var res android.Paths
896 if a.androidLibraryProperties.BuildAAR {
897 BuildAAR(ctx, a.aarFile, a.outputFile, a.manifestPath, a.rTxt, res)
898 ctx.CheckbuildFile(a.aarFile)
899 }
Colin Cross89c31582018-04-30 15:55:11 -0700900
Sam Delmerico82602492022-06-10 17:05:42 +0000901 prebuiltJniPackages := android.Paths{}
902 ctx.VisitDirectDeps(func(module android.Module) {
Colin Cross313aa542023-12-13 13:47:44 -0800903 if info, ok := android.OtherModuleProvider(ctx, module, JniPackageProvider); ok {
Sam Delmerico82602492022-06-10 17:05:42 +0000904 prebuiltJniPackages = append(prebuiltJniPackages, info.JniPackages...)
905 }
906 })
907 if len(prebuiltJniPackages) > 0 {
Colin Cross40213022023-12-13 15:19:49 -0800908 android.SetProvider(ctx, JniPackageProvider, JniPackageInfo{
Sam Delmerico82602492022-06-10 17:05:42 +0000909 JniPackages: prebuiltJniPackages,
910 })
911 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700912}
913
Colin Cross95b53b82023-10-17 13:21:02 -0700914func (a *AndroidLibrary) IDEInfo(dpInfo *android.IdeInfo) {
915 a.Library.IDEInfo(dpInfo)
916 a.aapt.IDEInfo(dpInfo)
917}
918
919func (a *aapt) IDEInfo(dpInfo *android.IdeInfo) {
Colin Cross8f1b0332024-01-25 13:39:06 -0800920 if a.rJar != nil {
Colin Cross95b53b82023-10-17 13:21:02 -0700921 dpInfo.Jars = append(dpInfo.Jars, a.rJar.String())
922 }
923}
924
Colin Cross1b16b0e2019-02-12 14:41:32 -0800925// android_library builds and links sources into a `.jar` file for the device along with Android resources.
926//
927// An android_library has a single variant that produces a `.jar` file containing `.class` files that were
Sam Delmerico82602492022-06-10 17:05:42 +0000928// compiled against the device bootclasspath, along with a `package-res.apk` file containing Android resources compiled
Colin Cross1b16b0e2019-02-12 14:41:32 -0800929// with aapt2. This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
930// an android_app module.
Colin Crossa97c5d32018-03-28 14:58:31 -0700931func AndroidLibraryFactory() android.Module {
932 module := &AndroidLibrary{}
933
Colin Crossce6734e2020-06-15 16:09:53 -0700934 module.Module.addHostAndDeviceProperties()
Colin Crossa97c5d32018-03-28 14:58:31 -0700935 module.AddProperties(
Colin Crossa97c5d32018-03-28 14:58:31 -0700936 &module.aaptProperties,
Ronald Braunsteincdc66f42024-04-12 11:23:19 -0700937 &module.androidLibraryProperties,
938 &module.sourceProperties)
Colin Crossa97c5d32018-03-28 14:58:31 -0700939
940 module.androidLibraryProperties.BuildAAR = true
Colin Cross014489c2020-06-02 20:09:13 -0700941 module.Module.linter.library = true
Colin Crossa97c5d32018-03-28 14:58:31 -0700942
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900943 android.InitApexModule(module)
Colin Cross48de9a42018-10-02 13:53:33 -0700944 InitJavaModule(module, android.DeviceSupported)
Colin Crossa97c5d32018-03-28 14:58:31 -0700945 return module
946}
947
Colin Crossfabb6082018-02-20 17:22:23 -0800948//
949// AAR (android library) prebuilts
950//
Colin Crossfabb6082018-02-20 17:22:23 -0800951
Vinh Trance0781f2022-04-13 01:30:44 +0000952// Properties for android_library_import
Colin Crossfabb6082018-02-20 17:22:23 -0800953type AARImportProperties struct {
Vinh Trance0781f2022-04-13 01:30:44 +0000954 // ARR (android library prebuilt) filepath. Exactly one ARR is required.
Colin Cross27b922f2019-03-04 22:35:41 -0800955 Aars []string `android:"path"`
Vinh Trance0781f2022-04-13 01:30:44 +0000956 // If not blank, set to the version of the sdk to compile against.
957 // Defaults to private.
958 // Values are of one of the following forms:
959 // 1) numerical API level, "current", "none", or "core_platform"
960 // 2) An SDK kind with an API level: "<sdk kind>_<API level>"
961 // See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds.
962 // If the SDK kind is empty, it will be set to public
963 Sdk_version *string
964 // If not blank, set the minimum version of the sdk that the compiled artifacts will run against.
965 // Defaults to sdk_version if not set. See sdk_version for possible values.
Colin Cross479884c2018-07-10 13:39:30 -0700966 Min_sdk_version *string
Vinh Trance0781f2022-04-13 01:30:44 +0000967 // List of java static libraries that the included ARR (android library prebuilts) has dependencies to.
Colin Crossa97c5d32018-03-28 14:58:31 -0700968 Static_libs []string
Vinh Trance0781f2022-04-13 01:30:44 +0000969 // List of java libraries that the included ARR (android library prebuilts) has dependencies to.
970 Libs []string
971 // If set to true, run Jetifier against .aar file. Defaults to false.
Colin Cross1001a792019-03-21 22:21:39 -0700972 Jetifier *bool
Sam Delmerico82602492022-06-10 17:05:42 +0000973 // If true, extract JNI libs from AAR archive. These libs will be accessible to android_app modules and
974 // will be passed transitively through android_libraries to an android_app.
975 //TODO(b/241138093) evaluate whether we can have this flag default to true for Bazel conversion
976 Extract_jni *bool
Colin Cross21ed4692024-04-24 20:23:38 +0000977
978 // If set, overrides the manifest extracted from the AAR with the provided path.
979 Manifest *string `android:"path"`
Colin Crossfabb6082018-02-20 17:22:23 -0800980}
981
982type AARImport struct {
983 android.ModuleBase
Colin Cross48de9a42018-10-02 13:53:33 -0700984 android.DefaultableModuleBase
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900985 android.ApexModuleBase
Colin Crossfabb6082018-02-20 17:22:23 -0800986 prebuilt android.Prebuilt
987
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900988 // Functionality common to Module and Import.
989 embeddableInModuleAndImport
990
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500991 providesTransitiveHeaderJars
992
Colin Crossfabb6082018-02-20 17:22:23 -0800993 properties AARImportProperties
994
Colin Cross9055e212024-03-23 04:43:41 +0000995 headerJarFile android.WritablePath
996 implementationJarFile android.WritablePath
Colin Cross607bbd62024-04-12 13:44:45 -0700997 implementationAndResourcesJarFile android.WritablePath
Colin Cross312634e2023-11-21 15:13:56 -0800998 proguardFlags android.WritablePath
999 exportPackage android.WritablePath
1000 transitiveAaptResourcePackagesFile android.Path
1001 extraAaptPackagesFile android.WritablePath
Colin Cross21ed4692024-04-24 20:23:38 +00001002 manifest android.Path
Colin Cross312634e2023-11-21 15:13:56 -08001003 assetsPackage android.WritablePath
1004 rTxt android.WritablePath
1005 rJar android.WritablePath
Colin Cross66f78822018-05-02 12:58:28 -07001006
Colin Crossab8d1382023-07-14 17:23:41 +00001007 resourcesNodesDepSet *android.DepSet[*resourcesNode]
1008 manifestsDepSet *android.DepSet[android.Path]
Colin Cross56a83212020-09-15 18:30:11 -07001009
1010 hideApexVariantFromMake bool
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001011
Sam Delmerico82602492022-06-10 17:05:42 +00001012 aarPath android.Path
1013 jniPackages android.Paths
Jiyong Park92315372021-04-02 08:45:46 +09001014
1015 sdkVersion android.SdkSpec
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001016 minSdkVersion android.ApiLevel
LaMont Jonesafe7baf2024-01-09 22:47:39 +00001017
Colin Cross9055e212024-03-23 04:43:41 +00001018 usesLibrary
1019 classLoaderContexts dexpreopt.ClassLoaderContextMap
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001020}
1021
1022var _ android.OutputFileProducer = (*AARImport)(nil)
1023
1024// For OutputFileProducer interface
1025func (a *AARImport) OutputFiles(tag string) (android.Paths, error) {
1026 switch tag {
1027 case ".aar":
1028 return []android.Path{a.aarPath}, nil
1029 case "":
Colin Cross607bbd62024-04-12 13:44:45 -07001030 return []android.Path{a.implementationAndResourcesJarFile}, nil
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001031 default:
1032 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
1033 }
Colin Crossfabb6082018-02-20 17:22:23 -08001034}
1035
Jiyong Park92315372021-04-02 08:45:46 +09001036func (a *AARImport) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
1037 return android.SdkSpecFrom(ctx, String(a.properties.Sdk_version))
Colin Cross83bb3162018-06-25 15:48:06 -07001038}
1039
Jiyong Parkf1691d22021-03-29 20:11:58 +09001040func (a *AARImport) SystemModules() string {
Paul Duffine25c6442019-10-11 13:50:28 +01001041 return ""
1042}
1043
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001044func (a *AARImport) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
Colin Cross479884c2018-07-10 13:39:30 -07001045 if a.properties.Min_sdk_version != nil {
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001046 return android.ApiLevelFrom(ctx, *a.properties.Min_sdk_version)
Colin Cross479884c2018-07-10 13:39:30 -07001047 }
Spandan Das8c9ae7e2023-03-03 21:20:36 +00001048 return a.SdkVersion(ctx).ApiLevel
Colin Cross83bb3162018-06-25 15:48:06 -07001049}
1050
Spandan Dasa26eda72023-03-02 00:56:06 +00001051func (a *AARImport) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
1052 return android.SdkSpecFrom(ctx, "").ApiLevel
William Loh5a082f92022-05-17 20:21:50 +00001053}
1054
Spandan Dasca70fc42023-03-01 23:38:49 +00001055func (a *AARImport) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
1056 return a.SdkVersion(ctx).ApiLevel
Dan Willemsen419290a2018-10-31 15:28:47 -07001057}
1058
Colin Cross1e743852019-10-28 11:37:20 -07001059func (a *AARImport) javaVersion() string {
1060 return ""
1061}
1062
Colin Crossa97c5d32018-03-28 14:58:31 -07001063var _ AndroidLibraryDependency = (*AARImport)(nil)
1064
1065func (a *AARImport) ExportPackage() android.Path {
1066 return a.exportPackage
1067}
Colin Crossab8d1382023-07-14 17:23:41 +00001068func (a *AARImport) ResourcesNodeDepSet() *android.DepSet[*resourcesNode] {
1069 return a.resourcesNodesDepSet
Colin Crossc1c37552019-01-31 11:42:41 -08001070}
1071
Colin Crossab8d1382023-07-14 17:23:41 +00001072func (a *AARImport) RRODirsDepSet() *android.DepSet[rroDir] {
1073 return android.NewDepSet[rroDir](android.TOPOLOGICAL, nil, nil)
Colin Cross66f78822018-05-02 12:58:28 -07001074}
1075
Colin Crossab8d1382023-07-14 17:23:41 +00001076func (a *AARImport) ManifestsDepSet() *android.DepSet[android.Path] {
1077 return a.manifestsDepSet
Jaewoong Jung6431ca72020-01-15 14:15:10 -08001078}
1079
Jaewoong Jungc779cd42020-10-06 18:56:10 -07001080// RRO enforcement is not available on aar_import since its RRO dirs are not
1081// exported.
1082func (a *AARImport) SetRROEnforcedForDependent(enforce bool) {
1083}
1084
1085// RRO enforcement is not available on aar_import since its RRO dirs are not
1086// exported.
1087func (a *AARImport) IsRROEnforced(ctx android.BaseModuleContext) bool {
1088 return false
1089}
1090
Colin Crossfabb6082018-02-20 17:22:23 -08001091func (a *AARImport) Prebuilt() *android.Prebuilt {
1092 return &a.prebuilt
1093}
1094
1095func (a *AARImport) Name() string {
1096 return a.prebuilt.Name(a.ModuleBase.Name())
1097}
1098
Jiyong Park618922e2020-01-08 13:35:43 +09001099func (a *AARImport) JacocoReportClassesFile() android.Path {
1100 return nil
1101}
1102
Colin Crossfabb6082018-02-20 17:22:23 -08001103func (a *AARImport) DepsMutator(ctx android.BottomUpMutatorContext) {
Jeongik Cha816a23a2020-07-08 01:09:23 +09001104 if !ctx.Config().AlwaysUsePrebuiltSdks() {
Jiyong Parkf1691d22021-03-29 20:11:58 +09001105 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Colin Crossa97c5d32018-03-28 14:58:31 -07001106 if sdkDep.useModule && sdkDep.frameworkResModule != "" {
Colin Cross42d48b72018-08-29 14:10:52 -07001107 ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
Colin Crossfabb6082018-02-20 17:22:23 -08001108 }
Rashed Abdel-Tawab5b948ab2018-08-09 14:08:53 -07001109 if sdkDep.useModule && sdkDep.omniromResModule != "" {
1110 ctx.AddVariationDependencies(nil, omniromResTag, sdkDep.omniromResModule)
1111 }
Colin Crossfabb6082018-02-20 17:22:23 -08001112 }
Colin Crossa97c5d32018-03-28 14:58:31 -07001113
Colin Cross42d48b72018-08-29 14:10:52 -07001114 ctx.AddVariationDependencies(nil, libTag, a.properties.Libs...)
1115 ctx.AddVariationDependencies(nil, staticLibTag, a.properties.Static_libs...)
Colin Cross9055e212024-03-23 04:43:41 +00001116
1117 a.usesLibrary.deps(ctx, false)
Colin Crossfabb6082018-02-20 17:22:23 -08001118}
1119
Sam Delmerico82602492022-06-10 17:05:42 +00001120type JniPackageInfo struct {
1121 // List of zip files containing JNI libraries
1122 // Zip files should have directory structure jni/<arch>/*.so
1123 JniPackages android.Paths
1124}
1125
Colin Crossbc7d76c2023-12-12 16:39:03 -08001126var JniPackageProvider = blueprint.NewProvider[JniPackageInfo]()
Sam Delmerico82602492022-06-10 17:05:42 +00001127
1128// Unzip an AAR and extract the JNI libs for $archString.
1129var extractJNI = pctx.AndroidStaticRule("extractJNI",
1130 blueprint.RuleParams{
1131 Command: `rm -rf $out $outDir && touch $out && ` +
1132 `unzip -qoDD -d $outDir $in "jni/${archString}/*" && ` +
1133 `jni_files=$$(find $outDir/jni -type f) && ` +
1134 // print error message if there are no JNI libs for this arch
1135 `[ -n "$$jni_files" ] || (echo "ERROR: no JNI libs found for arch ${archString}" && exit 1) && ` +
Sam Delmerico80ee45c2023-06-22 15:36:02 -04001136 `${config.SoongZipCmd} -o $out -L 0 -P 'lib/${archString}' ` +
Sam Delmerico82602492022-06-10 17:05:42 +00001137 `-C $outDir/jni/${archString} $$(echo $$jni_files | xargs -n1 printf " -f %s")`,
1138 CommandDeps: []string{"${config.SoongZipCmd}"},
1139 },
1140 "outDir", "archString")
1141
Colin Crossfabb6082018-02-20 17:22:23 -08001142// 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 -07001143// 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 -08001144var unzipAAR = pctx.AndroidStaticRule("unzipAAR",
1145 blueprint.RuleParams{
Dan Willemsen304cfec2019-05-28 14:49:06 -07001146 Command: `rm -rf $outDir && mkdir -p $outDir && ` +
Colin Cross205e9112020-08-06 13:20:17 -07001147 `unzip -qoDD -d $outDir $in && rm -rf $outDir/res && touch $out && ` +
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001148 `${config.Zip2ZipCmd} -i $in -o $assetsPackage 'assets/**/*' && ` +
Colin Cross205e9112020-08-06 13:20:17 -07001149 `${config.MergeZipsCmd} $combinedClassesJar $$(ls $outDir/classes.jar 2> /dev/null) $$(ls $outDir/libs/*.jar 2> /dev/null)`,
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001150 CommandDeps: []string{"${config.MergeZipsCmd}", "${config.Zip2ZipCmd}"},
Colin Crossfabb6082018-02-20 17:22:23 -08001151 },
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001152 "outDir", "combinedClassesJar", "assetsPackage")
Colin Crossfabb6082018-02-20 17:22:23 -08001153
1154func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1155 if len(a.properties.Aars) != 1 {
1156 ctx.PropertyErrorf("aars", "exactly one aar is required")
1157 return
1158 }
1159
Jiyong Park92315372021-04-02 08:45:46 +09001160 a.sdkVersion = a.SdkVersion(ctx)
1161 a.minSdkVersion = a.MinSdkVersion(ctx)
1162
Colin Crossff694a82023-12-13 15:54:49 -08001163 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
1164 a.hideApexVariantFromMake = !apexInfo.IsForPlatform()
Colin Cross56a83212020-09-15 18:30:11 -07001165
Nan Zhang4c819fb2018-08-27 18:31:46 -07001166 aarName := ctx.ModuleName() + ".aar"
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001167 a.aarPath = android.PathForModuleSrc(ctx, a.properties.Aars[0])
1168
Colin Cross1001a792019-03-21 22:21:39 -07001169 if Bool(a.properties.Jetifier) {
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001170 inputFile := a.aarPath
1171 a.aarPath = android.PathForModuleOut(ctx, "jetifier", aarName)
1172 TransformJetifier(ctx, a.aarPath.(android.WritablePath), inputFile)
Nan Zhang4c819fb2018-08-27 18:31:46 -07001173 }
Colin Crossfabb6082018-02-20 17:22:23 -08001174
Colin Cross607bbd62024-04-12 13:44:45 -07001175 jarName := ctx.ModuleName() + ".jar"
Colin Crossfabb6082018-02-20 17:22:23 -08001176 extractedAARDir := android.PathForModuleOut(ctx, "aar")
Colin Cross607bbd62024-04-12 13:44:45 -07001177 classpathFile := extractedAARDir.Join(ctx, jarName)
Colin Cross21ed4692024-04-24 20:23:38 +00001178
1179 extractedManifest := extractedAARDir.Join(ctx, "AndroidManifest.xml")
1180 providedManifest := android.OptionalPathForModuleSrc(ctx, a.properties.Manifest)
1181 if providedManifest.Valid() {
1182 a.manifest = providedManifest.Path()
1183 } else {
1184 a.manifest = extractedManifest
1185 }
1186
Colin Crossbb77d8e2024-02-15 14:43:47 -08001187 a.rTxt = extractedAARDir.Join(ctx, "R.txt")
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001188 a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip")
Sam Delmerico95d70942023-08-02 18:00:35 -04001189 a.proguardFlags = extractedAARDir.Join(ctx, "proguard.txt")
Colin Crosscde55342024-03-27 14:11:51 -07001190 transitiveProguardFlags, transitiveUnconditionalExportedFlags := collectDepProguardSpecInfo(ctx)
Colin Cross40213022023-12-13 15:19:49 -08001191 android.SetProvider(ctx, ProguardSpecInfoProvider, ProguardSpecInfo{
Sam Delmerico95d70942023-08-02 18:00:35 -04001192 ProguardFlagsFiles: android.NewDepSet[android.Path](
1193 android.POSTORDER,
1194 android.Paths{a.proguardFlags},
Colin Crosscde55342024-03-27 14:11:51 -07001195 transitiveProguardFlags,
1196 ),
1197 UnconditionallyExportedProguardFlags: android.NewDepSet[android.Path](
1198 android.POSTORDER,
Sam Delmerico95d70942023-08-02 18:00:35 -04001199 nil,
Colin Crosscde55342024-03-27 14:11:51 -07001200 transitiveUnconditionalExportedFlags,
Sam Delmerico95d70942023-08-02 18:00:35 -04001201 ),
1202 })
Colin Crossfabb6082018-02-20 17:22:23 -08001203
1204 ctx.Build(pctx, android.BuildParams{
1205 Rule: unzipAAR,
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001206 Input: a.aarPath,
Colin Cross21ed4692024-04-24 20:23:38 +00001207 Outputs: android.WritablePaths{classpathFile, a.proguardFlags, extractedManifest, a.assetsPackage, a.rTxt},
Colin Crossfabb6082018-02-20 17:22:23 -08001208 Description: "unzip AAR",
1209 Args: map[string]string{
Colin Cross205e9112020-08-06 13:20:17 -07001210 "outDir": extractedAARDir.String(),
Colin Cross9055e212024-03-23 04:43:41 +00001211 "combinedClassesJar": classpathFile.String(),
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001212 "assetsPackage": a.assetsPackage.String(),
Colin Crossfabb6082018-02-20 17:22:23 -08001213 },
1214 })
1215
Colin Crossa0ba2f52019-06-22 12:59:27 -07001216 // Always set --pseudo-localize, it will be stripped out later for release
1217 // builds that don't want it.
1218 compileFlags := []string{"--pseudo-localize"}
Colin Crossfabb6082018-02-20 17:22:23 -08001219 compiledResDir := android.PathForModuleOut(ctx, "flat-res")
Colin Crossfabb6082018-02-20 17:22:23 -08001220 flata := compiledResDir.Join(ctx, "gen_res.flata")
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +00001221 aapt2CompileZip(ctx, flata, a.aarPath, "res", compileFlags)
Colin Crossfabb6082018-02-20 17:22:23 -08001222
1223 a.exportPackage = android.PathForModuleOut(ctx, "package-res.apk")
Colin Crossfabb6082018-02-20 17:22:23 -08001224 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
Colin Crossbb77d8e2024-02-15 14:43:47 -08001225 aaptRTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -07001226 a.extraAaptPackagesFile = android.PathForModuleOut(ctx, "extra_packages")
Colin Crossfabb6082018-02-20 17:22:23 -08001227
1228 var linkDeps android.Paths
1229
1230 linkFlags := []string{
1231 "--static-lib",
Colin Cross4eae06d2023-06-20 22:40:02 -07001232 "--merge-only",
Colin Crossfabb6082018-02-20 17:22:23 -08001233 "--auto-add-overlay",
Colin Cross7c4dc5d2024-02-13 14:29:45 -08001234 "--no-static-lib-packages",
Colin Crossfabb6082018-02-20 17:22:23 -08001235 }
1236
Colin Cross10f7c4a2018-05-23 10:59:28 -07001237 linkFlags = append(linkFlags, "--manifest "+a.manifest.String())
1238 linkDeps = append(linkDeps, a.manifest)
Colin Crossfabb6082018-02-20 17:22:23 -08001239
Colin Cross8676c8c2023-10-12 15:58:57 -07001240 staticResourcesNodesDepSet, sharedResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedLibs, libFlags :=
Jiakai Zhang36937082024-04-15 11:15:50 +00001241 aaptLibs(ctx, android.SdkContext(a), nil, nil)
Colin Cross31656952018-05-24 16:11:20 -07001242
Colin Cross8676c8c2023-10-12 15:58:57 -07001243 _ = sharedResourcesNodesDepSet
Colin Crossab8d1382023-07-14 17:23:41 +00001244 _ = staticRRODirsDepSet
Colin Cross8676c8c2023-10-12 15:58:57 -07001245
Colin Crossab8d1382023-07-14 17:23:41 +00001246 staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
Colin Crossfabb6082018-02-20 17:22:23 -08001247
Colin Crossab8d1382023-07-14 17:23:41 +00001248 linkDeps = append(linkDeps, sharedLibs...)
Colin Cross4eae06d2023-06-20 22:40:02 -07001249 linkDeps = append(linkDeps, staticDeps.resPackages()...)
Colin Crossa97c5d32018-03-28 14:58:31 -07001250 linkFlags = append(linkFlags, libFlags...)
Colin Crossfabb6082018-02-20 17:22:23 -08001251
Colin Cross4eae06d2023-06-20 22:40:02 -07001252 overlayRes := android.Paths{flata}
1253
1254 // Treat static library dependencies of static libraries as imports.
1255 transitiveStaticLibs := staticDeps.resPackages()
1256 linkDeps = append(linkDeps, transitiveStaticLibs...)
1257 for _, staticLib := range transitiveStaticLibs {
1258 linkFlags = append(linkFlags, "-I "+staticLib.String())
1259 }
Colin Crossfabb6082018-02-20 17:22:23 -08001260
Colin Crossab8d1382023-07-14 17:23:41 +00001261 transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets())
Colin Crossbb77d8e2024-02-15 14:43:47 -08001262 aapt2Link(ctx, a.exportPackage, nil, proguardOptionsFile, aaptRTxt,
Jihoon Kang84b25892023-12-01 22:01:06 +00001263 linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil, nil)
Colin Crossfabb6082018-02-20 17:22:23 -08001264
Colin Cross4eae06d2023-06-20 22:40:02 -07001265 a.rJar = android.PathForModuleOut(ctx, "busybox/R.jar")
Rico Winda2fa2632024-03-13 13:09:17 +01001266 resourceProcessorBusyBoxGenerateBinaryR(ctx, a.rTxt, a.manifest, a.rJar, nil, true, nil, false)
Colin Cross4eae06d2023-06-20 22:40:02 -07001267
Colin Crossf3b7bad2023-08-02 15:49:00 -07001268 aapt2ExtractExtraPackages(ctx, a.extraAaptPackagesFile, a.rJar)
1269
Colin Crossab8d1382023-07-14 17:23:41 +00001270 resourcesNodesDepSetBuilder := android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL)
1271 resourcesNodesDepSetBuilder.Direct(&resourcesNode{
1272 resPackage: a.exportPackage,
1273 manifest: a.manifest,
Colin Cross4eae06d2023-06-20 22:40:02 -07001274 rTxt: a.rTxt,
1275 rJar: a.rJar,
Colin Crossab8d1382023-07-14 17:23:41 +00001276 assets: android.OptionalPathForPath(a.assetsPackage),
Colin Cross4eae06d2023-06-20 22:40:02 -07001277
1278 usedResourceProcessor: true,
Colin Crossab8d1382023-07-14 17:23:41 +00001279 })
1280 resourcesNodesDepSetBuilder.Transitive(staticResourcesNodesDepSet)
1281 a.resourcesNodesDepSet = resourcesNodesDepSetBuilder.Build()
1282
1283 manifestDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).Direct(a.manifest)
Colin Cross9055e212024-03-23 04:43:41 +00001284 manifestDepSetBuilder.Transitive(staticManifestsDepSet)
Colin Crossab8d1382023-07-14 17:23:41 +00001285 a.manifestsDepSet = manifestDepSetBuilder.Build()
Michael Rosenfeld5ad15572021-12-03 13:25:10 -08001286
Colin Cross312634e2023-11-21 15:13:56 -08001287 transitiveAaptResourcePackages := staticDeps.resPackages().Strings()
1288 transitiveAaptResourcePackages = slices.DeleteFunc(transitiveAaptResourcePackages, func(p string) bool {
1289 return p == a.exportPackage.String()
1290 })
1291 transitiveAaptResourcePackagesFile := android.PathForModuleOut(ctx, "transitive-res-packages")
1292 android.WriteFileRule(ctx, transitiveAaptResourcePackagesFile, strings.Join(transitiveAaptResourcePackages, "\n"))
1293 a.transitiveAaptResourcePackagesFile = transitiveAaptResourcePackagesFile
Colin Cross4eae06d2023-06-20 22:40:02 -07001294
Sam Delmerico9f9c0a22022-11-29 11:19:37 -05001295 a.collectTransitiveHeaderJars(ctx)
Colin Cross9055e212024-03-23 04:43:41 +00001296
1297 a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx)
1298
1299 var staticJars android.Paths
1300 var staticHeaderJars android.Paths
Colin Cross607bbd62024-04-12 13:44:45 -07001301 var staticResourceJars android.Paths
Colin Cross9055e212024-03-23 04:43:41 +00001302 ctx.VisitDirectDeps(func(module android.Module) {
1303 if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
1304 tag := ctx.OtherModuleDependencyTag(module)
1305 switch tag {
1306 case staticLibTag:
1307 staticJars = append(staticJars, dep.ImplementationJars...)
1308 staticHeaderJars = append(staticHeaderJars, dep.HeaderJars...)
Colin Cross607bbd62024-04-12 13:44:45 -07001309 staticResourceJars = append(staticResourceJars, dep.ResourceJars...)
Colin Cross9055e212024-03-23 04:43:41 +00001310 }
1311 }
1312 addCLCFromDep(ctx, module, a.classLoaderContexts)
Jiakai Zhang36937082024-04-15 11:15:50 +00001313 addMissingOptionalUsesLibsFromDep(ctx, module, &a.usesLibrary)
Colin Cross9055e212024-03-23 04:43:41 +00001314 })
1315
Colin Cross28ac2ff2024-04-02 12:21:34 -07001316 var implementationJarFile android.OutputPath
Colin Cross9055e212024-03-23 04:43:41 +00001317 if len(staticJars) > 0 {
1318 combineJars := append(android.Paths{classpathFile}, staticJars...)
Colin Cross607bbd62024-04-12 13:44:45 -07001319 implementationJarFile = android.PathForModuleOut(ctx, "combined", jarName).OutputPath
Colin Cross28ac2ff2024-04-02 12:21:34 -07001320 TransformJarsToJar(ctx, implementationJarFile, "combine", combineJars, android.OptionalPath{}, false, nil, nil)
Colin Cross9055e212024-03-23 04:43:41 +00001321 } else {
Colin Cross28ac2ff2024-04-02 12:21:34 -07001322 implementationJarFile = classpathFile
Colin Cross9055e212024-03-23 04:43:41 +00001323 }
1324
Colin Cross607bbd62024-04-12 13:44:45 -07001325 var resourceJarFile android.Path
1326 if len(staticResourceJars) > 1 {
1327 combinedJar := android.PathForModuleOut(ctx, "res-combined", jarName)
1328 TransformJarsToJar(ctx, combinedJar, "for resources", staticResourceJars, android.OptionalPath{},
1329 false, nil, nil)
1330 resourceJarFile = combinedJar
1331 } else if len(staticResourceJars) == 1 {
1332 resourceJarFile = staticResourceJars[0]
1333 }
1334
1335 // merge implementation jar with resources if necessary
1336 implementationAndResourcesJar := implementationJarFile
1337 if resourceJarFile != nil {
1338 jars := android.Paths{resourceJarFile, implementationAndResourcesJar}
1339 combinedJar := android.PathForModuleOut(ctx, "withres", jarName).OutputPath
1340 TransformJarsToJar(ctx, combinedJar, "for resources", jars, android.OptionalPath{},
1341 false, nil, nil)
1342 implementationAndResourcesJar = combinedJar
1343 }
1344
1345 a.implementationJarFile = implementationJarFile
Colin Cross28ac2ff2024-04-02 12:21:34 -07001346 // 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 -07001347 a.implementationAndResourcesJarFile = implementationAndResourcesJar.WithoutRel()
Colin Cross28ac2ff2024-04-02 12:21:34 -07001348
Colin Cross9055e212024-03-23 04:43:41 +00001349 if len(staticHeaderJars) > 0 {
1350 combineJars := append(android.Paths{classpathFile}, staticHeaderJars...)
Colin Cross607bbd62024-04-12 13:44:45 -07001351 a.headerJarFile = android.PathForModuleOut(ctx, "turbine-combined", jarName)
Colin Cross9055e212024-03-23 04:43:41 +00001352 TransformJarsToJar(ctx, a.headerJarFile, "combine header jars", combineJars, android.OptionalPath{}, false, nil, nil)
1353 } else {
1354 a.headerJarFile = classpathFile
1355 }
1356
Colin Cross40213022023-12-13 15:19:49 -08001357 android.SetProvider(ctx, JavaInfoProvider, JavaInfo{
Colin Cross9055e212024-03-23 04:43:41 +00001358 HeaderJars: android.PathsIfNonNil(a.headerJarFile),
Colin Cross607bbd62024-04-12 13:44:45 -07001359 ResourceJars: android.PathsIfNonNil(resourceJarFile),
Sam Delmerico9f9c0a22022-11-29 11:19:37 -05001360 TransitiveLibsHeaderJars: a.transitiveLibsHeaderJars,
1361 TransitiveStaticLibsHeaderJars: a.transitiveStaticLibsHeaderJars,
Colin Cross607bbd62024-04-12 13:44:45 -07001362 ImplementationAndResourcesJars: android.PathsIfNonNil(a.implementationAndResourcesJarFile),
Colin Cross9055e212024-03-23 04:43:41 +00001363 ImplementationJars: android.PathsIfNonNil(a.implementationJarFile),
Jihoon Kangfe914ed2024-02-12 22:49:21 +00001364 StubsLinkType: Implementation,
Joe Onorato6fe59eb2023-07-16 13:20:33 -07001365 // TransitiveAconfigFiles: // TODO(b/289117800): LOCAL_ACONFIG_FILES for prebuilts
Colin Crossdcf71b22021-02-01 13:59:03 -08001366 })
Sam Delmerico82602492022-06-10 17:05:42 +00001367
1368 if proptools.Bool(a.properties.Extract_jni) {
1369 for _, t := range ctx.MultiTargets() {
1370 arch := t.Arch.Abi[0]
1371 path := android.PathForModuleOut(ctx, arch+"_jni.zip")
1372 a.jniPackages = append(a.jniPackages, path)
1373
1374 outDir := android.PathForModuleOut(ctx, "aarForJni")
1375 aarPath := android.PathForModuleSrc(ctx, a.properties.Aars[0])
1376 ctx.Build(pctx, android.BuildParams{
1377 Rule: extractJNI,
1378 Input: aarPath,
1379 Outputs: android.WritablePaths{path},
1380 Description: "extract JNI from AAR",
1381 Args: map[string]string{
1382 "outDir": outDir.String(),
1383 "archString": arch,
1384 },
1385 })
1386 }
Sam Delmerico82602492022-06-10 17:05:42 +00001387 }
Colin Crosse8eeec92023-12-14 14:50:05 -08001388
Colin Cross40213022023-12-13 15:19:49 -08001389 android.SetProvider(ctx, JniPackageProvider, JniPackageInfo{
Colin Crosse8eeec92023-12-14 14:50:05 -08001390 JniPackages: a.jniPackages,
1391 })
Colin Crossdcf71b22021-02-01 13:59:03 -08001392}
Colin Crossfabb6082018-02-20 17:22:23 -08001393
1394func (a *AARImport) HeaderJars() android.Paths {
Colin Cross9055e212024-03-23 04:43:41 +00001395 return android.Paths{a.headerJarFile}
Colin Crossfabb6082018-02-20 17:22:23 -08001396}
1397
Colin Cross331a1212018-08-15 20:40:52 -07001398func (a *AARImport) ImplementationAndResourcesJars() android.Paths {
Colin Cross607bbd62024-04-12 13:44:45 -07001399 return android.Paths{a.implementationAndResourcesJarFile}
Colin Cross331a1212018-08-15 20:40:52 -07001400}
1401
Colin Cross9055e212024-03-23 04:43:41 +00001402func (a *AARImport) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath {
1403 return OptionalDexJarPath{}
Colin Crossf24a22a2019-01-31 14:12:44 -08001404}
1405
Ulya Trafimovich9f3052c2020-06-09 14:31:19 +01001406func (a *AARImport) DexJarInstallPath() android.Path {
1407 return nil
1408}
1409
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +01001410func (a *AARImport) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap {
Colin Cross9055e212024-03-23 04:43:41 +00001411 return a.classLoaderContexts
Jiyong Park1be96912018-05-28 18:02:19 +09001412}
1413
Colin Cross9055e212024-03-23 04:43:41 +00001414var _ UsesLibraryDependency = (*AARImport)(nil)
1415
Jiyong Park45bf82e2020-12-15 22:29:02 +09001416var _ android.ApexModule = (*AARImport)(nil)
1417
1418// Implements android.ApexModule
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001419func (a *AARImport) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
1420 return a.depIsInSameApex(ctx, dep)
1421}
1422
Jiyong Park45bf82e2020-12-15 22:29:02 +09001423// Implements android.ApexModule
Colin Cross9055e212024-03-23 04:43:41 +00001424func (a *AARImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
Dan Albertc8060532020-07-22 22:32:17 -07001425 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09001426 return nil
1427}
1428
Sam Delmericoaf8bb702022-07-25 15:39:32 -04001429var _ android.PrebuiltInterface = (*AARImport)(nil)
Colin Crossfabb6082018-02-20 17:22:23 -08001430
Jiakai Zhangf98da192024-04-15 11:15:41 +00001431func (a *AARImport) UsesLibrary() *usesLibrary {
1432 return &a.usesLibrary
1433}
1434
1435var _ ModuleWithUsesLibrary = (*AARImport)(nil)
1436
Colin Cross1b16b0e2019-02-12 14:41:32 -08001437// android_library_import imports an `.aar` file into the build graph as if it was built with android_library.
1438//
1439// This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
1440// an android_app module.
Colin Crossfabb6082018-02-20 17:22:23 -08001441func AARImportFactory() android.Module {
1442 module := &AARImport{}
1443
Colin Cross9055e212024-03-23 04:43:41 +00001444 module.AddProperties(
1445 &module.properties,
1446 &module.usesLibrary.usesLibraryProperties,
1447 )
Colin Crossfabb6082018-02-20 17:22:23 -08001448
1449 android.InitPrebuiltModule(module, &module.properties.Aars)
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001450 android.InitApexModule(module)
Sam Delmerico82602492022-06-10 17:05:42 +00001451 InitJavaModuleMultiTargets(module, android.DeviceSupported)
Colin Crossfabb6082018-02-20 17:22:23 -08001452 return module
1453}