blob: 4b3d3153973cc8a0bc6aa7c01f72d48649b29d9a [file] [log] [blame]
Colin Cross30e076a2015-04-13 13:58:27 -07001// Copyright 2015 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
17// This file generates the final rules for compiling all Java. All properties related to
18// compiling should have been translated into javaBuilderFlags or another argument to the Transform*
19// functions.
20
21import (
22 "path/filepath"
23 "strings"
24
25 "github.com/google/blueprint"
26
27 "android/soong/common"
28)
29
30var (
31 aaptCreateResourceJavaFile = pctx.StaticRule("aaptCreateResourceJavaFile",
32 blueprint.RuleParams{
33 Command: `rm -rf "$javaDir" && mkdir -p "$javaDir" && ` +
34 `$aaptCmd package -m $aaptFlags -P $publicResourcesFile -G $proguardOptionsFile ` +
35 `-J $javaDir || ( rm -rf "$javaDir/*"; exit 41 ) && ` +
36 `find $javaDir -name "*.java" > $javaFileList`,
Dan Willemsenc94a7682015-11-17 15:27:28 -080037 CommandDeps: []string{"$aaptCmd"},
Colin Cross30e076a2015-04-13 13:58:27 -070038 Description: "aapt create R.java $out",
39 },
40 "aaptFlags", "publicResourcesFile", "proguardOptionsFile", "javaDir", "javaFileList")
41
42 aaptCreateAssetsPackage = pctx.StaticRule("aaptCreateAssetsPackage",
43 blueprint.RuleParams{
Colin Cross5adac8a2015-04-28 13:29:20 -070044 Command: `rm -f $out && $aaptCmd package $aaptFlags -F $out`,
Dan Willemsenc94a7682015-11-17 15:27:28 -080045 CommandDeps: []string{"$aaptCmd"},
Colin Cross30e076a2015-04-13 13:58:27 -070046 Description: "aapt export package $out",
47 },
48 "aaptFlags", "publicResourcesFile", "proguardOptionsFile", "javaDir", "javaFileList")
49
50 aaptAddResources = pctx.StaticRule("aaptAddResources",
51 blueprint.RuleParams{
52 // TODO: add-jni-shared-libs-to-package
53 Command: `cp -f $in $out.tmp && $aaptCmd package -u $aaptFlags -F $out.tmp && mv $out.tmp $out`,
Dan Willemsenc94a7682015-11-17 15:27:28 -080054 CommandDeps: []string{"$aaptCmd"},
Colin Cross30e076a2015-04-13 13:58:27 -070055 Description: "aapt package $out",
56 },
57 "aaptFlags")
58
59 zipalign = pctx.StaticRule("zipalign",
60 blueprint.RuleParams{
61 Command: `$zipalignCmd -f $zipalignFlags 4 $in $out`,
Dan Willemsenc94a7682015-11-17 15:27:28 -080062 CommandDeps: []string{"$zipalignCmd"},
Colin Cross30e076a2015-04-13 13:58:27 -070063 Description: "zipalign $out",
64 },
65 "zipalignFlags")
66
67 signapk = pctx.StaticRule("signapk",
68 blueprint.RuleParams{
69 Command: `java -jar $signapkCmd $certificates $in $out`,
Dan Willemsenc94a7682015-11-17 15:27:28 -080070 CommandDeps: []string{"$signapkCmd"},
Colin Cross30e076a2015-04-13 13:58:27 -070071 Description: "signapk $out",
72 },
73 "certificates")
74
75 androidManifestMerger = pctx.StaticRule("androidManifestMerger",
76 blueprint.RuleParams{
77 Command: "java -classpath $androidManifestMergerCmd com.android.manifmerger.Main merge " +
78 "--main $in --libs $libsManifests --out $out",
Dan Willemsenc94a7682015-11-17 15:27:28 -080079 CommandDeps: []string{"$androidManifestMergerCmd"},
Colin Cross30e076a2015-04-13 13:58:27 -070080 Description: "merge manifest files $out",
81 },
82 "libsManifests")
83)
84
85func init() {
86 pctx.StaticVariable("androidManifestMergerCmd", "${srcDir}/prebuilts/devtools/tools/lib/manifest-merger.jar")
87 pctx.VariableFunc("aaptCmd", func(c interface{}) (string, error) {
88 return c.(common.Config).HostBinTool("aapt")
89 })
90 pctx.VariableFunc("zipalignCmd", func(c interface{}) (string, error) {
91 return c.(common.Config).HostBinTool("zipalign")
92 })
93 pctx.VariableFunc("signapkCmd", func(c interface{}) (string, error) {
94 return c.(common.Config).HostJavaTool("signapk.jar")
95 })
96}
97
98func CreateResourceJavaFiles(ctx common.AndroidModuleContext, flags []string,
99 deps []string) (string, string, string) {
100 javaDir := filepath.Join(common.ModuleGenDir(ctx), "R")
101 javaFileList := filepath.Join(common.ModuleOutDir(ctx), "R.filelist")
102 publicResourcesFile := filepath.Join(common.ModuleOutDir(ctx), "public_resources.xml")
103 proguardOptionsFile := filepath.Join(common.ModuleOutDir(ctx), "proguard.options")
104
105 ctx.Build(pctx, blueprint.BuildParams{
106 Rule: aaptCreateResourceJavaFile,
107 Outputs: []string{publicResourcesFile, proguardOptionsFile, javaFileList},
108 Implicits: deps,
109 Args: map[string]string{
110 "aaptFlags": strings.Join(flags, " "),
111 "publicResourcesFile": publicResourcesFile,
112 "proguardOptionsFile": proguardOptionsFile,
113 "javaDir": javaDir,
114 "javaFileList": javaFileList,
115 },
116 })
117
118 return publicResourcesFile, proguardOptionsFile, javaFileList
119}
120
121func CreateExportPackage(ctx common.AndroidModuleContext, flags []string, deps []string) string {
122 outputFile := filepath.Join(common.ModuleOutDir(ctx), "package-export.apk")
123
124 ctx.Build(pctx, blueprint.BuildParams{
125 Rule: aaptCreateAssetsPackage,
126 Outputs: []string{outputFile},
127 Implicits: deps,
128 Args: map[string]string{
129 "aaptFlags": strings.Join(flags, " "),
130 },
131 })
132
133 return outputFile
134}
135
136func CreateAppPackage(ctx common.AndroidModuleContext, flags []string, jarFile string,
137 certificates []string) string {
138
139 resourceApk := filepath.Join(common.ModuleOutDir(ctx), "resources.apk")
140
141 ctx.Build(pctx, blueprint.BuildParams{
Dan Willemsenc94a7682015-11-17 15:27:28 -0800142 Rule: aaptAddResources,
143 Outputs: []string{resourceApk},
144 Inputs: []string{jarFile},
Colin Cross30e076a2015-04-13 13:58:27 -0700145 Args: map[string]string{
146 "aaptFlags": strings.Join(flags, " "),
147 },
148 })
149
150 signedApk := filepath.Join(common.ModuleOutDir(ctx), "signed.apk")
151
152 var certificateArgs []string
153 for _, c := range certificates {
154 certificateArgs = append(certificateArgs, c+".x509.pem", c+".pk8")
155 }
156
157 ctx.Build(pctx, blueprint.BuildParams{
Dan Willemsenc94a7682015-11-17 15:27:28 -0800158 Rule: signapk,
159 Outputs: []string{signedApk},
160 Inputs: []string{resourceApk},
Colin Cross30e076a2015-04-13 13:58:27 -0700161 Args: map[string]string{
162 "certificates": strings.Join(certificateArgs, " "),
163 },
164 })
165
166 outputFile := filepath.Join(common.ModuleOutDir(ctx), "package.apk")
167
168 ctx.Build(pctx, blueprint.BuildParams{
Dan Willemsenc94a7682015-11-17 15:27:28 -0800169 Rule: zipalign,
170 Outputs: []string{outputFile},
171 Inputs: []string{signedApk},
Colin Cross30e076a2015-04-13 13:58:27 -0700172 Args: map[string]string{
173 "zipalignFlags": "",
174 },
175 })
176
177 return outputFile
178}