blob: 83cb171c6e44508dfa37f7b3e3c029dbf5d3fba2 [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 {
Alexei Nicoara69cf0f32022-07-27 14:59:18 +010059 SdkContext android.SdkContext
60 ClassLoaderContexts dexpreopt.ClassLoaderContextMap
61 IsLibrary bool
62 DefaultManifestVersion string
63 UseEmbeddedNativeLibs bool
64 UsesNonSdkApis bool
65 UseEmbeddedDex bool
66 HasNoCode bool
67 TestOnly bool
68 LoggingParent string
Gurpreet Singh75d65f32022-01-24 17:44:05 +000069}
Colin Cross1b6a3cf2018-07-24 14:51:30 -070070
Gurpreet Singh75d65f32022-01-24 17:44:05 +000071// Uses manifest_fixer.py to inject minSdkVersion, etc. into an AndroidManifest.xml
Gurpreet Singh7deabfa2022-02-10 13:28:35 +000072func ManifestFixer(ctx android.ModuleContext, manifest android.Path,
73 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 {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +000079 minSdkVersion, err := params.SdkContext.MinSdkVersion(ctx).EffectiveVersion(ctx)
Colin Crosse4246ab2019-02-05 21:55:21 -080080 if err != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +000081 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 {
Pedro Loureiroea2f5ef2022-04-22 13:53:16 +000086 ctx.ModuleErrorf("module attempted to store uncompressed native libraries, but minSdkVersion=%s doesn't support it",
87 minSdkVersion.String())
Colin Crosse4246ab2019-02-05 21:55:21 -080088 }
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 {
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +0100100 // Libraries propagated via `uses_libs`/`optional_uses_libs` are also added (they may be
101 // propagated from dependencies).
102 requiredUsesLibs, optionalUsesLibs := params.ClassLoaderContexts.UsesLibs()
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000103
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 {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000127 targetSdkVersion := targetSdkVersionForManifestFixer(ctx, params.SdkContext)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000128 args = append(args, "--targetSdkVersion ", targetSdkVersion)
129
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000130 if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" {
131 targetSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
132 deps = append(deps, ApiFingerprintPath(ctx))
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000133 }
134
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000135 minSdkVersion, err := params.SdkContext.MinSdkVersion(ctx).EffectiveVersionString(ctx)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000136 if err != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000137 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000138 }
139
William Loh5a082f92022-05-17 20:21:50 +0000140 replaceMaxSdkVersionPlaceholder, err := params.SdkContext.ReplaceMaxSdkVersionPlaceholder(ctx).EffectiveVersion(ctx)
141 if err != nil {
142 ctx.ModuleErrorf("invalid ReplaceMaxSdkVersionPlaceholder: %s", err)
143 }
144
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000145 if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" {
146 minSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
147 deps = append(deps, ApiFingerprintPath(ctx))
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000148 }
149
150 if err != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000151 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000152 }
153 args = append(args, "--minSdkVersion ", minSdkVersion)
William Loh5a082f92022-05-17 20:21:50 +0000154 args = append(args, "--replaceMaxSdkVersionPlaceholder ", strconv.Itoa(replaceMaxSdkVersionPlaceholder.FinalOrFutureInt()))
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000155 args = append(args, "--raise-min-sdk-version")
Jiyong Park6a927c42020-01-21 02:03:43 +0900156 }
Alexei Nicoara69cf0f32022-07-27 14:59:18 +0100157 if params.DefaultManifestVersion != "" {
158 args = append(args, "--override-placeholder-version", params.DefaultManifestVersion)
159 }
Jiyong Park6a927c42020-01-21 02:03:43 +0900160
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000161 fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml")
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000162 argsMapper["args"] = strings.Join(args, " ")
Colin Cross10932872019-04-18 14:27:12 -0700163
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000164 ctx.Build(pctx, android.BuildParams{
Colin Cross90c25c62019-04-19 16:22:57 -0700165 Rule: manifestFixerRule,
166 Description: "fix manifest",
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000167 Input: manifest,
Colin Cross90c25c62019-04-19 16:22:57 -0700168 Implicits: deps,
169 Output: fixedManifest,
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000170 Args: argsMapper,
Colin Cross31656952018-05-24 16:11:20 -0700171 })
Colin Cross31656952018-05-24 16:11:20 -0700172
Colin Cross8eebb132020-01-29 20:07:03 -0800173 return fixedManifest.WithoutRel()
Colin Cross90c25c62019-04-19 16:22:57 -0700174}
Colin Cross31656952018-05-24 16:11:20 -0700175
Colin Crossaa1c6f12019-04-19 16:25:38 -0700176func manifestMerger(ctx android.ModuleContext, manifest android.Path, staticLibManifests android.Paths,
177 isLibrary bool) android.Path {
178
179 var args string
180 if !isLibrary {
181 // Follow Gradle's behavior, only pass --remove-tools-declarations when merging app manifests.
182 args = "--remove-tools-declarations"
183 }
184
Colin Cross90c25c62019-04-19 16:22:57 -0700185 mergedManifest := android.PathForModuleOut(ctx, "manifest_merger", "AndroidManifest.xml")
186 ctx.Build(pctx, android.BuildParams{
187 Rule: manifestMergerRule,
188 Description: "merge manifest",
189 Input: manifest,
190 Implicits: staticLibManifests,
191 Output: mergedManifest,
192 Args: map[string]string{
193 "libs": android.JoinWithPrefix(staticLibManifests.Strings(), "--libs "),
Colin Crossaa1c6f12019-04-19 16:25:38 -0700194 "args": args,
Colin Cross90c25c62019-04-19 16:22:57 -0700195 },
196 })
197
Colin Cross8eebb132020-01-29 20:07:03 -0800198 return mergedManifest.WithoutRel()
Colin Cross31656952018-05-24 16:11:20 -0700199}