blob: 8e907d22633b9bc65cb3f296d6ef858715a9606e [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`,
37 Description: "aapt create R.java $out",
38 },
39 "aaptFlags", "publicResourcesFile", "proguardOptionsFile", "javaDir", "javaFileList")
40
41 aaptCreateAssetsPackage = pctx.StaticRule("aaptCreateAssetsPackage",
42 blueprint.RuleParams{
Colin Cross5adac8a2015-04-28 13:29:20 -070043 Command: `rm -f $out && $aaptCmd package $aaptFlags -F $out`,
Colin Cross30e076a2015-04-13 13:58:27 -070044 Description: "aapt export package $out",
45 },
46 "aaptFlags", "publicResourcesFile", "proguardOptionsFile", "javaDir", "javaFileList")
47
48 aaptAddResources = pctx.StaticRule("aaptAddResources",
49 blueprint.RuleParams{
50 // TODO: add-jni-shared-libs-to-package
51 Command: `cp -f $in $out.tmp && $aaptCmd package -u $aaptFlags -F $out.tmp && mv $out.tmp $out`,
52 Description: "aapt package $out",
53 },
54 "aaptFlags")
55
56 zipalign = pctx.StaticRule("zipalign",
57 blueprint.RuleParams{
58 Command: `$zipalignCmd -f $zipalignFlags 4 $in $out`,
59 Description: "zipalign $out",
60 },
61 "zipalignFlags")
62
63 signapk = pctx.StaticRule("signapk",
64 blueprint.RuleParams{
65 Command: `java -jar $signapkCmd $certificates $in $out`,
66 Description: "signapk $out",
67 },
68 "certificates")
69
70 androidManifestMerger = pctx.StaticRule("androidManifestMerger",
71 blueprint.RuleParams{
72 Command: "java -classpath $androidManifestMergerCmd com.android.manifmerger.Main merge " +
73 "--main $in --libs $libsManifests --out $out",
74 Description: "merge manifest files $out",
75 },
76 "libsManifests")
77)
78
79func init() {
80 pctx.StaticVariable("androidManifestMergerCmd", "${srcDir}/prebuilts/devtools/tools/lib/manifest-merger.jar")
81 pctx.VariableFunc("aaptCmd", func(c interface{}) (string, error) {
82 return c.(common.Config).HostBinTool("aapt")
83 })
84 pctx.VariableFunc("zipalignCmd", func(c interface{}) (string, error) {
85 return c.(common.Config).HostBinTool("zipalign")
86 })
87 pctx.VariableFunc("signapkCmd", func(c interface{}) (string, error) {
88 return c.(common.Config).HostJavaTool("signapk.jar")
89 })
90}
91
92func CreateResourceJavaFiles(ctx common.AndroidModuleContext, flags []string,
93 deps []string) (string, string, string) {
94 javaDir := filepath.Join(common.ModuleGenDir(ctx), "R")
95 javaFileList := filepath.Join(common.ModuleOutDir(ctx), "R.filelist")
96 publicResourcesFile := filepath.Join(common.ModuleOutDir(ctx), "public_resources.xml")
97 proguardOptionsFile := filepath.Join(common.ModuleOutDir(ctx), "proguard.options")
98
Colin Crosseb1e6cc2015-04-28 14:09:10 -070099 deps = append([]string{"$aaptCmd"}, deps...)
100
Colin Cross30e076a2015-04-13 13:58:27 -0700101 ctx.Build(pctx, blueprint.BuildParams{
102 Rule: aaptCreateResourceJavaFile,
103 Outputs: []string{publicResourcesFile, proguardOptionsFile, javaFileList},
104 Implicits: deps,
105 Args: map[string]string{
106 "aaptFlags": strings.Join(flags, " "),
107 "publicResourcesFile": publicResourcesFile,
108 "proguardOptionsFile": proguardOptionsFile,
109 "javaDir": javaDir,
110 "javaFileList": javaFileList,
111 },
112 })
113
114 return publicResourcesFile, proguardOptionsFile, javaFileList
115}
116
117func CreateExportPackage(ctx common.AndroidModuleContext, flags []string, deps []string) string {
118 outputFile := filepath.Join(common.ModuleOutDir(ctx), "package-export.apk")
119
Colin Crosseb1e6cc2015-04-28 14:09:10 -0700120 deps = append([]string{"$aaptCmd"}, deps...)
121
Colin Cross30e076a2015-04-13 13:58:27 -0700122 ctx.Build(pctx, blueprint.BuildParams{
123 Rule: aaptCreateAssetsPackage,
124 Outputs: []string{outputFile},
125 Implicits: deps,
126 Args: map[string]string{
127 "aaptFlags": strings.Join(flags, " "),
128 },
129 })
130
131 return outputFile
132}
133
134func CreateAppPackage(ctx common.AndroidModuleContext, flags []string, jarFile string,
135 certificates []string) string {
136
137 resourceApk := filepath.Join(common.ModuleOutDir(ctx), "resources.apk")
138
139 ctx.Build(pctx, blueprint.BuildParams{
Colin Crosseb1e6cc2015-04-28 14:09:10 -0700140 Rule: aaptAddResources,
141 Outputs: []string{resourceApk},
142 Inputs: []string{jarFile},
143 Implicits: []string{"$aaptCmd"},
Colin Cross30e076a2015-04-13 13:58:27 -0700144 Args: map[string]string{
145 "aaptFlags": strings.Join(flags, " "),
146 },
147 })
148
149 signedApk := filepath.Join(common.ModuleOutDir(ctx), "signed.apk")
150
151 var certificateArgs []string
152 for _, c := range certificates {
153 certificateArgs = append(certificateArgs, c+".x509.pem", c+".pk8")
154 }
155
156 ctx.Build(pctx, blueprint.BuildParams{
Colin Crosseb1e6cc2015-04-28 14:09:10 -0700157 Rule: signapk,
158 Outputs: []string{signedApk},
159 Inputs: []string{resourceApk},
160 Implicits: []string{"$signapkCmd"},
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{
Colin Crosseb1e6cc2015-04-28 14:09:10 -0700169 Rule: zipalign,
170 Outputs: []string{outputFile},
171 Inputs: []string{signedApk},
172 Implicits: []string{"$zipalignCmd"},
Colin Cross30e076a2015-04-13 13:58:27 -0700173 Args: map[string]string{
174 "zipalignFlags": "",
175 },
176 })
177
178 return outputFile
179}