blob: 39cf4712a0e2111fc91d565d404ee9c05a7b3a6b [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"
24)
25
26var manifestFixerRule = pctx.AndroidStaticRule("manifestFixer",
27 blueprint.RuleParams{
Colin Cross7b59e7b2018-09-10 13:35:13 -070028 Command: `${config.ManifestFixerCmd} ` +
29 `--minSdkVersion ${minSdkVersion} ` +
30 `--targetSdkVersion ${targetSdkVersion} ` +
31 `--raise-min-sdk-version ` +
32 `$args $in $out`,
Colin Cross31656952018-05-24 16:11:20 -070033 CommandDeps: []string{"${config.ManifestFixerCmd}"},
34 },
Colin Cross7b59e7b2018-09-10 13:35:13 -070035 "minSdkVersion", "targetSdkVersion", "args")
Colin Cross31656952018-05-24 16:11:20 -070036
37var manifestMergerRule = pctx.AndroidStaticRule("manifestMerger",
38 blueprint.RuleParams{
Colin Cross87ecbfe2019-02-26 22:14:04 -080039 Command: `${config.ManifestMergerCmd} --main $in $libs --out $out`,
40 CommandDeps: []string{"${config.ManifestMergerCmd}"},
Colin Cross31656952018-05-24 16:11:20 -070041 },
42 "libs")
43
44func manifestMerger(ctx android.ModuleContext, manifest android.Path, sdkContext sdkContext,
David Brazdild25060a2019-02-18 18:24:16 +000045 staticLibManifests android.Paths, isLibrary, uncompressedJNI, useEmbeddedDex, usesNonSdkApis bool) android.Path {
Colin Cross1b6a3cf2018-07-24 14:51:30 -070046
47 var args []string
48 if isLibrary {
49 args = append(args, "--library")
Colin Crosse4246ab2019-02-05 21:55:21 -080050 } else {
51 minSdkVersion, err := sdkVersionToNumber(ctx, sdkContext.minSdkVersion())
52 if err != nil {
53 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
54 }
55 if minSdkVersion >= 23 {
56 args = append(args, fmt.Sprintf("--extract-native-libs=%v", !uncompressedJNI))
57 } else if uncompressedJNI {
58 ctx.ModuleErrorf("module attempted to store uncompressed native libraries, but minSdkVersion=%d doesn't support it",
59 minSdkVersion)
60 }
Colin Cross1b6a3cf2018-07-24 14:51:30 -070061 }
Colin Cross31656952018-05-24 16:11:20 -070062
David Brazdild25060a2019-02-18 18:24:16 +000063 if usesNonSdkApis {
64 args = append(args, "--uses-non-sdk-api")
65 }
66
Colin Cross46abdad2019-02-07 13:07:08 -080067 if useEmbeddedDex {
68 args = append(args, "--use-embedded-dex=true")
69 }
70
Colin Cross10932872019-04-18 14:27:12 -070071 var deps android.Paths
72 targetSdkVersion := sdkVersionOrDefault(ctx, sdkContext.targetSdkVersion())
73 if targetSdkVersion == ctx.Config().PlatformSdkCodename() &&
74 ctx.Config().UnbundledBuild() &&
75 !ctx.Config().UnbundledBuildUsePrebuiltSdks() &&
76 ctx.Config().IsEnvTrue("UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT") {
77 apiFingerprint := apiFingerprintPath(ctx)
78 targetSdkVersion += fmt.Sprintf(".$$(cat %s)", apiFingerprint.String())
79 deps = append(deps, apiFingerprint)
80 }
81
Colin Cross31656952018-05-24 16:11:20 -070082 // Inject minSdkVersion into the manifest
83 fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml")
84 ctx.Build(pctx, android.BuildParams{
Colin Cross10932872019-04-18 14:27:12 -070085 Rule: manifestFixerRule,
86 Input: manifest,
87 Implicits: deps,
88 Output: fixedManifest,
Colin Cross31656952018-05-24 16:11:20 -070089 Args: map[string]string{
Colin Cross7b59e7b2018-09-10 13:35:13 -070090 "minSdkVersion": sdkVersionOrDefault(ctx, sdkContext.minSdkVersion()),
Colin Cross10932872019-04-18 14:27:12 -070091 "targetSdkVersion": targetSdkVersion,
Colin Cross7b59e7b2018-09-10 13:35:13 -070092 "args": strings.Join(args, " "),
Colin Cross31656952018-05-24 16:11:20 -070093 },
94 })
95 manifest = fixedManifest
96
97 // Merge static aar dependency manifests if necessary
98 if len(staticLibManifests) > 0 {
99 mergedManifest := android.PathForModuleOut(ctx, "manifest_merger", "AndroidManifest.xml")
100 ctx.Build(pctx, android.BuildParams{
101 Rule: manifestMergerRule,
102 Input: manifest,
103 Implicits: staticLibManifests,
104 Output: mergedManifest,
105 Args: map[string]string{
Jason Monk6f937a92018-08-09 21:47:37 -0400106 "libs": android.JoinWithPrefix(staticLibManifests.Strings(), "--libs "),
Colin Cross31656952018-05-24 16:11:20 -0700107 },
108 })
109 manifest = mergedManifest
110 }
111
112 return manifest
113}