blob: f29d8ad1a9f57dee06d4d918d7a9901e19339309 [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} ` +
31 `--minSdkVersion ${minSdkVersion} ` +
32 `--targetSdkVersion ${targetSdkVersion} ` +
33 `--raise-min-sdk-version ` +
34 `$args $in $out`,
Colin Cross31656952018-05-24 16:11:20 -070035 CommandDeps: []string{"${config.ManifestFixerCmd}"},
36 },
Colin Cross7b59e7b2018-09-10 13:35:13 -070037 "minSdkVersion", "targetSdkVersion", "args")
Colin Cross31656952018-05-24 16:11:20 -070038
39var manifestMergerRule = pctx.AndroidStaticRule("manifestMerger",
40 blueprint.RuleParams{
Colin Crossaa1c6f12019-04-19 16:25:38 -070041 Command: `${config.ManifestMergerCmd} $args --main $in $libs --out $out`,
Colin Cross87ecbfe2019-02-26 22:14:04 -080042 CommandDeps: []string{"${config.ManifestMergerCmd}"},
Colin Cross31656952018-05-24 16:11:20 -070043 },
Colin Crossaa1c6f12019-04-19 16:25:38 -070044 "args", "libs")
Colin Cross31656952018-05-24 16:11:20 -070045
Spandan Dasc8cb0c32021-12-08 17:00:38 +000046// targetSdkVersion for manifest_fixer
47// When TARGET_BUILD_APPS is not empty, this method returns 10000 for modules targeting an unreleased SDK
48// 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
49func targetSdkVersionForManifestFixer(ctx android.ModuleContext, sdkContext android.SdkContext) string {
50 targetSdkVersionSpec := sdkContext.TargetSdkVersion(ctx)
51 if ctx.Config().UnbundledBuildApps() && targetSdkVersionSpec.ApiLevel.IsPreview() {
52 return strconv.Itoa(android.FutureApiLevel.FinalOrFutureInt())
53 }
54 targetSdkVersion, err := targetSdkVersionSpec.EffectiveVersionString(ctx)
55 if err != nil {
56 ctx.ModuleErrorf("invalid targetSdkVersion: %s", err)
57 }
58 return targetSdkVersion
59}
60
Colin Cross90c25c62019-04-19 16:22:57 -070061// Uses manifest_fixer.py to inject minSdkVersion, etc. into an AndroidManifest.xml
Jiyong Parkf1691d22021-03-29 20:11:58 +090062func manifestFixer(ctx android.ModuleContext, manifest android.Path, sdkContext android.SdkContext,
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +010063 classLoaderContexts dexpreopt.ClassLoaderContextMap, isLibrary, useEmbeddedNativeLibs, usesNonSdkApis,
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +000064 useEmbeddedDex, hasNoCode bool, loggingParent string) android.Path {
Colin Cross1b6a3cf2018-07-24 14:51:30 -070065
66 var args []string
67 if isLibrary {
68 args = append(args, "--library")
Colin Crosse4246ab2019-02-05 21:55:21 -080069 } else {
Jiyong Park92315372021-04-02 08:45:46 +090070 minSdkVersion, err := sdkContext.MinSdkVersion(ctx).EffectiveVersion(ctx)
Colin Crosse4246ab2019-02-05 21:55:21 -080071 if err != nil {
72 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
73 }
Jiyong Park54105c42021-03-31 18:17:53 +090074 if minSdkVersion.FinalOrFutureInt() >= 23 {
Sasha Smundak6ad77252019-05-01 13:16:22 -070075 args = append(args, fmt.Sprintf("--extract-native-libs=%v", !useEmbeddedNativeLibs))
76 } else if useEmbeddedNativeLibs {
Colin Crosse4246ab2019-02-05 21:55:21 -080077 ctx.ModuleErrorf("module attempted to store uncompressed native libraries, but minSdkVersion=%d doesn't support it",
78 minSdkVersion)
79 }
Colin Cross1b6a3cf2018-07-24 14:51:30 -070080 }
Colin Cross31656952018-05-24 16:11:20 -070081
David Brazdild25060a2019-02-18 18:24:16 +000082 if usesNonSdkApis {
83 args = append(args, "--uses-non-sdk-api")
84 }
85
Colin Cross46abdad2019-02-07 13:07:08 -080086 if useEmbeddedDex {
Sasha Smundakd2e53612019-05-14 17:03:24 -070087 args = append(args, "--use-embedded-dex")
Colin Cross46abdad2019-02-07 13:07:08 -080088 }
89
Ulya Trafimovich0b1c70e2021-08-20 15:39:12 +010090 // manifest_fixer should add only the implicit SDK libraries inferred by Soong, not those added
91 // explicitly via `uses_libs`/`optional_uses_libs`.
92 requiredUsesLibs, optionalUsesLibs := classLoaderContexts.ImplicitUsesLibs()
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +010093 for _, usesLib := range requiredUsesLibs {
94 args = append(args, "--uses-library", usesLib)
95 }
96 for _, usesLib := range optionalUsesLibs {
97 args = append(args, "--optional-uses-library", usesLib)
Colin Cross5446e882019-05-22 10:46:27 -070098 }
99
Jaewoong Jungc27ab662019-05-30 15:51:14 -0700100 if hasNoCode {
101 args = append(args, "--has-no-code")
102 }
103
Baligh Uddin5b16dfb2020-02-11 17:27:19 -0800104 if loggingParent != "" {
105 args = append(args, "--logging-parent", loggingParent)
106 }
Colin Cross10932872019-04-18 14:27:12 -0700107 var deps android.Paths
Spandan Dasc8cb0c32021-12-08 17:00:38 +0000108 targetSdkVersion := targetSdkVersionForManifestFixer(ctx, sdkContext)
109
Colin Cross2669e7e2021-03-05 11:51:56 -0800110 if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" {
Nikita Ioffe1f4f3452020-03-02 16:58:11 +0000111 targetSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
Jiyong Park6a927c42020-01-21 02:03:43 +0900112 deps = append(deps, ApiFingerprintPath(ctx))
113 }
114
Jiyong Park92315372021-04-02 08:45:46 +0900115 minSdkVersion, err := sdkContext.MinSdkVersion(ctx).EffectiveVersionString(ctx)
Jiyong Park6a927c42020-01-21 02:03:43 +0900116 if err != nil {
117 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
118 }
Colin Cross2669e7e2021-03-05 11:51:56 -0800119 if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" {
Nikita Ioffe1f4f3452020-03-02 16:58:11 +0000120 minSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
Jiyong Park6a927c42020-01-21 02:03:43 +0900121 deps = append(deps, ApiFingerprintPath(ctx))
Colin Cross10932872019-04-18 14:27:12 -0700122 }
123
Colin Cross31656952018-05-24 16:11:20 -0700124 fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml")
Jiyong Park6a927c42020-01-21 02:03:43 +0900125 if err != nil {
126 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
127 }
Colin Cross31656952018-05-24 16:11:20 -0700128 ctx.Build(pctx, android.BuildParams{
Colin Cross90c25c62019-04-19 16:22:57 -0700129 Rule: manifestFixerRule,
130 Description: "fix manifest",
131 Input: manifest,
132 Implicits: deps,
133 Output: fixedManifest,
Colin Cross31656952018-05-24 16:11:20 -0700134 Args: map[string]string{
Baligh Uddinf6201372020-01-24 23:15:44 +0000135 "minSdkVersion": minSdkVersion,
Colin Cross10932872019-04-18 14:27:12 -0700136 "targetSdkVersion": targetSdkVersion,
Colin Cross7b59e7b2018-09-10 13:35:13 -0700137 "args": strings.Join(args, " "),
Colin Cross31656952018-05-24 16:11:20 -0700138 },
139 })
Colin Cross31656952018-05-24 16:11:20 -0700140
Colin Cross8eebb132020-01-29 20:07:03 -0800141 return fixedManifest.WithoutRel()
Colin Cross90c25c62019-04-19 16:22:57 -0700142}
Colin Cross31656952018-05-24 16:11:20 -0700143
Colin Crossaa1c6f12019-04-19 16:25:38 -0700144func manifestMerger(ctx android.ModuleContext, manifest android.Path, staticLibManifests android.Paths,
145 isLibrary bool) android.Path {
146
147 var args string
148 if !isLibrary {
149 // Follow Gradle's behavior, only pass --remove-tools-declarations when merging app manifests.
150 args = "--remove-tools-declarations"
151 }
152
Colin Cross90c25c62019-04-19 16:22:57 -0700153 mergedManifest := android.PathForModuleOut(ctx, "manifest_merger", "AndroidManifest.xml")
154 ctx.Build(pctx, android.BuildParams{
155 Rule: manifestMergerRule,
156 Description: "merge manifest",
157 Input: manifest,
158 Implicits: staticLibManifests,
159 Output: mergedManifest,
160 Args: map[string]string{
161 "libs": android.JoinWithPrefix(staticLibManifests.Strings(), "--libs "),
Colin Crossaa1c6f12019-04-19 16:25:38 -0700162 "args": args,
Colin Cross90c25c62019-04-19 16:22:57 -0700163 },
164 })
165
Colin Cross8eebb132020-01-29 20:07:03 -0800166 return mergedManifest.WithoutRel()
Colin Cross31656952018-05-24 16:11:20 -0700167}