blob: a5d5b97a0e6a82d7a397235ac9eff2764c5a0c54 [file] [log] [blame]
Colin Cross31656952018-05-24 16:11:20 -07001// 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 Crosse4246ab2019-02-05 21:55:21 -080018 "fmt"
Spandan Dasc8cb0c32021-12-08 17:00:38 +000019 "strconv"
Colin Cross1b6a3cf2018-07-24 14:51:30 -070020 "strings"
Colin Cross31656952018-05-24 16:11:20 -070021
22 "github.com/google/blueprint"
23
24 "android/soong/android"
Ulya Trafimovich31e444e2020-08-14 17:32:16 +010025 "android/soong/dexpreopt"
Colin Cross31656952018-05-24 16:11:20 -070026)
27
28var manifestFixerRule = pctx.AndroidStaticRule("manifestFixer",
29 blueprint.RuleParams{
Colin Cross7b59e7b2018-09-10 13:35:13 -070030 Command: `${config.ManifestFixerCmd} ` +
Colin Cross7b59e7b2018-09-10 13:35:13 -070031 `$args $in $out`,
Colin Cross31656952018-05-24 16:11:20 -070032 CommandDeps: []string{"${config.ManifestFixerCmd}"},
33 },
Gurpreet Singh75d65f32022-01-24 17:44:05 +000034 "args")
Colin Cross31656952018-05-24 16:11:20 -070035
36var manifestMergerRule = pctx.AndroidStaticRule("manifestMerger",
37 blueprint.RuleParams{
Colin Crossaa1c6f12019-04-19 16:25:38 -070038 Command: `${config.ManifestMergerCmd} $args --main $in $libs --out $out`,
Colin Cross87ecbfe2019-02-26 22:14:04 -080039 CommandDeps: []string{"${config.ManifestMergerCmd}"},
Colin Cross31656952018-05-24 16:11:20 -070040 },
Colin Crossaa1c6f12019-04-19 16:25:38 -070041 "args", "libs")
Colin Cross31656952018-05-24 16:11:20 -070042
Spandan Dasc8cb0c32021-12-08 17:00:38 +000043// targetSdkVersion for manifest_fixer
44// When TARGET_BUILD_APPS is not empty, this method returns 10000 for modules targeting an unreleased SDK
45// This enables release builds (that run with TARGET_BUILD_APPS=[val...]) to target APIs that have not yet been finalized as part of an SDK
46func targetSdkVersionForManifestFixer(ctx android.ModuleContext, sdkContext android.SdkContext) string {
47 targetSdkVersionSpec := sdkContext.TargetSdkVersion(ctx)
48 if ctx.Config().UnbundledBuildApps() && targetSdkVersionSpec.ApiLevel.IsPreview() {
49 return strconv.Itoa(android.FutureApiLevel.FinalOrFutureInt())
50 }
51 targetSdkVersion, err := targetSdkVersionSpec.EffectiveVersionString(ctx)
52 if err != nil {
53 ctx.ModuleErrorf("invalid targetSdkVersion: %s", err)
54 }
55 return targetSdkVersion
56}
57
Gurpreet Singh75d65f32022-01-24 17:44:05 +000058type ManifestFixerParams struct {
59 Ctx android.ModuleContext
60 Manifest android.Path
61 SdkContext android.SdkContext
62 ClassLoaderContexts dexpreopt.ClassLoaderContextMap
63 IsLibrary bool
64 UseEmbeddedNativeLibs bool
65 UsesNonSdkApis bool
66 UseEmbeddedDex bool
67 HasNoCode bool
68 TestOnly bool
69 LoggingParent string
70}
Colin Cross1b6a3cf2018-07-24 14:51:30 -070071
Gurpreet Singh75d65f32022-01-24 17:44:05 +000072// Uses manifest_fixer.py to inject minSdkVersion, etc. into an AndroidManifest.xml
73func ManifestFixer(params ManifestFixerParams) android.Path {
Colin Cross1b6a3cf2018-07-24 14:51:30 -070074 var args []string
Gurpreet Singh75d65f32022-01-24 17:44:05 +000075
76 if params.IsLibrary {
Colin Cross1b6a3cf2018-07-24 14:51:30 -070077 args = append(args, "--library")
Gurpreet Singh75d65f32022-01-24 17:44:05 +000078 } else if params.SdkContext != nil {
79 minSdkVersion, err := params.SdkContext.MinSdkVersion(params.Ctx).EffectiveVersion(params.Ctx)
Colin Crosse4246ab2019-02-05 21:55:21 -080080 if err != nil {
Gurpreet Singh75d65f32022-01-24 17:44:05 +000081 params.Ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
Colin Crosse4246ab2019-02-05 21:55:21 -080082 }
Jiyong Park54105c42021-03-31 18:17:53 +090083 if minSdkVersion.FinalOrFutureInt() >= 23 {
Gurpreet Singh75d65f32022-01-24 17:44:05 +000084 args = append(args, fmt.Sprintf("--extract-native-libs=%v", !params.UseEmbeddedNativeLibs))
85 } else if params.UseEmbeddedNativeLibs {
86 params.Ctx.ModuleErrorf("module attempted to store uncompressed native libraries, but minSdkVersion=%d doesn't support it",
Colin Crosse4246ab2019-02-05 21:55:21 -080087 minSdkVersion)
88 }
Colin Cross1b6a3cf2018-07-24 14:51:30 -070089 }
Colin Cross31656952018-05-24 16:11:20 -070090
Gurpreet Singh75d65f32022-01-24 17:44:05 +000091 if params.UsesNonSdkApis {
David Brazdild25060a2019-02-18 18:24:16 +000092 args = append(args, "--uses-non-sdk-api")
93 }
94
Gurpreet Singh75d65f32022-01-24 17:44:05 +000095 if params.UseEmbeddedDex {
Sasha Smundakd2e53612019-05-14 17:03:24 -070096 args = append(args, "--use-embedded-dex")
Colin Cross46abdad2019-02-07 13:07:08 -080097 }
98
Gurpreet Singh75d65f32022-01-24 17:44:05 +000099 if params.ClassLoaderContexts != nil {
100 // manifest_fixer should add only the implicit SDK libraries inferred by Soong, not those added
101 // explicitly via `uses_libs`/`optional_uses_libs`.
102 requiredUsesLibs, optionalUsesLibs := params.ClassLoaderContexts.ImplicitUsesLibs()
103
104 for _, usesLib := range requiredUsesLibs {
105 args = append(args, "--uses-library", usesLib)
106 }
107 for _, usesLib := range optionalUsesLibs {
108 args = append(args, "--optional-uses-library", usesLib)
109 }
Colin Cross5446e882019-05-22 10:46:27 -0700110 }
111
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000112 if params.HasNoCode {
Jaewoong Jungc27ab662019-05-30 15:51:14 -0700113 args = append(args, "--has-no-code")
114 }
115
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000116 if params.TestOnly {
117 args = append(args, "--test-only")
118 }
119
120 if params.LoggingParent != "" {
121 args = append(args, "--logging-parent", params.LoggingParent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -0800122 }
Colin Cross10932872019-04-18 14:27:12 -0700123 var deps android.Paths
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000124 var argsMapper = make(map[string]string)
Spandan Dasc8cb0c32021-12-08 17:00:38 +0000125
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000126 if params.SdkContext != nil {
127 targetSdkVersion := targetSdkVersionForManifestFixer(params.Ctx, params.SdkContext)
128 args = append(args, "--targetSdkVersion ", targetSdkVersion)
129
130 if UseApiFingerprint(params.Ctx) && params.Ctx.ModuleName() != "framework-res" {
131 targetSdkVersion = params.Ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(params.Ctx).String())
132 deps = append(deps, ApiFingerprintPath(params.Ctx))
133 }
134
135 minSdkVersion, err := params.SdkContext.MinSdkVersion(params.Ctx).EffectiveVersionString(params.Ctx)
136 if err != nil {
137 params.Ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
138 }
139
140 if UseApiFingerprint(params.Ctx) && params.Ctx.ModuleName() != "framework-res" {
141 minSdkVersion = params.Ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(params.Ctx).String())
142 deps = append(deps, ApiFingerprintPath(params.Ctx))
143 }
144
145 if err != nil {
146 params.Ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
147 }
148 args = append(args, "--minSdkVersion ", minSdkVersion)
149 args = append(args, "--raise-min-sdk-version")
Jiyong Park6a927c42020-01-21 02:03:43 +0900150 }
151
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000152 fixedManifest := android.PathForModuleOut(params.Ctx, "manifest_fixer", "AndroidManifest.xml")
153 argsMapper["args"] = strings.Join(args, " ")
Colin Cross10932872019-04-18 14:27:12 -0700154
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000155 params.Ctx.Build(pctx, android.BuildParams{
Colin Cross90c25c62019-04-19 16:22:57 -0700156 Rule: manifestFixerRule,
157 Description: "fix manifest",
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000158 Input: params.Manifest,
Colin Cross90c25c62019-04-19 16:22:57 -0700159 Implicits: deps,
160 Output: fixedManifest,
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000161 Args: argsMapper,
Colin Cross31656952018-05-24 16:11:20 -0700162 })
Colin Cross31656952018-05-24 16:11:20 -0700163
Colin Cross8eebb132020-01-29 20:07:03 -0800164 return fixedManifest.WithoutRel()
Colin Cross90c25c62019-04-19 16:22:57 -0700165}
Colin Cross31656952018-05-24 16:11:20 -0700166
Colin Crossaa1c6f12019-04-19 16:25:38 -0700167func manifestMerger(ctx android.ModuleContext, manifest android.Path, staticLibManifests android.Paths,
168 isLibrary bool) android.Path {
169
170 var args string
171 if !isLibrary {
172 // Follow Gradle's behavior, only pass --remove-tools-declarations when merging app manifests.
173 args = "--remove-tools-declarations"
174 }
175
Colin Cross90c25c62019-04-19 16:22:57 -0700176 mergedManifest := android.PathForModuleOut(ctx, "manifest_merger", "AndroidManifest.xml")
177 ctx.Build(pctx, android.BuildParams{
178 Rule: manifestMergerRule,
179 Description: "merge manifest",
180 Input: manifest,
181 Implicits: staticLibManifests,
182 Output: mergedManifest,
183 Args: map[string]string{
184 "libs": android.JoinWithPrefix(staticLibManifests.Strings(), "--libs "),
Colin Crossaa1c6f12019-04-19 16:25:38 -0700185 "args": args,
Colin Cross90c25c62019-04-19 16:22:57 -0700186 },
187 })
188
Colin Cross8eebb132020-01-29 20:07:03 -0800189 return mergedManifest.WithoutRel()
Colin Cross31656952018-05-24 16:11:20 -0700190}