blob: 29e86e6785565bd85c91a739610f413c64ca8171 [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 Crossd8c711f2023-07-14 15:52:41 +000034 ExportedRRODirs() []rroDir
35 ExportedStaticPackages() android.Paths
36 ExportedManifests() android.Paths
37 ExportedAssets() android.OptionalPath
Jaewoong Jungc779cd42020-10-06 18:56:10 -070038 SetRROEnforcedForDependent(enforce bool)
39 IsRROEnforced(ctx android.BaseModuleContext) bool
Colin Crossa97c5d32018-03-28 14:58:31 -070040}
41
42func init() {
Paul Duffinf9b1da02019-12-18 19:51:55 +000043 RegisterAARBuildComponents(android.InitRegistrationContext)
44}
45
46func RegisterAARBuildComponents(ctx android.RegistrationContext) {
47 ctx.RegisterModuleType("android_library_import", AARImportFactory)
48 ctx.RegisterModuleType("android_library", AndroidLibraryFactory)
Paul Duffin04ba70d2021-03-22 13:56:43 +000049 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
50 ctx.TopDown("propagate_rro_enforcement", propagateRROEnforcementMutator).Parallel()
51 })
Colin Crossa97c5d32018-03-28 14:58:31 -070052}
53
54//
55// AAR (android library)
56//
57
58type androidLibraryProperties struct {
59 BuildAAR bool `blueprint:"mutated"`
60}
61
62type aaptProperties struct {
63 // flags passed to aapt when creating the apk
64 Aaptflags []string
65
Dan Willemsen72be5902018-10-24 20:24:57 -070066 // include all resource configurations, not just the product-configured
67 // ones.
68 Aapt_include_all_resources *bool
69
Colin Crossa97c5d32018-03-28 14:58:31 -070070 // list of directories relative to the Blueprints file containing assets.
Colin Cross0ddae7f2019-02-07 15:30:01 -080071 // Defaults to ["assets"] if a directory called assets exists. Set to []
72 // to disable the default.
Colin Crossa97c5d32018-03-28 14:58:31 -070073 Asset_dirs []string
74
75 // list of directories relative to the Blueprints file containing
Colin Cross0ddae7f2019-02-07 15:30:01 -080076 // Android resources. Defaults to ["res"] if a directory called res exists.
77 // Set to [] to disable the default.
Colin Crossa97c5d32018-03-28 14:58:31 -070078 Resource_dirs []string
79
Colin Crossa592e3e2019-02-19 16:59:53 -080080 // list of zip files containing Android resources.
Colin Cross27b922f2019-03-04 22:35:41 -080081 Resource_zips []string `android:"path"`
Colin Crossa592e3e2019-02-19 16:59:53 -080082
Colin Crossa97c5d32018-03-28 14:58:31 -070083 // path to AndroidManifest.xml. If unset, defaults to "AndroidManifest.xml".
Colin Cross27b922f2019-03-04 22:35:41 -080084 Manifest *string `android:"path"`
changho.shinb5432b72019-08-08 18:37:17 +090085
86 // paths to additional manifest files to merge with main manifest.
87 Additional_manifests []string `android:"path"`
Sasha Smundak541056c2019-10-28 15:50:06 -070088
89 // do not include AndroidManifest from dependent libraries
90 Dont_merge_manifests *bool
Jaewoong Jungc779cd42020-10-06 18:56:10 -070091
92 // true if RRO is enforced for any of the dependent modules
93 RROEnforcedForDependent bool `blueprint:"mutated"`
Colin Crossa97c5d32018-03-28 14:58:31 -070094}
95
96type aapt struct {
Colin Crossd8c711f2023-07-14 15:52:41 +000097 aaptSrcJar android.Path
98 exportPackage android.Path
99 manifestPath android.Path
100 transitiveManifestPaths android.Paths
101 proguardOptionsFile android.Path
102 rroDirs []rroDir
103 rTxt android.Path
104 extraAaptPackagesFile android.Path
105 mergedManifestFile android.Path
106 noticeFile android.OptionalPath
107 assetPackage android.OptionalPath
108 isLibrary bool
109 defaultManifestVersion string
110 useEmbeddedNativeLibs bool
111 useEmbeddedDex bool
112 usesNonSdkApis bool
113 hasNoCode bool
114 LoggingParent string
115 resourceFiles android.Paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700116
Colin Crosse560c4a2019-03-19 16:03:11 -0700117 splitNames []string
118 splits []split
119
Colin Crossa97c5d32018-03-28 14:58:31 -0700120 aaptProperties aaptProperties
121}
122
Colin Crosse560c4a2019-03-19 16:03:11 -0700123type split struct {
124 name string
125 suffix string
126 path android.Path
127}
128
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700129// Propagate RRO enforcement flag to static lib dependencies transitively.
130func propagateRROEnforcementMutator(ctx android.TopDownMutatorContext) {
131 m := ctx.Module()
132 if d, ok := m.(AndroidLibraryDependency); ok && d.IsRROEnforced(ctx) {
133 ctx.VisitDirectDepsWithTag(staticLibTag, func(d android.Module) {
134 if a, ok := d.(AndroidLibraryDependency); ok {
135 a.SetRROEnforcedForDependent(true)
136 }
137 })
138 }
139}
140
Colin Crossa97c5d32018-03-28 14:58:31 -0700141func (a *aapt) ExportPackage() android.Path {
142 return a.exportPackage
143}
Colin Crossd8c711f2023-07-14 15:52:41 +0000144
145func (a *aapt) ExportedRRODirs() []rroDir {
146 return a.rroDirs
Colin Crossc1c37552019-01-31 11:42:41 -0800147}
148
Colin Crossd8c711f2023-07-14 15:52:41 +0000149func (a *aapt) ExportedManifests() android.Paths {
150 return a.transitiveManifestPaths
Colin Crossc1c37552019-01-31 11:42:41 -0800151}
152
Colin Crossd8c711f2023-07-14 15:52:41 +0000153func (a *aapt) ExportedAssets() android.OptionalPath {
154 return a.assetPackage
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 Crossd8c711f2023-07-14 15:52:41 +0000294 transitiveStaticLibs, transitiveStaticLibManifests, staticRRODirs, assetPackages, libDeps, 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
Luca Stefanifd898822019-09-10 22:13:31 +0200317 // Add additional manifest files to transitive manifests.
318 additionalManifests := android.PathsForModuleSrc(ctx, a.aaptProperties.Additional_manifests)
Colin Crossd8c711f2023-07-14 15:52:41 +0000319 a.transitiveManifestPaths = append(android.Paths{manifestPath}, additionalManifests...)
320 a.transitiveManifestPaths = append(a.transitiveManifestPaths, transitiveStaticLibManifests...)
Colin Cross90c25c62019-04-19 16:22:57 -0700321
Colin Crossd8c711f2023-07-14 15:52:41 +0000322 if len(a.transitiveManifestPaths) > 1 && !Bool(a.aaptProperties.Dont_merge_manifests) {
323 a.mergedManifestFile = manifestMerger(ctx, a.transitiveManifestPaths[0], a.transitiveManifestPaths[1:], a.isLibrary)
Colin Cross90c25c62019-04-19 16:22:57 -0700324 if !a.isLibrary {
325 // Only use the merged manifest for applications. For libraries, the transitive closure of manifests
326 // will be propagated to the final application and merged there. The merged manifest for libraries is
327 // only passed to Make, which can't handle transitive dependencies.
328 manifestPath = a.mergedManifestFile
329 }
330 } else {
331 a.mergedManifestFile = manifestPath
332 }
Colin Cross31656952018-05-24 16:11:20 -0700333
Colin Crossa0ba2f52019-06-22 12:59:27 -0700334 compileFlags, linkFlags, linkDeps, resDirs, overlayDirs, rroDirs, resZips := a.aapt2Flags(ctx, sdkContext, manifestPath)
Colin Cross31656952018-05-24 16:11:20 -0700335
Colin Crossd8c711f2023-07-14 15:52:41 +0000336 rroDirs = append(rroDirs, staticRRODirs...)
Colin Cross31656952018-05-24 16:11:20 -0700337 linkFlags = append(linkFlags, libFlags...)
Colin Crossd8c711f2023-07-14 15:52:41 +0000338 linkDeps = append(linkDeps, libDeps...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700339 linkFlags = append(linkFlags, extraLinkFlags...)
Colin Cross1b6a3cf2018-07-24 14:51:30 -0700340 if a.isLibrary {
341 linkFlags = append(linkFlags, "--static-lib")
342 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700343
344 packageRes := android.PathForModuleOut(ctx, "package-res.apk")
Jiyong Parkb7c639e2019-08-19 14:56:02 +0900345 // the subdir "android" is required to be filtered by package names
346 srcJar := android.PathForModuleGen(ctx, "android", "R.srcjar")
Colin Crossa97c5d32018-03-28 14:58:31 -0700347 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
348 rTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -0700349 // This file isn't used by Soong, but is generated for exporting
350 extraPackages := android.PathForModuleOut(ctx, "extra_packages")
Colin Crossa97c5d32018-03-28 14:58:31 -0700351
Colin Cross4aaa84a2018-08-21 15:14:37 -0700352 var compiledResDirs []android.Paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700353 for _, dir := range resDirs {
Colin Cross014489c2020-06-02 20:09:13 -0700354 a.resourceFiles = append(a.resourceFiles, dir.files...)
Colin Crossa0ba2f52019-06-22 12:59:27 -0700355 compiledResDirs = append(compiledResDirs, aapt2Compile(ctx, dir.dir, dir.files, compileFlags).Paths())
Colin Crossa97c5d32018-03-28 14:58:31 -0700356 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700357
Colin Crossa592e3e2019-02-19 16:59:53 -0800358 for i, zip := range resZips {
359 flata := android.PathForModuleOut(ctx, fmt.Sprintf("reszip.%d.flata", i))
Colin Crossa0ba2f52019-06-22 12:59:27 -0700360 aapt2CompileZip(ctx, flata, zip, "", compileFlags)
Colin Crossa592e3e2019-02-19 16:59:53 -0800361 compiledResDirs = append(compiledResDirs, android.Paths{flata})
362 }
363
Colin Cross4aaa84a2018-08-21 15:14:37 -0700364 var compiledRes, compiledOverlay android.Paths
365
366 compiledOverlay = append(compiledOverlay, transitiveStaticLibs...)
367
Colin Crossbec85302019-02-13 13:15:46 -0800368 if len(transitiveStaticLibs) > 0 {
Colin Cross4aaa84a2018-08-21 15:14:37 -0700369 // If we are using static android libraries, every source file becomes an overlay.
370 // This is to emulate old AAPT behavior which simulated library support.
371 for _, compiledResDir := range compiledResDirs {
372 compiledOverlay = append(compiledOverlay, compiledResDir...)
373 }
Colin Crossbec85302019-02-13 13:15:46 -0800374 } else if a.isLibrary {
375 // Otherwise, for a static library we treat all the resources equally with no overlay.
376 for _, compiledResDir := range compiledResDirs {
377 compiledRes = append(compiledRes, compiledResDir...)
378 }
Colin Cross4aaa84a2018-08-21 15:14:37 -0700379 } else if len(compiledResDirs) > 0 {
380 // Without static libraries, the first directory is our directory, which can then be
381 // overlaid by the rest.
382 compiledRes = append(compiledRes, compiledResDirs[0]...)
383 for _, compiledResDir := range compiledResDirs[1:] {
384 compiledOverlay = append(compiledOverlay, compiledResDir...)
385 }
386 }
387
Colin Crossa97c5d32018-03-28 14:58:31 -0700388 for _, dir := range overlayDirs {
Colin Crossa0ba2f52019-06-22 12:59:27 -0700389 compiledOverlay = append(compiledOverlay, aapt2Compile(ctx, dir.dir, dir.files, compileFlags).Paths()...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700390 }
391
Colin Crosse560c4a2019-03-19 16:03:11 -0700392 var splitPackages android.WritablePaths
393 var splits []split
394
395 for _, s := range a.splitNames {
396 suffix := strings.Replace(s, ",", "_", -1)
397 path := android.PathForModuleOut(ctx, "package_"+suffix+".apk")
398 linkFlags = append(linkFlags, "--split", path.String()+":"+s)
399 splitPackages = append(splitPackages, path)
400 splits = append(splits, split{
401 name: s,
402 suffix: suffix,
403 path: path,
404 })
405 }
406
Colin Cross66f78822018-05-02 12:58:28 -0700407 aapt2Link(ctx, packageRes, srcJar, proguardOptionsFile, rTxt, extraPackages,
Colin Crossd8c711f2023-07-14 15:52:41 +0000408 linkFlags, linkDeps, compiledRes, compiledOverlay, assetPackages, splitPackages)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800409
410 // Extract assets from the resource package output so that they can be used later in aapt2link
411 // for modules that depend on this one.
Colin Crossd8c711f2023-07-14 15:52:41 +0000412 if android.PrefixInList(linkFlags, "-A ") || len(assetPackages) > 0 {
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800413 assets := android.PathForModuleOut(ctx, "assets.zip")
414 ctx.Build(pctx, android.BuildParams{
415 Rule: extractAssetsRule,
416 Input: packageRes,
417 Output: assets,
418 Description: "extract assets from built resource file",
419 })
420 a.assetPackage = android.OptionalPathForPath(assets)
421 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700422
423 a.aaptSrcJar = srcJar
424 a.exportPackage = packageRes
425 a.manifestPath = manifestPath
426 a.proguardOptionsFile = proguardOptionsFile
Colin Crossd8c711f2023-07-14 15:52:41 +0000427 a.rroDirs = rroDirs
Colin Cross66f78822018-05-02 12:58:28 -0700428 a.extraAaptPackagesFile = extraPackages
Colin Crossa97c5d32018-03-28 14:58:31 -0700429 a.rTxt = rTxt
Colin Crosse560c4a2019-03-19 16:03:11 -0700430 a.splits = splits
Colin Crossa97c5d32018-03-28 14:58:31 -0700431}
432
433// aaptLibs collects libraries from dependencies and sdk_version and converts them into paths
Jiyong Parkf1691d22021-03-29 20:11:58 +0900434func aaptLibs(ctx android.ModuleContext, sdkContext android.SdkContext, classLoaderContexts dexpreopt.ClassLoaderContextMap) (
Colin Crossd8c711f2023-07-14 15:52:41 +0000435 transitiveStaticLibs, transitiveStaticLibManifests android.Paths, staticRRODirs []rroDir, assets, deps android.Paths, flags []string) {
436
437 var sharedLibs android.Paths
Colin Crossa97c5d32018-03-28 14:58:31 -0700438
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100439 if classLoaderContexts == nil {
Ulya Trafimovich18554242020-11-03 15:55:11 +0000440 // Not all callers need to compute class loader context, those who don't just pass nil.
441 // Create a temporary class loader context here (it will be computed, but not used).
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100442 classLoaderContexts = make(dexpreopt.ClassLoaderContextMap)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000443 }
444
Colin Cross83bb3162018-06-25 15:48:06 -0700445 sdkDep := decodeSdkDep(ctx, sdkContext)
Colin Crossa97c5d32018-03-28 14:58:31 -0700446 if sdkDep.useFiles {
Colin Cross86a60ae2018-05-29 14:44:55 -0700447 sharedLibs = append(sharedLibs, sdkDep.jars...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700448 }
449
450 ctx.VisitDirectDeps(func(module android.Module) {
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000451 depTag := ctx.OtherModuleDependencyTag(module)
Ulya Trafimovich18554242020-11-03 15:55:11 +0000452
Colin Crossa97c5d32018-03-28 14:58:31 -0700453 var exportPackage android.Path
Colin Cross66f78822018-05-02 12:58:28 -0700454 aarDep, _ := module.(AndroidLibraryDependency)
455 if aarDep != nil {
Colin Crossa97c5d32018-03-28 14:58:31 -0700456 exportPackage = aarDep.ExportPackage()
457 }
458
Ulya Trafimovich65b03192020-12-03 16:50:22 +0000459 switch depTag {
Colin Cross4b964c02018-10-15 16:18:06 -0700460 case instrumentationForTag:
461 // Nothing, instrumentationForTag is treated as libTag for javac but not for aapt2.
Liz Kammeref28a4c2022-09-23 16:50:56 -0400462 case sdkLibTag, libTag:
Colin Cross5446e882019-05-22 10:46:27 -0700463 if exportPackage != nil {
464 sharedLibs = append(sharedLibs, exportPackage)
465 }
Colin Cross5446e882019-05-22 10:46:27 -0700466 case frameworkResTag:
Colin Crossa97c5d32018-03-28 14:58:31 -0700467 if exportPackage != nil {
468 sharedLibs = append(sharedLibs, exportPackage)
469 }
470 case staticLibTag:
471 if exportPackage != nil {
Colin Crossd8c711f2023-07-14 15:52:41 +0000472 transitiveStaticLibs = append(transitiveStaticLibs, aarDep.ExportedStaticPackages()...)
473 transitiveStaticLibs = append(transitiveStaticLibs, exportPackage)
474 transitiveStaticLibManifests = append(transitiveStaticLibManifests, aarDep.ExportedManifests()...)
475 if aarDep.ExportedAssets().Valid() {
476 assets = append(assets, aarDep.ExportedAssets().Path())
477 }
478
479 outer:
480 for _, d := range aarDep.ExportedRRODirs() {
481 for _, e := range staticRRODirs {
482 if d.path == e.path {
483 continue outer
484 }
485 }
486 staticRRODirs = append(staticRRODirs, d)
487 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700488 }
489 }
Ulya Trafimovich18554242020-11-03 15:55:11 +0000490
Ulya Trafimovich88bb6f62020-12-16 16:16:11 +0000491 addCLCFromDep(ctx, module, classLoaderContexts)
Colin Crossa97c5d32018-03-28 14:58:31 -0700492 })
493
Colin Crossd8c711f2023-07-14 15:52:41 +0000494 deps = append(deps, sharedLibs...)
495 deps = append(deps, transitiveStaticLibs...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700496
Colin Crossd8c711f2023-07-14 15:52:41 +0000497 if len(transitiveStaticLibs) > 0 {
Colin Crossa97c5d32018-03-28 14:58:31 -0700498 flags = append(flags, "--auto-add-overlay")
499 }
500
501 for _, sharedLib := range sharedLibs {
502 flags = append(flags, "-I "+sharedLib.String())
503 }
504
Colin Crossd8c711f2023-07-14 15:52:41 +0000505 transitiveStaticLibs = android.FirstUniquePaths(transitiveStaticLibs)
506 transitiveStaticLibManifests = android.FirstUniquePaths(transitiveStaticLibManifests)
507
508 return transitiveStaticLibs, transitiveStaticLibManifests, staticRRODirs, assets, deps, flags
Colin Crossa97c5d32018-03-28 14:58:31 -0700509}
510
511type AndroidLibrary struct {
512 Library
513 aapt
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -0500514 android.BazelModuleBase
Colin Crossa97c5d32018-03-28 14:58:31 -0700515
516 androidLibraryProperties androidLibraryProperties
517
518 aarFile android.WritablePath
Colin Crossd8c711f2023-07-14 15:52:41 +0000519
520 exportedStaticPackages android.Paths
Colin Cross89c31582018-04-30 15:55:11 -0700521}
522
Saeid Farivar Asanjan1fca3012021-09-14 18:40:19 +0000523var _ android.OutputFileProducer = (*AndroidLibrary)(nil)
524
525// For OutputFileProducer interface
526func (a *AndroidLibrary) OutputFiles(tag string) (android.Paths, error) {
527 switch tag {
528 case ".aar":
529 return []android.Path{a.aarFile}, nil
530 default:
531 return a.Library.OutputFiles(tag)
532 }
533}
534
Colin Crossd8c711f2023-07-14 15:52:41 +0000535func (a *AndroidLibrary) ExportedStaticPackages() android.Paths {
536 return a.exportedStaticPackages
537}
538
Colin Crossa97c5d32018-03-28 14:58:31 -0700539var _ AndroidLibraryDependency = (*AndroidLibrary)(nil)
540
541func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
542 a.Module.deps(ctx)
Jiyong Parkf1691d22021-03-29 20:11:58 +0900543 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Paul Duffin250e6192019-06-07 10:44:37 +0100544 if sdkDep.hasFrameworkLibs() {
545 a.aapt.deps(ctx, sdkDep)
Colin Crossa97c5d32018-03-28 14:58:31 -0700546 }
Colin Cross4a80a152022-12-21 21:51:52 -0800547 a.usesLibrary.deps(ctx, false)
Colin Crossa97c5d32018-03-28 14:58:31 -0700548}
549
550func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Crosse4246ab2019-02-05 21:55:21 -0800551 a.aapt.isLibrary = true
Ulya Trafimovich42c7f0d2021-08-17 16:20:29 +0100552 a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +0000553 a.aapt.buildActions(ctx, android.SdkContext(a), a.classLoaderContexts, nil, false)
Colin Crossa97c5d32018-03-28 14:58:31 -0700554
Colin Cross56a83212020-09-15 18:30:11 -0700555 a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
556
Colin Crossa97c5d32018-03-28 14:58:31 -0700557 ctx.CheckbuildFile(a.proguardOptionsFile)
558 ctx.CheckbuildFile(a.exportPackage)
559 ctx.CheckbuildFile(a.aaptSrcJar)
560
561 // apps manifests are handled by aapt, don't let Module see them
562 a.properties.Manifest = nil
563
Colin Cross014489c2020-06-02 20:09:13 -0700564 a.linter.mergedManifest = a.aapt.mergedManifestFile
565 a.linter.manifest = a.aapt.manifestPath
566 a.linter.resources = a.aapt.resourceFiles
567
Colin Crossa97c5d32018-03-28 14:58:31 -0700568 a.Module.extraProguardFlagFiles = append(a.Module.extraProguardFlagFiles,
569 a.proguardOptionsFile)
570
571 a.Module.compile(ctx, a.aaptSrcJar)
572
Colin Crossf57c5782019-01-25 13:20:38 -0800573 a.aarFile = android.PathForModuleOut(ctx, ctx.ModuleName()+".aar")
Colin Crossa97c5d32018-03-28 14:58:31 -0700574 var res android.Paths
575 if a.androidLibraryProperties.BuildAAR {
576 BuildAAR(ctx, a.aarFile, a.outputFile, a.manifestPath, a.rTxt, res)
577 ctx.CheckbuildFile(a.aarFile)
578 }
Colin Cross89c31582018-04-30 15:55:11 -0700579
Cole Faust9a631312020-10-22 21:05:24 +0000580 a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles,
581 android.PathsForModuleSrc(ctx, a.dexProperties.Optimize.Proguard_flags_files)...)
Colin Cross89c31582018-04-30 15:55:11 -0700582 ctx.VisitDirectDeps(func(m android.Module) {
Jared Duke5979b302022-12-19 21:08:39 +0000583 if ctx.OtherModuleDependencyTag(m) == staticLibTag {
584 if lib, ok := m.(LibraryDependency); ok {
585 a.exportedProguardFlagFiles = append(a.exportedProguardFlagFiles, lib.ExportedProguardFlagFiles()...)
586 }
Colin Crossd8c711f2023-07-14 15:52:41 +0000587 if alib, ok := m.(AndroidLibraryDependency); ok {
588 a.exportedStaticPackages = append(a.exportedStaticPackages, alib.ExportPackage())
589 a.exportedStaticPackages = append(a.exportedStaticPackages, alib.ExportedStaticPackages()...)
590 }
Colin Cross89c31582018-04-30 15:55:11 -0700591 }
592 })
Colin Cross89c31582018-04-30 15:55:11 -0700593 a.exportedProguardFlagFiles = android.FirstUniquePaths(a.exportedProguardFlagFiles)
Colin Crossd8c711f2023-07-14 15:52:41 +0000594 a.exportedStaticPackages = android.FirstUniquePaths(a.exportedStaticPackages)
Sam Delmerico82602492022-06-10 17:05:42 +0000595
596 prebuiltJniPackages := android.Paths{}
597 ctx.VisitDirectDeps(func(module android.Module) {
598 if info, ok := ctx.OtherModuleProvider(module, JniPackageProvider).(JniPackageInfo); ok {
599 prebuiltJniPackages = append(prebuiltJniPackages, info.JniPackages...)
600 }
601 })
602 if len(prebuiltJniPackages) > 0 {
603 ctx.SetProvider(JniPackageProvider, JniPackageInfo{
604 JniPackages: prebuiltJniPackages,
605 })
606 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700607}
608
Colin Cross1b16b0e2019-02-12 14:41:32 -0800609// android_library builds and links sources into a `.jar` file for the device along with Android resources.
610//
611// An android_library has a single variant that produces a `.jar` file containing `.class` files that were
Sam Delmerico82602492022-06-10 17:05:42 +0000612// compiled against the device bootclasspath, along with a `package-res.apk` file containing Android resources compiled
Colin Cross1b16b0e2019-02-12 14:41:32 -0800613// with aapt2. This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
614// an android_app module.
Colin Crossa97c5d32018-03-28 14:58:31 -0700615func AndroidLibraryFactory() android.Module {
616 module := &AndroidLibrary{}
617
Colin Crossce6734e2020-06-15 16:09:53 -0700618 module.Module.addHostAndDeviceProperties()
Colin Crossa97c5d32018-03-28 14:58:31 -0700619 module.AddProperties(
Colin Crossa97c5d32018-03-28 14:58:31 -0700620 &module.aaptProperties,
621 &module.androidLibraryProperties)
622
623 module.androidLibraryProperties.BuildAAR = true
Colin Cross014489c2020-06-02 20:09:13 -0700624 module.Module.linter.library = true
Colin Crossa97c5d32018-03-28 14:58:31 -0700625
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900626 android.InitApexModule(module)
Colin Cross48de9a42018-10-02 13:53:33 -0700627 InitJavaModule(module, android.DeviceSupported)
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -0500628 android.InitBazelModule(module)
Colin Crossa97c5d32018-03-28 14:58:31 -0700629 return module
630}
631
Colin Crossfabb6082018-02-20 17:22:23 -0800632//
633// AAR (android library) prebuilts
634//
Colin Crossfabb6082018-02-20 17:22:23 -0800635
Vinh Trance0781f2022-04-13 01:30:44 +0000636// Properties for android_library_import
Colin Crossfabb6082018-02-20 17:22:23 -0800637type AARImportProperties struct {
Vinh Trance0781f2022-04-13 01:30:44 +0000638 // ARR (android library prebuilt) filepath. Exactly one ARR is required.
Colin Cross27b922f2019-03-04 22:35:41 -0800639 Aars []string `android:"path"`
Vinh Trance0781f2022-04-13 01:30:44 +0000640 // If not blank, set to the version of the sdk to compile against.
641 // Defaults to private.
642 // Values are of one of the following forms:
643 // 1) numerical API level, "current", "none", or "core_platform"
644 // 2) An SDK kind with an API level: "<sdk kind>_<API level>"
645 // See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds.
646 // If the SDK kind is empty, it will be set to public
647 Sdk_version *string
648 // If not blank, set the minimum version of the sdk that the compiled artifacts will run against.
649 // Defaults to sdk_version if not set. See sdk_version for possible values.
Colin Cross479884c2018-07-10 13:39:30 -0700650 Min_sdk_version *string
Vinh Trance0781f2022-04-13 01:30:44 +0000651 // List of java static libraries that the included ARR (android library prebuilts) has dependencies to.
Colin Crossa97c5d32018-03-28 14:58:31 -0700652 Static_libs []string
Vinh Trance0781f2022-04-13 01:30:44 +0000653 // List of java libraries that the included ARR (android library prebuilts) has dependencies to.
654 Libs []string
655 // If set to true, run Jetifier against .aar file. Defaults to false.
Colin Cross1001a792019-03-21 22:21:39 -0700656 Jetifier *bool
Sam Delmerico82602492022-06-10 17:05:42 +0000657 // If true, extract JNI libs from AAR archive. These libs will be accessible to android_app modules and
658 // will be passed transitively through android_libraries to an android_app.
659 //TODO(b/241138093) evaluate whether we can have this flag default to true for Bazel conversion
660 Extract_jni *bool
Colin Crossfabb6082018-02-20 17:22:23 -0800661}
662
663type AARImport struct {
664 android.ModuleBase
Colin Cross48de9a42018-10-02 13:53:33 -0700665 android.DefaultableModuleBase
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900666 android.ApexModuleBase
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -0500667 android.BazelModuleBase
Colin Crossfabb6082018-02-20 17:22:23 -0800668 prebuilt android.Prebuilt
669
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900670 // Functionality common to Module and Import.
671 embeddableInModuleAndImport
672
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500673 providesTransitiveHeaderJars
674
Colin Crossfabb6082018-02-20 17:22:23 -0800675 properties AARImportProperties
676
Colin Cross66f78822018-05-02 12:58:28 -0700677 classpathFile android.WritablePath
678 proguardFlags android.WritablePath
679 exportPackage android.WritablePath
680 extraAaptPackagesFile android.WritablePath
Colin Cross10f7c4a2018-05-23 10:59:28 -0700681 manifest android.WritablePath
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800682 assetsPackage android.WritablePath
Colin Cross66f78822018-05-02 12:58:28 -0700683
Colin Crossd8c711f2023-07-14 15:52:41 +0000684 exportedStaticPackages android.Paths
Colin Cross56a83212020-09-15 18:30:11 -0700685
686 hideApexVariantFromMake bool
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000687
Sam Delmerico82602492022-06-10 17:05:42 +0000688 aarPath android.Path
689 jniPackages android.Paths
Jiyong Park92315372021-04-02 08:45:46 +0900690
691 sdkVersion android.SdkSpec
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000692 minSdkVersion android.ApiLevel
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000693}
694
695var _ android.OutputFileProducer = (*AARImport)(nil)
696
697// For OutputFileProducer interface
698func (a *AARImport) OutputFiles(tag string) (android.Paths, error) {
699 switch tag {
700 case ".aar":
701 return []android.Path{a.aarPath}, nil
702 case "":
703 return []android.Path{a.classpathFile}, nil
704 default:
705 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
706 }
Colin Crossfabb6082018-02-20 17:22:23 -0800707}
708
Jiyong Park92315372021-04-02 08:45:46 +0900709func (a *AARImport) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
710 return android.SdkSpecFrom(ctx, String(a.properties.Sdk_version))
Colin Cross83bb3162018-06-25 15:48:06 -0700711}
712
Jiyong Parkf1691d22021-03-29 20:11:58 +0900713func (a *AARImport) SystemModules() string {
Paul Duffine25c6442019-10-11 13:50:28 +0100714 return ""
715}
716
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000717func (a *AARImport) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
Colin Cross479884c2018-07-10 13:39:30 -0700718 if a.properties.Min_sdk_version != nil {
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000719 return android.ApiLevelFrom(ctx, *a.properties.Min_sdk_version)
Colin Cross479884c2018-07-10 13:39:30 -0700720 }
Spandan Das8c9ae7e2023-03-03 21:20:36 +0000721 return a.SdkVersion(ctx).ApiLevel
Colin Cross83bb3162018-06-25 15:48:06 -0700722}
723
Spandan Dasa26eda72023-03-02 00:56:06 +0000724func (a *AARImport) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
725 return android.SdkSpecFrom(ctx, "").ApiLevel
William Loh5a082f92022-05-17 20:21:50 +0000726}
727
Spandan Dasca70fc42023-03-01 23:38:49 +0000728func (a *AARImport) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
729 return a.SdkVersion(ctx).ApiLevel
Dan Willemsen419290a2018-10-31 15:28:47 -0700730}
731
Colin Cross1e743852019-10-28 11:37:20 -0700732func (a *AARImport) javaVersion() string {
733 return ""
734}
735
Colin Crossa97c5d32018-03-28 14:58:31 -0700736var _ AndroidLibraryDependency = (*AARImport)(nil)
737
738func (a *AARImport) ExportPackage() android.Path {
739 return a.exportPackage
740}
Colin Crossd8c711f2023-07-14 15:52:41 +0000741
Colin Cross89c31582018-04-30 15:55:11 -0700742func (a *AARImport) ExportedProguardFlagFiles() android.Paths {
743 return android.Paths{a.proguardFlags}
744}
745
Colin Crossd8c711f2023-07-14 15:52:41 +0000746func (a *AARImport) ExportedRRODirs() []rroDir {
747 return nil
Colin Crossc1c37552019-01-31 11:42:41 -0800748}
749
Colin Crossd8c711f2023-07-14 15:52:41 +0000750func (a *AARImport) ExportedStaticPackages() android.Paths {
751 return a.exportedStaticPackages
Colin Cross66f78822018-05-02 12:58:28 -0700752}
753
Colin Crossd8c711f2023-07-14 15:52:41 +0000754func (a *AARImport) ExportedManifests() android.Paths {
755 return android.Paths{a.manifest}
756}
757
758func (a *AARImport) ExportedAssets() android.OptionalPath {
759 return android.OptionalPathForPath(a.assetsPackage)
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800760}
761
Jaewoong Jungc779cd42020-10-06 18:56:10 -0700762// RRO enforcement is not available on aar_import since its RRO dirs are not
763// exported.
764func (a *AARImport) SetRROEnforcedForDependent(enforce bool) {
765}
766
767// RRO enforcement is not available on aar_import since its RRO dirs are not
768// exported.
769func (a *AARImport) IsRROEnforced(ctx android.BaseModuleContext) bool {
770 return false
771}
772
Colin Crossfabb6082018-02-20 17:22:23 -0800773func (a *AARImport) Prebuilt() *android.Prebuilt {
774 return &a.prebuilt
775}
776
777func (a *AARImport) Name() string {
778 return a.prebuilt.Name(a.ModuleBase.Name())
779}
780
Jiyong Park618922e2020-01-08 13:35:43 +0900781func (a *AARImport) JacocoReportClassesFile() android.Path {
782 return nil
783}
784
Colin Crossfabb6082018-02-20 17:22:23 -0800785func (a *AARImport) DepsMutator(ctx android.BottomUpMutatorContext) {
Jeongik Cha816a23a2020-07-08 01:09:23 +0900786 if !ctx.Config().AlwaysUsePrebuiltSdks() {
Jiyong Parkf1691d22021-03-29 20:11:58 +0900787 sdkDep := decodeSdkDep(ctx, android.SdkContext(a))
Colin Crossa97c5d32018-03-28 14:58:31 -0700788 if sdkDep.useModule && sdkDep.frameworkResModule != "" {
Colin Cross42d48b72018-08-29 14:10:52 -0700789 ctx.AddVariationDependencies(nil, frameworkResTag, sdkDep.frameworkResModule)
Colin Crossfabb6082018-02-20 17:22:23 -0800790 }
791 }
Colin Crossa97c5d32018-03-28 14:58:31 -0700792
Colin Cross42d48b72018-08-29 14:10:52 -0700793 ctx.AddVariationDependencies(nil, libTag, a.properties.Libs...)
794 ctx.AddVariationDependencies(nil, staticLibTag, a.properties.Static_libs...)
Colin Crossfabb6082018-02-20 17:22:23 -0800795}
796
Sam Delmerico82602492022-06-10 17:05:42 +0000797type JniPackageInfo struct {
798 // List of zip files containing JNI libraries
799 // Zip files should have directory structure jni/<arch>/*.so
800 JniPackages android.Paths
801}
802
803var JniPackageProvider = blueprint.NewProvider(JniPackageInfo{})
804
805// Unzip an AAR and extract the JNI libs for $archString.
806var extractJNI = pctx.AndroidStaticRule("extractJNI",
807 blueprint.RuleParams{
808 Command: `rm -rf $out $outDir && touch $out && ` +
809 `unzip -qoDD -d $outDir $in "jni/${archString}/*" && ` +
810 `jni_files=$$(find $outDir/jni -type f) && ` +
811 // print error message if there are no JNI libs for this arch
812 `[ -n "$$jni_files" ] || (echo "ERROR: no JNI libs found for arch ${archString}" && exit 1) && ` +
813 `${config.SoongZipCmd} -o $out -P 'lib/${archString}' ` +
814 `-C $outDir/jni/${archString} $$(echo $$jni_files | xargs -n1 printf " -f %s")`,
815 CommandDeps: []string{"${config.SoongZipCmd}"},
816 },
817 "outDir", "archString")
818
Colin Crossfabb6082018-02-20 17:22:23 -0800819// 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 -0700820// 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 -0800821var unzipAAR = pctx.AndroidStaticRule("unzipAAR",
822 blueprint.RuleParams{
Dan Willemsen304cfec2019-05-28 14:49:06 -0700823 Command: `rm -rf $outDir && mkdir -p $outDir && ` +
Colin Cross205e9112020-08-06 13:20:17 -0700824 `unzip -qoDD -d $outDir $in && rm -rf $outDir/res && touch $out && ` +
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800825 `${config.Zip2ZipCmd} -i $in -o $assetsPackage 'assets/**/*' && ` +
Colin Cross205e9112020-08-06 13:20:17 -0700826 `${config.MergeZipsCmd} $combinedClassesJar $$(ls $outDir/classes.jar 2> /dev/null) $$(ls $outDir/libs/*.jar 2> /dev/null)`,
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800827 CommandDeps: []string{"${config.MergeZipsCmd}", "${config.Zip2ZipCmd}"},
Colin Crossfabb6082018-02-20 17:22:23 -0800828 },
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800829 "outDir", "combinedClassesJar", "assetsPackage")
Colin Crossfabb6082018-02-20 17:22:23 -0800830
831func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
832 if len(a.properties.Aars) != 1 {
833 ctx.PropertyErrorf("aars", "exactly one aar is required")
834 return
835 }
836
Jiyong Park92315372021-04-02 08:45:46 +0900837 a.sdkVersion = a.SdkVersion(ctx)
838 a.minSdkVersion = a.MinSdkVersion(ctx)
839
Colin Cross56a83212020-09-15 18:30:11 -0700840 a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
841
Nan Zhang4c819fb2018-08-27 18:31:46 -0700842 aarName := ctx.ModuleName() + ".aar"
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000843 a.aarPath = android.PathForModuleSrc(ctx, a.properties.Aars[0])
844
Colin Cross1001a792019-03-21 22:21:39 -0700845 if Bool(a.properties.Jetifier) {
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000846 inputFile := a.aarPath
847 a.aarPath = android.PathForModuleOut(ctx, "jetifier", aarName)
848 TransformJetifier(ctx, a.aarPath.(android.WritablePath), inputFile)
Nan Zhang4c819fb2018-08-27 18:31:46 -0700849 }
Colin Crossfabb6082018-02-20 17:22:23 -0800850
851 extractedAARDir := android.PathForModuleOut(ctx, "aar")
Colin Cross205e9112020-08-06 13:20:17 -0700852 a.classpathFile = extractedAARDir.Join(ctx, "classes-combined.jar")
Colin Crossfabb6082018-02-20 17:22:23 -0800853 a.proguardFlags = extractedAARDir.Join(ctx, "proguard.txt")
Colin Cross10f7c4a2018-05-23 10:59:28 -0700854 a.manifest = extractedAARDir.Join(ctx, "AndroidManifest.xml")
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800855 a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip")
Colin Crossfabb6082018-02-20 17:22:23 -0800856
857 ctx.Build(pctx, android.BuildParams{
858 Rule: unzipAAR,
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000859 Input: a.aarPath,
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800860 Outputs: android.WritablePaths{a.classpathFile, a.proguardFlags, a.manifest, a.assetsPackage},
Colin Crossfabb6082018-02-20 17:22:23 -0800861 Description: "unzip AAR",
862 Args: map[string]string{
Colin Cross205e9112020-08-06 13:20:17 -0700863 "outDir": extractedAARDir.String(),
864 "combinedClassesJar": a.classpathFile.String(),
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800865 "assetsPackage": a.assetsPackage.String(),
Colin Crossfabb6082018-02-20 17:22:23 -0800866 },
867 })
868
Colin Crossa0ba2f52019-06-22 12:59:27 -0700869 // Always set --pseudo-localize, it will be stripped out later for release
870 // builds that don't want it.
871 compileFlags := []string{"--pseudo-localize"}
Colin Crossfabb6082018-02-20 17:22:23 -0800872 compiledResDir := android.PathForModuleOut(ctx, "flat-res")
Colin Crossfabb6082018-02-20 17:22:23 -0800873 flata := compiledResDir.Join(ctx, "gen_res.flata")
Saeid Farivar Asanjanf0436962020-10-05 19:09:09 +0000874 aapt2CompileZip(ctx, flata, a.aarPath, "res", compileFlags)
Colin Crossfabb6082018-02-20 17:22:23 -0800875
876 a.exportPackage = android.PathForModuleOut(ctx, "package-res.apk")
Jiyong Parkb7c639e2019-08-19 14:56:02 +0900877 // the subdir "android" is required to be filtered by package names
878 srcJar := android.PathForModuleGen(ctx, "android", "R.srcjar")
Colin Crossfabb6082018-02-20 17:22:23 -0800879 proguardOptionsFile := android.PathForModuleGen(ctx, "proguard.options")
Colin Crossa97c5d32018-03-28 14:58:31 -0700880 rTxt := android.PathForModuleOut(ctx, "R.txt")
Colin Cross66f78822018-05-02 12:58:28 -0700881 a.extraAaptPackagesFile = android.PathForModuleOut(ctx, "extra_packages")
Colin Crossfabb6082018-02-20 17:22:23 -0800882
883 var linkDeps android.Paths
884
885 linkFlags := []string{
886 "--static-lib",
887 "--no-static-lib-packages",
888 "--auto-add-overlay",
889 }
890
Colin Cross10f7c4a2018-05-23 10:59:28 -0700891 linkFlags = append(linkFlags, "--manifest "+a.manifest.String())
892 linkDeps = append(linkDeps, a.manifest)
Colin Crossfabb6082018-02-20 17:22:23 -0800893
Colin Crossd8c711f2023-07-14 15:52:41 +0000894 transitiveStaticLibs, staticLibManifests, staticRRODirs, transitiveAssets, libDeps, libFlags :=
Jiyong Parkf1691d22021-03-29 20:11:58 +0900895 aaptLibs(ctx, android.SdkContext(a), nil)
Colin Cross31656952018-05-24 16:11:20 -0700896
Colin Crossd8c711f2023-07-14 15:52:41 +0000897 _ = staticLibManifests
898 _ = staticRRODirs
Colin Crossfabb6082018-02-20 17:22:23 -0800899
Colin Crossd8c711f2023-07-14 15:52:41 +0000900 linkDeps = append(linkDeps, libDeps...)
Colin Crossa97c5d32018-03-28 14:58:31 -0700901 linkFlags = append(linkFlags, libFlags...)
Colin Crossfabb6082018-02-20 17:22:23 -0800902
Colin Cross66f78822018-05-02 12:58:28 -0700903 overlayRes := append(android.Paths{flata}, transitiveStaticLibs...)
Colin Crossfabb6082018-02-20 17:22:23 -0800904
Colin Cross66f78822018-05-02 12:58:28 -0700905 aapt2Link(ctx, a.exportPackage, srcJar, proguardOptionsFile, rTxt, a.extraAaptPackagesFile,
Jaewoong Jung6431ca72020-01-15 14:15:10 -0800906 linkFlags, linkDeps, nil, overlayRes, transitiveAssets, nil)
Colin Crossfabb6082018-02-20 17:22:23 -0800907
Colin Crossd8c711f2023-07-14 15:52:41 +0000908 // Merge this import's assets with its dependencies' assets (if there are any).
909 if len(transitiveAssets) > 0 {
910 mergedAssets := android.PathForModuleOut(ctx, "merged-assets.zip")
911 inputZips := append(android.Paths{a.assetsPackage}, transitiveAssets...)
912 ctx.Build(pctx, android.BuildParams{
913 Rule: mergeAssetsRule,
914 Inputs: inputZips,
915 Output: mergedAssets,
916 Description: "merge assets from dependencies and self",
917 })
918 a.assetsPackage = mergedAssets
919 }
Michael Rosenfeld5ad15572021-12-03 13:25:10 -0800920
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500921 a.collectTransitiveHeaderJars(ctx)
Colin Crossdcf71b22021-02-01 13:59:03 -0800922 ctx.SetProvider(JavaInfoProvider, JavaInfo{
923 HeaderJars: android.PathsIfNonNil(a.classpathFile),
Sam Delmerico9f9c0a22022-11-29 11:19:37 -0500924 TransitiveLibsHeaderJars: a.transitiveLibsHeaderJars,
925 TransitiveStaticLibsHeaderJars: a.transitiveStaticLibsHeaderJars,
Colin Crossdcf71b22021-02-01 13:59:03 -0800926 ImplementationAndResourcesJars: android.PathsIfNonNil(a.classpathFile),
927 ImplementationJars: android.PathsIfNonNil(a.classpathFile),
928 })
Sam Delmerico82602492022-06-10 17:05:42 +0000929
930 if proptools.Bool(a.properties.Extract_jni) {
931 for _, t := range ctx.MultiTargets() {
932 arch := t.Arch.Abi[0]
933 path := android.PathForModuleOut(ctx, arch+"_jni.zip")
934 a.jniPackages = append(a.jniPackages, path)
935
936 outDir := android.PathForModuleOut(ctx, "aarForJni")
937 aarPath := android.PathForModuleSrc(ctx, a.properties.Aars[0])
938 ctx.Build(pctx, android.BuildParams{
939 Rule: extractJNI,
940 Input: aarPath,
941 Outputs: android.WritablePaths{path},
942 Description: "extract JNI from AAR",
943 Args: map[string]string{
944 "outDir": outDir.String(),
945 "archString": arch,
946 },
947 })
948 }
949
950 ctx.SetProvider(JniPackageProvider, JniPackageInfo{
951 JniPackages: a.jniPackages,
952 })
953 }
Colin Crossdcf71b22021-02-01 13:59:03 -0800954}
Colin Crossfabb6082018-02-20 17:22:23 -0800955
956func (a *AARImport) HeaderJars() android.Paths {
957 return android.Paths{a.classpathFile}
958}
959
Colin Cross331a1212018-08-15 20:40:52 -0700960func (a *AARImport) ImplementationAndResourcesJars() android.Paths {
961 return android.Paths{a.classpathFile}
962}
963
Ulyana Trafimovich5539e7b2020-06-04 14:08:17 +0000964func (a *AARImport) DexJarBuildPath() android.Path {
Colin Crossf24a22a2019-01-31 14:12:44 -0800965 return nil
966}
967
Ulya Trafimovich9f3052c2020-06-09 14:31:19 +0100968func (a *AARImport) DexJarInstallPath() android.Path {
969 return nil
970}
971
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +0100972func (a *AARImport) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap {
Jiyong Park1be96912018-05-28 18:02:19 +0900973 return nil
974}
975
Jiyong Park45bf82e2020-12-15 22:29:02 +0900976var _ android.ApexModule = (*AARImport)(nil)
977
978// Implements android.ApexModule
Jooyung Hanacc7bbe2020-05-20 09:06:00 +0900979func (a *AARImport) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
980 return a.depIsInSameApex(ctx, dep)
981}
982
Jiyong Park45bf82e2020-12-15 22:29:02 +0900983// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -0700984func (g *AARImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
985 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +0900986 return nil
987}
988
Sam Delmericoaf8bb702022-07-25 15:39:32 -0400989var _ android.PrebuiltInterface = (*AARImport)(nil)
Colin Crossfabb6082018-02-20 17:22:23 -0800990
Colin Cross1b16b0e2019-02-12 14:41:32 -0800991// android_library_import imports an `.aar` file into the build graph as if it was built with android_library.
992//
993// This module is not suitable for installing on a device, but can be used as a `static_libs` dependency of
994// an android_app module.
Colin Crossfabb6082018-02-20 17:22:23 -0800995func AARImportFactory() android.Module {
996 module := &AARImport{}
997
998 module.AddProperties(&module.properties)
999
1000 android.InitPrebuiltModule(module, &module.properties.Aars)
Jooyung Hanacc7bbe2020-05-20 09:06:00 +09001001 android.InitApexModule(module)
Sam Delmerico82602492022-06-10 17:05:42 +00001002 InitJavaModuleMultiTargets(module, android.DeviceSupported)
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001003 android.InitBazelModule(module)
Colin Crossfabb6082018-02-20 17:22:23 -08001004 return module
1005}
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001006
1007type bazelAapt struct {
1008 Manifest bazel.Label
1009 Resource_files bazel.LabelListAttribute
1010}
1011
1012type bazelAndroidLibrary struct {
1013 *javaLibraryAttributes
1014 *bazelAapt
1015}
1016
1017type bazelAndroidLibraryImport struct {
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001018 Aar bazel.Label
1019 Deps bazel.LabelListAttribute
1020 Exports bazel.LabelListAttribute
1021 Sdk_version bazel.StringAttribute
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001022}
1023
1024func (a *aapt) convertAaptAttrsWithBp2Build(ctx android.TopDownMutatorContext) *bazelAapt {
1025 manifest := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")
1026
1027 resourceFiles := bazel.LabelList{
1028 Includes: []bazel.Label{},
1029 }
1030 for _, dir := range android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res") {
1031 files := android.RootToModuleRelativePaths(ctx, androidResourceGlob(ctx, dir))
1032 resourceFiles.Includes = append(resourceFiles.Includes, files...)
1033 }
1034 return &bazelAapt{
1035 android.BazelLabelForModuleSrcSingle(ctx, manifest),
1036 bazel.MakeLabelListAttribute(resourceFiles),
1037 }
1038}
1039
1040func (a *AARImport) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
1041 aars := android.BazelLabelForModuleSrcExcludes(ctx, a.properties.Aars, []string{})
1042 exportableStaticLibs := []string{}
1043 // TODO(b/240716882): investigate and handle static_libs deps that are not imports. They are not supported for export by Bazel.
1044 for _, depName := range a.properties.Static_libs {
1045 if dep, ok := ctx.ModuleFromName(depName); ok {
1046 switch dep.(type) {
1047 case *AARImport, *Import:
1048 exportableStaticLibs = append(exportableStaticLibs, depName)
1049 }
1050 }
1051 }
1052 name := android.RemoveOptionalPrebuiltPrefix(a.Name())
1053 deps := android.BazelLabelForModuleDeps(ctx, android.LastUniqueStrings(android.CopyOf(append(a.properties.Static_libs, a.properties.Libs...))))
1054 exports := android.BazelLabelForModuleDeps(ctx, android.LastUniqueStrings(exportableStaticLibs))
1055
1056 ctx.CreateBazelTargetModule(
1057 bazel.BazelTargetModuleProperties{
1058 Rule_class: "aar_import",
Alixa381cd12023-05-10 14:49:38 +00001059 Bzl_load_location: "//build/bazel/rules/android:aar_import.bzl",
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001060 },
1061 android.CommonAttributes{Name: name},
1062 &bazelAndroidLibraryImport{
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001063 Aar: aars.Includes[0],
1064 Deps: bazel.MakeLabelListAttribute(deps),
1065 Exports: bazel.MakeLabelListAttribute(exports),
1066 Sdk_version: bazel.StringAttribute{Value: a.properties.Sdk_version},
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001067 },
1068 )
1069
Alix14101de2023-01-06 03:42:07 +00001070 neverlink := true
1071 ctx.CreateBazelTargetModule(
Alix32540022023-03-16 21:06:13 +00001072 AndroidLibraryBazelTargetModuleProperties(),
Alix14101de2023-01-06 03:42:07 +00001073 android.CommonAttributes{Name: name + "-neverlink"},
1074 &bazelAndroidLibrary{
1075 javaLibraryAttributes: &javaLibraryAttributes{
1076 Neverlink: bazel.BoolAttribute{Value: &neverlink},
1077 Exports: bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + name}),
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001078 javaCommonAttributes: &javaCommonAttributes{
1079 Sdk_version: bazel.StringAttribute{Value: a.properties.Sdk_version},
1080 },
Alix14101de2023-01-06 03:42:07 +00001081 },
1082 },
1083 )
1084
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001085}
Alix32540022023-03-16 21:06:13 +00001086func AndroidLibraryBazelTargetModuleProperties() bazel.BazelTargetModuleProperties {
1087 return bazel.BazelTargetModuleProperties{
1088 Rule_class: "android_library",
Alixa381cd12023-05-10 14:49:38 +00001089 Bzl_load_location: "//build/bazel/rules/android:android_library.bzl",
Alix32540022023-03-16 21:06:13 +00001090 }
1091}
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001092
1093func (a *AndroidLibrary) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
Alix8062f4d2022-11-14 21:38:07 +00001094 commonAttrs, bp2buildInfo := a.convertLibraryAttrsBp2Build(ctx)
1095 depLabels := bp2buildInfo.DepLabels
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001096
1097 deps := depLabels.Deps
1098 if !commonAttrs.Srcs.IsEmpty() {
1099 deps.Append(depLabels.StaticDeps) // we should only append these if there are sources to use them
1100 } else if !depLabels.Deps.IsEmpty() {
1101 ctx.ModuleErrorf("Module has direct dependencies but no sources. Bazel will not allow this.")
1102 }
Alix82fb94e2022-10-26 20:40:18 +00001103 name := a.Name()
Alix32540022023-03-16 21:06:13 +00001104 props := AndroidLibraryBazelTargetModuleProperties()
Alix82fb94e2022-10-26 20:40:18 +00001105
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001106 ctx.CreateBazelTargetModule(
Alix82fb94e2022-10-26 20:40:18 +00001107 props,
1108 android.CommonAttributes{Name: name},
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001109 &bazelAndroidLibrary{
1110 &javaLibraryAttributes{
1111 javaCommonAttributes: commonAttrs,
1112 Deps: deps,
1113 Exports: depLabels.StaticDeps,
1114 },
1115 a.convertAaptAttrsWithBp2Build(ctx),
1116 },
1117 )
Alix82fb94e2022-10-26 20:40:18 +00001118
1119 neverlink := true
1120 ctx.CreateBazelTargetModule(
1121 props,
1122 android.CommonAttributes{Name: name + "-neverlink"},
1123 &bazelAndroidLibrary{
1124 javaLibraryAttributes: &javaLibraryAttributes{
1125 Neverlink: bazel.BoolAttribute{Value: &neverlink},
1126 Exports: bazel.MakeSingleLabelListAttribute(bazel.Label{Label: ":" + name}),
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -05001127 javaCommonAttributes: &javaCommonAttributes{
1128 Sdk_version: bazel.StringAttribute{Value: a.deviceProperties.Sdk_version},
1129 Java_version: bazel.StringAttribute{Value: a.properties.Java_version},
1130 },
Alix82fb94e2022-10-26 20:40:18 +00001131 },
1132 },
1133 )
Romain Jobredeauxc9b2bba2022-02-15 09:35:07 -05001134}