blob: 3cca4f7186e9688acf8dfa0edf92f4cdbee8cff2 [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"
Colin Crosse4246ab2019-02-05 21:55:21 -080024 "android/soong/java/config"
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{
40 Command: `${config.JavaCmd} -classpath ${config.ManifestMergerClasspath} com.android.manifmerger.Merger ` +
41 `--main $in $libs --out $out`,
42 CommandDeps: config.ManifestMergerClasspath,
43 },
44 "libs")
45
46func manifestMerger(ctx android.ModuleContext, manifest android.Path, sdkContext sdkContext,
David Brazdild25060a2019-02-18 18:24:16 +000047 staticLibManifests android.Paths, isLibrary, uncompressedJNI, useEmbeddedDex, usesNonSdkApis bool) android.Path {
Colin Cross1b6a3cf2018-07-24 14:51:30 -070048
49 var args []string
50 if isLibrary {
51 args = append(args, "--library")
Colin Crosse4246ab2019-02-05 21:55:21 -080052 } else {
53 minSdkVersion, err := sdkVersionToNumber(ctx, sdkContext.minSdkVersion())
54 if err != nil {
55 ctx.ModuleErrorf("invalid minSdkVersion: %s", err)
56 }
57 if minSdkVersion >= 23 {
58 args = append(args, fmt.Sprintf("--extract-native-libs=%v", !uncompressedJNI))
59 } else if uncompressedJNI {
60 ctx.ModuleErrorf("module attempted to store uncompressed native libraries, but minSdkVersion=%d doesn't support it",
61 minSdkVersion)
62 }
Colin Cross1b6a3cf2018-07-24 14:51:30 -070063 }
Colin Cross31656952018-05-24 16:11:20 -070064
David Brazdild25060a2019-02-18 18:24:16 +000065 if usesNonSdkApis {
66 args = append(args, "--uses-non-sdk-api")
67 }
68
Colin Cross46abdad2019-02-07 13:07:08 -080069 if useEmbeddedDex {
70 args = append(args, "--use-embedded-dex=true")
71 }
72
Colin Cross31656952018-05-24 16:11:20 -070073 // Inject minSdkVersion into the manifest
74 fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml")
75 ctx.Build(pctx, android.BuildParams{
76 Rule: manifestFixerRule,
77 Input: manifest,
78 Output: fixedManifest,
79 Args: map[string]string{
Colin Cross7b59e7b2018-09-10 13:35:13 -070080 "minSdkVersion": sdkVersionOrDefault(ctx, sdkContext.minSdkVersion()),
Dan Willemsen419290a2018-10-31 15:28:47 -070081 "targetSdkVersion": sdkVersionOrDefault(ctx, sdkContext.targetSdkVersion()),
Colin Cross7b59e7b2018-09-10 13:35:13 -070082 "args": strings.Join(args, " "),
Colin Cross31656952018-05-24 16:11:20 -070083 },
84 })
85 manifest = fixedManifest
86
87 // Merge static aar dependency manifests if necessary
88 if len(staticLibManifests) > 0 {
89 mergedManifest := android.PathForModuleOut(ctx, "manifest_merger", "AndroidManifest.xml")
90 ctx.Build(pctx, android.BuildParams{
91 Rule: manifestMergerRule,
92 Input: manifest,
93 Implicits: staticLibManifests,
94 Output: mergedManifest,
95 Args: map[string]string{
Jason Monk6f937a92018-08-09 21:47:37 -040096 "libs": android.JoinWithPrefix(staticLibManifests.Strings(), "--libs "),
Colin Cross31656952018-05-24 16:11:20 -070097 },
98 })
99 manifest = mergedManifest
100 }
101
102 return manifest
103}