blob: dbcf09830b135a42de7f97abb7b124060f9c3b2a [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 {
Spandan Dasca70fc42023-03-01 23:38:49 +000047 targetSdkVersionLevel := params.SdkContext.TargetSdkVersion(ctx)
Harshit Mahajan5b8b7302022-06-10 11:24:05 +000048
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
Spandan Dasca70fc42023-03-01 23:38:49 +000051 if shouldReturnFinalOrFutureInt(ctx, targetSdkVersionLevel, params.EnforceDefaultTargetSdkVersion) {
Spandan Dasc8cb0c32021-12-08 17:00:38 +000052 return strconv.Itoa(android.FutureApiLevel.FinalOrFutureInt())
53 }
Spandan Dasca70fc42023-03-01 23:38:49 +000054 targetSdkVersion, err := targetSdkVersionLevel.EffectiveVersionString(ctx)
Spandan Dasc8cb0c32021-12-08 17:00:38 +000055 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
Spandan Dasca70fc42023-03-01 23:38:49 +000065func shouldReturnFinalOrFutureInt(ctx android.ModuleContext, targetSdkVersionLevel android.ApiLevel, enforceDefaultTargetSdkVersion bool) bool {
Harshit Mahajan5b8b7302022-06-10 11:24:05 +000066 if enforceDefaultTargetSdkVersion && ctx.Config().PlatformSdkFinal() {
67 return false
68 }
Spandan Dasca70fc42023-03-01 23:38:49 +000069 return targetSdkVersionLevel.IsPreview() && (ctx.Config().UnbundledBuildApps() || includedInMts(ctx.Module()))
Harshit Mahajan5b8b7302022-06-10 11:24:05 +000070}
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
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000153 if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" {
154 targetSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
155 deps = append(deps, ApiFingerprintPath(ctx))
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000156 }
157
Paul Duffinaa2aad62023-01-31 23:13:45 +0000158 args = append(args, "--targetSdkVersion ", targetSdkVersion)
159
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000160 minSdkVersion, err := params.SdkContext.MinSdkVersion(ctx).EffectiveVersionString(ctx)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000161 if err != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000162 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000163 }
164
William Loh5a082f92022-05-17 20:21:50 +0000165 replaceMaxSdkVersionPlaceholder, err := params.SdkContext.ReplaceMaxSdkVersionPlaceholder(ctx).EffectiveVersion(ctx)
166 if err != nil {
167 ctx.ModuleErrorf("invalid ReplaceMaxSdkVersionPlaceholder: %s", err)
168 }
169
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000170 if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" {
171 minSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
172 deps = append(deps, ApiFingerprintPath(ctx))
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000173 }
174
175 if err != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000176 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000177 }
178 args = append(args, "--minSdkVersion ", minSdkVersion)
William Loh5a082f92022-05-17 20:21:50 +0000179 args = append(args, "--replaceMaxSdkVersionPlaceholder ", strconv.Itoa(replaceMaxSdkVersionPlaceholder.FinalOrFutureInt()))
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000180 args = append(args, "--raise-min-sdk-version")
Jiyong Park6a927c42020-01-21 02:03:43 +0900181 }
Alexei Nicoara69cf0f32022-07-27 14:59:18 +0100182 if params.DefaultManifestVersion != "" {
183 args = append(args, "--override-placeholder-version", params.DefaultManifestVersion)
184 }
Jiyong Park6a927c42020-01-21 02:03:43 +0900185
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000186 fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml")
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000187 argsMapper["args"] = strings.Join(args, " ")
Colin Cross10932872019-04-18 14:27:12 -0700188
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000189 ctx.Build(pctx, android.BuildParams{
Colin Cross90c25c62019-04-19 16:22:57 -0700190 Rule: manifestFixerRule,
191 Description: "fix manifest",
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000192 Input: manifest,
Colin Cross90c25c62019-04-19 16:22:57 -0700193 Implicits: deps,
194 Output: fixedManifest,
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000195 Args: argsMapper,
Colin Cross31656952018-05-24 16:11:20 -0700196 })
Colin Cross31656952018-05-24 16:11:20 -0700197
Colin Cross8eebb132020-01-29 20:07:03 -0800198 return fixedManifest.WithoutRel()
Colin Cross90c25c62019-04-19 16:22:57 -0700199}
Colin Cross31656952018-05-24 16:11:20 -0700200
Colin Crossaa1c6f12019-04-19 16:25:38 -0700201func manifestMerger(ctx android.ModuleContext, manifest android.Path, staticLibManifests android.Paths,
202 isLibrary bool) android.Path {
203
204 var args string
205 if !isLibrary {
206 // Follow Gradle's behavior, only pass --remove-tools-declarations when merging app manifests.
207 args = "--remove-tools-declarations"
208 }
209
Colin Cross90c25c62019-04-19 16:22:57 -0700210 mergedManifest := android.PathForModuleOut(ctx, "manifest_merger", "AndroidManifest.xml")
211 ctx.Build(pctx, android.BuildParams{
212 Rule: manifestMergerRule,
213 Description: "merge manifest",
214 Input: manifest,
215 Implicits: staticLibManifests,
216 Output: mergedManifest,
217 Args: map[string]string{
218 "libs": android.JoinWithPrefix(staticLibManifests.Strings(), "--libs "),
Colin Crossaa1c6f12019-04-19 16:25:38 -0700219 "args": args,
Colin Cross90c25c62019-04-19 16:22:57 -0700220 },
221 })
222
Colin Cross8eebb132020-01-29 20:07:03 -0800223 return mergedManifest.WithoutRel()
Colin Cross31656952018-05-24 16:11:20 -0700224}