blob: c7853103f6ba3100901aa184f8a31356c4c8c9fc [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
Harshit Mahajan5b8b7302022-06-10 11:24:05 +000046func targetSdkVersionForManifestFixer(ctx android.ModuleContext, params ManifestFixerParams) string {
47 targetSdkVersionSpec := params.SdkContext.TargetSdkVersion(ctx)
48
49 // Check if we want to return 10000
Spandan Das9f7ae7f2022-07-25 00:34:18 +000050 // TODO(b/240294501): Determine the rules for handling test apexes
Harshit Mahajan5b8b7302022-06-10 11:24:05 +000051 if shouldReturnFinalOrFutureInt(ctx, targetSdkVersionSpec, params.EnforceDefaultTargetSdkVersion) {
Spandan Dasc8cb0c32021-12-08 17:00:38 +000052 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
Harshit Mahajan5b8b7302022-06-10 11:24:05 +000061// Return true for modules targeting "current" if either
62// 1. The module is built in unbundled mode (TARGET_BUILD_APPS not empty)
63// 2. The module is run as part of MTS, and should be testable on stable branches
64// Do not return 10000 if we are enforcing default targetSdkVersion and sdk has been finalised
65func shouldReturnFinalOrFutureInt(ctx android.ModuleContext, targetSdkVersionSpec android.SdkSpec, enforceDefaultTargetSdkVersion bool) bool {
66 if enforceDefaultTargetSdkVersion && ctx.Config().PlatformSdkFinal() {
67 return false
68 }
69 return targetSdkVersionSpec.ApiLevel.IsPreview() && (ctx.Config().UnbundledBuildApps() || includedInMts(ctx.Module()))
70}
71
Spandan Das9f7ae7f2022-07-25 00:34:18 +000072// Helper function that casts android.Module to java.androidTestApp
73// If this type conversion is possible, it queries whether the test app is included in an MTS suite
74func includedInMts(module android.Module) bool {
75 if test, ok := module.(androidTestApp); ok {
76 return test.includedInTestSuite("mts")
77 }
78 return false
79}
80
Gurpreet Singh75d65f32022-01-24 17:44:05 +000081type ManifestFixerParams struct {
Harshit Mahajan5b8b7302022-06-10 11:24:05 +000082 SdkContext android.SdkContext
83 ClassLoaderContexts dexpreopt.ClassLoaderContextMap
84 IsLibrary bool
85 DefaultManifestVersion string
86 UseEmbeddedNativeLibs bool
87 UsesNonSdkApis bool
88 UseEmbeddedDex bool
89 HasNoCode bool
90 TestOnly bool
91 LoggingParent string
92 EnforceDefaultTargetSdkVersion bool
Gurpreet Singh75d65f32022-01-24 17:44:05 +000093}
Colin Cross1b6a3cf2018-07-24 14:51:30 -070094
Gurpreet Singh75d65f32022-01-24 17:44:05 +000095// Uses manifest_fixer.py to inject minSdkVersion, etc. into an AndroidManifest.xml
Gurpreet Singh7deabfa2022-02-10 13:28:35 +000096func ManifestFixer(ctx android.ModuleContext, manifest android.Path,
97 params ManifestFixerParams) android.Path {
Colin Cross1b6a3cf2018-07-24 14:51:30 -070098 var args []string
Gurpreet Singh75d65f32022-01-24 17:44:05 +000099
100 if params.IsLibrary {
Colin Cross1b6a3cf2018-07-24 14:51:30 -0700101 args = append(args, "--library")
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000102 } else if params.SdkContext != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000103 minSdkVersion, err := params.SdkContext.MinSdkVersion(ctx).EffectiveVersion(ctx)
Colin Crosse4246ab2019-02-05 21:55:21 -0800104 if err != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000105 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
Colin Crosse4246ab2019-02-05 21:55:21 -0800106 }
Jiyong Park54105c42021-03-31 18:17:53 +0900107 if minSdkVersion.FinalOrFutureInt() >= 23 {
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000108 args = append(args, fmt.Sprintf("--extract-native-libs=%v", !params.UseEmbeddedNativeLibs))
109 } else if params.UseEmbeddedNativeLibs {
Pedro Loureiroea2f5ef2022-04-22 13:53:16 +0000110 ctx.ModuleErrorf("module attempted to store uncompressed native libraries, but minSdkVersion=%s doesn't support it",
111 minSdkVersion.String())
Colin Crosse4246ab2019-02-05 21:55:21 -0800112 }
Colin Cross1b6a3cf2018-07-24 14:51:30 -0700113 }
Colin Cross31656952018-05-24 16:11:20 -0700114
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000115 if params.UsesNonSdkApis {
David Brazdild25060a2019-02-18 18:24:16 +0000116 args = append(args, "--uses-non-sdk-api")
117 }
118
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000119 if params.UseEmbeddedDex {
Sasha Smundakd2e53612019-05-14 17:03:24 -0700120 args = append(args, "--use-embedded-dex")
Colin Cross46abdad2019-02-07 13:07:08 -0800121 }
122
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000123 if params.ClassLoaderContexts != nil {
Ulya Trafimovichf5d91bb2022-05-04 12:00:02 +0100124 // Libraries propagated via `uses_libs`/`optional_uses_libs` are also added (they may be
125 // propagated from dependencies).
126 requiredUsesLibs, optionalUsesLibs := params.ClassLoaderContexts.UsesLibs()
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000127
128 for _, usesLib := range requiredUsesLibs {
129 args = append(args, "--uses-library", usesLib)
130 }
131 for _, usesLib := range optionalUsesLibs {
132 args = append(args, "--optional-uses-library", usesLib)
133 }
Colin Cross5446e882019-05-22 10:46:27 -0700134 }
135
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000136 if params.HasNoCode {
Jaewoong Jungc27ab662019-05-30 15:51:14 -0700137 args = append(args, "--has-no-code")
138 }
139
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000140 if params.TestOnly {
141 args = append(args, "--test-only")
142 }
143
144 if params.LoggingParent != "" {
145 args = append(args, "--logging-parent", params.LoggingParent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -0800146 }
Colin Cross10932872019-04-18 14:27:12 -0700147 var deps android.Paths
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000148 var argsMapper = make(map[string]string)
Spandan Dasc8cb0c32021-12-08 17:00:38 +0000149
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000150 if params.SdkContext != nil {
Harshit Mahajan5b8b7302022-06-10 11:24:05 +0000151 targetSdkVersion := targetSdkVersionForManifestFixer(ctx, params)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000152 args = append(args, "--targetSdkVersion ", targetSdkVersion)
153
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000154 if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" {
155 targetSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
156 deps = append(deps, ApiFingerprintPath(ctx))
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000157 }
158
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000159 minSdkVersion, err := params.SdkContext.MinSdkVersion(ctx).EffectiveVersionString(ctx)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000160 if err != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000161 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000162 }
163
William Loh5a082f92022-05-17 20:21:50 +0000164 replaceMaxSdkVersionPlaceholder, err := params.SdkContext.ReplaceMaxSdkVersionPlaceholder(ctx).EffectiveVersion(ctx)
165 if err != nil {
166 ctx.ModuleErrorf("invalid ReplaceMaxSdkVersionPlaceholder: %s", err)
167 }
168
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000169 if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" {
170 minSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
171 deps = append(deps, ApiFingerprintPath(ctx))
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000172 }
173
174 if err != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000175 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000176 }
177 args = append(args, "--minSdkVersion ", minSdkVersion)
William Loh5a082f92022-05-17 20:21:50 +0000178 args = append(args, "--replaceMaxSdkVersionPlaceholder ", strconv.Itoa(replaceMaxSdkVersionPlaceholder.FinalOrFutureInt()))
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000179 args = append(args, "--raise-min-sdk-version")
Jiyong Park6a927c42020-01-21 02:03:43 +0900180 }
Alexei Nicoara69cf0f32022-07-27 14:59:18 +0100181 if params.DefaultManifestVersion != "" {
182 args = append(args, "--override-placeholder-version", params.DefaultManifestVersion)
183 }
Jiyong Park6a927c42020-01-21 02:03:43 +0900184
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000185 fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml")
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000186 argsMapper["args"] = strings.Join(args, " ")
Colin Cross10932872019-04-18 14:27:12 -0700187
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000188 ctx.Build(pctx, android.BuildParams{
Colin Cross90c25c62019-04-19 16:22:57 -0700189 Rule: manifestFixerRule,
190 Description: "fix manifest",
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000191 Input: manifest,
Colin Cross90c25c62019-04-19 16:22:57 -0700192 Implicits: deps,
193 Output: fixedManifest,
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000194 Args: argsMapper,
Colin Cross31656952018-05-24 16:11:20 -0700195 })
Colin Cross31656952018-05-24 16:11:20 -0700196
Colin Cross8eebb132020-01-29 20:07:03 -0800197 return fixedManifest.WithoutRel()
Colin Cross90c25c62019-04-19 16:22:57 -0700198}
Colin Cross31656952018-05-24 16:11:20 -0700199
Colin Crossaa1c6f12019-04-19 16:25:38 -0700200func manifestMerger(ctx android.ModuleContext, manifest android.Path, staticLibManifests android.Paths,
201 isLibrary bool) android.Path {
202
203 var args string
204 if !isLibrary {
205 // Follow Gradle's behavior, only pass --remove-tools-declarations when merging app manifests.
206 args = "--remove-tools-declarations"
207 }
208
Colin Cross90c25c62019-04-19 16:22:57 -0700209 mergedManifest := android.PathForModuleOut(ctx, "manifest_merger", "AndroidManifest.xml")
210 ctx.Build(pctx, android.BuildParams{
211 Rule: manifestMergerRule,
212 Description: "merge manifest",
213 Input: manifest,
214 Implicits: staticLibManifests,
215 Output: mergedManifest,
216 Args: map[string]string{
217 "libs": android.JoinWithPrefix(staticLibManifests.Strings(), "--libs "),
Colin Crossaa1c6f12019-04-19 16:25:38 -0700218 "args": args,
Colin Cross90c25c62019-04-19 16:22:57 -0700219 },
220 })
221
Colin Cross8eebb132020-01-29 20:07:03 -0800222 return mergedManifest.WithoutRel()
Colin Cross31656952018-05-24 16:11:20 -0700223}