blob: 01bd1030235e426dd9204947a408dfabb9d6ffb3 [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 Crossc20dc852020-11-10 12:27:45 -080020 "strconv"
Colin Crossa97c5d32018-03-28 14:58:31 -070021 "strings"
Colin Crossfabb6082018-02-20 17:22:23 -080022
Jaewoong Jung9befb0c2020-01-18 10:33:43 -080023 "android/soong/android"
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -050024 "android/soong/bazel"
Ulya Trafimovich31e444e2020-08-14 17:32:16 +010025 "android/soong/dexpreopt"
Jaewoong Jung9befb0c2020-01-18 10:33:43 -080026
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 {
Jared Duke5979b302022-12-19 21:08:39 +000032 LibraryDependency
Colin Crossa97c5d32018-03-28 14:58:31 -070033 ExportPackage() android.Path
Colin Crossab8d1382023-07-14 17:23:41 +000034 ResourcesNodeDepSet() *android.DepSet[*resourcesNode]
35 RRODirsDepSet() *android.DepSet[rroDir]
36 ManifestsDepSet() *android.DepSet[android.Path]
Jaewoong Jungc779cd42020-10-06 18:56:10 -070037 SetRROEnforcedForDependent(enforce bool)
38 IsRROEnforced(ctx android.BaseModuleContext) bool
Colin Crossa97c5d32018-03-28 14:58:31 -070039}
40
41func init() {
Paul Duffinf9b1da02019-12-18 19:51:55 +000042 RegisterAARBuildComponents(android.InitRegistrationContext)
43}
44
45func RegisterAARBuildComponents(ctx android.RegistrationContext) {
46 ctx.RegisterModuleType("android_library_import", AARImportFactory)
47 ctx.RegisterModuleType("android_library", AndroidLibraryFactory)
Paul Duffin04ba70d2021-03-22 13:56:43 +000048 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
49 ctx.TopDown("propagate_rro_enforcement", propagateRROEnforcementMutator).Parallel()
50 })
Colin Crossa97c5d32018-03-28 14:58:31 -070051}
52
53//
54// AAR (android library)
55//
56
57type androidLibraryProperties struct {
58 BuildAAR bool `blueprint:"mutated"`
59}
60
61type aaptProperties struct {
62 // flags passed to aapt when creating the apk
63 Aaptflags []string
64
Dan Willemsen72be5902018-10-24 20:24:57 -070065 // include all resource configurations, not just the product-configured
66 // ones.
67 Aapt_include_all_resources *bool
68
Colin Crossa97c5d32018-03-28 14:58:31 -070069 // list of directories relative to the Blueprints file containing assets.
Colin Cross0ddae7f2019-02-07 15:30:01 -080070 // Defaults to ["assets"] if a directory called assets exists. Set to []
71 // to disable the default.
Colin Crossa97c5d32018-03-28 14:58:31 -070072 Asset_dirs []string
73
74 // list of directories relative to the Blueprints file containing
Colin Cross0ddae7f2019-02-07 15:30:01 -080075 // Android resources. Defaults to ["res"] if a directory called res exists.
76 // Set to [] to disable the default.
Colin Crossa97c5d32018-03-28 14:58:31 -070077 Resource_dirs []string
78
Colin Crossa592e3e2019-02-19 16:59:53 -080079 // list of zip files containing Android resources.
Colin Cross27b922f2019-03-04 22:35:41 -080080 Resource_zips []string `android:"path"`
Colin Crossa592e3e2019-02-19 16:59:53 -080081
Colin Crossa97c5d32018-03-28 14:58:31 -070082 // path to AndroidManifest.xml. If unset, defaults to "AndroidManifest.xml".
Colin Cross27b922f2019-03-04 22:35:41 -080083 Manifest *string `android:"path"`
changho.shinb5432b72019-08-08 18:37:17 +090084
85 // paths to additional manifest files to merge with main manifest.
86 Additional_manifests []string `android:"path"`
Sasha Smundak541056c2019-10-28 15:50:06 -070087
88 // do not include AndroidManifest from dependent libraries
89 Dont_merge_manifests *bool
Jaewoong Jungc779cd42020-10-06 18:56:10 -070090
91 // true if RRO is enforced for any of the dependent modules
92 RROEnforcedForDependent bool `blueprint:"mutated"`
Colin Crossa97c5d32018-03-28 14:58:31 -070093}
94
95type aapt struct {
Colin Crossab8d1382023-07-14 17:23:41 +000096 aaptSrcJar android.Path
97 exportPackage android.Path
98 manifestPath android.Path
99 proguardOptionsFile android.Path
100 rTxt android.Path
101 extraAaptPackagesFile android.Path
102 mergedManifestFile android.Path
103 noticeFile android.OptionalPath
104 assetPackage android.OptionalPath
105 isLibrary bool
106 defaultManifestVersion string
107 useEmbeddedNativeLibs bool
108 useEmbeddedDex bool
109 usesNonSdkApis bool
110 hasNoCode bool
111 LoggingParent string
112 resourceFiles android.Paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700113
Colin Crosse560c4a2019-03-19 16:03:11 -0700114 splitNames []string
115 splits []split
116
Colin Crossa97c5d32018-03-28 14:58:31 -0700117 aaptProperties aaptProperties
Colin Crossab8d1382023-07-14 17:23:41 +0000118
119 resourcesNodesDepSet *android.DepSet[*resourcesNode]
120 rroDirsDepSet *android.DepSet[rroDir]
121 manifestsDepSet *android.DepSet[android.Path]
Colin Crossa97c5d32018-03-28 14:58:31 -0700122}
123
Colin Crosse560c4a2019-03-19 16:03:11 -0700124type split struct {
125 name string
126 suffix string
127 path android.Path
128}
129
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700130// Propagate RRO enforcement flag to static lib dependencies transitively.
131func propagateRROEnforcementMutator(ctx android.TopDownMutatorContext) {
132 m := ctx.Module()
133 if d, ok := m.(AndroidLibraryDependency); ok && d.IsRROEnforced(ctx) {
134 ctx.VisitDirectDepsWithTag(staticLibTag, func(d android.Module) {
135 if a, ok := d.(AndroidLibraryDependency); ok {
136 a.SetRROEnforcedForDependent(true)
137 }
138 })
139 }
140}
141
Colin Crossa97c5d32018-03-28 14:58:31 -0700142func (a *aapt) ExportPackage() android.Path {
143 return a.exportPackage
144}
Colin Crossab8d1382023-07-14 17:23:41 +0000145func (a *aapt) ResourcesNodeDepSet() *android.DepSet[*resourcesNode] {
146 return a.resourcesNodesDepSet
Colin Crossc1c37552019-01-31 11:42:41 -0800147}
148
Colin Crossab8d1382023-07-14 17:23:41 +0000149func (a *aapt) RRODirsDepSet() *android.DepSet[rroDir] {
150 return a.rroDirsDepSet
Colin Crossc1c37552019-01-31 11:42:41 -0800151}
152
Colin Crossab8d1382023-07-14 17:23:41 +0000153func (a *aapt) ManifestsDepSet() *android.DepSet[android.Path] {
154 return a.manifestsDepSet
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800155}
156
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700157func (a *aapt) SetRROEnforcedForDependent(enforce bool) {
158 a.aaptProperties.RROEnforcedForDependent = enforce
159}
160
161func (a *aapt) IsRROEnforced(ctx android.BaseModuleContext) bool {
162 // True if RRO is enforced for this module or...
163 return ctx.Config().EnforceRROForModule(ctx.ModuleName()) ||
Jeongik Chacee5ba92021-02-19 12:11:51 +0900164 // if RRO is enforced for any of its dependents.
165 a.aaptProperties.RROEnforcedForDependent
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700166}
167
Jiyong Parkf1691d22021-03-29 20:11:58 +0900168func (a *aapt) aapt2Flags(ctx android.ModuleContext, sdkContext android.SdkContext,
Colin Crossa0ba2f52019-06-22 12:59:27 -0700169 manifestPath android.Path) (compileFlags, linkFlags []string, linkDeps android.Paths,
170 resDirs, overlayDirs []globbedResourceDir, rroDirs []rroDir, resZips android.Paths) {
Colin Crossa97c5d32018-03-28 14:58:31 -0700171
Jaewoong Jung3aff5782020-02-11 07:54:35 -0800172 hasVersionCode := android.PrefixInList(a.aaptProperties.Aaptflags, "--version-code")
173 hasVersionName := android.PrefixInList(a.aaptProperties.Aaptflags, "--version-name")
Colin Crossa97c5d32018-03-28 14:58:31 -0700174
Colin Crossa97c5d32018-03-28 14:58:31 -0700175 // Flags specified in Android.bp
176 linkFlags = append(linkFlags, a.aaptProperties.Aaptflags...)
177
178 linkFlags = append(linkFlags, "--no-static-lib-packages")
179
180 // Find implicit or explicit asset and resource dirs
181 assetDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Asset_dirs, "assets")
182 resourceDirs := android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res")
Colin Cross8a497952019-03-05 22:25:09 -0800183 resourceZips := android.PathsForModuleSrc(ctx, a.aaptProperties.Resource_zips)
Colin Crossa97c5d32018-03-28 14:58:31 -0700184
Colin Crossa97c5d32018-03-28 14:58:31 -0700185 // Glob directories into lists of paths
186 for _, dir := range resourceDirs {
187 resDirs = append(resDirs, globbedResourceDir{
188 dir: dir,
189 files: androidResourceGlob(ctx, dir),
190 })
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700191 resOverlayDirs, resRRODirs := overlayResourceGlob(ctx, a, dir)
Colin Crossa97c5d32018-03-28 14:58:31 -0700192 overlayDirs = append(overlayDirs, resOverlayDirs...)
193 rroDirs = append(rroDirs, resRRODirs...)
194 }
195
Colin Crossc20dc852020-11-10 12:27:45 -0800196 var assetDeps android.Paths
197 for i, dir := range assetDirs {
198 // Add a dependency on every file in the asset directory. This ensures the aapt2
199 // rule will be rerun if one of the files in the asset directory is modified.
200 assetDeps = append(assetDeps, androidResourceGlob(ctx, dir)...)
201
202 // Add a dependency on a file that contains a list of all the files in the asset directory.
203 // This ensures the aapt2 rule will be run if a file is removed from the asset directory,
204 // or a file is added whose timestamp is older than the output of aapt2.
205 assetFileListFile := android.PathForModuleOut(ctx, "asset_dir_globs", strconv.Itoa(i)+".glob")
206 androidResourceGlobList(ctx, dir, assetFileListFile)
207 assetDeps = append(assetDeps, assetFileListFile)
Colin Crossa97c5d32018-03-28 14:58:31 -0700208 }
209
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700210 assetDirStrings := assetDirs.Strings()
211 if a.noticeFile.Valid() {
212 assetDirStrings = append(assetDirStrings, filepath.Dir(a.noticeFile.Path().String()))
Colin Crossc20dc852020-11-10 12:27:45 -0800213 assetDeps = append(assetDeps, a.noticeFile.Path())
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700214 }
215
Colin Crossa97c5d32018-03-28 14:58:31 -0700216 linkFlags = append(linkFlags, "--manifest "+manifestPath.String())
217 linkDeps = append(linkDeps, manifestPath)
218
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700219 linkFlags = append(linkFlags, android.JoinWithPrefix(assetDirStrings, "-A "))
Colin Crossc20dc852020-11-10 12:27:45 -0800220 linkDeps = append(linkDeps, assetDeps...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700221
Spandan Das50885c02023-02-23 21:31:33 +0000222 // Returns the effective version for {min|target}_sdk_version
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000223 effectiveVersionString := func(sdkVersion android.SdkSpec, minSdkVersion android.ApiLevel) string {
Spandan Das50885c02023-02-23 21:31:33 +0000224 // If {min|target}_sdk_version is current, use sdk_version to determine the effective level
225 // This is necessary for vendor modules.
226 // The effective version does not _only_ depend on {min|target}_sdk_version(level),
227 // but also on the sdk_version (kind+level)
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000228 if minSdkVersion.IsCurrent() {
Spandan Das50885c02023-02-23 21:31:33 +0000229 ret, err := sdkVersion.EffectiveVersionString(ctx)
230 if err != nil {
231 ctx.ModuleErrorf("invalid sdk_version: %s", err)
232 }
233 return ret
234 }
235 ret, err := minSdkVersion.EffectiveVersionString(ctx)
236 if err != nil {
237 ctx.ModuleErrorf("invalid min_sdk_version: %s", err)
238 }
239 return ret
Jiyong Park6a927c42020-01-21 02:03:43 +0900240 }
Spandan Das50885c02023-02-23 21:31:33 +0000241 // SDK version flags
242 sdkVersion := sdkContext.SdkVersion(ctx)
243 minSdkVersion := effectiveVersionString(sdkVersion, sdkContext.MinSdkVersion(ctx))
Colin Crossa97c5d32018-03-28 14:58:31 -0700244
Colin Cross83bb3162018-06-25 15:48:06 -0700245 linkFlags = append(linkFlags, "--min-sdk-version "+minSdkVersion)
Spandan Das6450b552023-02-23 19:27:07 +0000246 // Use minSdkVersion for target-sdk-version, even if `target_sdk_version` is set
247 // This behavior has been copied from Make.
Colin Cross83bb3162018-06-25 15:48:06 -0700248 linkFlags = append(linkFlags, "--target-sdk-version "+minSdkVersion)
Colin Crossa97c5d32018-03-28 14:58:31 -0700249
Colin Crossa97c5d32018-03-28 14:58:31 -0700250 // Version code
251 if !hasVersionCode {
Dan Albert4f378d72020-07-23 17:32:15 -0700252 linkFlags = append(linkFlags, "--version-code", ctx.Config().PlatformSdkVersion().String())
Colin Crossa97c5d32018-03-28 14:58:31 -0700253 }
254
255 if !hasVersionName {
Colin Cross402d5e02018-04-25 14:54:06 -0700256 var versionName string
257 if ctx.ModuleName() == "framework-res" {
258 // Some builds set AppsDefaultVersionName() to include the build number ("O-123456"). aapt2 copies the
259 // version name of framework-res into app manifests as compileSdkVersionCodename, which confuses things
Colin Crossbfd347d2018-05-09 11:11:35 -0700260 // if it contains the build number. Use the PlatformVersionName instead.
261 versionName = ctx.Config().PlatformVersionName()
Colin Cross402d5e02018-04-25 14:54:06 -0700262 } else {
263 versionName = ctx.Config().AppsDefaultVersionName()
264 }
Colin Cross0b9f31f2019-02-28 11:00:01 -0800265 versionName = proptools.NinjaEscape(versionName)
Colin Crossa97c5d32018-03-28 14:58:31 -0700266 linkFlags = append(linkFlags, "--version-name ", versionName)
267 }
268
Colin Crossa0ba2f52019-06-22 12:59:27 -0700269 linkFlags, compileFlags = android.FilterList(linkFlags, []string{"--legacy"})
270
271 // Always set --pseudo-localize, it will be stripped out later for release
272 // builds that don't want it.
273 compileFlags = append(compileFlags, "--pseudo-localize")
274
275 return compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resourceZips
Colin Crossa97c5d32018-03-28 14:58:31 -0700276}
277
Paul Duffin250e6192019-06-07 10:44:37 +0100278func (a *aapt) deps(ctx android.BottomUpMutatorContext, sdkDep sdkDep) {
Colin Cross42308aa2018-11-14 21:44:17 -0800279 if sdkDep.frameworkResModule != "" {
280 ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
Colin Crossa97c5d32018-03-28 14:58:31 -0700281 }
282}
283
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800284var extractAssetsRule = pctx.AndroidStaticRule("extractAssets",
285 blueprint.RuleParams{
286 Command: `${config.Zip2ZipCmd} -i ${in} -o ${out} "assets/**/*"`,
287 CommandDeps: []string{"${config.Zip2ZipCmd}"},
288 })
289
Jiyong Parkf1691d22021-03-29 20:11:58 +0900290func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkContext,
Paul Duffin06530572022-02-03 17:54:15 +0000291 classLoaderContexts dexpreopt.ClassLoaderContextMap, excludedLibs []string,
Harshit Mahajan5b8b7302022-06-10 11:24:05 +0000292 enforceDefaultTargetSdkVersion bool, extraLinkFlags ...string) {
Colin Cross5446e882019-05-22 10:46:27 -0700293
Colin Crossab8d1382023-07-14 17:23:41 +0000294 staticResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedDeps, libFlags :=
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100295 aaptLibs(ctx, sdkContext, classLoaderContexts)
Ulya Trafimovich31e444e2020-08-14 17:32:16 +0100296
Paul Duffin06530572022-02-03 17:54:15 +0000297 // Exclude any libraries from the supplied list.
298 classLoaderContexts = classLoaderContexts.ExcludeLibs(excludedLibs)
299
Colin Cross31656952018-05-24 16:11:20 -0700300 // App manifest file
301 manifestFile := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")
302 manifestSrcPath := android.PathForModuleSrc(ctx, manifestFile)
303
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000304 manifestPath := ManifestFixer(ctx, manifestSrcPath, ManifestFixerParams{
Harshit Mahajan5b8b7302022-06-10 11:24:05 +0000305 SdkContext: sdkContext,
306 ClassLoaderContexts: classLoaderContexts,
307 IsLibrary: a.isLibrary,
308 DefaultManifestVersion: a.defaultManifestVersion,
309 UseEmbeddedNativeLibs: a.useEmbeddedNativeLibs,
310 UsesNonSdkApis: a.usesNonSdkApis,
311 UseEmbeddedDex: a.useEmbeddedDex,
312 HasNoCode: a.hasNoCode,
313 LoggingParent: a.LoggingParent,
314 EnforceDefaultTargetSdkVersion: enforceDefaultTargetSdkVersion,
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000315 })
Colin Cross90c25c62019-04-19 16:22:57 -0700316
Colin Crossab8d1382023-07-14 17:23:41 +0000317 staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
318
Luca Stefanifd898822019-09-10 22:13:31 +0200319 // Add additional manifest files to transitive manifests.
320 additionalManifests := android.PathsForModuleSrc(ctx, a.aaptProperties.Additional_manifests)
Colin Crossab8d1382023-07-14 17:23:41 +0000321 transitiveManifestPaths := append(android.Paths{manifestPath}, additionalManifests...)
322 // TODO(b/288358614): Soong has historically not merged manifests from dependencies of android_library_import
323 // modules. Merging manifests from dependencies could remove the need for pom2bp to generate the "-nodeps" copies
324 // of androidx libraries, but doing so triggers errors due to errors introduced by existing dependencies of
325 // android_library_import modules. If this is fixed, staticManifestsDepSet can be dropped completely in favor of
326 // staticResourcesNodesDepSet.manifests()
327 transitiveManifestPaths = append(transitiveManifestPaths, staticManifestsDepSet.ToList()...)
Colin Cross90c25c62019-04-19 16:22:57 -0700328
Colin Crossab8d1382023-07-14 17:23:41 +0000329 if len(transitiveManifestPaths) > 1 && !Bool(a.aaptProperties.Dont_merge_manifests) {
330 a.mergedManifestFile = manifestMerger(ctx, transitiveManifestPaths[0], transitiveManifestPaths[1:], a.isLibrary)
Colin Cross90c25c62019-04-19 16:22:57 -0700331 if !a.isLibrary {
332 // Only use the merged manifest for applications. For libraries, the transitive closure of manifests
333 // will be propagated to the final application and merged there. The merged manifest for libraries is
334 // only passed to Make, which can't handle transitive dependencies.
335 manifestPath = a.mergedManifestFile
336 }
337 } else {
338 a.mergedManifestFile = manifestPath
339 }
Colin Cross31656952018-05-24 16:11:20 -0700340
Colin Crossa0ba2f52019-06-22 12:59:27 -0700341 compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, sdkContext, manifestPath)
Colin Cross31656952018-05-24 16:11:20 -0700342
343 linkFlags = append(linkFlags, libFlags...)
Colin Crossab8d1382023-07-14 17:23:41 +0000344 linkDeps = append(linkDeps, sharedDeps...)
345 linkDeps = append(linkDeps, staticDeps.resPackages()...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700346 linkFlags = append(linkFlags, extraLinkFlags...)
Colin Cross1b6a3cf2018-07-24 14:51:30 -0700347 if a.isLibrary {
348 linkFlags = append(linkFlags, "--static-lib")
349 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700350
351 packageRes := android.PathForModuleOut(ctx, "package-res.apk")
Jiyong Parkb7c639e2019-08-19 14:56:02 +0900352 // the subdir "android" is required to be filtered by package names
353 srcJar := android.PathForModuleGen(ctx, "android", "R.srcjar")
Colin Crossa97c5d32018-03-28 14:58:31 -0700354 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
355 rTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -0700356 // This file isn't used by Soong, but is generated for exporting
357 extraPackages := android.PathForModuleOut(ctx, "extra_packages")
Colin Crossa97c5d32018-03-28 14:58:31 -0700358
Colin Cross4aaa84a2018-08-21 15:14:37 -0700359 var compiledResDirs []android.Paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700360 for _, dir := range resDirs {
Colin Cross014489c2020-06-02 20:09:13 -0700361 a.resourceFiles = append(a.resourceFiles, dir.files...)
Colin Crossa0ba2f52019-06-22 12:59:27 -0700362 compiledResDirs = append(compiledResDirs, aapt2Compile(ctx, dir.dir, dir.files, compileFlags).Paths())
Colin Crossa97c5d32018-03-28 14:58:31 -0700363 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700364
Colin Crossa592e3e2019-02-19 16:59:53 -0800365 for i, zip := range resZips {
366 flata := android.PathForModuleOut(ctx, fmt.Sprintf("reszip.%d.flata", i))
Colin Crossa0ba2f52019-06-22 12:59:27 -0700367 aapt2CompileZip(ctx, flata, zip, "", compileFlags)
Colin Crossa592e3e2019-02-19 16:59:53 -0800368 compiledResDirs = append(compiledResDirs, android.Paths{flata})
369 }
370
Colin Cross4aaa84a2018-08-21 15:14:37 -0700371 var compiledRes, compiledOverlay android.Paths
372
Colin Crossab8d1382023-07-14 17:23:41 +0000373 // AAPT2 overlays are in lowest to highest priority order, reverse the topological order
374 // of transitiveStaticLibs.
375 transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages())
376
Colin Cross4aaa84a2018-08-21 15:14:37 -0700377 compiledOverlay = append(compiledOverlay, transitiveStaticLibs...)
378
Colin Crossbec85302019-02-13 13:15:46 -0800379 if len(transitiveStaticLibs) > 0 {
Colin Cross4aaa84a2018-08-21 15:14:37 -0700380 // If we are using static android libraries, every source file becomes an overlay.
381 // This is to emulate old AAPT behavior which simulated library support.
382 for _, compiledResDir := range compiledResDirs {
383 compiledOverlay = append(compiledOverlay, compiledResDir...)
384 }
Colin Crossbec85302019-02-13 13:15:46 -0800385 } else if a.isLibrary {
386 // Otherwise, for a static library we treat all the resources equally with no overlay.
387 for _, compiledResDir := range compiledResDirs {
388 compiledRes = append(compiledRes, compiledResDir...)
389 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700390 } else if len(compiledResDirs) > 0 {
391 // Without static libraries, the first directory is our directory, which can then be
392 // overlaid by the rest.
393 compiledRes = append(compiledRes, compiledResDirs[0]...)
394 for _, compiledResDir := range compiledResDirs[1:] {
395 compiledOverlay = append(compiledOverlay, compiledResDir...)
396 }
397 }
398
Colin Crossa97c5d32018-03-28 14:58:31 -0700399 for _, dir := range overlayDirs {
Colin Crossa0ba2f52019-06-22 12:59:27 -0700400 compiledOverlay = append(compiledOverlay, aapt2Compile(ctx, dir.dir, dir.files, compileFlags).Paths()...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700401 }
402
Colin Crosse560c4a2019-03-19 16:03:11 -0700403 var splitPackages android.WritablePaths
404 var splits []split
405
406 for _, s := range a.splitNames {
407 suffix := strings.Replace(s, ",", "_", -1)
408 path := android.PathForModuleOut(ctx, "package_"+suffix+".apk")
409 linkFlags = append(linkFlags, "--split", path.String()+":"+s)
410 splitPackages = append(splitPackages, path)
411 splits = append(splits, split{
412 name: s,
413 suffix: suffix,
414 path: path,
415 })
416 }
417
Colin Crossab8d1382023-07-14 17:23:41 +0000418 // No need to specify assets from dependencies to aapt2Link for libraries, all transitive assets will be
419 // provided to the final app aapt2Link step.
420 var transitiveAssets android.Paths
421 if !a.isLibrary {
422 transitiveAssets = android.ReverseSliceInPlace(staticDeps.assets())
423 }
Colin Cross66f78822018-05-02 12:58:28 -0700424 aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt, extraPackages,
Colin Crossab8d1382023-07-14 17:23:41 +0000425 linkFlags, linkDeps, compiledRes, compiledOverlay, transitiveAssets, splitPackages)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800426
427 // Extract assets from the resource package output so that they can be used later in aapt2link
428 // for modules that depend on this one.
Colin Crossab8d1382023-07-14 17:23:41 +0000429 if android.PrefixInList(linkFlags, "-A ") {
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800430 assets := android.PathForModuleOut(ctx, "assets.zip")
431 ctx.Build(pctx, android.BuildParams{
432 Rule: extractAssetsRule,
433 Input: packageRes,
434 Output: assets,
435 Description: "extract assets from built resource file",
436 })
437 a.assetPackage = android.OptionalPathForPath(assets)
438 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700439
440 a.aaptSrcJar = srcJar
441 a.exportPackage = packageRes
442 a.manifestPath = manifestPath
443 a.proguardOptionsFile = proguardOptionsFile
Colin Cross66f78822018-05-02 12:58:28 -0700444 a.extraAaptPackagesFile = extraPackages
Colin Crossa97c5d32018-03-28 14:58:31 -0700445 a.rTxt = rTxt
Colin Crosse560c4a2019-03-19 16:03:11 -0700446 a.splits = splits
Colin Crossab8d1382023-07-14 17:23:41 +0000447 a.resourcesNodesDepSet = android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL).
448 Direct(&resourcesNode{
449 resPackage: a.exportPackage,
450 manifest: a.manifestPath,
451 additionalManifests: additionalManifests,
452 assets: a.assetPackage,
453 }).
454 Transitive(staticResourcesNodesDepSet).Build()
455 a.rroDirsDepSet = android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL).
456 Direct(rroDirs...).
457 Transitive(staticRRODirsDepSet).Build()
458 a.manifestsDepSet = android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).
459 Direct(a.manifestPath).
460 DirectSlice(additionalManifests).
461 Transitive(staticManifestsDepSet).Build()
462}
463
464type resourcesNode struct {
465 resPackage android.Path
466 manifest android.Path
467 additionalManifests android.Paths
468 assets android.OptionalPath
469}
470
471type transitiveAarDeps []*resourcesNode
472
473func (t transitiveAarDeps) resPackages() android.Paths {
474 var paths android.Paths
475 for _, dep := range t {
476 paths = append(paths, dep.resPackage)
477 }
478 return android.FirstUniquePaths(paths)
479}
480
481func (t transitiveAarDeps) manifests() android.Paths {
482 var paths android.Paths
483 for _, dep := range t {
484 paths = append(paths, dep.manifest)
485 paths = append(paths, dep.additionalManifests...)
486 }
487 return android.FirstUniquePaths(paths)
488}
489
490func (t transitiveAarDeps) assets() android.Paths {
491 var paths android.Paths
492 for _, dep := range t {
493 if dep.assets.Valid() {
494 paths = append(paths, dep.assets.Path())
495 }
496 }
497 return paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700498}
499
500// aaptLibs collects libraries from dependencies and sdk_version and converts them into paths
Jiyong Parkf1691d22021-03-29 20:11:58 +0900501func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoaderContexts dexpreopt.ClassLoaderContextMap) (
Colin Crossab8d1382023-07-14 17:23:41 +0000502 staticResourcesNodes *android.DepSet[*resourcesNode], staticRRODirs *android.DepSet[rroDir],
503 staticManifests *android.DepSet[android.Path], sharedLibs android.Paths, flags []string) {
Colin Crossa97c5d32018-03-28 14:58:31 -0700504
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100505 if classLoaderContexts == nil {
Ulya Trafimovich18554242020-11-03 15:55:11 +0000506 // Not all callers need to compute class loader context, those who don't just pass nil.
507 // Create a temporary class loader context here (it will be computed, but not used).
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100508 classLoaderContexts = make(dexpreopt.ClassLoaderContextMap)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000509 }
510
Colin Cross83bb3162018-06-25 15:48:06 -0700511 sdkDep := decodeSdkDep(ctx, sdkContext)
Colin Crossa97c5d32018-03-28 14:58:31 -0700512 if sdkDep.useFiles {
Colin Cross86a60ae2018-05-29 14:44:55 -0700513 sharedLibs = append(sharedLibs, sdkDep.jars...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700514 }
515
Colin Crossab8d1382023-07-14 17:23:41 +0000516 var resourcesNodeDepSets []*android.DepSet[*resourcesNode]
517 rroDirsDepSetBuilder := android.NewDepSetBuilder[rroDir](android.TOPOLOGICAL)
518 manifestsDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
519
Colin Crossa97c5d32018-03-28 14:58:31 -0700520 ctx.VisitDirectDeps(func(module android.Module) {
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000521 depTag := ctx.OtherModuleDependencyTag(module)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000522
Colin Crossa97c5d32018-03-28 14:58:31 -0700523 var exportPackage android.Path
Colin Cross66f78822018-05-02 12:58:28 -0700524 aarDep, _ := module.(AndroidLibraryDependency)
525 if aarDep != nil {
Colin Crossa97c5d32018-03-28 14:58:31 -0700526 exportPackage = aarDep.ExportPackage()
527 }
528
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000529 switch depTag {
Colin Cross4b964c02018-10-15 16:18:06 -0700530 case instrumentationForTag:
531 // Nothing, instrumentationForTag is treated as libTag for javac but not for aapt2.
Liz Kammeref28a4c2022-09-23 16:50:56 -0400532 case sdkLibTag, libTag:
Colin Cross5446e882019-05-22 10:46:27 -0700533 if exportPackage != nil {
534 sharedLibs = append(sharedLibs, exportPackage)
535 }
Colin Cross5446e882019-05-22 10:46:27 -0700536 case frameworkResTag:
Colin Crossa97c5d32018-03-28 14:58:31 -0700537 if exportPackage != nil {
538 sharedLibs = append(sharedLibs, exportPackage)
539 }
540 case staticLibTag:
541 if exportPackage != nil {
Colin Crossab8d1382023-07-14 17:23:41 +0000542 resourcesNodeDepSets = append(resourcesNodeDepSets, aarDep.ResourcesNodeDepSet())
543 rroDirsDepSetBuilder.Transitive(aarDep.RRODirsDepSet())
544 manifestsDepSetBuilder.Transitive(aarDep.ManifestsDepSet())
Colin Crossa97c5d32018-03-28 14:58:31 -0700545 }
546 }
Ulya Trafimovich18554242020-11-03 15:55:11 +0000547
Ulya Trafimovich88bb6f62020-12-16 16:16:11 +0000548 addCLCFromDep(ctx, module, classLoaderContexts)
Colin Crossa97c5d32018-03-28 14:58:31 -0700549 })
550
Colin Crossab8d1382023-07-14 17:23:41 +0000551 // AAPT2 overlays are in lowest to highest priority order, the topological order will be reversed later.
552 // Reverse the dependency order now going into the depset so that it comes out in order after the second
553 // reverse later.
554 // NOTE: this is legacy and probably incorrect behavior, for most other cases (e.g. conflicting classes in
555 // dependencies) the highest priority dependency is listed first, but for resources the highest priority
556 // dependency has to be listed last.
557 staticResourcesNodes = android.NewDepSet(android.TOPOLOGICAL, nil,
558 android.ReverseSliceInPlace(resourcesNodeDepSets))
Colin Crossa97c5d32018-03-28 14:58:31 -0700559
Colin Crossab8d1382023-07-14 17:23:41 +0000560 staticRRODirs = rroDirsDepSetBuilder.Build()
561 staticManifests = manifestsDepSetBuilder.Build()
562
563 if len(staticResourcesNodes.ToList()) > 0 {
Colin Crossa97c5d32018-03-28 14:58:31 -0700564 flags = append(flags, "--auto-add-overlay")
565 }
566
567 for _, sharedLib := range sharedLibs {
568 flags = append(flags, "-I "+sharedLib.String())
569 }
570
Colin Crossab8d1382023-07-14 17:23:41 +0000571 return staticResourcesNodes, staticRRODirs, staticManifests, sharedLibs, flags
Colin Crossa97c5d32018-03-28 14:58:31 -0700572}
573
574type AndroidLibrary struct {
575 Library
576 aapt
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -0500577 android.BazelModuleBase
Colin Crossa97c5d32018-03-28 14:58:31 -0700578
579 androidLibraryProperties androidLibraryProperties
580
581 aarFile android.WritablePath
Colin Cross89c31582018-04-30 15:55:11 -0700582}
583
Saeid Farivar Asanjan1fca3012021-09-14 18:40:19 +0000584var _ android.OutputFileProducer = (*AndroidLibrary)(nil)
585
586// For OutputFileProducer interface
587func (a *AndroidLibrary) OutputFiles(tag string) (android.Paths, error) {
588 switch tag {
589 case ".aar":
590 return []android.Path{a.aarFile}, nil
591 default:
592 return a.Library.OutputFiles(tag)
593 }
594}
595
Colin Crossa97c5d32018-03-28 14:58:31 -0700596var _ AndroidLibraryDependency = (*AndroidLibrary)(nil)
597
598func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
599 a.Module.deps(ctx)
Jiyong Parkf1691d22021-03-29 20:11:58 +0900600 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Paul Duffin250e6192019-06-07 10:44:37 +0100601 if sdkDep.hasFrameworkLibs() {
602 a.aapt.deps(ctx, sdkDep)
Colin Crossa97c5d32018-03-28 14:58:31 -0700603 }
Colin Cross4a80a152022-12-21 21:51:52 -0800604 a.usesLibrary.deps(ctx, false)
Colin Crossa97c5d32018-03-28 14:58:31 -0700605}
606
607func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Crosse4246ab2019-02-05 21:55:21 -0800608 a.aapt.isLibrary = true
Ulya Trafimovich42c7f0d2021-08-17 16:20:29 +0100609 a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +0000610 a.aapt.buildActions(ctx, android.SdkContext(a), a.classLoaderContexts, nil, false)
Colin Crossa97c5d32018-03-28 14:58:31 -0700611
Colin Cross56a83212020-09-15 18:30:11 -0700612 a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
613
Colin Crossa97c5d32018-03-28 14:58:31 -0700614 ctx.CheckbuildFile(a.proguardOptionsFile)
615 ctx.CheckbuildFile(a.exportPackage)
616 ctx.CheckbuildFile(a.aaptSrcJar)
617
618 // apps manifests are handled by aapt, don't let Module see them
619 a.properties.Manifest = nil
620
Colin Cross014489c2020-06-02 20:09:13 -0700621 a.linter.mergedManifest = a.aapt.mergedManifestFile
622 a.linter.manifest = a.aapt.manifestPath
623 a.linter.resources = a.aapt.resourceFiles
624
Colin Crossa97c5d32018-03-28 14:58:31 -0700625 a.Module.extraProguardFlagFiles = append(a.Module.extraProguardFlagFiles,
626 a.proguardOptionsFile)
627
628 a.Module.compile(ctx, a.aaptSrcJar)
629
Colin Crossf57c5782019-01-25 13:20:38 -0800630 a.aarFile = android.PathForModuleOut(ctx, ctx.ModuleName()+".aar")
Colin Crossa97c5d32018-03-28 14:58:31 -0700631 var res android.Paths
632 if a.androidLibraryProperties.BuildAAR {
633 BuildAAR(ctx, a.aarFile, a.outputFile, a.manifestPath, a.rTxt, res)
634 ctx.CheckbuildFile(a.aarFile)
635 }
Colin Cross89c31582018-04-30 15:55:11 -0700636
Cole Faust9a631312020-10-22 21:05:24 +0000637 a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles,
638 android.PathsForModuleSrc(ctx, a.dexProperties.Optimize.Proguard_flags_files)...)
Colin Crossab8d1382023-07-14 17:23:41 +0000639
Colin Cross89c31582018-04-30 15:55:11 -0700640 ctx.VisitDirectDeps(func(m android.Module) {
Jared Duke5979b302022-12-19 21:08:39 +0000641 if ctx.OtherModuleDependencyTag(m) == staticLibTag {
642 if lib, ok := m.(LibraryDependency); ok {
643 a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles, lib.ExportedProguardFlagFiles()...)
644 }
Colin Cross89c31582018-04-30 15:55:11 -0700645 }
646 })
Colin Cross89c31582018-04-30 15:55:11 -0700647 a.exportedProguardFlagFiles = android.FirstUniquePaths(a.exportedProguardFlagFiles)
Sam Delmerico82602492022-06-10 17:05:42 +0000648
649 prebuiltJniPackages := android.Paths{}
650 ctx.VisitDirectDeps(func(module android.Module) {
651 if info, ok := ctx.OtherModuleProvider(module, JniPackageProvider).(JniPackageInfo); ok {
652 prebuiltJniPackages = append(prebuiltJniPackages, info.JniPackages...)
653 }
654 })
655 if len(prebuiltJniPackages) > 0 {
656 ctx.SetProvider(JniPackageProvider, JniPackageInfo{
657 JniPackages: prebuiltJniPackages,
658 })
659 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700660}
661
Colin Cross1b16b0e2019-02-12 14:41:32 -0800662// android_library builds and links sources into a `.jar` file for the device along with Android resources.
663//
664// An android_library has a single variant that produces a `.jar` file containing `.class` files that were
Sam Delmerico82602492022-06-10 17:05:42 +0000665// compiled against the device bootclasspath, along with a `package-res.apk` file containing Android resources compiled
Colin Cross1b16b0e2019-02-12 14:41:32 -0800666// with aapt2. This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
667// an android_app module.
Colin Crossa97c5d32018-03-28 14:58:31 -0700668func AndroidLibraryFactory() android.Module {
669 module := &AndroidLibrary{}
670
Colin Crossce6734e2020-06-15 16:09:53 -0700671 module.Module.addHostAndDeviceProperties()
Colin Crossa97c5d32018-03-28 14:58:31 -0700672 module.AddProperties(
Colin Crossa97c5d32018-03-28 14:58:31 -0700673 &module.aaptProperties,
674 &module.androidLibraryProperties)
675
676 module.androidLibraryProperties.BuildAAR = true
Colin Cross014489c2020-06-02 20:09:13 -0700677 module.Module.linter.library = true
Colin Crossa97c5d32018-03-28 14:58:31 -0700678
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900679 android.InitApexModule(module)
Colin Cross48de9a42018-10-02 13:53:33 -0700680 InitJavaModule(module, android.DeviceSupported)
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -0500681 android.InitBazelModule(module)
Colin Crossa97c5d32018-03-28 14:58:31 -0700682 return module
683}
684
Colin Crossfabb6082018-02-20 17:22:23 -0800685//
686// AAR (android library) prebuilts
687//
Colin Crossfabb6082018-02-20 17:22:23 -0800688
Vinh Trance0781f2022-04-13 01:30:44 +0000689// Properties for android_library_import
Colin Crossfabb6082018-02-20 17:22:23 -0800690type AARImportProperties struct {
Vinh Trance0781f2022-04-13 01:30:44 +0000691 // ARR (android library prebuilt) filepath. Exactly one ARR is required.
Colin Cross27b922f2019-03-04 22:35:41 -0800692 Aars []string `android:"path"`
Vinh Trance0781f2022-04-13 01:30:44 +0000693 // If not blank, set to the version of the sdk to compile against.
694 // Defaults to private.
695 // Values are of one of the following forms:
696 // 1) numerical API level, "current", "none", or "core_platform"
697 // 2) An SDK kind with an API level: "<sdk kind>_<API level>"
698 // See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds.
699 // If the SDK kind is empty, it will be set to public
700 Sdk_version *string
701 // If not blank, set the minimum version of the sdk that the compiled artifacts will run against.
702 // Defaults to sdk_version if not set. See sdk_version for possible values.
Colin Cross479884c2018-07-10 13:39:30 -0700703 Min_sdk_version *string
Vinh Trance0781f2022-04-13 01:30:44 +0000704 // List of java static libraries that the included ARR (android library prebuilts) has dependencies to.
Colin Crossa97c5d32018-03-28 14:58:31 -0700705 Static_libs []string
Vinh Trance0781f2022-04-13 01:30:44 +0000706 // List of java libraries that the included ARR (android library prebuilts) has dependencies to.
707 Libs []string
708 // If set to true, run Jetifier against .aar file. Defaults to false.
Colin Cross1001a792019-03-21 22:21:39 -0700709 Jetifier *bool
Sam Delmerico82602492022-06-10 17:05:42 +0000710 // If true, extract JNI libs from AAR archive. These libs will be accessible to android_app modules and
711 // will be passed transitively through android_libraries to an android_app.
712 //TODO(b/241138093) evaluate whether we can have this flag default to true for Bazel conversion
713 Extract_jni *bool
Colin Crossfabb6082018-02-20 17:22:23 -0800714}
715
716type AARImport struct {
717 android.ModuleBase
Colin Cross48de9a42018-10-02 13:53:33 -0700718 android.DefaultableModuleBase
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900719 android.ApexModuleBase
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -0500720 android.BazelModuleBase
Colin Crossfabb6082018-02-20 17:22:23 -0800721 prebuilt android.Prebuilt
722
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900723 // Functionality common to Module and Import.
724 embeddableInModuleAndImport
725
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500726 providesTransitiveHeaderJars
727
Colin Crossfabb6082018-02-20 17:22:23 -0800728 properties AARImportProperties
729
Colin Cross66f78822018-05-02 12:58:28 -0700730 classpathFile android.WritablePath
731 proguardFlags android.WritablePath
732 exportPackage android.WritablePath
733 extraAaptPackagesFile android.WritablePath
Colin Cross10f7c4a2018-05-23 10:59:28 -0700734 manifest android.WritablePath
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800735 assetsPackage android.WritablePath
Colin Cross66f78822018-05-02 12:58:28 -0700736
Colin Crossab8d1382023-07-14 17:23:41 +0000737 resourcesNodesDepSet *android.DepSet[*resourcesNode]
738 manifestsDepSet *android.DepSet[android.Path]
Colin Cross56a83212020-09-15 18:30:11 -0700739
740 hideApexVariantFromMake bool
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000741
Sam Delmerico82602492022-06-10 17:05:42 +0000742 aarPath android.Path
743 jniPackages android.Paths
Jiyong Park92315372021-04-02 08:45:46 +0900744
745 sdkVersion android.SdkSpec
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000746 minSdkVersion android.ApiLevel
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000747}
748
749var _ android.OutputFileProducer = (*AARImport)(nil)
750
751// For OutputFileProducer interface
752func (a *AARImport) OutputFiles(tag string) (android.Paths, error) {
753 switch tag {
754 case ".aar":
755 return []android.Path{a.aarPath}, nil
756 case "":
757 return []android.Path{a.classpathFile}, nil
758 default:
759 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
760 }
Colin Crossfabb6082018-02-20 17:22:23 -0800761}
762
Jiyong Park92315372021-04-02 08:45:46 +0900763func (a *AARImport) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
764 return android.SdkSpecFrom(ctx, String(a.properties.Sdk_version))
Colin Cross83bb3162018-06-25 15:48:06 -0700765}
766
Jiyong Parkf1691d22021-03-29 20:11:58 +0900767func (a *AARImport) SystemModules() string {
Paul Duffine25c6442019-10-11 13:50:28 +0100768 return ""
769}
770
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000771func (a *AARImport) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
Colin Cross479884c2018-07-10 13:39:30 -0700772 if a.properties.Min_sdk_version != nil {
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000773 return android.ApiLevelFrom(ctx, *a.properties.Min_sdk_version)
Colin Cross479884c2018-07-10 13:39:30 -0700774 }
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000775 return a.SdkVersion(ctx).ApiLevel
Colin Cross83bb3162018-06-25 15:48:06 -0700776}
777
Spandan Dasa26eda72023-03-02 00:56:06 +0000778func (a *AARImport) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
779 return android.SdkSpecFrom(ctx, "").ApiLevel
William Loh5a082f92022-05-17 20:21:50 +0000780}
781
Spandan Dasca70fc42023-03-01 23:38:49 +0000782func (a *AARImport) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
783 return a.SdkVersion(ctx).ApiLevel
Dan Willemsen419290a2018-10-31 15:28:47 -0700784}
785
Colin Cross1e743852019-10-28 11:37:20 -0700786func (a *AARImport) javaVersion() string {
787 return ""
788}
789
Colin Crossa97c5d32018-03-28 14:58:31 -0700790var _ AndroidLibraryDependency = (*AARImport)(nil)
791
792func (a *AARImport) ExportPackage() android.Path {
793 return a.exportPackage
794}
Colin Cross89c31582018-04-30 15:55:11 -0700795func (a *AARImport) ExportedProguardFlagFiles() android.Paths {
796 return android.Paths{a.proguardFlags}
797}
798
Colin Crossab8d1382023-07-14 17:23:41 +0000799func (a *AARImport) ResourcesNodeDepSet() *android.DepSet[*resourcesNode] {
800 return a.resourcesNodesDepSet
Colin Crossc1c37552019-01-31 11:42:41 -0800801}
802
Colin Crossab8d1382023-07-14 17:23:41 +0000803func (a *AARImport) RRODirsDepSet() *android.DepSet[rroDir] {
804 return android.NewDepSet[rroDir](android.TOPOLOGICAL, nil, nil)
Colin Cross66f78822018-05-02 12:58:28 -0700805}
806
Colin Crossab8d1382023-07-14 17:23:41 +0000807func (a *AARImport) ManifestsDepSet() *android.DepSet[android.Path] {
808 return a.manifestsDepSet
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800809}
810
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700811// RRO enforcement is not available on aar_import since its RRO dirs are not
812// exported.
813func (a *AARImport) SetRROEnforcedForDependent(enforce bool) {
814}
815
816// RRO enforcement is not available on aar_import since its RRO dirs are not
817// exported.
818func (a *AARImport) IsRROEnforced(ctx android.BaseModuleContext) bool {
819 return false
820}
821
Colin Crossfabb6082018-02-20 17:22:23 -0800822func (a *AARImport) Prebuilt() *android.Prebuilt {
823 return &a.prebuilt
824}
825
826func (a *AARImport) Name() string {
827 return a.prebuilt.Name(a.ModuleBase.Name())
828}
829
Jiyong Park618922e2020-01-08 13:35:43 +0900830func (a *AARImport) JacocoReportClassesFile() android.Path {
831 return nil
832}
833
Colin Crossfabb6082018-02-20 17:22:23 -0800834func (a *AARImport) DepsMutator(ctx android.BottomUpMutatorContext) {
Jeongik Cha816a23a2020-07-08 01:09:23 +0900835 if !ctx.Config().AlwaysUsePrebuiltSdks() {
Jiyong Parkf1691d22021-03-29 20:11:58 +0900836 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Colin Crossa97c5d32018-03-28 14:58:31 -0700837 if sdkDep.useModule && sdkDep.frameworkResModule != "" {
Colin Cross42d48b72018-08-29 14:10:52 -0700838 ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
Colin Crossfabb6082018-02-20 17:22:23 -0800839 }
840 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700841
Colin Cross42d48b72018-08-29 14:10:52 -0700842 ctx.AddVariationDependencies(nil, libTag, a.properties.Libs...)
843 ctx.AddVariationDependencies(nil, staticLibTag, a.properties.Static_libs...)
Colin Crossfabb6082018-02-20 17:22:23 -0800844}
845
Sam Delmerico82602492022-06-10 17:05:42 +0000846type JniPackageInfo struct {
847 // List of zip files containing JNI libraries
848 // Zip files should have directory structure jni/<arch>/*.so
849 JniPackages android.Paths
850}
851
852var JniPackageProvider = blueprint.NewProvider(JniPackageInfo{})
853
854// Unzip an AAR and extract the JNI libs for $archString.
855var extractJNI = pctx.AndroidStaticRule("extractJNI",
856 blueprint.RuleParams{
857 Command: `rm -rf $out $outDir && touch $out && ` +
858 `unzip -qoDD -d $outDir $in "jni/${archString}/*" && ` +
859 `jni_files=$$(find $outDir/jni -type f) && ` +
860 // print error message if there are no JNI libs for this arch
861 `[ -n "$$jni_files" ] || (echo "ERROR: no JNI libs found for arch ${archString}" && exit 1) && ` +
862 `${config.SoongZipCmd} -o $out -P 'lib/${archString}' ` +
863 `-C $outDir/jni/${archString} $$(echo $$jni_files | xargs -n1 printf " -f %s")`,
864 CommandDeps: []string{"${config.SoongZipCmd}"},
865 },
866 "outDir", "archString")
867
Colin Crossfabb6082018-02-20 17:22:23 -0800868// 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 -0700869// 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 -0800870var unzipAAR = pctx.AndroidStaticRule("unzipAAR",
871 blueprint.RuleParams{
Dan Willemsen304cfec2019-05-28 14:49:06 -0700872 Command: `rm -rf $outDir && mkdir -p $outDir && ` +
Colin Cross205e9112020-08-06 13:20:17 -0700873 `unzip -qoDD -d $outDir $in && rm -rf $outDir/res && touch $out && ` +
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800874 `${config.Zip2ZipCmd} -i $in -o $assetsPackage 'assets/**/*' && ` +
Colin Cross205e9112020-08-06 13:20:17 -0700875 `${config.MergeZipsCmd} $combinedClassesJar $$(ls $outDir/classes.jar 2> /dev/null) $$(ls $outDir/libs/*.jar 2> /dev/null)`,
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800876 CommandDeps: []string{"${config.MergeZipsCmd}", "${config.Zip2ZipCmd}"},
Colin Crossfabb6082018-02-20 17:22:23 -0800877 },
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800878 "outDir", "combinedClassesJar", "assetsPackage")
Colin Crossfabb6082018-02-20 17:22:23 -0800879
880func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
881 if len(a.properties.Aars) != 1 {
882 ctx.PropertyErrorf("aars", "exactly one aar is required")
883 return
884 }
885
Jiyong Park92315372021-04-02 08:45:46 +0900886 a.sdkVersion = a.SdkVersion(ctx)
887 a.minSdkVersion = a.MinSdkVersion(ctx)
888
Colin Cross56a83212020-09-15 18:30:11 -0700889 a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
890
Nan Zhang4c819fb2018-08-27 18:31:46 -0700891 aarName := ctx.ModuleName() + ".aar"
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000892 a.aarPath = android.PathForModuleSrc(ctx, a.properties.Aars[0])
893
Colin Cross1001a792019-03-21 22:21:39 -0700894 if Bool(a.properties.Jetifier) {
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000895 inputFile := a.aarPath
896 a.aarPath = android.PathForModuleOut(ctx, "jetifier", aarName)
897 TransformJetifier(ctx, a.aarPath.(android.WritablePath), inputFile)
Nan Zhang4c819fb2018-08-27 18:31:46 -0700898 }
Colin Crossfabb6082018-02-20 17:22:23 -0800899
900 extractedAARDir := android.PathForModuleOut(ctx, "aar")
Colin Cross205e9112020-08-06 13:20:17 -0700901 a.classpathFile = extractedAARDir.Join(ctx, "classes-combined.jar")
Colin Crossfabb6082018-02-20 17:22:23 -0800902 a.proguardFlags = extractedAARDir.Join(ctx, "proguard.txt")
Colin Cross10f7c4a2018-05-23 10:59:28 -0700903 a.manifest = extractedAARDir.Join(ctx, "AndroidManifest.xml")
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800904 a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip")
Colin Crossfabb6082018-02-20 17:22:23 -0800905
906 ctx.Build(pctx, android.BuildParams{
907 Rule: unzipAAR,
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000908 Input: a.aarPath,
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800909 Outputs: android.WritablePaths{a.classpathFile, a.proguardFlags, a.manifest, a.assetsPackage},
Colin Crossfabb6082018-02-20 17:22:23 -0800910 Description: "unzip AAR",
911 Args: map[string]string{
Colin Cross205e9112020-08-06 13:20:17 -0700912 "outDir": extractedAARDir.String(),
913 "combinedClassesJar": a.classpathFile.String(),
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800914 "assetsPackage": a.assetsPackage.String(),
Colin Crossfabb6082018-02-20 17:22:23 -0800915 },
916 })
917
Colin Crossa0ba2f52019-06-22 12:59:27 -0700918 // Always set --pseudo-localize, it will be stripped out later for release
919 // builds that don't want it.
920 compileFlags := []string{"--pseudo-localize"}
Colin Crossfabb6082018-02-20 17:22:23 -0800921 compiledResDir := android.PathForModuleOut(ctx, "flat-res")
Colin Crossfabb6082018-02-20 17:22:23 -0800922 flata := compiledResDir.Join(ctx, "gen_res.flata")
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000923 aapt2CompileZip(ctx, flata, a.aarPath, "res", compileFlags)
Colin Crossfabb6082018-02-20 17:22:23 -0800924
925 a.exportPackage = android.PathForModuleOut(ctx, "package-res.apk")
Jiyong Parkb7c639e2019-08-19 14:56:02 +0900926 // the subdir "android" is required to be filtered by package names
927 srcJar := android.PathForModuleGen(ctx, "android", "R.srcjar")
Colin Crossfabb6082018-02-20 17:22:23 -0800928 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
Colin Crossa97c5d32018-03-28 14:58:31 -0700929 rTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -0700930 a.extraAaptPackagesFile = android.PathForModuleOut(ctx, "extra_packages")
Colin Crossfabb6082018-02-20 17:22:23 -0800931
932 var linkDeps android.Paths
933
934 linkFlags := []string{
935 "--static-lib",
936 "--no-static-lib-packages",
937 "--auto-add-overlay",
938 }
939
Colin Cross10f7c4a2018-05-23 10:59:28 -0700940 linkFlags = append(linkFlags, "--manifest "+a.manifest.String())
941 linkDeps = append(linkDeps, a.manifest)
Colin Crossfabb6082018-02-20 17:22:23 -0800942
Colin Crossab8d1382023-07-14 17:23:41 +0000943 staticResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedLibs, libFlags :=
Jiyong Parkf1691d22021-03-29 20:11:58 +0900944 aaptLibs(ctx, android.SdkContext(a), nil)
Colin Cross31656952018-05-24 16:11:20 -0700945
Colin Crossab8d1382023-07-14 17:23:41 +0000946 _ = staticRRODirsDepSet
947 staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
Colin Crossfabb6082018-02-20 17:22:23 -0800948
Colin Crossab8d1382023-07-14 17:23:41 +0000949 // AAPT2 overlays are in lowest to highest priority order, reverse the topological order
950 // of transitiveStaticLibs.
951 transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages())
952
953 linkDeps = append(linkDeps, sharedLibs...)
954 linkDeps = append(linkDeps, transitiveStaticLibs...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700955 linkFlags = append(linkFlags, libFlags...)
Colin Crossfabb6082018-02-20 17:22:23 -0800956
Colin Cross66f78822018-05-02 12:58:28 -0700957 overlayRes := append(android.Paths{flata}, transitiveStaticLibs...)
Colin Crossfabb6082018-02-20 17:22:23 -0800958
Colin Crossab8d1382023-07-14 17:23:41 +0000959 transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets())
Colin Cross66f78822018-05-02 12:58:28 -0700960 aapt2Link(ctx, a.exportPackage, srcJar, proguardOptionsFile, rTxt, a.extraAaptPackagesFile,
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800961 linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil)
Colin Crossfabb6082018-02-20 17:22:23 -0800962
Colin Crossab8d1382023-07-14 17:23:41 +0000963 resourcesNodesDepSetBuilder := android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL)
964 resourcesNodesDepSetBuilder.Direct(&resourcesNode{
965 resPackage: a.exportPackage,
966 manifest: a.manifest,
967 assets: android.OptionalPathForPath(a.assetsPackage),
968 })
969 resourcesNodesDepSetBuilder.Transitive(staticResourcesNodesDepSet)
970 a.resourcesNodesDepSet = resourcesNodesDepSetBuilder.Build()
971
972 manifestDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).Direct(a.manifest)
973 // TODO(b/288358614): Soong has historically not merged manifests from dependencies of android_library_import
974 // modules. Merging manifests from dependencies could remove the need for pom2bp to generate the "-nodeps" copies
975 // of androidx libraries, but doing so triggers errors due to errors introduced by existing dependencies of
976 // android_library_import modules. If this is fixed, AndroidLibraryDependency.ManifestsDepSet can be dropped
977 // completely in favor of AndroidLibraryDependency.ResourceNodesDepSet.manifest
978 //manifestDepSetBuilder.Transitive(transitiveStaticDeps.manifests)
979 _ = staticManifestsDepSet
980 a.manifestsDepSet = manifestDepSetBuilder.Build()
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800981
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500982 a.collectTransitiveHeaderJars(ctx)
Colin Crossdcf71b22021-02-01 13:59:03 -0800983 ctx.SetProvider(JavaInfoProvider, JavaInfo{
984 HeaderJars: android.PathsIfNonNil(a.classpathFile),
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500985 TransitiveLibsHeaderJars: a.transitiveLibsHeaderJars,
986 TransitiveStaticLibsHeaderJars: a.transitiveStaticLibsHeaderJars,
Colin Crossdcf71b22021-02-01 13:59:03 -0800987 ImplementationAndResourcesJars: android.PathsIfNonNil(a.classpathFile),
988 ImplementationJars: android.PathsIfNonNil(a.classpathFile),
989 })
Sam Delmerico82602492022-06-10 17:05:42 +0000990
991 if proptools.Bool(a.properties.Extract_jni) {
992 for _, t := range ctx.MultiTargets() {
993 arch := t.Arch.Abi[0]
994 path := android.PathForModuleOut(ctx, arch+"_jni.zip")
995 a.jniPackages = append(a.jniPackages, path)
996
997 outDir := android.PathForModuleOut(ctx, "aarForJni")
998 aarPath := android.PathForModuleSrc(ctx, a.properties.Aars[0])
999 ctx.Build(pctx, android.BuildParams{
1000 Rule: extractJNI,
1001 Input: aarPath,
1002 Outputs: android.WritablePaths{path},
1003 Description: "extract JNI from AAR",
1004 Args: map[string]string{
1005 "outDir": outDir.String(),
1006 "archString": arch,
1007 },
1008 })
1009 }
1010
1011 ctx.SetProvider(JniPackageProvider, JniPackageInfo{
1012 JniPackages: a.jniPackages,
1013 })
1014 }
Colin Crossdcf71b22021-02-01 13:59:03 -08001015}
Colin Crossfabb6082018-02-20 17:22:23 -08001016
1017func (a *AARImport) HeaderJars() android.Paths {
1018 return android.Paths{a.classpathFile}
1019}
1020
Colin Cross331a1212018-08-15 20:40:52 -07001021func (a *AARImport) ImplementationAndResourcesJars() android.Paths {
1022 return android.Paths{a.classpathFile}
1023}
1024
Ulyana Trafimovich5539e7b2020-06-04 14:08:17 +00001025func (a *AARImport) DexJarBuildPath() android.Path {
Colin Crossf24a22a2019-01-31 14:12:44 -08001026 return nil
1027}
1028
Ulya Trafimovich9f3052c2020-06-09 14:31:19 +01001029func (a *AARImport) DexJarInstallPath() android.Path {
1030 return nil
1031}
1032
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +01001033func (a *AARImport) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap {
Jiyong Park1be96912018-05-28 18:02:19 +09001034 return nil
1035}
1036
Jiyong Park45bf82e2020-12-15 22:29:02 +09001037var _ android.ApexModule = (*AARImport)(nil)
1038
1039// Implements android.ApexModule
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001040func (a *AARImport) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
1041 return a.depIsInSameApex(ctx, dep)
1042}
1043
Jiyong Park45bf82e2020-12-15 22:29:02 +09001044// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07001045func (g *AARImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
1046 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09001047 return nil
1048}
1049
Sam Delmericoaf8bb702022-07-25 15:39:32 -04001050var _ android.PrebuiltInterface = (*AARImport)(nil)
Colin Crossfabb6082018-02-20 17:22:23 -08001051
Colin Cross1b16b0e2019-02-12 14:41:32 -08001052// android_library_import imports an `.aar` file into the build graph as if it was built with android_library.
1053//
1054// This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
1055// an android_app module.
Colin Crossfabb6082018-02-20 17:22:23 -08001056func AARImportFactory() android.Module {
1057 module := &AARImport{}
1058
1059 module.AddProperties(&module.properties)
1060
1061 android.InitPrebuiltModule(module, &module.properties.Aars)
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001062 android.InitApexModule(module)
Sam Delmerico82602492022-06-10 17:05:42 +00001063 InitJavaModuleMultiTargets(module, android.DeviceSupported)
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001064 android.InitBazelModule(module)
Colin Crossfabb6082018-02-20 17:22:23 -08001065 return module
1066}
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001067
1068type bazelAapt struct {
1069 Manifest bazel.Label
1070 Resource_files bazel.LabelListAttribute
1071}
1072
1073type bazelAndroidLibrary struct {
1074 *javaLibraryAttributes
1075 *bazelAapt
1076}
1077
1078type bazelAndroidLibraryImport struct {
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001079 Aar bazel.Label
1080 Deps bazel.LabelListAttribute
1081 Exports bazel.LabelListAttribute
1082 Sdk_version bazel.StringAttribute
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001083}
1084
1085func (a *aapt) convertAaptAttrsWithBp2Build(ctx android.TopDownMutatorContext) *bazelAapt {
1086 manifest := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")
1087
1088 resourceFiles := bazel.LabelList{
1089 Includes: []bazel.Label{},
1090 }
1091 for _, dir := range android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res") {
1092 files := android.RootToModuleRelativePaths(ctx, androidResourceGlob(ctx, dir))
1093 resourceFiles.Includes = append(resourceFiles.Includes, files...)
1094 }
1095 return &bazelAapt{
1096 android.BazelLabelForModuleSrcSingle(ctx, manifest),
1097 bazel.MakeLabelListAttribute(resourceFiles),
1098 }
1099}
1100
1101func (a *AARImport) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
1102 aars := android.BazelLabelForModuleSrcExcludes(ctx, a.properties.Aars, []string{})
1103 exportableStaticLibs := []string{}
1104 // TODO(b/240716882): investigate and handle static_libs deps that are not imports. They are not supported for export by Bazel.
1105 for _, depName := range a.properties.Static_libs {
1106 if dep, ok := ctx.ModuleFromName(depName); ok {
1107 switch dep.(type) {
1108 case *AARImport, *Import:
1109 exportableStaticLibs = append(exportableStaticLibs, depName)
1110 }
1111 }
1112 }
1113 name := android.RemoveOptionalPrebuiltPrefix(a.Name())
1114 deps := android.BazelLabelForModuleDeps(ctx, android.LastUniqueStrings(android.CopyOf(append(a.properties.Static_libs, a.properties.Libs...))))
1115 exports := android.BazelLabelForModuleDeps(ctx, android.LastUniqueStrings(exportableStaticLibs))
1116
1117 ctx.CreateBazelTargetModule(
1118 bazel.BazelTargetModuleProperties{
1119 Rule_class: "aar_import",
Alixa381cd12023-05-10 14:49:38 +00001120 Bzl_load_location: "//build/bazel/rules/android:aar_import.bzl",
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001121 },
1122 android.CommonAttributes{Name: name},
1123 &bazelAndroidLibraryImport{
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001124 Aar: aars.Includes[0],
1125 Deps: bazel.MakeLabelListAttribute(deps),
1126 Exports: bazel.MakeLabelListAttribute(exports),
1127 Sdk_version: bazel.StringAttribute{Value: a.properties.Sdk_version},
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001128 },
1129 )
1130
Alix14101de2023-01-06 03:42:07 +00001131 neverlink := true
1132 ctx.CreateBazelTargetModule(
Alix32540022023-03-16 21:06:13 +00001133 AndroidLibraryBazelTargetModuleProperties(),
Alix14101de2023-01-06 03:42:07 +00001134 android.CommonAttributes{Name: name + "-neverlink"},
1135 &bazelAndroidLibrary{
1136 javaLibraryAttributes: &javaLibraryAttributes{
1137 Neverlink: bazel.BoolAttribute{Value: &neverlink},
1138 Exports: bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + name}),
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001139 javaCommonAttributes: &javaCommonAttributes{
1140 Sdk_version: bazel.StringAttribute{Value: a.properties.Sdk_version},
1141 },
Alix14101de2023-01-06 03:42:07 +00001142 },
1143 },
1144 )
1145
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001146}
Alix32540022023-03-16 21:06:13 +00001147func AndroidLibraryBazelTargetModuleProperties() bazel.BazelTargetModuleProperties {
1148 return bazel.BazelTargetModuleProperties{
1149 Rule_class: "android_library",
Alixa381cd12023-05-10 14:49:38 +00001150 Bzl_load_location: "//build/bazel/rules/android:android_library.bzl",
Alix32540022023-03-16 21:06:13 +00001151 }
1152}
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001153
1154func (a *AndroidLibrary) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
Alix8062f4d2022-11-14 21:38:07 +00001155 commonAttrs, bp2buildInfo := a.convertLibraryAttrsBp2Build(ctx)
1156 depLabels := bp2buildInfo.DepLabels
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001157
1158 deps := depLabels.Deps
1159 if !commonAttrs.Srcs.IsEmpty() {
1160 deps.Append(depLabels.StaticDeps) // we should only append these if there are sources to use them
1161 } else if !depLabels.Deps.IsEmpty() {
1162 ctx.ModuleErrorf("Module has direct dependencies but no sources. Bazel will not allow this.")
1163 }
Alix82fb94e2022-10-26 20:40:18 +00001164 name := a.Name()
Alix32540022023-03-16 21:06:13 +00001165 props := AndroidLibraryBazelTargetModuleProperties()
Alix82fb94e2022-10-26 20:40:18 +00001166
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001167 ctx.CreateBazelTargetModule(
Alix82fb94e2022-10-26 20:40:18 +00001168 props,
1169 android.CommonAttributes{Name: name},
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001170 &bazelAndroidLibrary{
1171 &javaLibraryAttributes{
1172 javaCommonAttributes: commonAttrs,
1173 Deps: deps,
1174 Exports: depLabels.StaticDeps,
1175 },
1176 a.convertAaptAttrsWithBp2Build(ctx),
1177 },
1178 )
Alix82fb94e2022-10-26 20:40:18 +00001179
1180 neverlink := true
1181 ctx.CreateBazelTargetModule(
1182 props,
1183 android.CommonAttributes{Name: name + "-neverlink"},
1184 &bazelAndroidLibrary{
1185 javaLibraryAttributes: &javaLibraryAttributes{
1186 Neverlink: bazel.BoolAttribute{Value: &neverlink},
1187 Exports: bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + name}),
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001188 javaCommonAttributes: &javaCommonAttributes{
1189 Sdk_version: bazel.StringAttribute{Value: a.deviceProperties.Sdk_version},
1190 Java_version: bazel.StringAttribute{Value: a.properties.Java_version},
1191 },
Alix82fb94e2022-10-26 20:40:18 +00001192 },
1193 },
1194 )
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001195}