xref: /aosp_15_r20/build/soong/java/app_builder.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage java
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Worker// This file generates the final rules for compiling all Java.  All properties related to
18*333d2b36SAndroid Build Coastguard Worker// compiling should have been translated into javaBuilderFlags or another argument to the Transform*
19*333d2b36SAndroid Build Coastguard Worker// functions.
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Workerimport (
22*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
23*333d2b36SAndroid Build Coastguard Worker	"strings"
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
26*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
29*333d2b36SAndroid Build Coastguard Worker	"android/soong/remoteexec"
30*333d2b36SAndroid Build Coastguard Worker)
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Workervar (
33*333d2b36SAndroid Build Coastguard Worker	Signapk, SignapkRE = pctx.RemoteStaticRules("signapk",
34*333d2b36SAndroid Build Coastguard Worker		blueprint.RuleParams{
35*333d2b36SAndroid Build Coastguard Worker			Command: `rm -f $out && $reTemplate${config.JavaCmd} ${config.JavaVmFlags} -Djava.library.path=$$(dirname ${config.SignapkJniLibrary}) ` +
36*333d2b36SAndroid Build Coastguard Worker				`-jar ${config.SignapkCmd} $flags $certificates $in $out`,
37*333d2b36SAndroid Build Coastguard Worker			CommandDeps: []string{"${config.SignapkCmd}", "${config.SignapkJniLibrary}"},
38*333d2b36SAndroid Build Coastguard Worker		},
39*333d2b36SAndroid Build Coastguard Worker		&remoteexec.REParams{Labels: map[string]string{"type": "tool", "name": "signapk"},
40*333d2b36SAndroid Build Coastguard Worker			ExecStrategy:    "${config.RESignApkExecStrategy}",
41*333d2b36SAndroid Build Coastguard Worker			Inputs:          []string{"${config.SignapkCmd}", "$in", "$$(dirname ${config.SignapkJniLibrary})", "$implicits"},
42*333d2b36SAndroid Build Coastguard Worker			OutputFiles:     []string{"$outCommaList"},
43*333d2b36SAndroid Build Coastguard Worker			ToolchainInputs: []string{"${config.JavaCmd}"},
44*333d2b36SAndroid Build Coastguard Worker			Platform:        map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
45*333d2b36SAndroid Build Coastguard Worker		}, []string{"flags", "certificates"}, []string{"implicits", "outCommaList"})
46*333d2b36SAndroid Build Coastguard Worker)
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Workervar combineApk = pctx.AndroidStaticRule("combineApk",
49*333d2b36SAndroid Build Coastguard Worker	blueprint.RuleParams{
50*333d2b36SAndroid Build Coastguard Worker		Command:     `${config.MergeZipsCmd} $out $in`,
51*333d2b36SAndroid Build Coastguard Worker		CommandDeps: []string{"${config.MergeZipsCmd}"},
52*333d2b36SAndroid Build Coastguard Worker	})
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Workerfunc CreateAndSignAppPackage(ctx android.ModuleContext, outputFile android.WritablePath,
55*333d2b36SAndroid Build Coastguard Worker	packageFile, jniJarFile, dexJarFile android.Path, certificates []Certificate, deps android.Paths, v4SignatureFile android.WritablePath, lineageFile android.Path, rotationMinSdkVersion string) {
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker	unsignedApkName := strings.TrimSuffix(outputFile.Base(), ".apk") + "-unsigned.apk"
58*333d2b36SAndroid Build Coastguard Worker	unsignedApk := android.PathForModuleOut(ctx, unsignedApkName)
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Worker	var inputs android.Paths
61*333d2b36SAndroid Build Coastguard Worker	if dexJarFile != nil {
62*333d2b36SAndroid Build Coastguard Worker		inputs = append(inputs, dexJarFile)
63*333d2b36SAndroid Build Coastguard Worker	}
64*333d2b36SAndroid Build Coastguard Worker	inputs = append(inputs, packageFile)
65*333d2b36SAndroid Build Coastguard Worker	if jniJarFile != nil {
66*333d2b36SAndroid Build Coastguard Worker		inputs = append(inputs, jniJarFile)
67*333d2b36SAndroid Build Coastguard Worker	}
68*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
69*333d2b36SAndroid Build Coastguard Worker		Rule:      combineApk,
70*333d2b36SAndroid Build Coastguard Worker		Inputs:    inputs,
71*333d2b36SAndroid Build Coastguard Worker		Output:    unsignedApk,
72*333d2b36SAndroid Build Coastguard Worker		Implicits: deps,
73*333d2b36SAndroid Build Coastguard Worker	})
74*333d2b36SAndroid Build Coastguard Worker	SignAppPackage(ctx, outputFile, unsignedApk, certificates, v4SignatureFile, lineageFile, rotationMinSdkVersion)
75*333d2b36SAndroid Build Coastguard Worker}
76*333d2b36SAndroid Build Coastguard Worker
77*333d2b36SAndroid Build Coastguard Workerfunc SignAppPackage(ctx android.ModuleContext, signedApk android.WritablePath, unsignedApk android.Path, certificates []Certificate, v4SignatureFile android.WritablePath, lineageFile android.Path, rotationMinSdkVersion string) {
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Worker	var certificateArgs []string
80*333d2b36SAndroid Build Coastguard Worker	var deps android.Paths
81*333d2b36SAndroid Build Coastguard Worker	for _, c := range certificates {
82*333d2b36SAndroid Build Coastguard Worker		certificateArgs = append(certificateArgs, c.Pem.String(), c.Key.String())
83*333d2b36SAndroid Build Coastguard Worker		deps = append(deps, c.Pem, c.Key)
84*333d2b36SAndroid Build Coastguard Worker	}
85*333d2b36SAndroid Build Coastguard Worker	outputFiles := android.WritablePaths{signedApk}
86*333d2b36SAndroid Build Coastguard Worker	var flags []string
87*333d2b36SAndroid Build Coastguard Worker	if v4SignatureFile != nil {
88*333d2b36SAndroid Build Coastguard Worker		outputFiles = append(outputFiles, v4SignatureFile)
89*333d2b36SAndroid Build Coastguard Worker		flags = append(flags, "--enable-v4")
90*333d2b36SAndroid Build Coastguard Worker	}
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Worker	if lineageFile != nil {
93*333d2b36SAndroid Build Coastguard Worker		flags = append(flags, "--lineage", lineageFile.String())
94*333d2b36SAndroid Build Coastguard Worker		deps = append(deps, lineageFile)
95*333d2b36SAndroid Build Coastguard Worker	}
96*333d2b36SAndroid Build Coastguard Worker
97*333d2b36SAndroid Build Coastguard Worker	if rotationMinSdkVersion != "" {
98*333d2b36SAndroid Build Coastguard Worker		flags = append(flags, "--rotation-min-sdk-version", rotationMinSdkVersion)
99*333d2b36SAndroid Build Coastguard Worker	}
100*333d2b36SAndroid Build Coastguard Worker
101*333d2b36SAndroid Build Coastguard Worker	rule := Signapk
102*333d2b36SAndroid Build Coastguard Worker	args := map[string]string{
103*333d2b36SAndroid Build Coastguard Worker		"certificates": strings.Join(certificateArgs, " "),
104*333d2b36SAndroid Build Coastguard Worker		"flags":        strings.Join(flags, " "),
105*333d2b36SAndroid Build Coastguard Worker	}
106*333d2b36SAndroid Build Coastguard Worker	if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_SIGNAPK") {
107*333d2b36SAndroid Build Coastguard Worker		rule = SignapkRE
108*333d2b36SAndroid Build Coastguard Worker		args["implicits"] = strings.Join(deps.Strings(), ",")
109*333d2b36SAndroid Build Coastguard Worker		args["outCommaList"] = strings.Join(outputFiles.Strings(), ",")
110*333d2b36SAndroid Build Coastguard Worker	}
111*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
112*333d2b36SAndroid Build Coastguard Worker		Rule:        rule,
113*333d2b36SAndroid Build Coastguard Worker		Description: "signapk",
114*333d2b36SAndroid Build Coastguard Worker		Outputs:     outputFiles,
115*333d2b36SAndroid Build Coastguard Worker		Input:       unsignedApk,
116*333d2b36SAndroid Build Coastguard Worker		Implicits:   deps,
117*333d2b36SAndroid Build Coastguard Worker		Args:        args,
118*333d2b36SAndroid Build Coastguard Worker	})
119*333d2b36SAndroid Build Coastguard Worker}
120*333d2b36SAndroid Build Coastguard Worker
121*333d2b36SAndroid Build Coastguard Workervar buildAAR = pctx.AndroidStaticRule("buildAAR",
122*333d2b36SAndroid Build Coastguard Worker	blueprint.RuleParams{
123*333d2b36SAndroid Build Coastguard Worker		Command: `rm -rf ${outDir} && mkdir -p ${outDir} && ` +
124*333d2b36SAndroid Build Coastguard Worker			`cp ${manifest} ${outDir}/AndroidManifest.xml && ` +
125*333d2b36SAndroid Build Coastguard Worker			`cp ${classesJar} ${outDir}/classes.jar && ` +
126*333d2b36SAndroid Build Coastguard Worker			`cp ${rTxt} ${outDir}/R.txt && ` +
127*333d2b36SAndroid Build Coastguard Worker			`${config.SoongZipCmd} -jar -o $out -C ${outDir} -D ${outDir}`,
128*333d2b36SAndroid Build Coastguard Worker		CommandDeps: []string{"${config.SoongZipCmd}"},
129*333d2b36SAndroid Build Coastguard Worker	},
130*333d2b36SAndroid Build Coastguard Worker	"manifest", "classesJar", "rTxt", "outDir")
131*333d2b36SAndroid Build Coastguard Worker
132*333d2b36SAndroid Build Coastguard Workerfunc BuildAAR(ctx android.ModuleContext, outputFile android.WritablePath,
133*333d2b36SAndroid Build Coastguard Worker	classesJar, manifest, rTxt android.Path, res android.Paths) {
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Worker	// TODO(ccross): uniquify and copy resources with dependencies
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Worker	deps := android.Paths{manifest, rTxt}
138*333d2b36SAndroid Build Coastguard Worker	classesJarPath := ""
139*333d2b36SAndroid Build Coastguard Worker	if classesJar != nil {
140*333d2b36SAndroid Build Coastguard Worker		deps = append(deps, classesJar)
141*333d2b36SAndroid Build Coastguard Worker		classesJarPath = classesJar.String()
142*333d2b36SAndroid Build Coastguard Worker	}
143*333d2b36SAndroid Build Coastguard Worker
144*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
145*333d2b36SAndroid Build Coastguard Worker		Rule:        buildAAR,
146*333d2b36SAndroid Build Coastguard Worker		Description: "aar",
147*333d2b36SAndroid Build Coastguard Worker		Implicits:   deps,
148*333d2b36SAndroid Build Coastguard Worker		Output:      outputFile,
149*333d2b36SAndroid Build Coastguard Worker		Args: map[string]string{
150*333d2b36SAndroid Build Coastguard Worker			"manifest":   manifest.String(),
151*333d2b36SAndroid Build Coastguard Worker			"classesJar": classesJarPath,
152*333d2b36SAndroid Build Coastguard Worker			"rTxt":       rTxt.String(),
153*333d2b36SAndroid Build Coastguard Worker			"outDir":     android.PathForModuleOut(ctx, "aar").String(),
154*333d2b36SAndroid Build Coastguard Worker		},
155*333d2b36SAndroid Build Coastguard Worker	})
156*333d2b36SAndroid Build Coastguard Worker}
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Workervar buildBundleModule = pctx.AndroidStaticRule("buildBundleModule",
159*333d2b36SAndroid Build Coastguard Worker	blueprint.RuleParams{
160*333d2b36SAndroid Build Coastguard Worker		Command:     `${config.MergeZipsCmd} ${out} ${in}`,
161*333d2b36SAndroid Build Coastguard Worker		CommandDeps: []string{"${config.MergeZipsCmd}"},
162*333d2b36SAndroid Build Coastguard Worker	})
163*333d2b36SAndroid Build Coastguard Worker
164*333d2b36SAndroid Build Coastguard Workervar bundleMungePackage = pctx.AndroidStaticRule("bundleMungePackage",
165*333d2b36SAndroid Build Coastguard Worker	blueprint.RuleParams{
166*333d2b36SAndroid Build Coastguard Worker		Command:     `${config.Zip2ZipCmd} -i ${in} -o ${out} AndroidManifest.xml:manifest/AndroidManifest.xml resources.pb "res/**/*" "assets/**/*"`,
167*333d2b36SAndroid Build Coastguard Worker		CommandDeps: []string{"${config.Zip2ZipCmd}"},
168*333d2b36SAndroid Build Coastguard Worker	})
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Workervar bundleMungeDexJar = pctx.AndroidStaticRule("bundleMungeDexJar",
171*333d2b36SAndroid Build Coastguard Worker	blueprint.RuleParams{
172*333d2b36SAndroid Build Coastguard Worker		Command: `${config.Zip2ZipCmd} -i ${in} -o ${out} "classes*.dex:dex/" && ` +
173*333d2b36SAndroid Build Coastguard Worker			`${config.Zip2ZipCmd} -i ${in} -o ${resJar} -x "classes*.dex" "**/*:root/"`,
174*333d2b36SAndroid Build Coastguard Worker		CommandDeps: []string{"${config.Zip2ZipCmd}"},
175*333d2b36SAndroid Build Coastguard Worker	}, "resJar")
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Worker// Builds an app into a module suitable for input to bundletool
178*333d2b36SAndroid Build Coastguard Workerfunc BuildBundleModule(ctx android.ModuleContext, outputFile android.WritablePath,
179*333d2b36SAndroid Build Coastguard Worker	packageFile, jniJarFile, dexJarFile android.Path) {
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Worker	protoResJarFile := android.PathForModuleOut(ctx, "package-res.pb.apk")
182*333d2b36SAndroid Build Coastguard Worker	aapt2Convert(ctx, protoResJarFile, packageFile, "proto")
183*333d2b36SAndroid Build Coastguard Worker
184*333d2b36SAndroid Build Coastguard Worker	var zips android.Paths
185*333d2b36SAndroid Build Coastguard Worker
186*333d2b36SAndroid Build Coastguard Worker	mungedPackage := android.PathForModuleOut(ctx, "bundle", "apk.zip")
187*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
188*333d2b36SAndroid Build Coastguard Worker		Rule:        bundleMungePackage,
189*333d2b36SAndroid Build Coastguard Worker		Input:       protoResJarFile,
190*333d2b36SAndroid Build Coastguard Worker		Output:      mungedPackage,
191*333d2b36SAndroid Build Coastguard Worker		Description: "bundle apk",
192*333d2b36SAndroid Build Coastguard Worker	})
193*333d2b36SAndroid Build Coastguard Worker	zips = append(zips, mungedPackage)
194*333d2b36SAndroid Build Coastguard Worker
195*333d2b36SAndroid Build Coastguard Worker	if dexJarFile != nil {
196*333d2b36SAndroid Build Coastguard Worker		mungedDexJar := android.PathForModuleOut(ctx, "bundle", "dex.zip")
197*333d2b36SAndroid Build Coastguard Worker		mungedResJar := android.PathForModuleOut(ctx, "bundle", "res.zip")
198*333d2b36SAndroid Build Coastguard Worker		ctx.Build(pctx, android.BuildParams{
199*333d2b36SAndroid Build Coastguard Worker			Rule:           bundleMungeDexJar,
200*333d2b36SAndroid Build Coastguard Worker			Input:          dexJarFile,
201*333d2b36SAndroid Build Coastguard Worker			Output:         mungedDexJar,
202*333d2b36SAndroid Build Coastguard Worker			ImplicitOutput: mungedResJar,
203*333d2b36SAndroid Build Coastguard Worker			Description:    "bundle dex",
204*333d2b36SAndroid Build Coastguard Worker			Args: map[string]string{
205*333d2b36SAndroid Build Coastguard Worker				"resJar": mungedResJar.String(),
206*333d2b36SAndroid Build Coastguard Worker			},
207*333d2b36SAndroid Build Coastguard Worker		})
208*333d2b36SAndroid Build Coastguard Worker		zips = append(zips, mungedDexJar, mungedResJar)
209*333d2b36SAndroid Build Coastguard Worker	}
210*333d2b36SAndroid Build Coastguard Worker	if jniJarFile != nil {
211*333d2b36SAndroid Build Coastguard Worker		zips = append(zips, jniJarFile)
212*333d2b36SAndroid Build Coastguard Worker	}
213*333d2b36SAndroid Build Coastguard Worker
214*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
215*333d2b36SAndroid Build Coastguard Worker		Rule:        buildBundleModule,
216*333d2b36SAndroid Build Coastguard Worker		Inputs:      zips,
217*333d2b36SAndroid Build Coastguard Worker		Output:      outputFile,
218*333d2b36SAndroid Build Coastguard Worker		Description: "bundle",
219*333d2b36SAndroid Build Coastguard Worker	})
220*333d2b36SAndroid Build Coastguard Worker}
221*333d2b36SAndroid Build Coastguard Worker
222*333d2b36SAndroid Build Coastguard Workerfunc TransformJniLibsToJar(
223*333d2b36SAndroid Build Coastguard Worker	ctx android.ModuleContext,
224*333d2b36SAndroid Build Coastguard Worker	outputFile android.WritablePath,
225*333d2b36SAndroid Build Coastguard Worker	jniLibs []jniLib,
226*333d2b36SAndroid Build Coastguard Worker	prebuiltJniPackages android.Paths,
227*333d2b36SAndroid Build Coastguard Worker	uncompressJNI bool) {
228*333d2b36SAndroid Build Coastguard Worker
229*333d2b36SAndroid Build Coastguard Worker	var deps android.Paths
230*333d2b36SAndroid Build Coastguard Worker	jarArgs := []string{
231*333d2b36SAndroid Build Coastguard Worker		"-j", // junk paths, they will be added back with -P arguments
232*333d2b36SAndroid Build Coastguard Worker	}
233*333d2b36SAndroid Build Coastguard Worker
234*333d2b36SAndroid Build Coastguard Worker	if uncompressJNI {
235*333d2b36SAndroid Build Coastguard Worker		jarArgs = append(jarArgs, "-L", "0")
236*333d2b36SAndroid Build Coastguard Worker	}
237*333d2b36SAndroid Build Coastguard Worker
238*333d2b36SAndroid Build Coastguard Worker	for _, j := range jniLibs {
239*333d2b36SAndroid Build Coastguard Worker		deps = append(deps, j.path)
240*333d2b36SAndroid Build Coastguard Worker		jarArgs = append(jarArgs,
241*333d2b36SAndroid Build Coastguard Worker			"-P", targetToJniDir(j.target),
242*333d2b36SAndroid Build Coastguard Worker			"-f", j.path.String())
243*333d2b36SAndroid Build Coastguard Worker	}
244*333d2b36SAndroid Build Coastguard Worker
245*333d2b36SAndroid Build Coastguard Worker	rule := zip
246*333d2b36SAndroid Build Coastguard Worker	args := map[string]string{
247*333d2b36SAndroid Build Coastguard Worker		"jarArgs": strings.Join(proptools.NinjaAndShellEscapeList(jarArgs), " "),
248*333d2b36SAndroid Build Coastguard Worker	}
249*333d2b36SAndroid Build Coastguard Worker	if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_ZIP") {
250*333d2b36SAndroid Build Coastguard Worker		rule = zipRE
251*333d2b36SAndroid Build Coastguard Worker		args["implicits"] = strings.Join(deps.Strings(), ",")
252*333d2b36SAndroid Build Coastguard Worker	}
253*333d2b36SAndroid Build Coastguard Worker	var jniJarPath android.WritablePath = android.PathForModuleOut(ctx, "jniJarOutput.zip")
254*333d2b36SAndroid Build Coastguard Worker	if len(prebuiltJniPackages) == 0 {
255*333d2b36SAndroid Build Coastguard Worker		jniJarPath = outputFile
256*333d2b36SAndroid Build Coastguard Worker	}
257*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
258*333d2b36SAndroid Build Coastguard Worker		Rule:        rule,
259*333d2b36SAndroid Build Coastguard Worker		Description: "zip jni libs",
260*333d2b36SAndroid Build Coastguard Worker		Output:      jniJarPath,
261*333d2b36SAndroid Build Coastguard Worker		Implicits:   deps,
262*333d2b36SAndroid Build Coastguard Worker		Args:        args,
263*333d2b36SAndroid Build Coastguard Worker	})
264*333d2b36SAndroid Build Coastguard Worker	if len(prebuiltJniPackages) > 0 {
265*333d2b36SAndroid Build Coastguard Worker		var mergeJniJarPath android.WritablePath = android.PathForModuleOut(ctx, "mergeJniJarOutput.zip")
266*333d2b36SAndroid Build Coastguard Worker		if !uncompressJNI {
267*333d2b36SAndroid Build Coastguard Worker			mergeJniJarPath = outputFile
268*333d2b36SAndroid Build Coastguard Worker		}
269*333d2b36SAndroid Build Coastguard Worker		ctx.Build(pctx, android.BuildParams{
270*333d2b36SAndroid Build Coastguard Worker			Rule:        mergeAssetsRule,
271*333d2b36SAndroid Build Coastguard Worker			Description: "merge prebuilt JNI packages",
272*333d2b36SAndroid Build Coastguard Worker			Inputs:      append(prebuiltJniPackages, jniJarPath),
273*333d2b36SAndroid Build Coastguard Worker			Output:      mergeJniJarPath,
274*333d2b36SAndroid Build Coastguard Worker		})
275*333d2b36SAndroid Build Coastguard Worker
276*333d2b36SAndroid Build Coastguard Worker		if uncompressJNI {
277*333d2b36SAndroid Build Coastguard Worker			ctx.Build(pctx, android.BuildParams{
278*333d2b36SAndroid Build Coastguard Worker				Rule:   uncompressEmbeddedJniLibsRule,
279*333d2b36SAndroid Build Coastguard Worker				Input:  mergeJniJarPath,
280*333d2b36SAndroid Build Coastguard Worker				Output: outputFile,
281*333d2b36SAndroid Build Coastguard Worker			})
282*333d2b36SAndroid Build Coastguard Worker		}
283*333d2b36SAndroid Build Coastguard Worker	}
284*333d2b36SAndroid Build Coastguard Worker}
285*333d2b36SAndroid Build Coastguard Worker
286*333d2b36SAndroid Build Coastguard Workerfunc (a *AndroidApp) generateJavaUsedByApex(ctx android.ModuleContext) {
287*333d2b36SAndroid Build Coastguard Worker	javaApiUsedByOutputFile := android.PathForModuleOut(ctx, a.installApkName+"_using.xml")
288*333d2b36SAndroid Build Coastguard Worker	javaUsedByRule := android.NewRuleBuilder(pctx, ctx)
289*333d2b36SAndroid Build Coastguard Worker	javaUsedByRule.Command().
290*333d2b36SAndroid Build Coastguard Worker		Tool(android.PathForSource(ctx, "build/soong/scripts/gen_java_usedby_apex.sh")).
291*333d2b36SAndroid Build Coastguard Worker		BuiltTool("dexdeps").
292*333d2b36SAndroid Build Coastguard Worker		Output(javaApiUsedByOutputFile).
293*333d2b36SAndroid Build Coastguard Worker		Input(a.Library.Module.outputFile)
294*333d2b36SAndroid Build Coastguard Worker	javaUsedByRule.Build("java_usedby_list", "Generate Java APIs used by Apex")
295*333d2b36SAndroid Build Coastguard Worker	a.javaApiUsedByOutputFile = javaApiUsedByOutputFile
296*333d2b36SAndroid Build Coastguard Worker}
297*333d2b36SAndroid Build Coastguard Worker
298*333d2b36SAndroid Build Coastguard Workerfunc targetToJniDir(target android.Target) string {
299*333d2b36SAndroid Build Coastguard Worker	return filepath.Join("lib", target.Arch.Abi[0])
300*333d2b36SAndroid Build Coastguard Worker}
301