blob: 1553564c2fb7bf67bc3fde698a73adef88249b9e [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)
Spandan Dascf9b0072022-07-25 00:34:18 +000048 // Return 10000 for modules targeting "current" if either
49 // 1. The module is built in unbundled mode (TARGET_BUILD_APPS not empty)
50 // 2. The module is run as part of MTS, and should be testable on stable branches
51 // TODO(b/240294501): Determine the rules for handling test apexes
52 if targetSdkVersionSpec.ApiLevel.IsPreview() && (ctx.Config().UnbundledBuildApps() || includedInMts(ctx.Module())) {
Spandan Dasc8cb0c32021-12-08 17:00:38 +000053 return strconv.Itoa(android.FutureApiLevel.FinalOrFutureInt())
54 }
55 targetSdkVersion, err := targetSdkVersionSpec.EffectiveVersionString(ctx)
56 if err != nil {
57 ctx.ModuleErrorf("invalid targetSdkVersion: %s", err)
58 }
59 return targetSdkVersion
60}
61
Spandan Dascf9b0072022-07-25 00:34:18 +000062// Helper function that casts android.Module to java.androidTestApp
63// If this type conversion is possible, it queries whether the test app is included in an MTS suite
64func includedInMts(module android.Module) bool {
65 if test, ok := module.(androidTestApp); ok {
66 return test.includedInTestSuite("mts")
67 }
68 return false
69}
70
Gurpreet Singh75d65f32022-01-24 17:44:05 +000071type ManifestFixerParams struct {
Gurpreet Singh75d65f32022-01-24 17:44:05 +000072 SdkContext android.SdkContext
73 ClassLoaderContexts dexpreopt.ClassLoaderContextMap
74 IsLibrary bool
75 UseEmbeddedNativeLibs bool
76 UsesNonSdkApis bool
77 UseEmbeddedDex bool
78 HasNoCode bool
79 TestOnly bool
80 LoggingParent string
81}
Colin Cross1b6a3cf2018-07-24 14:51:30 -070082
Gurpreet Singh75d65f32022-01-24 17:44:05 +000083// Uses manifest_fixer.py to inject minSdkVersion, etc. into an AndroidManifest.xml
Gurpreet Singh7deabfa2022-02-10 13:28:35 +000084func ManifestFixer(ctx android.ModuleContext, manifest android.Path,
85 params ManifestFixerParams) android.Path {
Colin Cross1b6a3cf2018-07-24 14:51:30 -070086 var args []string
Gurpreet Singh75d65f32022-01-24 17:44:05 +000087
88 if params.IsLibrary {
Colin Cross1b6a3cf2018-07-24 14:51:30 -070089 args = append(args, "--library")
Gurpreet Singh75d65f32022-01-24 17:44:05 +000090 } else if params.SdkContext != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +000091 minSdkVersion, err := params.SdkContext.MinSdkVersion(ctx).EffectiveVersion(ctx)
Colin Crosse4246ab2019-02-05 21:55:21 -080092 if err != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +000093 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
Colin Crosse4246ab2019-02-05 21:55:21 -080094 }
Jiyong Park54105c42021-03-31 18:17:53 +090095 if minSdkVersion.FinalOrFutureInt() >= 23 {
Gurpreet Singh75d65f32022-01-24 17:44:05 +000096 args = append(args, fmt.Sprintf("--extract-native-libs=%v", !params.UseEmbeddedNativeLibs))
97 } else if params.UseEmbeddedNativeLibs {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +000098 ctx.ModuleErrorf("module attempted to store uncompressed native libraries, but minSdkVersion=%d doesn't support it",
Colin Crosse4246ab2019-02-05 21:55:21 -080099 minSdkVersion)
100 }
Colin Cross1b6a3cf2018-07-24 14:51:30 -0700101 }
Colin Cross31656952018-05-24 16:11:20 -0700102
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000103 if params.UsesNonSdkApis {
David Brazdild25060a2019-02-18 18:24:16 +0000104 args = append(args, "--uses-non-sdk-api")
105 }
106
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000107 if params.UseEmbeddedDex {
Sasha Smundakd2e53612019-05-14 17:03:24 -0700108 args = append(args, "--use-embedded-dex")
Colin Cross46abdad2019-02-07 13:07:08 -0800109 }
110
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000111 if params.ClassLoaderContexts != nil {
112 // manifest_fixer should add only the implicit SDK libraries inferred by Soong, not those added
113 // explicitly via `uses_libs`/`optional_uses_libs`.
114 requiredUsesLibs, optionalUsesLibs := params.ClassLoaderContexts.ImplicitUsesLibs()
115
116 for _, usesLib := range requiredUsesLibs {
117 args = append(args, "--uses-library", usesLib)
118 }
119 for _, usesLib := range optionalUsesLibs {
120 args = append(args, "--optional-uses-library", usesLib)
121 }
Colin Cross5446e882019-05-22 10:46:27 -0700122 }
123
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000124 if params.HasNoCode {
Jaewoong Jungc27ab662019-05-30 15:51:14 -0700125 args = append(args, "--has-no-code")
126 }
127
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000128 if params.TestOnly {
129 args = append(args, "--test-only")
130 }
131
132 if params.LoggingParent != "" {
133 args = append(args, "--logging-parent", params.LoggingParent)
Baligh Uddin5b16dfb2020-02-11 17:27:19 -0800134 }
Colin Cross10932872019-04-18 14:27:12 -0700135 var deps android.Paths
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000136 var argsMapper = make(map[string]string)
Spandan Dasc8cb0c32021-12-08 17:00:38 +0000137
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000138 if params.SdkContext != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000139 targetSdkVersion := targetSdkVersionForManifestFixer(ctx, params.SdkContext)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000140 args = append(args, "--targetSdkVersion ", targetSdkVersion)
141
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000142 if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" {
143 targetSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
144 deps = append(deps, ApiFingerprintPath(ctx))
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000145 }
146
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000147 minSdkVersion, err := params.SdkContext.MinSdkVersion(ctx).EffectiveVersionString(ctx)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000148 if err != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000149 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000150 }
151
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000152 if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" {
153 minSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
154 deps = append(deps, ApiFingerprintPath(ctx))
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000155 }
156
157 if err != nil {
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000158 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000159 }
160 args = append(args, "--minSdkVersion ", minSdkVersion)
161 args = append(args, "--raise-min-sdk-version")
Jiyong Park6a927c42020-01-21 02:03:43 +0900162 }
163
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000164 fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml")
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000165 argsMapper["args"] = strings.Join(args, " ")
Colin Cross10932872019-04-18 14:27:12 -0700166
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000167 ctx.Build(pctx, android.BuildParams{
Colin Cross90c25c62019-04-19 16:22:57 -0700168 Rule: manifestFixerRule,
169 Description: "fix manifest",
Gurpreet Singh7deabfa2022-02-10 13:28:35 +0000170 Input: manifest,
Colin Cross90c25c62019-04-19 16:22:57 -0700171 Implicits: deps,
172 Output: fixedManifest,
Gurpreet Singh75d65f32022-01-24 17:44:05 +0000173 Args: argsMapper,
Colin Cross31656952018-05-24 16:11:20 -0700174 })
Colin Cross31656952018-05-24 16:11:20 -0700175
Colin Cross8eebb132020-01-29 20:07:03 -0800176 return fixedManifest.WithoutRel()
Colin Cross90c25c62019-04-19 16:22:57 -0700177}
Colin Cross31656952018-05-24 16:11:20 -0700178
Colin Crossaa1c6f12019-04-19 16:25:38 -0700179func manifestMerger(ctx android.ModuleContext, manifest android.Path, staticLibManifests android.Paths,
180 isLibrary bool) android.Path {
181
182 var args string
183 if !isLibrary {
184 // Follow Gradle's behavior, only pass --remove-tools-declarations when merging app manifests.
185 args = "--remove-tools-declarations"
186 }
187
Colin Cross90c25c62019-04-19 16:22:57 -0700188 mergedManifest := android.PathForModuleOut(ctx, "manifest_merger", "AndroidManifest.xml")
189 ctx.Build(pctx, android.BuildParams{
190 Rule: manifestMergerRule,
191 Description: "merge manifest",
192 Input: manifest,
193 Implicits: staticLibManifests,
194 Output: mergedManifest,
195 Args: map[string]string{
196 "libs": android.JoinWithPrefix(staticLibManifests.Strings(), "--libs "),
Colin Crossaa1c6f12019-04-19 16:25:38 -0700197 "args": args,
Colin Cross90c25c62019-04-19 16:22:57 -0700198 },
199 })
200
Colin Cross8eebb132020-01-29 20:07:03 -0800201 return mergedManifest.WithoutRel()
Colin Cross31656952018-05-24 16:11:20 -0700202}