blob: c76bb2fdadfdef105f2038db8221dbe00bd5b2e7 [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"
Colin Cross1b6a3cf2018-07-24 14:51:30 -070019 "strings"
Colin Cross31656952018-05-24 16:11:20 -070020
21 "github.com/google/blueprint"
22
23 "android/soong/android"
Ulya Trafimovich31e444e2020-08-14 17:32:16 +010024 "android/soong/dexpreopt"
Colin Cross31656952018-05-24 16:11:20 -070025)
26
27var manifestFixerRule = pctx.AndroidStaticRule("manifestFixer",
28 blueprint.RuleParams{
Colin Cross7b59e7b2018-09-10 13:35:13 -070029 Command: `${config.ManifestFixerCmd} ` +
30 `--minSdkVersion ${minSdkVersion} ` +
31 `--targetSdkVersion ${targetSdkVersion} ` +
32 `--raise-min-sdk-version ` +
33 `$args $in $out`,
Colin Cross31656952018-05-24 16:11:20 -070034 CommandDeps: []string{"${config.ManifestFixerCmd}"},
35 },
Colin Cross7b59e7b2018-09-10 13:35:13 -070036 "minSdkVersion", "targetSdkVersion", "args")
Colin Cross31656952018-05-24 16:11:20 -070037
38var manifestMergerRule = pctx.AndroidStaticRule("manifestMerger",
39 blueprint.RuleParams{
Colin Crossaa1c6f12019-04-19 16:25:38 -070040 Command: `${config.ManifestMergerCmd} $args --main $in $libs --out $out`,
Colin Cross87ecbfe2019-02-26 22:14:04 -080041 CommandDeps: []string{"${config.ManifestMergerCmd}"},
Colin Cross31656952018-05-24 16:11:20 -070042 },
Colin Crossaa1c6f12019-04-19 16:25:38 -070043 "args", "libs")
Colin Cross31656952018-05-24 16:11:20 -070044
Colin Cross90c25c62019-04-19 16:22:57 -070045// Uses manifest_fixer.py to inject minSdkVersion, etc. into an AndroidManifest.xml
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +000046func manifestFixer(ctx android.ModuleContext, manifest android.Path, sdkContext sdkContext,
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +010047 classLoaderContexts dexpreopt.ClassLoaderContextMap, isLibrary, useEmbeddedNativeLibs, usesNonSdkApis,
Ulya Trafimovich8cbc5d22020-11-03 15:15:46 +000048 useEmbeddedDex, hasNoCode bool, loggingParent string) android.Path {
Colin Cross1b6a3cf2018-07-24 14:51:30 -070049
50 var args []string
51 if isLibrary {
52 args = append(args, "--library")
Colin Crosse4246ab2019-02-05 21:55:21 -080053 } else {
Jiyong Park6a927c42020-01-21 02:03:43 +090054 minSdkVersion, err := sdkContext.minSdkVersion().effectiveVersion(ctx)
Colin Crosse4246ab2019-02-05 21:55:21 -080055 if err != nil {
56 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
57 }
58 if minSdkVersion >= 23 {
Sasha Smundak6ad77252019-05-01 13:16:22 -070059 args = append(args, fmt.Sprintf("--extract-native-libs=%v", !useEmbeddedNativeLibs))
60 } else if useEmbeddedNativeLibs {
Colin Crosse4246ab2019-02-05 21:55:21 -080061 ctx.ModuleErrorf("module attempted to store uncompressed native libraries, but minSdkVersion=%d doesn't support it",
62 minSdkVersion)
63 }
Colin Cross1b6a3cf2018-07-24 14:51:30 -070064 }
Colin Cross31656952018-05-24 16:11:20 -070065
David Brazdild25060a2019-02-18 18:24:16 +000066 if usesNonSdkApis {
67 args = append(args, "--uses-non-sdk-api")
68 }
69
Colin Cross46abdad2019-02-07 13:07:08 -080070 if useEmbeddedDex {
Sasha Smundakd2e53612019-05-14 17:03:24 -070071 args = append(args, "--use-embedded-dex")
Colin Cross46abdad2019-02-07 13:07:08 -080072 }
73
Ulya Trafimovichb23d28c2020-10-08 12:53:58 +010074 for _, usesLib := range classLoaderContexts.UsesLibs() {
Ulya Trafimovich663dc532020-09-10 12:48:53 +010075 if inList(usesLib, dexpreopt.OptionalCompatUsesLibs) {
Colin Cross5446e882019-05-22 10:46:27 -070076 args = append(args, "--optional-uses-library", usesLib)
77 } else {
78 args = append(args, "--uses-library", usesLib)
79 }
80 }
81
Jaewoong Jungc27ab662019-05-30 15:51:14 -070082 if hasNoCode {
83 args = append(args, "--has-no-code")
84 }
85
Baligh Uddin5b16dfb2020-02-11 17:27:19 -080086 if loggingParent != "" {
87 args = append(args, "--logging-parent", loggingParent)
88 }
Colin Cross10932872019-04-18 14:27:12 -070089 var deps android.Paths
Jiyong Park6a927c42020-01-21 02:03:43 +090090 targetSdkVersion, err := sdkContext.targetSdkVersion().effectiveVersionString(ctx)
91 if err != nil {
92 ctx.ModuleErrorf("invalid targetSdkVersion: %s", err)
93 }
Nikita Ioffe1f4f3452020-03-02 16:58:11 +000094 if UseApiFingerprint(ctx) {
95 targetSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
Jiyong Park6a927c42020-01-21 02:03:43 +090096 deps = append(deps, ApiFingerprintPath(ctx))
97 }
98
99 minSdkVersion, err := sdkContext.minSdkVersion().effectiveVersionString(ctx)
100 if err != nil {
101 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
102 }
Nikita Ioffe1f4f3452020-03-02 16:58:11 +0000103 if UseApiFingerprint(ctx) {
104 minSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String())
Jiyong Park6a927c42020-01-21 02:03:43 +0900105 deps = append(deps, ApiFingerprintPath(ctx))
Colin Cross10932872019-04-18 14:27:12 -0700106 }
107
Colin Cross31656952018-05-24 16:11:20 -0700108 fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml")
Jiyong Park6a927c42020-01-21 02:03:43 +0900109 if err != nil {
110 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
111 }
Colin Cross31656952018-05-24 16:11:20 -0700112 ctx.Build(pctx, android.BuildParams{
Colin Cross90c25c62019-04-19 16:22:57 -0700113 Rule: manifestFixerRule,
114 Description: "fix manifest",
115 Input: manifest,
116 Implicits: deps,
117 Output: fixedManifest,
Colin Cross31656952018-05-24 16:11:20 -0700118 Args: map[string]string{
Baligh Uddinf6201372020-01-24 23:15:44 +0000119 "minSdkVersion": minSdkVersion,
Colin Cross10932872019-04-18 14:27:12 -0700120 "targetSdkVersion": targetSdkVersion,
Colin Cross7b59e7b2018-09-10 13:35:13 -0700121 "args": strings.Join(args, " "),
Colin Cross31656952018-05-24 16:11:20 -0700122 },
123 })
Colin Cross31656952018-05-24 16:11:20 -0700124
Colin Cross8eebb132020-01-29 20:07:03 -0800125 return fixedManifest.WithoutRel()
Colin Cross90c25c62019-04-19 16:22:57 -0700126}
Colin Cross31656952018-05-24 16:11:20 -0700127
Colin Crossaa1c6f12019-04-19 16:25:38 -0700128func manifestMerger(ctx android.ModuleContext, manifest android.Path, staticLibManifests android.Paths,
129 isLibrary bool) android.Path {
130
131 var args string
132 if !isLibrary {
133 // Follow Gradle's behavior, only pass --remove-tools-declarations when merging app manifests.
134 args = "--remove-tools-declarations"
135 }
136
Colin Cross90c25c62019-04-19 16:22:57 -0700137 mergedManifest := android.PathForModuleOut(ctx, "manifest_merger", "AndroidManifest.xml")
138 ctx.Build(pctx, android.BuildParams{
139 Rule: manifestMergerRule,
140 Description: "merge manifest",
141 Input: manifest,
142 Implicits: staticLibManifests,
143 Output: mergedManifest,
144 Args: map[string]string{
145 "libs": android.JoinWithPrefix(staticLibManifests.Strings(), "--libs "),
Colin Crossaa1c6f12019-04-19 16:25:38 -0700146 "args": args,
Colin Cross90c25c62019-04-19 16:22:57 -0700147 },
148 })
149
Colin Cross8eebb132020-01-29 20:07:03 -0800150 return mergedManifest.WithoutRel()
Colin Cross31656952018-05-24 16:11:20 -0700151}