blob: a682e3ad71e53023b7bcf833768638516a27a4f3 [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
Jihoon Kang1bfb6f22023-07-01 00:13:47 +0000614 a.stem = proptools.StringDefault(a.overridableDeviceProperties.Stem, ctx.ModuleName())
615
Colin Crossa97c5d32018-03-28 14:58:31 -0700616 ctx.CheckbuildFile(a.proguardOptionsFile)
617 ctx.CheckbuildFile(a.exportPackage)
618 ctx.CheckbuildFile(a.aaptSrcJar)
619
620 // apps manifests are handled by aapt, don't let Module see them
621 a.properties.Manifest = nil
622
Colin Cross014489c2020-06-02 20:09:13 -0700623 a.linter.mergedManifest = a.aapt.mergedManifestFile
624 a.linter.manifest = a.aapt.manifestPath
625 a.linter.resources = a.aapt.resourceFiles
626
Colin Crossa97c5d32018-03-28 14:58:31 -0700627 a.Module.extraProguardFlagFiles = append(a.Module.extraProguardFlagFiles,
628 a.proguardOptionsFile)
629
630 a.Module.compile(ctx, a.aaptSrcJar)
631
Colin Crossf57c5782019-01-25 13:20:38 -0800632 a.aarFile = android.PathForModuleOut(ctx, ctx.ModuleName()+".aar")
Colin Crossa97c5d32018-03-28 14:58:31 -0700633 var res android.Paths
634 if a.androidLibraryProperties.BuildAAR {
635 BuildAAR(ctx, a.aarFile, a.outputFile, a.manifestPath, a.rTxt, res)
636 ctx.CheckbuildFile(a.aarFile)
637 }
Colin Cross89c31582018-04-30 15:55:11 -0700638
Cole Faust9a631312020-10-22 21:05:24 +0000639 a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles,
640 android.PathsForModuleSrc(ctx, a.dexProperties.Optimize.Proguard_flags_files)...)
Colin Crossab8d1382023-07-14 17:23:41 +0000641
Colin Cross89c31582018-04-30 15:55:11 -0700642 ctx.VisitDirectDeps(func(m android.Module) {
Jared Duke5979b302022-12-19 21:08:39 +0000643 if ctx.OtherModuleDependencyTag(m) == staticLibTag {
644 if lib, ok := m.(LibraryDependency); ok {
645 a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles, lib.ExportedProguardFlagFiles()...)
646 }
Colin Cross89c31582018-04-30 15:55:11 -0700647 }
648 })
Colin Cross89c31582018-04-30 15:55:11 -0700649 a.exportedProguardFlagFiles = android.FirstUniquePaths(a.exportedProguardFlagFiles)
Sam Delmerico82602492022-06-10 17:05:42 +0000650
651 prebuiltJniPackages := android.Paths{}
652 ctx.VisitDirectDeps(func(module android.Module) {
653 if info, ok := ctx.OtherModuleProvider(module, JniPackageProvider).(JniPackageInfo); ok {
654 prebuiltJniPackages = append(prebuiltJniPackages, info.JniPackages...)
655 }
656 })
657 if len(prebuiltJniPackages) > 0 {
658 ctx.SetProvider(JniPackageProvider, JniPackageInfo{
659 JniPackages: prebuiltJniPackages,
660 })
661 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700662}
663
Colin Cross1b16b0e2019-02-12 14:41:32 -0800664// android_library builds and links sources into a `.jar` file for the device along with Android resources.
665//
666// An android_library has a single variant that produces a `.jar` file containing `.class` files that were
Sam Delmerico82602492022-06-10 17:05:42 +0000667// compiled against the device bootclasspath, along with a `package-res.apk` file containing Android resources compiled
Colin Cross1b16b0e2019-02-12 14:41:32 -0800668// with aapt2. This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
669// an android_app module.
Colin Crossa97c5d32018-03-28 14:58:31 -0700670func AndroidLibraryFactory() android.Module {
671 module := &AndroidLibrary{}
672
Colin Crossce6734e2020-06-15 16:09:53 -0700673 module.Module.addHostAndDeviceProperties()
Colin Crossa97c5d32018-03-28 14:58:31 -0700674 module.AddProperties(
Colin Crossa97c5d32018-03-28 14:58:31 -0700675 &module.aaptProperties,
676 &module.androidLibraryProperties)
677
678 module.androidLibraryProperties.BuildAAR = true
Colin Cross014489c2020-06-02 20:09:13 -0700679 module.Module.linter.library = true
Colin Crossa97c5d32018-03-28 14:58:31 -0700680
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900681 android.InitApexModule(module)
Colin Cross48de9a42018-10-02 13:53:33 -0700682 InitJavaModule(module, android.DeviceSupported)
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -0500683 android.InitBazelModule(module)
Colin Crossa97c5d32018-03-28 14:58:31 -0700684 return module
685}
686
Colin Crossfabb6082018-02-20 17:22:23 -0800687//
688// AAR (android library) prebuilts
689//
Colin Crossfabb6082018-02-20 17:22:23 -0800690
Vinh Trance0781f2022-04-13 01:30:44 +0000691// Properties for android_library_import
Colin Crossfabb6082018-02-20 17:22:23 -0800692type AARImportProperties struct {
Vinh Trance0781f2022-04-13 01:30:44 +0000693 // ARR (android library prebuilt) filepath. Exactly one ARR is required.
Colin Cross27b922f2019-03-04 22:35:41 -0800694 Aars []string `android:"path"`
Vinh Trance0781f2022-04-13 01:30:44 +0000695 // If not blank, set to the version of the sdk to compile against.
696 // Defaults to private.
697 // Values are of one of the following forms:
698 // 1) numerical API level, "current", "none", or "core_platform"
699 // 2) An SDK kind with an API level: "<sdk kind>_<API level>"
700 // See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds.
701 // If the SDK kind is empty, it will be set to public
702 Sdk_version *string
703 // If not blank, set the minimum version of the sdk that the compiled artifacts will run against.
704 // Defaults to sdk_version if not set. See sdk_version for possible values.
Colin Cross479884c2018-07-10 13:39:30 -0700705 Min_sdk_version *string
Vinh Trance0781f2022-04-13 01:30:44 +0000706 // List of java static libraries that the included ARR (android library prebuilts) has dependencies to.
Colin Crossa97c5d32018-03-28 14:58:31 -0700707 Static_libs []string
Vinh Trance0781f2022-04-13 01:30:44 +0000708 // List of java libraries that the included ARR (android library prebuilts) has dependencies to.
709 Libs []string
710 // If set to true, run Jetifier against .aar file. Defaults to false.
Colin Cross1001a792019-03-21 22:21:39 -0700711 Jetifier *bool
Sam Delmerico82602492022-06-10 17:05:42 +0000712 // If true, extract JNI libs from AAR archive. These libs will be accessible to android_app modules and
713 // will be passed transitively through android_libraries to an android_app.
714 //TODO(b/241138093) evaluate whether we can have this flag default to true for Bazel conversion
715 Extract_jni *bool
Colin Crossfabb6082018-02-20 17:22:23 -0800716}
717
718type AARImport struct {
719 android.ModuleBase
Colin Cross48de9a42018-10-02 13:53:33 -0700720 android.DefaultableModuleBase
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900721 android.ApexModuleBase
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -0500722 android.BazelModuleBase
Colin Crossfabb6082018-02-20 17:22:23 -0800723 prebuilt android.Prebuilt
724
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900725 // Functionality common to Module and Import.
726 embeddableInModuleAndImport
727
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500728 providesTransitiveHeaderJars
729
Colin Crossfabb6082018-02-20 17:22:23 -0800730 properties AARImportProperties
731
Colin Cross66f78822018-05-02 12:58:28 -0700732 classpathFile android.WritablePath
733 proguardFlags android.WritablePath
734 exportPackage android.WritablePath
735 extraAaptPackagesFile android.WritablePath
Colin Cross10f7c4a2018-05-23 10:59:28 -0700736 manifest android.WritablePath
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800737 assetsPackage android.WritablePath
Colin Cross66f78822018-05-02 12:58:28 -0700738
Colin Crossab8d1382023-07-14 17:23:41 +0000739 resourcesNodesDepSet *android.DepSet[*resourcesNode]
740 manifestsDepSet *android.DepSet[android.Path]
Colin Cross56a83212020-09-15 18:30:11 -0700741
742 hideApexVariantFromMake bool
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000743
Sam Delmerico82602492022-06-10 17:05:42 +0000744 aarPath android.Path
745 jniPackages android.Paths
Jiyong Park92315372021-04-02 08:45:46 +0900746
747 sdkVersion android.SdkSpec
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000748 minSdkVersion android.ApiLevel
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000749}
750
751var _ android.OutputFileProducer = (*AARImport)(nil)
752
753// For OutputFileProducer interface
754func (a *AARImport) OutputFiles(tag string) (android.Paths, error) {
755 switch tag {
756 case ".aar":
757 return []android.Path{a.aarPath}, nil
758 case "":
759 return []android.Path{a.classpathFile}, nil
760 default:
761 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
762 }
Colin Crossfabb6082018-02-20 17:22:23 -0800763}
764
Jiyong Park92315372021-04-02 08:45:46 +0900765func (a *AARImport) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
766 return android.SdkSpecFrom(ctx, String(a.properties.Sdk_version))
Colin Cross83bb3162018-06-25 15:48:06 -0700767}
768
Jiyong Parkf1691d22021-03-29 20:11:58 +0900769func (a *AARImport) SystemModules() string {
Paul Duffine25c6442019-10-11 13:50:28 +0100770 return ""
771}
772
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000773func (a *AARImport) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
Colin Cross479884c2018-07-10 13:39:30 -0700774 if a.properties.Min_sdk_version != nil {
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000775 return android.ApiLevelFrom(ctx, *a.properties.Min_sdk_version)
Colin Cross479884c2018-07-10 13:39:30 -0700776 }
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000777 return a.SdkVersion(ctx).ApiLevel
Colin Cross83bb3162018-06-25 15:48:06 -0700778}
779
Spandan Dasa26eda72023-03-02 00:56:06 +0000780func (a *AARImport) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
781 return android.SdkSpecFrom(ctx, "").ApiLevel
William Loh5a082f92022-05-17 20:21:50 +0000782}
783
Spandan Dasca70fc42023-03-01 23:38:49 +0000784func (a *AARImport) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
785 return a.SdkVersion(ctx).ApiLevel
Dan Willemsen419290a2018-10-31 15:28:47 -0700786}
787
Colin Cross1e743852019-10-28 11:37:20 -0700788func (a *AARImport) javaVersion() string {
789 return ""
790}
791
Colin Crossa97c5d32018-03-28 14:58:31 -0700792var _ AndroidLibraryDependency = (*AARImport)(nil)
793
794func (a *AARImport) ExportPackage() android.Path {
795 return a.exportPackage
796}
Colin Cross89c31582018-04-30 15:55:11 -0700797func (a *AARImport) ExportedProguardFlagFiles() android.Paths {
798 return android.Paths{a.proguardFlags}
799}
800
Colin Crossab8d1382023-07-14 17:23:41 +0000801func (a *AARImport) ResourcesNodeDepSet() *android.DepSet[*resourcesNode] {
802 return a.resourcesNodesDepSet
Colin Crossc1c37552019-01-31 11:42:41 -0800803}
804
Colin Crossab8d1382023-07-14 17:23:41 +0000805func (a *AARImport) RRODirsDepSet() *android.DepSet[rroDir] {
806 return android.NewDepSet[rroDir](android.TOPOLOGICAL, nil, nil)
Colin Cross66f78822018-05-02 12:58:28 -0700807}
808
Colin Crossab8d1382023-07-14 17:23:41 +0000809func (a *AARImport) ManifestsDepSet() *android.DepSet[android.Path] {
810 return a.manifestsDepSet
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800811}
812
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700813// RRO enforcement is not available on aar_import since its RRO dirs are not
814// exported.
815func (a *AARImport) SetRROEnforcedForDependent(enforce bool) {
816}
817
818// RRO enforcement is not available on aar_import since its RRO dirs are not
819// exported.
820func (a *AARImport) IsRROEnforced(ctx android.BaseModuleContext) bool {
821 return false
822}
823
Colin Crossfabb6082018-02-20 17:22:23 -0800824func (a *AARImport) Prebuilt() *android.Prebuilt {
825 return &a.prebuilt
826}
827
828func (a *AARImport) Name() string {
829 return a.prebuilt.Name(a.ModuleBase.Name())
830}
831
Jiyong Park618922e2020-01-08 13:35:43 +0900832func (a *AARImport) JacocoReportClassesFile() android.Path {
833 return nil
834}
835
Colin Crossfabb6082018-02-20 17:22:23 -0800836func (a *AARImport) DepsMutator(ctx android.BottomUpMutatorContext) {
Jeongik Cha816a23a2020-07-08 01:09:23 +0900837 if !ctx.Config().AlwaysUsePrebuiltSdks() {
Jiyong Parkf1691d22021-03-29 20:11:58 +0900838 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Colin Crossa97c5d32018-03-28 14:58:31 -0700839 if sdkDep.useModule && sdkDep.frameworkResModule != "" {
Colin Cross42d48b72018-08-29 14:10:52 -0700840 ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
Colin Crossfabb6082018-02-20 17:22:23 -0800841 }
842 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700843
Colin Cross42d48b72018-08-29 14:10:52 -0700844 ctx.AddVariationDependencies(nil, libTag, a.properties.Libs...)
845 ctx.AddVariationDependencies(nil, staticLibTag, a.properties.Static_libs...)
Colin Crossfabb6082018-02-20 17:22:23 -0800846}
847
Sam Delmerico82602492022-06-10 17:05:42 +0000848type JniPackageInfo struct {
849 // List of zip files containing JNI libraries
850 // Zip files should have directory structure jni/<arch>/*.so
851 JniPackages android.Paths
852}
853
854var JniPackageProvider = blueprint.NewProvider(JniPackageInfo{})
855
856// Unzip an AAR and extract the JNI libs for $archString.
857var extractJNI = pctx.AndroidStaticRule("extractJNI",
858 blueprint.RuleParams{
859 Command: `rm -rf $out $outDir && touch $out && ` +
860 `unzip -qoDD -d $outDir $in "jni/${archString}/*" && ` +
861 `jni_files=$$(find $outDir/jni -type f) && ` +
862 // print error message if there are no JNI libs for this arch
863 `[ -n "$$jni_files" ] || (echo "ERROR: no JNI libs found for arch ${archString}" && exit 1) && ` +
864 `${config.SoongZipCmd} -o $out -P 'lib/${archString}' ` +
865 `-C $outDir/jni/${archString} $$(echo $$jni_files | xargs -n1 printf " -f %s")`,
866 CommandDeps: []string{"${config.SoongZipCmd}"},
867 },
868 "outDir", "archString")
869
Colin Crossfabb6082018-02-20 17:22:23 -0800870// 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 -0700871// 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 -0800872var unzipAAR = pctx.AndroidStaticRule("unzipAAR",
873 blueprint.RuleParams{
Dan Willemsen304cfec2019-05-28 14:49:06 -0700874 Command: `rm -rf $outDir && mkdir -p $outDir && ` +
Colin Cross205e9112020-08-06 13:20:17 -0700875 `unzip -qoDD -d $outDir $in && rm -rf $outDir/res && touch $out && ` +
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800876 `${config.Zip2ZipCmd} -i $in -o $assetsPackage 'assets/**/*' && ` +
Colin Cross205e9112020-08-06 13:20:17 -0700877 `${config.MergeZipsCmd} $combinedClassesJar $$(ls $outDir/classes.jar 2> /dev/null) $$(ls $outDir/libs/*.jar 2> /dev/null)`,
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800878 CommandDeps: []string{"${config.MergeZipsCmd}", "${config.Zip2ZipCmd}"},
Colin Crossfabb6082018-02-20 17:22:23 -0800879 },
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800880 "outDir", "combinedClassesJar", "assetsPackage")
Colin Crossfabb6082018-02-20 17:22:23 -0800881
882func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
883 if len(a.properties.Aars) != 1 {
884 ctx.PropertyErrorf("aars", "exactly one aar is required")
885 return
886 }
887
Jiyong Park92315372021-04-02 08:45:46 +0900888 a.sdkVersion = a.SdkVersion(ctx)
889 a.minSdkVersion = a.MinSdkVersion(ctx)
890
Colin Cross56a83212020-09-15 18:30:11 -0700891 a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
892
Nan Zhang4c819fb2018-08-27 18:31:46 -0700893 aarName := ctx.ModuleName() + ".aar"
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000894 a.aarPath = android.PathForModuleSrc(ctx, a.properties.Aars[0])
895
Colin Cross1001a792019-03-21 22:21:39 -0700896 if Bool(a.properties.Jetifier) {
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000897 inputFile := a.aarPath
898 a.aarPath = android.PathForModuleOut(ctx, "jetifier", aarName)
899 TransformJetifier(ctx, a.aarPath.(android.WritablePath), inputFile)
Nan Zhang4c819fb2018-08-27 18:31:46 -0700900 }
Colin Crossfabb6082018-02-20 17:22:23 -0800901
902 extractedAARDir := android.PathForModuleOut(ctx, "aar")
Colin Cross205e9112020-08-06 13:20:17 -0700903 a.classpathFile = extractedAARDir.Join(ctx, "classes-combined.jar")
Colin Crossfabb6082018-02-20 17:22:23 -0800904 a.proguardFlags = extractedAARDir.Join(ctx, "proguard.txt")
Colin Cross10f7c4a2018-05-23 10:59:28 -0700905 a.manifest = extractedAARDir.Join(ctx, "AndroidManifest.xml")
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800906 a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip")
Colin Crossfabb6082018-02-20 17:22:23 -0800907
908 ctx.Build(pctx, android.BuildParams{
909 Rule: unzipAAR,
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000910 Input: a.aarPath,
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800911 Outputs: android.WritablePaths{a.classpathFile, a.proguardFlags, a.manifest, a.assetsPackage},
Colin Crossfabb6082018-02-20 17:22:23 -0800912 Description: "unzip AAR",
913 Args: map[string]string{
Colin Cross205e9112020-08-06 13:20:17 -0700914 "outDir": extractedAARDir.String(),
915 "combinedClassesJar": a.classpathFile.String(),
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800916 "assetsPackage": a.assetsPackage.String(),
Colin Crossfabb6082018-02-20 17:22:23 -0800917 },
918 })
919
Colin Crossa0ba2f52019-06-22 12:59:27 -0700920 // Always set --pseudo-localize, it will be stripped out later for release
921 // builds that don't want it.
922 compileFlags := []string{"--pseudo-localize"}
Colin Crossfabb6082018-02-20 17:22:23 -0800923 compiledResDir := android.PathForModuleOut(ctx, "flat-res")
Colin Crossfabb6082018-02-20 17:22:23 -0800924 flata := compiledResDir.Join(ctx, "gen_res.flata")
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000925 aapt2CompileZip(ctx, flata, a.aarPath, "res", compileFlags)
Colin Crossfabb6082018-02-20 17:22:23 -0800926
927 a.exportPackage = android.PathForModuleOut(ctx, "package-res.apk")
Jiyong Parkb7c639e2019-08-19 14:56:02 +0900928 // the subdir "android" is required to be filtered by package names
929 srcJar := android.PathForModuleGen(ctx, "android", "R.srcjar")
Colin Crossfabb6082018-02-20 17:22:23 -0800930 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
Colin Crossa97c5d32018-03-28 14:58:31 -0700931 rTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -0700932 a.extraAaptPackagesFile = android.PathForModuleOut(ctx, "extra_packages")
Colin Crossfabb6082018-02-20 17:22:23 -0800933
934 var linkDeps android.Paths
935
936 linkFlags := []string{
937 "--static-lib",
938 "--no-static-lib-packages",
939 "--auto-add-overlay",
940 }
941
Colin Cross10f7c4a2018-05-23 10:59:28 -0700942 linkFlags = append(linkFlags, "--manifest "+a.manifest.String())
943 linkDeps = append(linkDeps, a.manifest)
Colin Crossfabb6082018-02-20 17:22:23 -0800944
Colin Crossab8d1382023-07-14 17:23:41 +0000945 staticResourcesNodesDepSet, staticRRODirsDepSet, staticManifestsDepSet, sharedLibs, libFlags :=
Jiyong Parkf1691d22021-03-29 20:11:58 +0900946 aaptLibs(ctx, android.SdkContext(a), nil)
Colin Cross31656952018-05-24 16:11:20 -0700947
Colin Crossab8d1382023-07-14 17:23:41 +0000948 _ = staticRRODirsDepSet
949 staticDeps := transitiveAarDeps(staticResourcesNodesDepSet.ToList())
Colin Crossfabb6082018-02-20 17:22:23 -0800950
Colin Crossab8d1382023-07-14 17:23:41 +0000951 // AAPT2 overlays are in lowest to highest priority order, reverse the topological order
952 // of transitiveStaticLibs.
953 transitiveStaticLibs := android.ReversePaths(staticDeps.resPackages())
954
955 linkDeps = append(linkDeps, sharedLibs...)
956 linkDeps = append(linkDeps, transitiveStaticLibs...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700957 linkFlags = append(linkFlags, libFlags...)
Colin Crossfabb6082018-02-20 17:22:23 -0800958
Colin Cross66f78822018-05-02 12:58:28 -0700959 overlayRes := append(android.Paths{flata}, transitiveStaticLibs...)
Colin Crossfabb6082018-02-20 17:22:23 -0800960
Colin Crossab8d1382023-07-14 17:23:41 +0000961 transitiveAssets := android.ReverseSliceInPlace(staticDeps.assets())
Colin Cross66f78822018-05-02 12:58:28 -0700962 aapt2Link(ctx, a.exportPackage, srcJar, proguardOptionsFile, rTxt, a.extraAaptPackagesFile,
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800963 linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil)
Colin Crossfabb6082018-02-20 17:22:23 -0800964
Colin Crossab8d1382023-07-14 17:23:41 +0000965 resourcesNodesDepSetBuilder := android.NewDepSetBuilder[*resourcesNode](android.TOPOLOGICAL)
966 resourcesNodesDepSetBuilder.Direct(&resourcesNode{
967 resPackage: a.exportPackage,
968 manifest: a.manifest,
969 assets: android.OptionalPathForPath(a.assetsPackage),
970 })
971 resourcesNodesDepSetBuilder.Transitive(staticResourcesNodesDepSet)
972 a.resourcesNodesDepSet = resourcesNodesDepSetBuilder.Build()
973
974 manifestDepSetBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL).Direct(a.manifest)
975 // TODO(b/288358614): Soong has historically not merged manifests from dependencies of android_library_import
976 // modules. Merging manifests from dependencies could remove the need for pom2bp to generate the "-nodeps" copies
977 // of androidx libraries, but doing so triggers errors due to errors introduced by existing dependencies of
978 // android_library_import modules. If this is fixed, AndroidLibraryDependency.ManifestsDepSet can be dropped
979 // completely in favor of AndroidLibraryDependency.ResourceNodesDepSet.manifest
980 //manifestDepSetBuilder.Transitive(transitiveStaticDeps.manifests)
981 _ = staticManifestsDepSet
982 a.manifestsDepSet = manifestDepSetBuilder.Build()
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800983
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500984 a.collectTransitiveHeaderJars(ctx)
Colin Crossdcf71b22021-02-01 13:59:03 -0800985 ctx.SetProvider(JavaInfoProvider, JavaInfo{
986 HeaderJars: android.PathsIfNonNil(a.classpathFile),
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500987 TransitiveLibsHeaderJars: a.transitiveLibsHeaderJars,
988 TransitiveStaticLibsHeaderJars: a.transitiveStaticLibsHeaderJars,
Colin Crossdcf71b22021-02-01 13:59:03 -0800989 ImplementationAndResourcesJars: android.PathsIfNonNil(a.classpathFile),
990 ImplementationJars: android.PathsIfNonNil(a.classpathFile),
Joe Onorato6fe59eb2023-07-16 13:20:33 -0700991 // TransitiveAconfigFiles: // TODO(b/289117800): LOCAL_ACONFIG_FILES for prebuilts
Colin Crossdcf71b22021-02-01 13:59:03 -0800992 })
Sam Delmerico82602492022-06-10 17:05:42 +0000993
994 if proptools.Bool(a.properties.Extract_jni) {
995 for _, t := range ctx.MultiTargets() {
996 arch := t.Arch.Abi[0]
997 path := android.PathForModuleOut(ctx, arch+"_jni.zip")
998 a.jniPackages = append(a.jniPackages, path)
999
1000 outDir := android.PathForModuleOut(ctx, "aarForJni")
1001 aarPath := android.PathForModuleSrc(ctx, a.properties.Aars[0])
1002 ctx.Build(pctx, android.BuildParams{
1003 Rule: extractJNI,
1004 Input: aarPath,
1005 Outputs: android.WritablePaths{path},
1006 Description: "extract JNI from AAR",
1007 Args: map[string]string{
1008 "outDir": outDir.String(),
1009 "archString": arch,
1010 },
1011 })
1012 }
1013
1014 ctx.SetProvider(JniPackageProvider, JniPackageInfo{
1015 JniPackages: a.jniPackages,
1016 })
1017 }
Colin Crossdcf71b22021-02-01 13:59:03 -08001018}
Colin Crossfabb6082018-02-20 17:22:23 -08001019
1020func (a *AARImport) HeaderJars() android.Paths {
1021 return android.Paths{a.classpathFile}
1022}
1023
Colin Cross331a1212018-08-15 20:40:52 -07001024func (a *AARImport) ImplementationAndResourcesJars() android.Paths {
1025 return android.Paths{a.classpathFile}
1026}
1027
Ulyana Trafimovich5539e7b2020-06-04 14:08:17 +00001028func (a *AARImport) DexJarBuildPath() android.Path {
Colin Crossf24a22a2019-01-31 14:12:44 -08001029 return nil
1030}
1031
Ulya Trafimovich9f3052c2020-06-09 14:31:19 +01001032func (a *AARImport) DexJarInstallPath() android.Path {
1033 return nil
1034}
1035
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +01001036func (a *AARImport) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap {
Jiyong Park1be96912018-05-28 18:02:19 +09001037 return nil
1038}
1039
Jiyong Park45bf82e2020-12-15 22:29:02 +09001040var _ android.ApexModule = (*AARImport)(nil)
1041
1042// Implements android.ApexModule
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001043func (a *AARImport) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
1044 return a.depIsInSameApex(ctx, dep)
1045}
1046
Jiyong Park45bf82e2020-12-15 22:29:02 +09001047// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07001048func (g *AARImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
1049 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09001050 return nil
1051}
1052
Sam Delmericoaf8bb702022-07-25 15:39:32 -04001053var _ android.PrebuiltInterface = (*AARImport)(nil)
Colin Crossfabb6082018-02-20 17:22:23 -08001054
Colin Cross1b16b0e2019-02-12 14:41:32 -08001055// android_library_import imports an `.aar` file into the build graph as if it was built with android_library.
1056//
1057// This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
1058// an android_app module.
Colin Crossfabb6082018-02-20 17:22:23 -08001059func AARImportFactory() android.Module {
1060 module := &AARImport{}
1061
1062 module.AddProperties(&module.properties)
1063
1064 android.InitPrebuiltModule(module, &module.properties.Aars)
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001065 android.InitApexModule(module)
Sam Delmerico82602492022-06-10 17:05:42 +00001066 InitJavaModuleMultiTargets(module, android.DeviceSupported)
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001067 android.InitBazelModule(module)
Colin Crossfabb6082018-02-20 17:22:23 -08001068 return module
1069}
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001070
1071type bazelAapt struct {
1072 Manifest bazel.Label
1073 Resource_files bazel.LabelListAttribute
1074}
1075
1076type bazelAndroidLibrary struct {
1077 *javaLibraryAttributes
1078 *bazelAapt
1079}
1080
1081type bazelAndroidLibraryImport struct {
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001082 Aar bazel.Label
1083 Deps bazel.LabelListAttribute
1084 Exports bazel.LabelListAttribute
1085 Sdk_version bazel.StringAttribute
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001086}
1087
1088func (a *aapt) convertAaptAttrsWithBp2Build(ctx android.TopDownMutatorContext) *bazelAapt {
1089 manifest := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")
1090
1091 resourceFiles := bazel.LabelList{
1092 Includes: []bazel.Label{},
1093 }
1094 for _, dir := range android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res") {
1095 files := android.RootToModuleRelativePaths(ctx, androidResourceGlob(ctx, dir))
1096 resourceFiles.Includes = append(resourceFiles.Includes, files...)
1097 }
1098 return &bazelAapt{
1099 android.BazelLabelForModuleSrcSingle(ctx, manifest),
1100 bazel.MakeLabelListAttribute(resourceFiles),
1101 }
1102}
1103
1104func (a *AARImport) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
1105 aars := android.BazelLabelForModuleSrcExcludes(ctx, a.properties.Aars, []string{})
1106 exportableStaticLibs := []string{}
1107 // TODO(b/240716882): investigate and handle static_libs deps that are not imports. They are not supported for export by Bazel.
1108 for _, depName := range a.properties.Static_libs {
1109 if dep, ok := ctx.ModuleFromName(depName); ok {
1110 switch dep.(type) {
1111 case *AARImport, *Import:
1112 exportableStaticLibs = append(exportableStaticLibs, depName)
1113 }
1114 }
1115 }
1116 name := android.RemoveOptionalPrebuiltPrefix(a.Name())
1117 deps := android.BazelLabelForModuleDeps(ctx, android.LastUniqueStrings(android.CopyOf(append(a.properties.Static_libs, a.properties.Libs...))))
1118 exports := android.BazelLabelForModuleDeps(ctx, android.LastUniqueStrings(exportableStaticLibs))
1119
1120 ctx.CreateBazelTargetModule(
1121 bazel.BazelTargetModuleProperties{
1122 Rule_class: "aar_import",
Alixa381cd12023-05-10 14:49:38 +00001123 Bzl_load_location: "//build/bazel/rules/android:aar_import.bzl",
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001124 },
1125 android.CommonAttributes{Name: name},
1126 &bazelAndroidLibraryImport{
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001127 Aar: aars.Includes[0],
1128 Deps: bazel.MakeLabelListAttribute(deps),
1129 Exports: bazel.MakeLabelListAttribute(exports),
1130 Sdk_version: bazel.StringAttribute{Value: a.properties.Sdk_version},
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001131 },
1132 )
1133
Alix14101de2023-01-06 03:42:07 +00001134 neverlink := true
1135 ctx.CreateBazelTargetModule(
Alix32540022023-03-16 21:06:13 +00001136 AndroidLibraryBazelTargetModuleProperties(),
Alix14101de2023-01-06 03:42:07 +00001137 android.CommonAttributes{Name: name + "-neverlink"},
1138 &bazelAndroidLibrary{
1139 javaLibraryAttributes: &javaLibraryAttributes{
1140 Neverlink: bazel.BoolAttribute{Value: &neverlink},
1141 Exports: bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + name}),
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001142 javaCommonAttributes: &javaCommonAttributes{
1143 Sdk_version: bazel.StringAttribute{Value: a.properties.Sdk_version},
1144 },
Alix14101de2023-01-06 03:42:07 +00001145 },
1146 },
1147 )
1148
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001149}
Alix32540022023-03-16 21:06:13 +00001150func AndroidLibraryBazelTargetModuleProperties() bazel.BazelTargetModuleProperties {
1151 return bazel.BazelTargetModuleProperties{
1152 Rule_class: "android_library",
Alixa381cd12023-05-10 14:49:38 +00001153 Bzl_load_location: "//build/bazel/rules/android:android_library.bzl",
Alix32540022023-03-16 21:06:13 +00001154 }
1155}
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001156
1157func (a *AndroidLibrary) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
Alix8062f4d2022-11-14 21:38:07 +00001158 commonAttrs, bp2buildInfo := a.convertLibraryAttrsBp2Build(ctx)
1159 depLabels := bp2buildInfo.DepLabels
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001160
1161 deps := depLabels.Deps
1162 if !commonAttrs.Srcs.IsEmpty() {
1163 deps.Append(depLabels.StaticDeps) // we should only append these if there are sources to use them
1164 } else if !depLabels.Deps.IsEmpty() {
1165 ctx.ModuleErrorf("Module has direct dependencies but no sources. Bazel will not allow this.")
1166 }
Alix82fb94e2022-10-26 20:40:18 +00001167 name := a.Name()
Alix32540022023-03-16 21:06:13 +00001168 props := AndroidLibraryBazelTargetModuleProperties()
Alix82fb94e2022-10-26 20:40:18 +00001169
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001170 ctx.CreateBazelTargetModule(
Alix82fb94e2022-10-26 20:40:18 +00001171 props,
1172 android.CommonAttributes{Name: name},
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001173 &bazelAndroidLibrary{
1174 &javaLibraryAttributes{
1175 javaCommonAttributes: commonAttrs,
1176 Deps: deps,
1177 Exports: depLabels.StaticDeps,
1178 },
1179 a.convertAaptAttrsWithBp2Build(ctx),
1180 },
1181 )
Alix82fb94e2022-10-26 20:40:18 +00001182
1183 neverlink := true
1184 ctx.CreateBazelTargetModule(
1185 props,
1186 android.CommonAttributes{Name: name + "-neverlink"},
1187 &bazelAndroidLibrary{
1188 javaLibraryAttributes: &javaLibraryAttributes{
1189 Neverlink: bazel.BoolAttribute{Value: &neverlink},
1190 Exports: bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + name}),
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001191 javaCommonAttributes: &javaCommonAttributes{
1192 Sdk_version: bazel.StringAttribute{Value: a.deviceProperties.Sdk_version},
1193 Java_version: bazel.StringAttribute{Value: a.properties.Java_version},
1194 },
Alix82fb94e2022-10-26 20:40:18 +00001195 },
1196 },
1197 )
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001198}