xref: /aosp_15_r20/build/soong/java/java.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 contains the module types for compiling Java for Android, and converts the properties
18*333d2b36SAndroid Build Coastguard Worker// into the flags and filenames necessary to pass to the Module.  The final creation of the rules
19*333d2b36SAndroid Build Coastguard Worker// is handled in builder.go
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Workerimport (
22*333d2b36SAndroid Build Coastguard Worker	"fmt"
23*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
24*333d2b36SAndroid Build Coastguard Worker	"slices"
25*333d2b36SAndroid Build Coastguard Worker	"sort"
26*333d2b36SAndroid Build Coastguard Worker	"strings"
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Worker	"android/soong/remoteexec"
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
31*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/depset"
32*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
35*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
36*333d2b36SAndroid Build Coastguard Worker	"android/soong/dexpreopt"
37*333d2b36SAndroid Build Coastguard Worker	"android/soong/java/config"
38*333d2b36SAndroid Build Coastguard Worker	"android/soong/tradefed"
39*333d2b36SAndroid Build Coastguard Worker)
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Workerfunc init() {
42*333d2b36SAndroid Build Coastguard Worker	registerJavaBuildComponents(android.InitRegistrationContext)
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Worker	RegisterJavaSdkMemberTypes()
45*333d2b36SAndroid Build Coastguard Worker}
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Workerfunc registerJavaBuildComponents(ctx android.RegistrationContext) {
48*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_defaults", DefaultsFactory)
49*333d2b36SAndroid Build Coastguard Worker
50*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_library", LibraryFactory)
51*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_library_static", LibraryStaticFactory)
52*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_library_host", LibraryHostFactory)
53*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_binary", BinaryFactory)
54*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_binary_host", BinaryHostFactory)
55*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_test", TestFactory)
56*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_test_helper_library", TestHelperLibraryFactory)
57*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_test_host", TestHostFactory)
58*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_test_import", JavaTestImportFactory)
59*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_import", ImportFactory)
60*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_import_host", ImportFactoryHost)
61*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_device_for_host", DeviceForHostFactory)
62*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_host_for_device", HostForDeviceFactory)
63*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("dex_import", DexImportFactory)
64*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_api_library", ApiLibraryFactory)
65*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_api_contribution", ApiContributionFactory)
66*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_api_contribution_import", ApiContributionImportFactory)
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Worker	// This mutator registers dependencies on dex2oat for modules that should be
69*333d2b36SAndroid Build Coastguard Worker	// dexpreopted. This is done late when the final variants have been
70*333d2b36SAndroid Build Coastguard Worker	// established, to not get the dependencies split into the wrong variants and
71*333d2b36SAndroid Build Coastguard Worker	// to support the checks in dexpreoptDisabled().
72*333d2b36SAndroid Build Coastguard Worker	ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
73*333d2b36SAndroid Build Coastguard Worker		ctx.BottomUp("dexpreopt_tool_deps", dexpreoptToolDepsMutator)
74*333d2b36SAndroid Build Coastguard Worker		// needs access to ApexInfoProvider which is available after variant creation
75*333d2b36SAndroid Build Coastguard Worker		ctx.BottomUp("jacoco_deps", jacocoDepsMutator)
76*333d2b36SAndroid Build Coastguard Worker	})
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterParallelSingletonType("kythe_java_extract", kytheExtractJavaFactory)
79*333d2b36SAndroid Build Coastguard Worker}
80*333d2b36SAndroid Build Coastguard Worker
81*333d2b36SAndroid Build Coastguard Workerfunc RegisterJavaSdkMemberTypes() {
82*333d2b36SAndroid Build Coastguard Worker	// Register sdk member types.
83*333d2b36SAndroid Build Coastguard Worker	android.RegisterSdkMemberType(javaHeaderLibsSdkMemberType)
84*333d2b36SAndroid Build Coastguard Worker	android.RegisterSdkMemberType(javaLibsSdkMemberType)
85*333d2b36SAndroid Build Coastguard Worker	android.RegisterSdkMemberType(JavaBootLibsSdkMemberType)
86*333d2b36SAndroid Build Coastguard Worker	android.RegisterSdkMemberType(JavaSystemserverLibsSdkMemberType)
87*333d2b36SAndroid Build Coastguard Worker	android.RegisterSdkMemberType(javaTestSdkMemberType)
88*333d2b36SAndroid Build Coastguard Worker}
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Workertype StubsLinkType int
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Workerconst (
93*333d2b36SAndroid Build Coastguard Worker	Unknown StubsLinkType = iota
94*333d2b36SAndroid Build Coastguard Worker	Stubs
95*333d2b36SAndroid Build Coastguard Worker	Implementation
96*333d2b36SAndroid Build Coastguard Worker)
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Workervar (
99*333d2b36SAndroid Build Coastguard Worker	// Supports adding java header libraries to module_exports and sdk.
100*333d2b36SAndroid Build Coastguard Worker	javaHeaderLibsSdkMemberType = &librarySdkMemberType{
101*333d2b36SAndroid Build Coastguard Worker		android.SdkMemberTypeBase{
102*333d2b36SAndroid Build Coastguard Worker			PropertyName: "java_header_libs",
103*333d2b36SAndroid Build Coastguard Worker			SupportsSdk:  true,
104*333d2b36SAndroid Build Coastguard Worker		},
105*333d2b36SAndroid Build Coastguard Worker		func(_ android.SdkMemberContext, j *Library) android.Path {
106*333d2b36SAndroid Build Coastguard Worker			headerJars := j.HeaderJars()
107*333d2b36SAndroid Build Coastguard Worker			if len(headerJars) != 1 {
108*333d2b36SAndroid Build Coastguard Worker				panic(fmt.Errorf("there must be only one header jar from %q", j.Name()))
109*333d2b36SAndroid Build Coastguard Worker			}
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Worker			return headerJars[0]
112*333d2b36SAndroid Build Coastguard Worker		},
113*333d2b36SAndroid Build Coastguard Worker		sdkSnapshotFilePathForJar,
114*333d2b36SAndroid Build Coastguard Worker		copyEverythingToSnapshot,
115*333d2b36SAndroid Build Coastguard Worker	}
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Worker	// Export implementation classes jar as part of the sdk.
118*333d2b36SAndroid Build Coastguard Worker	exportImplementationClassesJar = func(_ android.SdkMemberContext, j *Library) android.Path {
119*333d2b36SAndroid Build Coastguard Worker		implementationJars := j.ImplementationAndResourcesJars()
120*333d2b36SAndroid Build Coastguard Worker		if len(implementationJars) != 1 {
121*333d2b36SAndroid Build Coastguard Worker			panic(fmt.Errorf("there must be only one implementation jar from %q", j.Name()))
122*333d2b36SAndroid Build Coastguard Worker		}
123*333d2b36SAndroid Build Coastguard Worker		return implementationJars[0]
124*333d2b36SAndroid Build Coastguard Worker	}
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Worker	// Supports adding java implementation libraries to module_exports but not sdk.
127*333d2b36SAndroid Build Coastguard Worker	javaLibsSdkMemberType = &librarySdkMemberType{
128*333d2b36SAndroid Build Coastguard Worker		android.SdkMemberTypeBase{
129*333d2b36SAndroid Build Coastguard Worker			PropertyName: "java_libs",
130*333d2b36SAndroid Build Coastguard Worker		},
131*333d2b36SAndroid Build Coastguard Worker		exportImplementationClassesJar,
132*333d2b36SAndroid Build Coastguard Worker		sdkSnapshotFilePathForJar,
133*333d2b36SAndroid Build Coastguard Worker		copyEverythingToSnapshot,
134*333d2b36SAndroid Build Coastguard Worker	}
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker	snapshotRequiresImplementationJar = func(ctx android.SdkMemberContext) bool {
137*333d2b36SAndroid Build Coastguard Worker		// In the S build the build will break if updatable-media does not provide a full implementation
138*333d2b36SAndroid Build Coastguard Worker		// jar. That issue was fixed in Tiramisu by b/229932396.
139*333d2b36SAndroid Build Coastguard Worker		if ctx.IsTargetBuildBeforeTiramisu() && ctx.Name() == "updatable-media" {
140*333d2b36SAndroid Build Coastguard Worker			return true
141*333d2b36SAndroid Build Coastguard Worker		}
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Worker		return false
144*333d2b36SAndroid Build Coastguard Worker	}
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Worker	// Supports adding java boot libraries to module_exports and sdk.
147*333d2b36SAndroid Build Coastguard Worker	//
148*333d2b36SAndroid Build Coastguard Worker	// The build has some implicit dependencies (via the boot jars configuration) on a number of
149*333d2b36SAndroid Build Coastguard Worker	// modules, e.g. core-oj, apache-xml, that are part of the java boot class path and which are
150*333d2b36SAndroid Build Coastguard Worker	// provided by mainline modules (e.g. art, conscrypt, runtime-i18n) but which are not otherwise
151*333d2b36SAndroid Build Coastguard Worker	// used outside those mainline modules.
152*333d2b36SAndroid Build Coastguard Worker	//
153*333d2b36SAndroid Build Coastguard Worker	// As they are not needed outside the mainline modules adding them to the sdk/module-exports as
154*333d2b36SAndroid Build Coastguard Worker	// either java_libs, or java_header_libs would end up exporting more information than was strictly
155*333d2b36SAndroid Build Coastguard Worker	// necessary. The java_boot_libs property to allow those modules to be exported as part of the
156*333d2b36SAndroid Build Coastguard Worker	// sdk/module_exports without exposing any unnecessary information.
157*333d2b36SAndroid Build Coastguard Worker	JavaBootLibsSdkMemberType = &librarySdkMemberType{
158*333d2b36SAndroid Build Coastguard Worker		android.SdkMemberTypeBase{
159*333d2b36SAndroid Build Coastguard Worker			PropertyName: "java_boot_libs",
160*333d2b36SAndroid Build Coastguard Worker			SupportsSdk:  true,
161*333d2b36SAndroid Build Coastguard Worker		},
162*333d2b36SAndroid Build Coastguard Worker		func(ctx android.SdkMemberContext, j *Library) android.Path {
163*333d2b36SAndroid Build Coastguard Worker			if snapshotRequiresImplementationJar(ctx) {
164*333d2b36SAndroid Build Coastguard Worker				return exportImplementationClassesJar(ctx, j)
165*333d2b36SAndroid Build Coastguard Worker			}
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Worker			// Java boot libs are only provided in the SDK to provide access to their dex implementation
168*333d2b36SAndroid Build Coastguard Worker			// jar for use by dexpreopting and boot jars package check. They do not need to provide an
169*333d2b36SAndroid Build Coastguard Worker			// actual implementation jar but the java_import will need a file that exists so just copy an
170*333d2b36SAndroid Build Coastguard Worker			// empty file. Any attempt to use that file as a jar will cause a build error.
171*333d2b36SAndroid Build Coastguard Worker			return ctx.SnapshotBuilder().EmptyFile()
172*333d2b36SAndroid Build Coastguard Worker		},
173*333d2b36SAndroid Build Coastguard Worker		func(ctx android.SdkMemberContext, osPrefix, name string) string {
174*333d2b36SAndroid Build Coastguard Worker			if snapshotRequiresImplementationJar(ctx) {
175*333d2b36SAndroid Build Coastguard Worker				return sdkSnapshotFilePathForJar(ctx, osPrefix, name)
176*333d2b36SAndroid Build Coastguard Worker			}
177*333d2b36SAndroid Build Coastguard Worker
178*333d2b36SAndroid Build Coastguard Worker			// Create a special name for the implementation jar to try and provide some useful information
179*333d2b36SAndroid Build Coastguard Worker			// to a developer that attempts to compile against this.
180*333d2b36SAndroid Build Coastguard Worker			// TODO(b/175714559): Provide a proper error message in Soong not ninja.
181*333d2b36SAndroid Build Coastguard Worker			return filepath.Join(osPrefix, "java_boot_libs", "snapshot", "jars", "are", "invalid", name+jarFileSuffix)
182*333d2b36SAndroid Build Coastguard Worker		},
183*333d2b36SAndroid Build Coastguard Worker		onlyCopyJarToSnapshot,
184*333d2b36SAndroid Build Coastguard Worker	}
185*333d2b36SAndroid Build Coastguard Worker
186*333d2b36SAndroid Build Coastguard Worker	// Supports adding java systemserver libraries to module_exports and sdk.
187*333d2b36SAndroid Build Coastguard Worker	//
188*333d2b36SAndroid Build Coastguard Worker	// The build has some implicit dependencies (via the systemserver jars configuration) on a number
189*333d2b36SAndroid Build Coastguard Worker	// of modules that are part of the java systemserver classpath and which are provided by mainline
190*333d2b36SAndroid Build Coastguard Worker	// modules but which are not otherwise used outside those mainline modules.
191*333d2b36SAndroid Build Coastguard Worker	//
192*333d2b36SAndroid Build Coastguard Worker	// As they are not needed outside the mainline modules adding them to the sdk/module-exports as
193*333d2b36SAndroid Build Coastguard Worker	// either java_libs, or java_header_libs would end up exporting more information than was strictly
194*333d2b36SAndroid Build Coastguard Worker	// necessary. The java_systemserver_libs property to allow those modules to be exported as part of
195*333d2b36SAndroid Build Coastguard Worker	// the sdk/module_exports without exposing any unnecessary information.
196*333d2b36SAndroid Build Coastguard Worker	JavaSystemserverLibsSdkMemberType = &librarySdkMemberType{
197*333d2b36SAndroid Build Coastguard Worker		android.SdkMemberTypeBase{
198*333d2b36SAndroid Build Coastguard Worker			PropertyName: "java_systemserver_libs",
199*333d2b36SAndroid Build Coastguard Worker			SupportsSdk:  true,
200*333d2b36SAndroid Build Coastguard Worker
201*333d2b36SAndroid Build Coastguard Worker			// This was only added in Tiramisu.
202*333d2b36SAndroid Build Coastguard Worker			SupportedBuildReleaseSpecification: "Tiramisu+",
203*333d2b36SAndroid Build Coastguard Worker		},
204*333d2b36SAndroid Build Coastguard Worker		func(ctx android.SdkMemberContext, j *Library) android.Path {
205*333d2b36SAndroid Build Coastguard Worker			// Java systemserver libs are only provided in the SDK to provide access to their dex
206*333d2b36SAndroid Build Coastguard Worker			// implementation jar for use by dexpreopting. They do not need to provide an actual
207*333d2b36SAndroid Build Coastguard Worker			// implementation jar but the java_import will need a file that exists so just copy an empty
208*333d2b36SAndroid Build Coastguard Worker			// file. Any attempt to use that file as a jar will cause a build error.
209*333d2b36SAndroid Build Coastguard Worker			return ctx.SnapshotBuilder().EmptyFile()
210*333d2b36SAndroid Build Coastguard Worker		},
211*333d2b36SAndroid Build Coastguard Worker		func(_ android.SdkMemberContext, osPrefix, name string) string {
212*333d2b36SAndroid Build Coastguard Worker			// Create a special name for the implementation jar to try and provide some useful information
213*333d2b36SAndroid Build Coastguard Worker			// to a developer that attempts to compile against this.
214*333d2b36SAndroid Build Coastguard Worker			// TODO(b/175714559): Provide a proper error message in Soong not ninja.
215*333d2b36SAndroid Build Coastguard Worker			return filepath.Join(osPrefix, "java_systemserver_libs", "snapshot", "jars", "are", "invalid", name+jarFileSuffix)
216*333d2b36SAndroid Build Coastguard Worker		},
217*333d2b36SAndroid Build Coastguard Worker		onlyCopyJarToSnapshot,
218*333d2b36SAndroid Build Coastguard Worker	}
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Worker	// Supports adding java test libraries to module_exports but not sdk.
221*333d2b36SAndroid Build Coastguard Worker	javaTestSdkMemberType = &testSdkMemberType{
222*333d2b36SAndroid Build Coastguard Worker		SdkMemberTypeBase: android.SdkMemberTypeBase{
223*333d2b36SAndroid Build Coastguard Worker			PropertyName: "java_tests",
224*333d2b36SAndroid Build Coastguard Worker		},
225*333d2b36SAndroid Build Coastguard Worker	}
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Worker	// Rule for generating device binary default wrapper
228*333d2b36SAndroid Build Coastguard Worker	deviceBinaryWrapper = pctx.StaticRule("deviceBinaryWrapper", blueprint.RuleParams{
229*333d2b36SAndroid Build Coastguard Worker		Command: `printf '#!/system/bin/sh\n` +
230*333d2b36SAndroid Build Coastguard Worker			`export CLASSPATH=/system/framework/$jar_name\n` +
231*333d2b36SAndroid Build Coastguard Worker			`exec app_process /$partition/bin $main_class "$$@"\n'> ${out}`,
232*333d2b36SAndroid Build Coastguard Worker		Description: "Generating device binary wrapper ${jar_name}",
233*333d2b36SAndroid Build Coastguard Worker	}, "jar_name", "partition", "main_class")
234*333d2b36SAndroid Build Coastguard Worker)
235*333d2b36SAndroid Build Coastguard Worker
236*333d2b36SAndroid Build Coastguard Workertype ProguardSpecInfo struct {
237*333d2b36SAndroid Build Coastguard Worker	// If true, proguard flags files will be exported to reverse dependencies across libs edges
238*333d2b36SAndroid Build Coastguard Worker	// If false, proguard flags files will only be exported to reverse dependencies across
239*333d2b36SAndroid Build Coastguard Worker	// static_libs edges.
240*333d2b36SAndroid Build Coastguard Worker	Export_proguard_flags_files bool
241*333d2b36SAndroid Build Coastguard Worker
242*333d2b36SAndroid Build Coastguard Worker	// TransitiveDepsProguardSpecFiles is a depset of paths to proguard flags files that are exported from
243*333d2b36SAndroid Build Coastguard Worker	// all transitive deps. This list includes all proguard flags files from transitive static dependencies,
244*333d2b36SAndroid Build Coastguard Worker	// and all proguard flags files from transitive libs dependencies which set `export_proguard_spec: true`.
245*333d2b36SAndroid Build Coastguard Worker	ProguardFlagsFiles depset.DepSet[android.Path]
246*333d2b36SAndroid Build Coastguard Worker
247*333d2b36SAndroid Build Coastguard Worker	// implementation detail to store transitive proguard flags files from exporting shared deps
248*333d2b36SAndroid Build Coastguard Worker	UnconditionallyExportedProguardFlags depset.DepSet[android.Path]
249*333d2b36SAndroid Build Coastguard Worker}
250*333d2b36SAndroid Build Coastguard Worker
251*333d2b36SAndroid Build Coastguard Workervar ProguardSpecInfoProvider = blueprint.NewProvider[ProguardSpecInfo]()
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Worker// JavaInfo contains information about a java module for use by modules that depend on it.
254*333d2b36SAndroid Build Coastguard Workertype JavaInfo struct {
255*333d2b36SAndroid Build Coastguard Worker	// HeaderJars is a list of jars that can be passed as the javac classpath in order to link
256*333d2b36SAndroid Build Coastguard Worker	// against this module.  If empty, ImplementationJars should be used instead.
257*333d2b36SAndroid Build Coastguard Worker	// Unlike LocalHeaderJars, HeaderJars includes classes from static dependencies.
258*333d2b36SAndroid Build Coastguard Worker	HeaderJars android.Paths
259*333d2b36SAndroid Build Coastguard Worker
260*333d2b36SAndroid Build Coastguard Worker	RepackagedHeaderJars android.Paths
261*333d2b36SAndroid Build Coastguard Worker
262*333d2b36SAndroid Build Coastguard Worker	// set of header jars for all transitive libs deps
263*333d2b36SAndroid Build Coastguard Worker	TransitiveLibsHeaderJarsForR8 depset.DepSet[android.Path]
264*333d2b36SAndroid Build Coastguard Worker
265*333d2b36SAndroid Build Coastguard Worker	// set of header jars for all transitive static libs deps
266*333d2b36SAndroid Build Coastguard Worker	TransitiveStaticLibsHeaderJarsForR8 depset.DepSet[android.Path]
267*333d2b36SAndroid Build Coastguard Worker
268*333d2b36SAndroid Build Coastguard Worker	// depset of header jars for this module and all transitive static dependencies
269*333d2b36SAndroid Build Coastguard Worker	TransitiveStaticLibsHeaderJars depset.DepSet[android.Path]
270*333d2b36SAndroid Build Coastguard Worker
271*333d2b36SAndroid Build Coastguard Worker	// depset of implementation jars for this module and all transitive static dependencies
272*333d2b36SAndroid Build Coastguard Worker	TransitiveStaticLibsImplementationJars depset.DepSet[android.Path]
273*333d2b36SAndroid Build Coastguard Worker
274*333d2b36SAndroid Build Coastguard Worker	// depset of resource jars for this module and all transitive static dependencies
275*333d2b36SAndroid Build Coastguard Worker	TransitiveStaticLibsResourceJars depset.DepSet[android.Path]
276*333d2b36SAndroid Build Coastguard Worker
277*333d2b36SAndroid Build Coastguard Worker	// ImplementationAndResourceJars is a list of jars that contain the implementations of classes
278*333d2b36SAndroid Build Coastguard Worker	// in the module as well as any resources included in the module.
279*333d2b36SAndroid Build Coastguard Worker	ImplementationAndResourcesJars android.Paths
280*333d2b36SAndroid Build Coastguard Worker
281*333d2b36SAndroid Build Coastguard Worker	// ImplementationJars is a list of jars that contain the implementations of classes in the
282*333d2b36SAndroid Build Coastguard Worker	// module.
283*333d2b36SAndroid Build Coastguard Worker	ImplementationJars android.Paths
284*333d2b36SAndroid Build Coastguard Worker
285*333d2b36SAndroid Build Coastguard Worker	// ResourceJars is a list of jars that contain the resources included in the module.
286*333d2b36SAndroid Build Coastguard Worker	ResourceJars android.Paths
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Worker	// LocalHeaderJars is a list of jars that contain classes from this module, but not from any static dependencies.
289*333d2b36SAndroid Build Coastguard Worker	LocalHeaderJars android.Paths
290*333d2b36SAndroid Build Coastguard Worker
291*333d2b36SAndroid Build Coastguard Worker	// AidlIncludeDirs is a list of directories that should be passed to the aidl tool when
292*333d2b36SAndroid Build Coastguard Worker	// depending on this module.
293*333d2b36SAndroid Build Coastguard Worker	AidlIncludeDirs android.Paths
294*333d2b36SAndroid Build Coastguard Worker
295*333d2b36SAndroid Build Coastguard Worker	// SrcJarArgs is a list of arguments to pass to soong_zip to package the sources of this
296*333d2b36SAndroid Build Coastguard Worker	// module.
297*333d2b36SAndroid Build Coastguard Worker	SrcJarArgs []string
298*333d2b36SAndroid Build Coastguard Worker
299*333d2b36SAndroid Build Coastguard Worker	// SrcJarDeps is a list of paths to depend on when packaging the sources of this module.
300*333d2b36SAndroid Build Coastguard Worker	SrcJarDeps android.Paths
301*333d2b36SAndroid Build Coastguard Worker
302*333d2b36SAndroid Build Coastguard Worker	// The source files of this module and all its transitive static dependencies.
303*333d2b36SAndroid Build Coastguard Worker	TransitiveSrcFiles depset.DepSet[android.Path]
304*333d2b36SAndroid Build Coastguard Worker
305*333d2b36SAndroid Build Coastguard Worker	// ExportedPlugins is a list of paths that should be used as annotation processors for any
306*333d2b36SAndroid Build Coastguard Worker	// module that depends on this module.
307*333d2b36SAndroid Build Coastguard Worker	ExportedPlugins android.Paths
308*333d2b36SAndroid Build Coastguard Worker
309*333d2b36SAndroid Build Coastguard Worker	// ExportedPluginClasses is a list of classes that should be run as annotation processors for
310*333d2b36SAndroid Build Coastguard Worker	// any module that depends on this module.
311*333d2b36SAndroid Build Coastguard Worker	ExportedPluginClasses []string
312*333d2b36SAndroid Build Coastguard Worker
313*333d2b36SAndroid Build Coastguard Worker	// ExportedPluginDisableTurbine is true if this module's annotation processors generate APIs,
314*333d2b36SAndroid Build Coastguard Worker	// requiring disbling turbine for any modules that depend on it.
315*333d2b36SAndroid Build Coastguard Worker	ExportedPluginDisableTurbine bool
316*333d2b36SAndroid Build Coastguard Worker
317*333d2b36SAndroid Build Coastguard Worker	// JacocoReportClassesFile is the path to a jar containing uninstrumented classes that will be
318*333d2b36SAndroid Build Coastguard Worker	// instrumented by jacoco.
319*333d2b36SAndroid Build Coastguard Worker	JacocoReportClassesFile android.Path
320*333d2b36SAndroid Build Coastguard Worker
321*333d2b36SAndroid Build Coastguard Worker	// StubsLinkType provides information about whether the provided jars are stub jars or
322*333d2b36SAndroid Build Coastguard Worker	// implementation jars. If the provider is set by java_sdk_library, the link type is "unknown"
323*333d2b36SAndroid Build Coastguard Worker	// and selection between the stub jar vs implementation jar is deferred to SdkLibrary.sdkJars(...)
324*333d2b36SAndroid Build Coastguard Worker	StubsLinkType StubsLinkType
325*333d2b36SAndroid Build Coastguard Worker
326*333d2b36SAndroid Build Coastguard Worker	// AconfigIntermediateCacheOutputPaths is a path to the cache files collected from the
327*333d2b36SAndroid Build Coastguard Worker	// java_aconfig_library modules that are statically linked to this module.
328*333d2b36SAndroid Build Coastguard Worker	AconfigIntermediateCacheOutputPaths android.Paths
329*333d2b36SAndroid Build Coastguard Worker
330*333d2b36SAndroid Build Coastguard Worker	SdkVersion android.SdkSpec
331*333d2b36SAndroid Build Coastguard Worker}
332*333d2b36SAndroid Build Coastguard Worker
333*333d2b36SAndroid Build Coastguard Workervar JavaInfoProvider = blueprint.NewProvider[*JavaInfo]()
334*333d2b36SAndroid Build Coastguard Worker
335*333d2b36SAndroid Build Coastguard Worker// SyspropPublicStubInfo contains info about the sysprop public stub library that corresponds to
336*333d2b36SAndroid Build Coastguard Worker// the sysprop implementation library.
337*333d2b36SAndroid Build Coastguard Workertype SyspropPublicStubInfo struct {
338*333d2b36SAndroid Build Coastguard Worker	// JavaInfo is the JavaInfoProvider of the sysprop public stub library that corresponds to
339*333d2b36SAndroid Build Coastguard Worker	// the sysprop implementation library.
340*333d2b36SAndroid Build Coastguard Worker	JavaInfo *JavaInfo
341*333d2b36SAndroid Build Coastguard Worker}
342*333d2b36SAndroid Build Coastguard Worker
343*333d2b36SAndroid Build Coastguard Workervar SyspropPublicStubInfoProvider = blueprint.NewProvider[SyspropPublicStubInfo]()
344*333d2b36SAndroid Build Coastguard Worker
345*333d2b36SAndroid Build Coastguard Worker// Methods that need to be implemented for a module that is added to apex java_libs property.
346*333d2b36SAndroid Build Coastguard Workertype ApexDependency interface {
347*333d2b36SAndroid Build Coastguard Worker	HeaderJars() android.Paths
348*333d2b36SAndroid Build Coastguard Worker	ImplementationAndResourcesJars() android.Paths
349*333d2b36SAndroid Build Coastguard Worker}
350*333d2b36SAndroid Build Coastguard Worker
351*333d2b36SAndroid Build Coastguard Worker// Provides build path and install path to DEX jars.
352*333d2b36SAndroid Build Coastguard Workertype UsesLibraryDependency interface {
353*333d2b36SAndroid Build Coastguard Worker	DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath
354*333d2b36SAndroid Build Coastguard Worker	DexJarInstallPath() android.Path
355*333d2b36SAndroid Build Coastguard Worker	ClassLoaderContexts() dexpreopt.ClassLoaderContextMap
356*333d2b36SAndroid Build Coastguard Worker}
357*333d2b36SAndroid Build Coastguard Worker
358*333d2b36SAndroid Build Coastguard Worker// TODO(jungjw): Move this to kythe.go once it's created.
359*333d2b36SAndroid Build Coastguard Workertype xref interface {
360*333d2b36SAndroid Build Coastguard Worker	XrefJavaFiles() android.Paths
361*333d2b36SAndroid Build Coastguard Worker	XrefKotlinFiles() android.Paths
362*333d2b36SAndroid Build Coastguard Worker}
363*333d2b36SAndroid Build Coastguard Worker
364*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) XrefJavaFiles() android.Paths {
365*333d2b36SAndroid Build Coastguard Worker	return j.kytheFiles
366*333d2b36SAndroid Build Coastguard Worker}
367*333d2b36SAndroid Build Coastguard Worker
368*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) XrefKotlinFiles() android.Paths {
369*333d2b36SAndroid Build Coastguard Worker	return j.kytheKotlinFiles
370*333d2b36SAndroid Build Coastguard Worker}
371*333d2b36SAndroid Build Coastguard Worker
372*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) PropagateAconfigValidation() bool {
373*333d2b36SAndroid Build Coastguard Worker	return d.static
374*333d2b36SAndroid Build Coastguard Worker}
375*333d2b36SAndroid Build Coastguard Worker
376*333d2b36SAndroid Build Coastguard Workervar _ android.PropagateAconfigValidationDependencyTag = dependencyTag{}
377*333d2b36SAndroid Build Coastguard Worker
378*333d2b36SAndroid Build Coastguard Workertype dependencyTag struct {
379*333d2b36SAndroid Build Coastguard Worker	blueprint.BaseDependencyTag
380*333d2b36SAndroid Build Coastguard Worker	name string
381*333d2b36SAndroid Build Coastguard Worker
382*333d2b36SAndroid Build Coastguard Worker	// True if the dependency is relinked at runtime.
383*333d2b36SAndroid Build Coastguard Worker	runtimeLinked bool
384*333d2b36SAndroid Build Coastguard Worker
385*333d2b36SAndroid Build Coastguard Worker	// True if the dependency is a toolchain, for example an annotation processor.
386*333d2b36SAndroid Build Coastguard Worker	toolchain bool
387*333d2b36SAndroid Build Coastguard Worker
388*333d2b36SAndroid Build Coastguard Worker	static bool
389*333d2b36SAndroid Build Coastguard Worker
390*333d2b36SAndroid Build Coastguard Worker	installable bool
391*333d2b36SAndroid Build Coastguard Worker}
392*333d2b36SAndroid Build Coastguard Worker
393*333d2b36SAndroid Build Coastguard Workervar _ android.InstallNeededDependencyTag = (*dependencyTag)(nil)
394*333d2b36SAndroid Build Coastguard Worker
395*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) InstallDepNeeded() bool {
396*333d2b36SAndroid Build Coastguard Worker	return d.installable
397*333d2b36SAndroid Build Coastguard Worker}
398*333d2b36SAndroid Build Coastguard Worker
399*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
400*333d2b36SAndroid Build Coastguard Worker	if d.runtimeLinked {
401*333d2b36SAndroid Build Coastguard Worker		return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
402*333d2b36SAndroid Build Coastguard Worker	} else if d.toolchain {
403*333d2b36SAndroid Build Coastguard Worker		return []android.LicenseAnnotation{android.LicenseAnnotationToolchain}
404*333d2b36SAndroid Build Coastguard Worker	}
405*333d2b36SAndroid Build Coastguard Worker	return nil
406*333d2b36SAndroid Build Coastguard Worker}
407*333d2b36SAndroid Build Coastguard Worker
408*333d2b36SAndroid Build Coastguard Workervar _ android.LicenseAnnotationsDependencyTag = dependencyTag{}
409*333d2b36SAndroid Build Coastguard Worker
410*333d2b36SAndroid Build Coastguard Workertype usesLibraryDependencyTag struct {
411*333d2b36SAndroid Build Coastguard Worker	dependencyTag
412*333d2b36SAndroid Build Coastguard Worker	sdkVersion int  // SDK version in which the library appared as a standalone library.
413*333d2b36SAndroid Build Coastguard Worker	optional   bool // If the dependency is optional or required.
414*333d2b36SAndroid Build Coastguard Worker}
415*333d2b36SAndroid Build Coastguard Worker
416*333d2b36SAndroid Build Coastguard Workerfunc makeUsesLibraryDependencyTag(sdkVersion int, optional bool) usesLibraryDependencyTag {
417*333d2b36SAndroid Build Coastguard Worker	return usesLibraryDependencyTag{
418*333d2b36SAndroid Build Coastguard Worker		dependencyTag: dependencyTag{
419*333d2b36SAndroid Build Coastguard Worker			name:          fmt.Sprintf("uses-library-%d", sdkVersion),
420*333d2b36SAndroid Build Coastguard Worker			runtimeLinked: true,
421*333d2b36SAndroid Build Coastguard Worker		},
422*333d2b36SAndroid Build Coastguard Worker		sdkVersion: sdkVersion,
423*333d2b36SAndroid Build Coastguard Worker		optional:   optional,
424*333d2b36SAndroid Build Coastguard Worker	}
425*333d2b36SAndroid Build Coastguard Worker}
426*333d2b36SAndroid Build Coastguard Worker
427*333d2b36SAndroid Build Coastguard Workerfunc IsJniDepTag(depTag blueprint.DependencyTag) bool {
428*333d2b36SAndroid Build Coastguard Worker	return depTag == jniLibTag || depTag == jniInstallTag
429*333d2b36SAndroid Build Coastguard Worker}
430*333d2b36SAndroid Build Coastguard Worker
431*333d2b36SAndroid Build Coastguard Workervar (
432*333d2b36SAndroid Build Coastguard Worker	dataNativeBinsTag       = dependencyTag{name: "dataNativeBins"}
433*333d2b36SAndroid Build Coastguard Worker	dataDeviceBinsTag       = dependencyTag{name: "dataDeviceBins"}
434*333d2b36SAndroid Build Coastguard Worker	staticLibTag            = dependencyTag{name: "staticlib", static: true}
435*333d2b36SAndroid Build Coastguard Worker	libTag                  = dependencyTag{name: "javalib", runtimeLinked: true}
436*333d2b36SAndroid Build Coastguard Worker	sdkLibTag               = dependencyTag{name: "sdklib", runtimeLinked: true}
437*333d2b36SAndroid Build Coastguard Worker	java9LibTag             = dependencyTag{name: "java9lib", runtimeLinked: true}
438*333d2b36SAndroid Build Coastguard Worker	pluginTag               = dependencyTag{name: "plugin", toolchain: true}
439*333d2b36SAndroid Build Coastguard Worker	errorpronePluginTag     = dependencyTag{name: "errorprone-plugin", toolchain: true}
440*333d2b36SAndroid Build Coastguard Worker	exportedPluginTag       = dependencyTag{name: "exported-plugin", toolchain: true}
441*333d2b36SAndroid Build Coastguard Worker	bootClasspathTag        = dependencyTag{name: "bootclasspath", runtimeLinked: true}
442*333d2b36SAndroid Build Coastguard Worker	systemModulesTag        = dependencyTag{name: "system modules", runtimeLinked: true}
443*333d2b36SAndroid Build Coastguard Worker	frameworkResTag         = dependencyTag{name: "framework-res"}
444*333d2b36SAndroid Build Coastguard Worker	kotlinPluginTag         = dependencyTag{name: "kotlin-plugin", toolchain: true}
445*333d2b36SAndroid Build Coastguard Worker	proguardRaiseTag        = dependencyTag{name: "proguard-raise"}
446*333d2b36SAndroid Build Coastguard Worker	certificateTag          = dependencyTag{name: "certificate"}
447*333d2b36SAndroid Build Coastguard Worker	instrumentationForTag   = dependencyTag{name: "instrumentation_for"}
448*333d2b36SAndroid Build Coastguard Worker	extraLintCheckTag       = dependencyTag{name: "extra-lint-check", toolchain: true}
449*333d2b36SAndroid Build Coastguard Worker	jniLibTag               = dependencyTag{name: "jnilib", runtimeLinked: true}
450*333d2b36SAndroid Build Coastguard Worker	r8LibraryJarTag         = dependencyTag{name: "r8-libraryjar", runtimeLinked: true}
451*333d2b36SAndroid Build Coastguard Worker	syspropPublicStubDepTag = dependencyTag{name: "sysprop public stub"}
452*333d2b36SAndroid Build Coastguard Worker	javaApiContributionTag  = dependencyTag{name: "java-api-contribution"}
453*333d2b36SAndroid Build Coastguard Worker	aconfigDeclarationTag   = dependencyTag{name: "aconfig-declaration"}
454*333d2b36SAndroid Build Coastguard Worker	jniInstallTag           = dependencyTag{name: "jni install", runtimeLinked: true, installable: true}
455*333d2b36SAndroid Build Coastguard Worker	usesLibReqTag           = makeUsesLibraryDependencyTag(dexpreopt.AnySdkVersion, false)
456*333d2b36SAndroid Build Coastguard Worker	usesLibOptTag           = makeUsesLibraryDependencyTag(dexpreopt.AnySdkVersion, true)
457*333d2b36SAndroid Build Coastguard Worker	usesLibCompat28OptTag   = makeUsesLibraryDependencyTag(28, true)
458*333d2b36SAndroid Build Coastguard Worker	usesLibCompat29ReqTag   = makeUsesLibraryDependencyTag(29, false)
459*333d2b36SAndroid Build Coastguard Worker	usesLibCompat30OptTag   = makeUsesLibraryDependencyTag(30, true)
460*333d2b36SAndroid Build Coastguard Worker)
461*333d2b36SAndroid Build Coastguard Worker
462*333d2b36SAndroid Build Coastguard Worker// A list of tags for deps used for compiling a module.
463*333d2b36SAndroid Build Coastguard Worker// Any dependency tags that modifies the following properties of `deps` in `Module.collectDeps` should be
464*333d2b36SAndroid Build Coastguard Worker// added to this list:
465*333d2b36SAndroid Build Coastguard Worker// - bootClasspath
466*333d2b36SAndroid Build Coastguard Worker// - classpath
467*333d2b36SAndroid Build Coastguard Worker// - java9Classpath
468*333d2b36SAndroid Build Coastguard Worker// - systemModules
469*333d2b36SAndroid Build Coastguard Worker// - kotlin deps...
470*333d2b36SAndroid Build Coastguard Workervar (
471*333d2b36SAndroid Build Coastguard Worker	compileDependencyTags = []blueprint.DependencyTag{
472*333d2b36SAndroid Build Coastguard Worker		sdkLibTag,
473*333d2b36SAndroid Build Coastguard Worker		libTag,
474*333d2b36SAndroid Build Coastguard Worker		staticLibTag,
475*333d2b36SAndroid Build Coastguard Worker		bootClasspathTag,
476*333d2b36SAndroid Build Coastguard Worker		systemModulesTag,
477*333d2b36SAndroid Build Coastguard Worker		java9LibTag,
478*333d2b36SAndroid Build Coastguard Worker		kotlinPluginTag,
479*333d2b36SAndroid Build Coastguard Worker		syspropPublicStubDepTag,
480*333d2b36SAndroid Build Coastguard Worker		instrumentationForTag,
481*333d2b36SAndroid Build Coastguard Worker	}
482*333d2b36SAndroid Build Coastguard Worker)
483*333d2b36SAndroid Build Coastguard Worker
484*333d2b36SAndroid Build Coastguard Workerfunc IsLibDepTag(depTag blueprint.DependencyTag) bool {
485*333d2b36SAndroid Build Coastguard Worker	return depTag == libTag || depTag == sdkLibTag
486*333d2b36SAndroid Build Coastguard Worker}
487*333d2b36SAndroid Build Coastguard Worker
488*333d2b36SAndroid Build Coastguard Workerfunc IsStaticLibDepTag(depTag blueprint.DependencyTag) bool {
489*333d2b36SAndroid Build Coastguard Worker	return depTag == staticLibTag
490*333d2b36SAndroid Build Coastguard Worker}
491*333d2b36SAndroid Build Coastguard Worker
492*333d2b36SAndroid Build Coastguard Workertype sdkDep struct {
493*333d2b36SAndroid Build Coastguard Worker	useModule, useFiles, invalidVersion bool
494*333d2b36SAndroid Build Coastguard Worker
495*333d2b36SAndroid Build Coastguard Worker	// The modules that will be added to the bootclasspath when targeting 1.8 or lower
496*333d2b36SAndroid Build Coastguard Worker	bootclasspath []string
497*333d2b36SAndroid Build Coastguard Worker
498*333d2b36SAndroid Build Coastguard Worker	// The default system modules to use. Will be an empty string if no system
499*333d2b36SAndroid Build Coastguard Worker	// modules are to be used.
500*333d2b36SAndroid Build Coastguard Worker	systemModules string
501*333d2b36SAndroid Build Coastguard Worker
502*333d2b36SAndroid Build Coastguard Worker	// The modules that will be added to the classpath regardless of the Java language level targeted
503*333d2b36SAndroid Build Coastguard Worker	classpath []string
504*333d2b36SAndroid Build Coastguard Worker
505*333d2b36SAndroid Build Coastguard Worker	// The modules that will be added ot the classpath when targeting 1.9 or higher
506*333d2b36SAndroid Build Coastguard Worker	// (normally these will be on the bootclasspath when targeting 1.8 or lower)
507*333d2b36SAndroid Build Coastguard Worker	java9Classpath []string
508*333d2b36SAndroid Build Coastguard Worker
509*333d2b36SAndroid Build Coastguard Worker	frameworkResModule string
510*333d2b36SAndroid Build Coastguard Worker
511*333d2b36SAndroid Build Coastguard Worker	jars android.Paths
512*333d2b36SAndroid Build Coastguard Worker	aidl android.OptionalPath
513*333d2b36SAndroid Build Coastguard Worker
514*333d2b36SAndroid Build Coastguard Worker	noStandardLibs, noFrameworksLibs bool
515*333d2b36SAndroid Build Coastguard Worker}
516*333d2b36SAndroid Build Coastguard Worker
517*333d2b36SAndroid Build Coastguard Workerfunc (s sdkDep) hasStandardLibs() bool {
518*333d2b36SAndroid Build Coastguard Worker	return !s.noStandardLibs
519*333d2b36SAndroid Build Coastguard Worker}
520*333d2b36SAndroid Build Coastguard Worker
521*333d2b36SAndroid Build Coastguard Workerfunc (s sdkDep) hasFrameworkLibs() bool {
522*333d2b36SAndroid Build Coastguard Worker	return !s.noStandardLibs && !s.noFrameworksLibs
523*333d2b36SAndroid Build Coastguard Worker}
524*333d2b36SAndroid Build Coastguard Worker
525*333d2b36SAndroid Build Coastguard Workertype jniLib struct {
526*333d2b36SAndroid Build Coastguard Worker	name           string
527*333d2b36SAndroid Build Coastguard Worker	path           android.Path
528*333d2b36SAndroid Build Coastguard Worker	target         android.Target
529*333d2b36SAndroid Build Coastguard Worker	coverageFile   android.OptionalPath
530*333d2b36SAndroid Build Coastguard Worker	unstrippedFile android.Path
531*333d2b36SAndroid Build Coastguard Worker	partition      string
532*333d2b36SAndroid Build Coastguard Worker	installPaths   android.InstallPaths
533*333d2b36SAndroid Build Coastguard Worker}
534*333d2b36SAndroid Build Coastguard Worker
535*333d2b36SAndroid Build Coastguard Workerfunc sdkDeps(ctx android.BottomUpMutatorContext, sdkContext android.SdkContext, d dexer) {
536*333d2b36SAndroid Build Coastguard Worker	sdkDep := decodeSdkDep(ctx, sdkContext)
537*333d2b36SAndroid Build Coastguard Worker	if sdkDep.useModule {
538*333d2b36SAndroid Build Coastguard Worker		ctx.AddVariationDependencies(nil, bootClasspathTag, sdkDep.bootclasspath...)
539*333d2b36SAndroid Build Coastguard Worker		ctx.AddVariationDependencies(nil, java9LibTag, sdkDep.java9Classpath...)
540*333d2b36SAndroid Build Coastguard Worker		ctx.AddVariationDependencies(nil, sdkLibTag, sdkDep.classpath...)
541*333d2b36SAndroid Build Coastguard Worker		if d.effectiveOptimizeEnabled() && sdkDep.hasStandardLibs() {
542*333d2b36SAndroid Build Coastguard Worker			ctx.AddVariationDependencies(nil, proguardRaiseTag,
543*333d2b36SAndroid Build Coastguard Worker				config.LegacyCorePlatformBootclasspathLibraries...,
544*333d2b36SAndroid Build Coastguard Worker			)
545*333d2b36SAndroid Build Coastguard Worker		}
546*333d2b36SAndroid Build Coastguard Worker		if d.effectiveOptimizeEnabled() && sdkDep.hasFrameworkLibs() {
547*333d2b36SAndroid Build Coastguard Worker			ctx.AddVariationDependencies(nil, proguardRaiseTag, config.FrameworkLibraries...)
548*333d2b36SAndroid Build Coastguard Worker		}
549*333d2b36SAndroid Build Coastguard Worker	}
550*333d2b36SAndroid Build Coastguard Worker	if sdkDep.systemModules != "" {
551*333d2b36SAndroid Build Coastguard Worker		ctx.AddVariationDependencies(nil, systemModulesTag, sdkDep.systemModules)
552*333d2b36SAndroid Build Coastguard Worker	}
553*333d2b36SAndroid Build Coastguard Worker}
554*333d2b36SAndroid Build Coastguard Worker
555*333d2b36SAndroid Build Coastguard Workertype deps struct {
556*333d2b36SAndroid Build Coastguard Worker	// bootClasspath is the list of jars that form the boot classpath (generally the java.* and
557*333d2b36SAndroid Build Coastguard Worker	// android.* classes) for tools that still use it.  javac targeting 1.9 or higher uses
558*333d2b36SAndroid Build Coastguard Worker	// systemModules and java9Classpath instead.
559*333d2b36SAndroid Build Coastguard Worker	bootClasspath classpath
560*333d2b36SAndroid Build Coastguard Worker
561*333d2b36SAndroid Build Coastguard Worker	// classpath is the list of jars that form the classpath for javac and kotlinc rules.  It
562*333d2b36SAndroid Build Coastguard Worker	// contains header jars for all static and non-static dependencies.
563*333d2b36SAndroid Build Coastguard Worker	classpath classpath
564*333d2b36SAndroid Build Coastguard Worker
565*333d2b36SAndroid Build Coastguard Worker	// dexClasspath is the list of jars that form the classpath for d8 and r8 rules.  It contains
566*333d2b36SAndroid Build Coastguard Worker	// header jars for all non-static dependencies.  Static dependencies have already been
567*333d2b36SAndroid Build Coastguard Worker	// combined into the program jar.
568*333d2b36SAndroid Build Coastguard Worker	dexClasspath classpath
569*333d2b36SAndroid Build Coastguard Worker
570*333d2b36SAndroid Build Coastguard Worker	// java9Classpath is the list of jars that will be added to the classpath when targeting
571*333d2b36SAndroid Build Coastguard Worker	// 1.9 or higher.  It generally contains the android.* classes, while the java.* classes
572*333d2b36SAndroid Build Coastguard Worker	// are provided by systemModules.
573*333d2b36SAndroid Build Coastguard Worker	java9Classpath classpath
574*333d2b36SAndroid Build Coastguard Worker
575*333d2b36SAndroid Build Coastguard Worker	processorPath           classpath ``
576*333d2b36SAndroid Build Coastguard Worker	errorProneProcessorPath classpath
577*333d2b36SAndroid Build Coastguard Worker	processorClasses        []string
578*333d2b36SAndroid Build Coastguard Worker	staticJars              android.Paths
579*333d2b36SAndroid Build Coastguard Worker	staticHeaderJars        android.Paths
580*333d2b36SAndroid Build Coastguard Worker	staticResourceJars      android.Paths
581*333d2b36SAndroid Build Coastguard Worker	aidlIncludeDirs         android.Paths
582*333d2b36SAndroid Build Coastguard Worker	srcs                    android.Paths
583*333d2b36SAndroid Build Coastguard Worker	srcJars                 android.Paths
584*333d2b36SAndroid Build Coastguard Worker	systemModules           *systemModules
585*333d2b36SAndroid Build Coastguard Worker	aidlPreprocess          android.OptionalPath
586*333d2b36SAndroid Build Coastguard Worker	kotlinPlugins           android.Paths
587*333d2b36SAndroid Build Coastguard Worker	aconfigProtoFiles       android.Paths
588*333d2b36SAndroid Build Coastguard Worker
589*333d2b36SAndroid Build Coastguard Worker	disableTurbine bool
590*333d2b36SAndroid Build Coastguard Worker
591*333d2b36SAndroid Build Coastguard Worker	transitiveStaticLibsHeaderJars         []depset.DepSet[android.Path]
592*333d2b36SAndroid Build Coastguard Worker	transitiveStaticLibsImplementationJars []depset.DepSet[android.Path]
593*333d2b36SAndroid Build Coastguard Worker	transitiveStaticLibsResourceJars       []depset.DepSet[android.Path]
594*333d2b36SAndroid Build Coastguard Worker}
595*333d2b36SAndroid Build Coastguard Worker
596*333d2b36SAndroid Build Coastguard Workerfunc checkProducesJars(ctx android.ModuleContext, dep android.SourceFileProducer) {
597*333d2b36SAndroid Build Coastguard Worker	for _, f := range dep.Srcs() {
598*333d2b36SAndroid Build Coastguard Worker		if f.Ext() != ".jar" {
599*333d2b36SAndroid Build Coastguard Worker			ctx.ModuleErrorf("genrule %q must generate files ending with .jar to be used as a libs or static_libs dependency",
600*333d2b36SAndroid Build Coastguard Worker				ctx.OtherModuleName(dep.(blueprint.Module)))
601*333d2b36SAndroid Build Coastguard Worker		}
602*333d2b36SAndroid Build Coastguard Worker	}
603*333d2b36SAndroid Build Coastguard Worker}
604*333d2b36SAndroid Build Coastguard Worker
605*333d2b36SAndroid Build Coastguard Workerfunc getJavaVersion(ctx android.ModuleContext, javaVersion string, sdkContext android.SdkContext) javaVersion {
606*333d2b36SAndroid Build Coastguard Worker	if javaVersion != "" {
607*333d2b36SAndroid Build Coastguard Worker		return normalizeJavaVersion(ctx, javaVersion)
608*333d2b36SAndroid Build Coastguard Worker	} else if ctx.Device() {
609*333d2b36SAndroid Build Coastguard Worker		return defaultJavaLanguageVersion(ctx, sdkContext.SdkVersion(ctx))
610*333d2b36SAndroid Build Coastguard Worker	} else if ctx.Config().TargetsJava21() {
611*333d2b36SAndroid Build Coastguard Worker		// Build flag that controls whether Java 21 is used as the default
612*333d2b36SAndroid Build Coastguard Worker		// target version, or Java 17.
613*333d2b36SAndroid Build Coastguard Worker		return JAVA_VERSION_21
614*333d2b36SAndroid Build Coastguard Worker	} else {
615*333d2b36SAndroid Build Coastguard Worker		return JAVA_VERSION_17
616*333d2b36SAndroid Build Coastguard Worker	}
617*333d2b36SAndroid Build Coastguard Worker}
618*333d2b36SAndroid Build Coastguard Worker
619*333d2b36SAndroid Build Coastguard Worker// Java version for stubs generation
620*333d2b36SAndroid Build Coastguard Workerfunc getStubsJavaVersion() javaVersion {
621*333d2b36SAndroid Build Coastguard Worker	return JAVA_VERSION_8
622*333d2b36SAndroid Build Coastguard Worker}
623*333d2b36SAndroid Build Coastguard Worker
624*333d2b36SAndroid Build Coastguard Workertype javaVersion int
625*333d2b36SAndroid Build Coastguard Worker
626*333d2b36SAndroid Build Coastguard Workerconst (
627*333d2b36SAndroid Build Coastguard Worker	JAVA_VERSION_UNSUPPORTED = 0
628*333d2b36SAndroid Build Coastguard Worker	JAVA_VERSION_6           = 6
629*333d2b36SAndroid Build Coastguard Worker	JAVA_VERSION_7           = 7
630*333d2b36SAndroid Build Coastguard Worker	JAVA_VERSION_8           = 8
631*333d2b36SAndroid Build Coastguard Worker	JAVA_VERSION_9           = 9
632*333d2b36SAndroid Build Coastguard Worker	JAVA_VERSION_11          = 11
633*333d2b36SAndroid Build Coastguard Worker	JAVA_VERSION_17          = 17
634*333d2b36SAndroid Build Coastguard Worker	JAVA_VERSION_21          = 21
635*333d2b36SAndroid Build Coastguard Worker)
636*333d2b36SAndroid Build Coastguard Worker
637*333d2b36SAndroid Build Coastguard Workerfunc (v javaVersion) String() string {
638*333d2b36SAndroid Build Coastguard Worker	switch v {
639*333d2b36SAndroid Build Coastguard Worker	case JAVA_VERSION_6:
640*333d2b36SAndroid Build Coastguard Worker		// Java version 1.6 no longer supported, bumping to 1.8
641*333d2b36SAndroid Build Coastguard Worker		return "1.8"
642*333d2b36SAndroid Build Coastguard Worker	case JAVA_VERSION_7:
643*333d2b36SAndroid Build Coastguard Worker		// Java version 1.7 no longer supported, bumping to 1.8
644*333d2b36SAndroid Build Coastguard Worker		return "1.8"
645*333d2b36SAndroid Build Coastguard Worker	case JAVA_VERSION_8:
646*333d2b36SAndroid Build Coastguard Worker		return "1.8"
647*333d2b36SAndroid Build Coastguard Worker	case JAVA_VERSION_9:
648*333d2b36SAndroid Build Coastguard Worker		return "1.9"
649*333d2b36SAndroid Build Coastguard Worker	case JAVA_VERSION_11:
650*333d2b36SAndroid Build Coastguard Worker		return "11"
651*333d2b36SAndroid Build Coastguard Worker	case JAVA_VERSION_17:
652*333d2b36SAndroid Build Coastguard Worker		return "17"
653*333d2b36SAndroid Build Coastguard Worker	case JAVA_VERSION_21:
654*333d2b36SAndroid Build Coastguard Worker		return "21"
655*333d2b36SAndroid Build Coastguard Worker	default:
656*333d2b36SAndroid Build Coastguard Worker		return "unsupported"
657*333d2b36SAndroid Build Coastguard Worker	}
658*333d2b36SAndroid Build Coastguard Worker}
659*333d2b36SAndroid Build Coastguard Worker
660*333d2b36SAndroid Build Coastguard Workerfunc (v javaVersion) StringForKotlinc() string {
661*333d2b36SAndroid Build Coastguard Worker	// $ ./external/kotlinc/bin/kotlinc -jvm-target foo
662*333d2b36SAndroid Build Coastguard Worker	// error: unknown JVM target version: foo
663*333d2b36SAndroid Build Coastguard Worker	// Supported versions: 1.8, 9, 10, 11, 12, 13, 14, 15, 16, 17
664*333d2b36SAndroid Build Coastguard Worker	switch v {
665*333d2b36SAndroid Build Coastguard Worker	case JAVA_VERSION_6:
666*333d2b36SAndroid Build Coastguard Worker		return "1.8"
667*333d2b36SAndroid Build Coastguard Worker	case JAVA_VERSION_7:
668*333d2b36SAndroid Build Coastguard Worker		return "1.8"
669*333d2b36SAndroid Build Coastguard Worker	case JAVA_VERSION_9:
670*333d2b36SAndroid Build Coastguard Worker		return "9"
671*333d2b36SAndroid Build Coastguard Worker	default:
672*333d2b36SAndroid Build Coastguard Worker		return v.String()
673*333d2b36SAndroid Build Coastguard Worker	}
674*333d2b36SAndroid Build Coastguard Worker}
675*333d2b36SAndroid Build Coastguard Worker
676*333d2b36SAndroid Build Coastguard Worker// Returns true if javac targeting this version uses system modules instead of a bootclasspath.
677*333d2b36SAndroid Build Coastguard Workerfunc (v javaVersion) usesJavaModules() bool {
678*333d2b36SAndroid Build Coastguard Worker	return v >= 9
679*333d2b36SAndroid Build Coastguard Worker}
680*333d2b36SAndroid Build Coastguard Worker
681*333d2b36SAndroid Build Coastguard Workerfunc normalizeJavaVersion(ctx android.BaseModuleContext, javaVersion string) javaVersion {
682*333d2b36SAndroid Build Coastguard Worker	switch javaVersion {
683*333d2b36SAndroid Build Coastguard Worker	case "1.6", "6":
684*333d2b36SAndroid Build Coastguard Worker		// Java version 1.6 no longer supported, bumping to 1.8
685*333d2b36SAndroid Build Coastguard Worker		return JAVA_VERSION_8
686*333d2b36SAndroid Build Coastguard Worker	case "1.7", "7":
687*333d2b36SAndroid Build Coastguard Worker		// Java version 1.7 no longer supported, bumping to 1.8
688*333d2b36SAndroid Build Coastguard Worker		return JAVA_VERSION_8
689*333d2b36SAndroid Build Coastguard Worker	case "1.8", "8":
690*333d2b36SAndroid Build Coastguard Worker		return JAVA_VERSION_8
691*333d2b36SAndroid Build Coastguard Worker	case "1.9", "9":
692*333d2b36SAndroid Build Coastguard Worker		return JAVA_VERSION_9
693*333d2b36SAndroid Build Coastguard Worker	case "11":
694*333d2b36SAndroid Build Coastguard Worker		return JAVA_VERSION_11
695*333d2b36SAndroid Build Coastguard Worker	case "17":
696*333d2b36SAndroid Build Coastguard Worker		return JAVA_VERSION_17
697*333d2b36SAndroid Build Coastguard Worker	case "21":
698*333d2b36SAndroid Build Coastguard Worker		return JAVA_VERSION_21
699*333d2b36SAndroid Build Coastguard Worker	case "10", "12", "13", "14", "15", "16":
700*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("java_version", "Java language level %s is not supported", javaVersion)
701*333d2b36SAndroid Build Coastguard Worker		return JAVA_VERSION_UNSUPPORTED
702*333d2b36SAndroid Build Coastguard Worker	default:
703*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("java_version", "Unrecognized Java language level")
704*333d2b36SAndroid Build Coastguard Worker		return JAVA_VERSION_UNSUPPORTED
705*333d2b36SAndroid Build Coastguard Worker	}
706*333d2b36SAndroid Build Coastguard Worker}
707*333d2b36SAndroid Build Coastguard Worker
708*333d2b36SAndroid Build Coastguard Worker//
709*333d2b36SAndroid Build Coastguard Worker// Java libraries (.jar file)
710*333d2b36SAndroid Build Coastguard Worker//
711*333d2b36SAndroid Build Coastguard Worker
712*333d2b36SAndroid Build Coastguard Workertype Library struct {
713*333d2b36SAndroid Build Coastguard Worker	Module
714*333d2b36SAndroid Build Coastguard Worker
715*333d2b36SAndroid Build Coastguard Worker	combinedExportedProguardFlagsFile android.Path
716*333d2b36SAndroid Build Coastguard Worker
717*333d2b36SAndroid Build Coastguard Worker	InstallMixin func(ctx android.ModuleContext, installPath android.Path) (extraInstallDeps android.InstallPaths)
718*333d2b36SAndroid Build Coastguard Worker}
719*333d2b36SAndroid Build Coastguard Worker
720*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*Library)(nil)
721*333d2b36SAndroid Build Coastguard Worker
722*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) CheckDepsMinSdkVersion(ctx android.ModuleContext) {
723*333d2b36SAndroid Build Coastguard Worker	CheckMinSdkVersion(ctx, j)
724*333d2b36SAndroid Build Coastguard Worker}
725*333d2b36SAndroid Build Coastguard Worker
726*333d2b36SAndroid Build Coastguard Worker// Provides access to the list of permitted packages from apex boot jars.
727*333d2b36SAndroid Build Coastguard Workertype PermittedPackagesForUpdatableBootJars interface {
728*333d2b36SAndroid Build Coastguard Worker	PermittedPackagesForUpdatableBootJars() []string
729*333d2b36SAndroid Build Coastguard Worker}
730*333d2b36SAndroid Build Coastguard Worker
731*333d2b36SAndroid Build Coastguard Workervar _ PermittedPackagesForUpdatableBootJars = (*Library)(nil)
732*333d2b36SAndroid Build Coastguard Worker
733*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) PermittedPackagesForUpdatableBootJars() []string {
734*333d2b36SAndroid Build Coastguard Worker	return j.properties.Permitted_packages
735*333d2b36SAndroid Build Coastguard Worker}
736*333d2b36SAndroid Build Coastguard Worker
737*333d2b36SAndroid Build Coastguard Workerfunc shouldUncompressDex(ctx android.ModuleContext, libName string, dexpreopter *dexpreopter) bool {
738*333d2b36SAndroid Build Coastguard Worker	// Store uncompressed (and aligned) any dex files from jars in APEXes.
739*333d2b36SAndroid Build Coastguard Worker	if apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider); !apexInfo.IsForPlatform() {
740*333d2b36SAndroid Build Coastguard Worker		return true
741*333d2b36SAndroid Build Coastguard Worker	}
742*333d2b36SAndroid Build Coastguard Worker
743*333d2b36SAndroid Build Coastguard Worker	// Store uncompressed (and do not strip) dex files from boot class path jars.
744*333d2b36SAndroid Build Coastguard Worker	if inList(ctx.ModuleName(), ctx.Config().BootJars()) {
745*333d2b36SAndroid Build Coastguard Worker		return true
746*333d2b36SAndroid Build Coastguard Worker	}
747*333d2b36SAndroid Build Coastguard Worker
748*333d2b36SAndroid Build Coastguard Worker	// Store uncompressed dex files that are preopted on /system or /system_other.
749*333d2b36SAndroid Build Coastguard Worker	if !dexpreopter.dexpreoptDisabled(ctx, libName) {
750*333d2b36SAndroid Build Coastguard Worker		return true
751*333d2b36SAndroid Build Coastguard Worker	}
752*333d2b36SAndroid Build Coastguard Worker
753*333d2b36SAndroid Build Coastguard Worker	if ctx.Config().UncompressPrivAppDex() &&
754*333d2b36SAndroid Build Coastguard Worker		inList(ctx.ModuleName(), ctx.Config().ModulesLoadedByPrivilegedModules()) {
755*333d2b36SAndroid Build Coastguard Worker		return true
756*333d2b36SAndroid Build Coastguard Worker	}
757*333d2b36SAndroid Build Coastguard Worker
758*333d2b36SAndroid Build Coastguard Worker	return false
759*333d2b36SAndroid Build Coastguard Worker}
760*333d2b36SAndroid Build Coastguard Worker
761*333d2b36SAndroid Build Coastguard Worker// Sets `dexer.dexProperties.Uncompress_dex` to the proper value.
762*333d2b36SAndroid Build Coastguard Workerfunc setUncompressDex(ctx android.ModuleContext, dexpreopter *dexpreopter, dexer *dexer) {
763*333d2b36SAndroid Build Coastguard Worker	if dexer.dexProperties.Uncompress_dex == nil {
764*333d2b36SAndroid Build Coastguard Worker		// If the value was not force-set by the user, use reasonable default based on the module.
765*333d2b36SAndroid Build Coastguard Worker		dexer.dexProperties.Uncompress_dex = proptools.BoolPtr(shouldUncompressDex(ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), dexpreopter))
766*333d2b36SAndroid Build Coastguard Worker	}
767*333d2b36SAndroid Build Coastguard Worker}
768*333d2b36SAndroid Build Coastguard Worker
769*333d2b36SAndroid Build Coastguard Worker// list of java_library modules that set platform_apis: true
770*333d2b36SAndroid Build Coastguard Worker// this property is a no-op for java_library
771*333d2b36SAndroid Build Coastguard Worker// TODO (b/215379393): Remove this allowlist
772*333d2b36SAndroid Build Coastguard Workervar (
773*333d2b36SAndroid Build Coastguard Worker	aospPlatformApiAllowlist = map[string]bool{
774*333d2b36SAndroid Build Coastguard Worker		"adservices-test-scenarios":                         true,
775*333d2b36SAndroid Build Coastguard Worker		"aidl-cpp-java-test-interface-java":                 true,
776*333d2b36SAndroid Build Coastguard Worker		"aidl-test-extras-java":                             true,
777*333d2b36SAndroid Build Coastguard Worker		"aidl-test-interface-java":                          true,
778*333d2b36SAndroid Build Coastguard Worker		"aidl-test-interface-permission-java":               true,
779*333d2b36SAndroid Build Coastguard Worker		"aidl_test_java_client_permission":                  true,
780*333d2b36SAndroid Build Coastguard Worker		"aidl_test_java_client_sdk1":                        true,
781*333d2b36SAndroid Build Coastguard Worker		"aidl_test_java_client_sdk29":                       true,
782*333d2b36SAndroid Build Coastguard Worker		"aidl_test_java_client":                             true,
783*333d2b36SAndroid Build Coastguard Worker		"aidl_test_java_service_permission":                 true,
784*333d2b36SAndroid Build Coastguard Worker		"aidl_test_java_service_sdk1":                       true,
785*333d2b36SAndroid Build Coastguard Worker		"aidl_test_java_service_sdk29":                      true,
786*333d2b36SAndroid Build Coastguard Worker		"aidl_test_java_service":                            true,
787*333d2b36SAndroid Build Coastguard Worker		"aidl_test_loggable_interface-java":                 true,
788*333d2b36SAndroid Build Coastguard Worker		"aidl_test_nonvintf_parcelable-V1-java":             true,
789*333d2b36SAndroid Build Coastguard Worker		"aidl_test_nonvintf_parcelable-V2-java":             true,
790*333d2b36SAndroid Build Coastguard Worker		"aidl_test_unstable_parcelable-java":                true,
791*333d2b36SAndroid Build Coastguard Worker		"aidl_test_vintf_parcelable-V1-java":                true,
792*333d2b36SAndroid Build Coastguard Worker		"aidl_test_vintf_parcelable-V2-java":                true,
793*333d2b36SAndroid Build Coastguard Worker		"android.aidl.test.trunk-V1-java":                   true,
794*333d2b36SAndroid Build Coastguard Worker		"android.aidl.test.trunk-V2-java":                   true,
795*333d2b36SAndroid Build Coastguard Worker		"android.frameworks.location.altitude-V1-java":      true,
796*333d2b36SAndroid Build Coastguard Worker		"android.frameworks.location.altitude-V2-java":      true,
797*333d2b36SAndroid Build Coastguard Worker		"android.frameworks.stats-V1-java":                  true,
798*333d2b36SAndroid Build Coastguard Worker		"android.frameworks.stats-V2-java":                  true,
799*333d2b36SAndroid Build Coastguard Worker		"android.frameworks.stats-V3-java":                  true,
800*333d2b36SAndroid Build Coastguard Worker		"android.hardware.authsecret-V1-java":               true,
801*333d2b36SAndroid Build Coastguard Worker		"android.hardware.authsecret-V2-java":               true,
802*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.common-V1-java":        true,
803*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.common-V2-java":        true,
804*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.common-V3-java":        true,
805*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.common-V4-java":        true,
806*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.face-V1-java":          true,
807*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.face-V2-java":          true,
808*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.face-V3-java":          true,
809*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.face-V4-java":          true,
810*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.fingerprint-V1-java":   true,
811*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.fingerprint-V2-java":   true,
812*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.fingerprint-V3-java":   true,
813*333d2b36SAndroid Build Coastguard Worker		"android.hardware.biometrics.fingerprint-V4-java":   true,
814*333d2b36SAndroid Build Coastguard Worker		"android.hardware.bluetooth.lmp_event-V1-java":      true,
815*333d2b36SAndroid Build Coastguard Worker		"android.hardware.confirmationui-V1-java":           true,
816*333d2b36SAndroid Build Coastguard Worker		"android.hardware.confirmationui-V2-java":           true,
817*333d2b36SAndroid Build Coastguard Worker		"android.hardware.gatekeeper-V1-java":               true,
818*333d2b36SAndroid Build Coastguard Worker		"android.hardware.gatekeeper-V2-java":               true,
819*333d2b36SAndroid Build Coastguard Worker		"android.hardware.gnss-V1-java":                     true,
820*333d2b36SAndroid Build Coastguard Worker		"android.hardware.gnss-V2-java":                     true,
821*333d2b36SAndroid Build Coastguard Worker		"android.hardware.gnss-V3-java":                     true,
822*333d2b36SAndroid Build Coastguard Worker		"android.hardware.gnss-V4-java":                     true,
823*333d2b36SAndroid Build Coastguard Worker		"android.hardware.graphics.common-V1-java":          true,
824*333d2b36SAndroid Build Coastguard Worker		"android.hardware.graphics.common-V2-java":          true,
825*333d2b36SAndroid Build Coastguard Worker		"android.hardware.graphics.common-V3-java":          true,
826*333d2b36SAndroid Build Coastguard Worker		"android.hardware.graphics.common-V4-java":          true,
827*333d2b36SAndroid Build Coastguard Worker		"android.hardware.graphics.common-V5-java":          true,
828*333d2b36SAndroid Build Coastguard Worker		"android.hardware.identity-V1-java":                 true,
829*333d2b36SAndroid Build Coastguard Worker		"android.hardware.identity-V2-java":                 true,
830*333d2b36SAndroid Build Coastguard Worker		"android.hardware.identity-V3-java":                 true,
831*333d2b36SAndroid Build Coastguard Worker		"android.hardware.identity-V4-java":                 true,
832*333d2b36SAndroid Build Coastguard Worker		"android.hardware.identity-V5-java":                 true,
833*333d2b36SAndroid Build Coastguard Worker		"android.hardware.identity-V6-java":                 true,
834*333d2b36SAndroid Build Coastguard Worker		"android.hardware.keymaster-V1-java":                true,
835*333d2b36SAndroid Build Coastguard Worker		"android.hardware.keymaster-V2-java":                true,
836*333d2b36SAndroid Build Coastguard Worker		"android.hardware.keymaster-V3-java":                true,
837*333d2b36SAndroid Build Coastguard Worker		"android.hardware.keymaster-V4-java":                true,
838*333d2b36SAndroid Build Coastguard Worker		"android.hardware.keymaster-V5-java":                true,
839*333d2b36SAndroid Build Coastguard Worker		"android.hardware.oemlock-V1-java":                  true,
840*333d2b36SAndroid Build Coastguard Worker		"android.hardware.oemlock-V2-java":                  true,
841*333d2b36SAndroid Build Coastguard Worker		"android.hardware.power.stats-V1-java":              true,
842*333d2b36SAndroid Build Coastguard Worker		"android.hardware.power.stats-V2-java":              true,
843*333d2b36SAndroid Build Coastguard Worker		"android.hardware.power.stats-V3-java":              true,
844*333d2b36SAndroid Build Coastguard Worker		"android.hardware.power-V1-java":                    true,
845*333d2b36SAndroid Build Coastguard Worker		"android.hardware.power-V2-java":                    true,
846*333d2b36SAndroid Build Coastguard Worker		"android.hardware.power-V3-java":                    true,
847*333d2b36SAndroid Build Coastguard Worker		"android.hardware.power-V4-java":                    true,
848*333d2b36SAndroid Build Coastguard Worker		"android.hardware.power-V5-java":                    true,
849*333d2b36SAndroid Build Coastguard Worker		"android.hardware.rebootescrow-V1-java":             true,
850*333d2b36SAndroid Build Coastguard Worker		"android.hardware.rebootescrow-V2-java":             true,
851*333d2b36SAndroid Build Coastguard Worker		"android.hardware.security.authgraph-V1-java":       true,
852*333d2b36SAndroid Build Coastguard Worker		"android.hardware.security.keymint-V1-java":         true,
853*333d2b36SAndroid Build Coastguard Worker		"android.hardware.security.keymint-V2-java":         true,
854*333d2b36SAndroid Build Coastguard Worker		"android.hardware.security.keymint-V3-java":         true,
855*333d2b36SAndroid Build Coastguard Worker		"android.hardware.security.keymint-V4-java":         true,
856*333d2b36SAndroid Build Coastguard Worker		"android.hardware.security.secretkeeper-V1-java":    true,
857*333d2b36SAndroid Build Coastguard Worker		"android.hardware.security.secureclock-V1-java":     true,
858*333d2b36SAndroid Build Coastguard Worker		"android.hardware.security.secureclock-V2-java":     true,
859*333d2b36SAndroid Build Coastguard Worker		"android.hardware.thermal-V1-java":                  true,
860*333d2b36SAndroid Build Coastguard Worker		"android.hardware.thermal-V2-java":                  true,
861*333d2b36SAndroid Build Coastguard Worker		"android.hardware.threadnetwork-V1-java":            true,
862*333d2b36SAndroid Build Coastguard Worker		"android.hardware.weaver-V1-java":                   true,
863*333d2b36SAndroid Build Coastguard Worker		"android.hardware.weaver-V2-java":                   true,
864*333d2b36SAndroid Build Coastguard Worker		"android.hardware.weaver-V3-java":                   true,
865*333d2b36SAndroid Build Coastguard Worker		"android.security.attestationmanager-java":          true,
866*333d2b36SAndroid Build Coastguard Worker		"android.security.authorization-java":               true,
867*333d2b36SAndroid Build Coastguard Worker		"android.security.compat-java":                      true,
868*333d2b36SAndroid Build Coastguard Worker		"android.security.legacykeystore-java":              true,
869*333d2b36SAndroid Build Coastguard Worker		"android.security.maintenance-java":                 true,
870*333d2b36SAndroid Build Coastguard Worker		"android.security.metrics-java":                     true,
871*333d2b36SAndroid Build Coastguard Worker		"android.system.keystore2-V1-java":                  true,
872*333d2b36SAndroid Build Coastguard Worker		"android.system.keystore2-V2-java":                  true,
873*333d2b36SAndroid Build Coastguard Worker		"android.system.keystore2-V3-java":                  true,
874*333d2b36SAndroid Build Coastguard Worker		"android.system.keystore2-V4-java":                  true,
875*333d2b36SAndroid Build Coastguard Worker		"binderReadParcelIface-java":                        true,
876*333d2b36SAndroid Build Coastguard Worker		"binderRecordReplayTestIface-java":                  true,
877*333d2b36SAndroid Build Coastguard Worker		"car-experimental-api-static-lib":                   true,
878*333d2b36SAndroid Build Coastguard Worker		"collector-device-lib-platform":                     true,
879*333d2b36SAndroid Build Coastguard Worker		"com.android.car.oem":                               true,
880*333d2b36SAndroid Build Coastguard Worker		"com.google.hardware.pixel.display-V10-java":        true,
881*333d2b36SAndroid Build Coastguard Worker		"com.google.hardware.pixel.display-V1-java":         true,
882*333d2b36SAndroid Build Coastguard Worker		"com.google.hardware.pixel.display-V2-java":         true,
883*333d2b36SAndroid Build Coastguard Worker		"com.google.hardware.pixel.display-V3-java":         true,
884*333d2b36SAndroid Build Coastguard Worker		"com.google.hardware.pixel.display-V4-java":         true,
885*333d2b36SAndroid Build Coastguard Worker		"com.google.hardware.pixel.display-V5-java":         true,
886*333d2b36SAndroid Build Coastguard Worker		"com.google.hardware.pixel.display-V6-java":         true,
887*333d2b36SAndroid Build Coastguard Worker		"com.google.hardware.pixel.display-V7-java":         true,
888*333d2b36SAndroid Build Coastguard Worker		"com.google.hardware.pixel.display-V8-java":         true,
889*333d2b36SAndroid Build Coastguard Worker		"com.google.hardware.pixel.display-V9-java":         true,
890*333d2b36SAndroid Build Coastguard Worker		"conscrypt-support":                                 true,
891*333d2b36SAndroid Build Coastguard Worker		"cts-keystore-test-util":                            true,
892*333d2b36SAndroid Build Coastguard Worker		"cts-keystore-user-auth-helper-library":             true,
893*333d2b36SAndroid Build Coastguard Worker		"ctsmediautil":                                      true,
894*333d2b36SAndroid Build Coastguard Worker		"CtsNetTestsNonUpdatableLib":                        true,
895*333d2b36SAndroid Build Coastguard Worker		"DpmWrapper":                                        true,
896*333d2b36SAndroid Build Coastguard Worker		"flickerlib-apphelpers":                             true,
897*333d2b36SAndroid Build Coastguard Worker		"flickerlib-helpers":                                true,
898*333d2b36SAndroid Build Coastguard Worker		"flickerlib-parsers":                                true,
899*333d2b36SAndroid Build Coastguard Worker		"flickerlib":                                        true,
900*333d2b36SAndroid Build Coastguard Worker		"hardware.google.bluetooth.ccc-V1-java":             true,
901*333d2b36SAndroid Build Coastguard Worker		"hardware.google.bluetooth.sar-V1-java":             true,
902*333d2b36SAndroid Build Coastguard Worker		"monet":                                             true,
903*333d2b36SAndroid Build Coastguard Worker		"pixel-power-ext-V1-java":                           true,
904*333d2b36SAndroid Build Coastguard Worker		"pixel-power-ext-V2-java":                           true,
905*333d2b36SAndroid Build Coastguard Worker		"pixel_stateresidency_provider_aidl_interface-java": true,
906*333d2b36SAndroid Build Coastguard Worker		"pixel-thermal-ext-V1-java":                         true,
907*333d2b36SAndroid Build Coastguard Worker		"protolog-lib":                                      true,
908*333d2b36SAndroid Build Coastguard Worker		"RkpRegistrationCheck":                              true,
909*333d2b36SAndroid Build Coastguard Worker		"rotary-service-javastream-protos":                  true,
910*333d2b36SAndroid Build Coastguard Worker		"service_based_camera_extensions":                   true,
911*333d2b36SAndroid Build Coastguard Worker		"statsd-helper-test":                                true,
912*333d2b36SAndroid Build Coastguard Worker		"statsd-helper":                                     true,
913*333d2b36SAndroid Build Coastguard Worker		"test-piece-2-V1-java":                              true,
914*333d2b36SAndroid Build Coastguard Worker		"test-piece-2-V2-java":                              true,
915*333d2b36SAndroid Build Coastguard Worker		"test-piece-3-V1-java":                              true,
916*333d2b36SAndroid Build Coastguard Worker		"test-piece-3-V2-java":                              true,
917*333d2b36SAndroid Build Coastguard Worker		"test-piece-3-V3-java":                              true,
918*333d2b36SAndroid Build Coastguard Worker		"test-piece-4-V1-java":                              true,
919*333d2b36SAndroid Build Coastguard Worker		"test-piece-4-V2-java":                              true,
920*333d2b36SAndroid Build Coastguard Worker		"test-root-package-V1-java":                         true,
921*333d2b36SAndroid Build Coastguard Worker		"test-root-package-V2-java":                         true,
922*333d2b36SAndroid Build Coastguard Worker		"test-root-package-V3-java":                         true,
923*333d2b36SAndroid Build Coastguard Worker		"test-root-package-V4-java":                         true,
924*333d2b36SAndroid Build Coastguard Worker		"testServiceIface-java":                             true,
925*333d2b36SAndroid Build Coastguard Worker		"wm-flicker-common-app-helpers":                     true,
926*333d2b36SAndroid Build Coastguard Worker		"wm-flicker-common-assertions":                      true,
927*333d2b36SAndroid Build Coastguard Worker		"wm-shell-flicker-utils":                            true,
928*333d2b36SAndroid Build Coastguard Worker		"wycheproof-keystore":                               true,
929*333d2b36SAndroid Build Coastguard Worker	}
930*333d2b36SAndroid Build Coastguard Worker
931*333d2b36SAndroid Build Coastguard Worker	// Union of aosp and internal allowlists
932*333d2b36SAndroid Build Coastguard Worker	PlatformApiAllowlist = map[string]bool{}
933*333d2b36SAndroid Build Coastguard Worker)
934*333d2b36SAndroid Build Coastguard Worker
935*333d2b36SAndroid Build Coastguard Workerfunc init() {
936*333d2b36SAndroid Build Coastguard Worker	for k, v := range aospPlatformApiAllowlist {
937*333d2b36SAndroid Build Coastguard Worker		PlatformApiAllowlist[k] = v
938*333d2b36SAndroid Build Coastguard Worker	}
939*333d2b36SAndroid Build Coastguard Worker}
940*333d2b36SAndroid Build Coastguard Worker
941*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) {
942*333d2b36SAndroid Build Coastguard Worker	if disableSourceApexVariant(ctx) {
943*333d2b36SAndroid Build Coastguard Worker		// Prebuilts are active, do not create the installation rules for the source javalib.
944*333d2b36SAndroid Build Coastguard Worker		// Even though the source javalib is not used, we need to hide it to prevent duplicate installation rules.
945*333d2b36SAndroid Build Coastguard Worker		// TODO (b/331665856): Implement a principled solution for this.
946*333d2b36SAndroid Build Coastguard Worker		j.HideFromMake()
947*333d2b36SAndroid Build Coastguard Worker		j.SkipInstall()
948*333d2b36SAndroid Build Coastguard Worker	}
949*333d2b36SAndroid Build Coastguard Worker	j.provideHiddenAPIPropertyInfo(ctx)
950*333d2b36SAndroid Build Coastguard Worker
951*333d2b36SAndroid Build Coastguard Worker	j.sdkVersion = j.SdkVersion(ctx)
952*333d2b36SAndroid Build Coastguard Worker	j.minSdkVersion = j.MinSdkVersion(ctx)
953*333d2b36SAndroid Build Coastguard Worker	j.maxSdkVersion = j.MaxSdkVersion(ctx)
954*333d2b36SAndroid Build Coastguard Worker
955*333d2b36SAndroid Build Coastguard Worker	// Check min_sdk_version of the transitive dependencies if this module is created from
956*333d2b36SAndroid Build Coastguard Worker	// java_sdk_library.
957*333d2b36SAndroid Build Coastguard Worker	if j.overridableProperties.Min_sdk_version != nil && j.SdkLibraryName() != nil {
958*333d2b36SAndroid Build Coastguard Worker		j.CheckDepsMinSdkVersion(ctx)
959*333d2b36SAndroid Build Coastguard Worker	}
960*333d2b36SAndroid Build Coastguard Worker
961*333d2b36SAndroid Build Coastguard Worker	// SdkLibrary.GenerateAndroidBuildActions(ctx) sets the stubsLinkType to Unknown.
962*333d2b36SAndroid Build Coastguard Worker	// If the stubsLinkType has already been set to Unknown, the stubsLinkType should
963*333d2b36SAndroid Build Coastguard Worker	// not be overridden.
964*333d2b36SAndroid Build Coastguard Worker	if j.stubsLinkType != Unknown {
965*333d2b36SAndroid Build Coastguard Worker		if proptools.Bool(j.properties.Is_stubs_module) {
966*333d2b36SAndroid Build Coastguard Worker			j.stubsLinkType = Stubs
967*333d2b36SAndroid Build Coastguard Worker		} else {
968*333d2b36SAndroid Build Coastguard Worker			j.stubsLinkType = Implementation
969*333d2b36SAndroid Build Coastguard Worker		}
970*333d2b36SAndroid Build Coastguard Worker	}
971*333d2b36SAndroid Build Coastguard Worker
972*333d2b36SAndroid Build Coastguard Worker	j.stem = proptools.StringDefault(j.overridableProperties.Stem, ctx.ModuleName())
973*333d2b36SAndroid Build Coastguard Worker
974*333d2b36SAndroid Build Coastguard Worker	proguardSpecInfo := j.collectProguardSpecInfo(ctx)
975*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, ProguardSpecInfoProvider, proguardSpecInfo)
976*333d2b36SAndroid Build Coastguard Worker	exportedProguardFlagsFiles := proguardSpecInfo.ProguardFlagsFiles.ToList()
977*333d2b36SAndroid Build Coastguard Worker	j.extraProguardFlagsFiles = append(j.extraProguardFlagsFiles, exportedProguardFlagsFiles...)
978*333d2b36SAndroid Build Coastguard Worker
979*333d2b36SAndroid Build Coastguard Worker	combinedExportedProguardFlagFile := android.PathForModuleOut(ctx, "export_proguard_flags")
980*333d2b36SAndroid Build Coastguard Worker	writeCombinedProguardFlagsFile(ctx, combinedExportedProguardFlagFile, exportedProguardFlagsFiles)
981*333d2b36SAndroid Build Coastguard Worker	j.combinedExportedProguardFlagsFile = combinedExportedProguardFlagFile
982*333d2b36SAndroid Build Coastguard Worker
983*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
984*333d2b36SAndroid Build Coastguard Worker	if !apexInfo.IsForPlatform() {
985*333d2b36SAndroid Build Coastguard Worker		j.hideApexVariantFromMake = true
986*333d2b36SAndroid Build Coastguard Worker	}
987*333d2b36SAndroid Build Coastguard Worker
988*333d2b36SAndroid Build Coastguard Worker	j.checkSdkVersions(ctx)
989*333d2b36SAndroid Build Coastguard Worker	j.checkHeadersOnly(ctx)
990*333d2b36SAndroid Build Coastguard Worker	if ctx.Device() {
991*333d2b36SAndroid Build Coastguard Worker		libName := j.Name()
992*333d2b36SAndroid Build Coastguard Worker		if j.SdkLibraryName() != nil && strings.HasSuffix(libName, ".impl") {
993*333d2b36SAndroid Build Coastguard Worker			libName = proptools.String(j.SdkLibraryName())
994*333d2b36SAndroid Build Coastguard Worker		}
995*333d2b36SAndroid Build Coastguard Worker		j.dexpreopter.installPath = j.dexpreopter.getInstallPath(
996*333d2b36SAndroid Build Coastguard Worker			ctx, libName, android.PathForModuleInstall(ctx, "framework", j.Stem()+".jar"))
997*333d2b36SAndroid Build Coastguard Worker		j.dexpreopter.isSDKLibrary = j.deviceProperties.IsSDKLibrary
998*333d2b36SAndroid Build Coastguard Worker		setUncompressDex(ctx, &j.dexpreopter, &j.dexer)
999*333d2b36SAndroid Build Coastguard Worker		j.dexpreopter.uncompressedDex = *j.dexProperties.Uncompress_dex
1000*333d2b36SAndroid Build Coastguard Worker		j.classLoaderContexts = j.usesLibrary.classLoaderContextForUsesLibDeps(ctx)
1001*333d2b36SAndroid Build Coastguard Worker		if j.usesLibrary.shouldDisableDexpreopt {
1002*333d2b36SAndroid Build Coastguard Worker			j.dexpreopter.disableDexpreopt()
1003*333d2b36SAndroid Build Coastguard Worker		}
1004*333d2b36SAndroid Build Coastguard Worker	}
1005*333d2b36SAndroid Build Coastguard Worker	j.compile(ctx, nil, nil, nil, nil)
1006*333d2b36SAndroid Build Coastguard Worker
1007*333d2b36SAndroid Build Coastguard Worker	j.setInstallRules(ctx)
1008*333d2b36SAndroid Build Coastguard Worker
1009*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
1010*333d2b36SAndroid Build Coastguard Worker		TestOnly:       Bool(j.sourceProperties.Test_only),
1011*333d2b36SAndroid Build Coastguard Worker		TopLevelTarget: j.sourceProperties.Top_level_test_target,
1012*333d2b36SAndroid Build Coastguard Worker	})
1013*333d2b36SAndroid Build Coastguard Worker
1014*333d2b36SAndroid Build Coastguard Worker	setOutputFiles(ctx, j.Module)
1015*333d2b36SAndroid Build Coastguard Worker}
1016*333d2b36SAndroid Build Coastguard Worker
1017*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) getJarInstallDir(ctx android.ModuleContext) android.InstallPath {
1018*333d2b36SAndroid Build Coastguard Worker	var installDir android.InstallPath
1019*333d2b36SAndroid Build Coastguard Worker	if ctx.InstallInTestcases() {
1020*333d2b36SAndroid Build Coastguard Worker		var archDir string
1021*333d2b36SAndroid Build Coastguard Worker		if !ctx.Host() {
1022*333d2b36SAndroid Build Coastguard Worker			archDir = ctx.DeviceConfig().DeviceArch()
1023*333d2b36SAndroid Build Coastguard Worker		}
1024*333d2b36SAndroid Build Coastguard Worker		installModuleName := ctx.ModuleName()
1025*333d2b36SAndroid Build Coastguard Worker		// If this module is an impl library created from java_sdk_library,
1026*333d2b36SAndroid Build Coastguard Worker		// install the files under the java_sdk_library module outdir instead of this module outdir.
1027*333d2b36SAndroid Build Coastguard Worker		if j.SdkLibraryName() != nil && strings.HasSuffix(j.Name(), ".impl") {
1028*333d2b36SAndroid Build Coastguard Worker			installModuleName = proptools.String(j.SdkLibraryName())
1029*333d2b36SAndroid Build Coastguard Worker		}
1030*333d2b36SAndroid Build Coastguard Worker		installDir = android.PathForModuleInstall(ctx, installModuleName, archDir)
1031*333d2b36SAndroid Build Coastguard Worker	} else {
1032*333d2b36SAndroid Build Coastguard Worker		installDir = android.PathForModuleInstall(ctx, "framework")
1033*333d2b36SAndroid Build Coastguard Worker	}
1034*333d2b36SAndroid Build Coastguard Worker	return installDir
1035*333d2b36SAndroid Build Coastguard Worker}
1036*333d2b36SAndroid Build Coastguard Worker
1037*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) setInstallRules(ctx android.ModuleContext) {
1038*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
1039*333d2b36SAndroid Build Coastguard Worker
1040*333d2b36SAndroid Build Coastguard Worker	if (Bool(j.properties.Installable) || ctx.Host()) && apexInfo.IsForPlatform() {
1041*333d2b36SAndroid Build Coastguard Worker		var extraInstallDeps android.InstallPaths
1042*333d2b36SAndroid Build Coastguard Worker		if j.InstallMixin != nil {
1043*333d2b36SAndroid Build Coastguard Worker			extraInstallDeps = j.InstallMixin(ctx, j.outputFile)
1044*333d2b36SAndroid Build Coastguard Worker		}
1045*333d2b36SAndroid Build Coastguard Worker		hostDexNeeded := Bool(j.deviceProperties.Hostdex) && !ctx.Host()
1046*333d2b36SAndroid Build Coastguard Worker		if hostDexNeeded {
1047*333d2b36SAndroid Build Coastguard Worker			j.hostdexInstallFile = ctx.InstallFileWithoutCheckbuild(
1048*333d2b36SAndroid Build Coastguard Worker				android.PathForHostDexInstall(ctx, "framework"),
1049*333d2b36SAndroid Build Coastguard Worker				j.Stem()+"-hostdex.jar", j.outputFile)
1050*333d2b36SAndroid Build Coastguard Worker		}
1051*333d2b36SAndroid Build Coastguard Worker		j.installFile = ctx.InstallFileWithoutCheckbuild(j.getJarInstallDir(ctx), j.Stem()+".jar", j.outputFile, extraInstallDeps...)
1052*333d2b36SAndroid Build Coastguard Worker	}
1053*333d2b36SAndroid Build Coastguard Worker}
1054*333d2b36SAndroid Build Coastguard Worker
1055*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) DepsMutator(ctx android.BottomUpMutatorContext) {
1056*333d2b36SAndroid Build Coastguard Worker	j.usesLibrary.deps(ctx, false)
1057*333d2b36SAndroid Build Coastguard Worker	j.deps(ctx)
1058*333d2b36SAndroid Build Coastguard Worker
1059*333d2b36SAndroid Build Coastguard Worker	if j.SdkLibraryName() != nil && strings.HasSuffix(j.Name(), ".impl") {
1060*333d2b36SAndroid Build Coastguard Worker		if dexpreopt.IsDex2oatNeeded(ctx) {
1061*333d2b36SAndroid Build Coastguard Worker			dexpreopt.RegisterToolDeps(ctx)
1062*333d2b36SAndroid Build Coastguard Worker		}
1063*333d2b36SAndroid Build Coastguard Worker		prebuiltSdkLibExists := ctx.OtherModuleExists(android.PrebuiltNameFromSource(proptools.String(j.SdkLibraryName())))
1064*333d2b36SAndroid Build Coastguard Worker		if prebuiltSdkLibExists && ctx.OtherModuleExists("all_apex_contributions") {
1065*333d2b36SAndroid Build Coastguard Worker			ctx.AddDependency(ctx.Module(), android.AcDepTag, "all_apex_contributions")
1066*333d2b36SAndroid Build Coastguard Worker		}
1067*333d2b36SAndroid Build Coastguard Worker	}
1068*333d2b36SAndroid Build Coastguard Worker}
1069*333d2b36SAndroid Build Coastguard Worker
1070*333d2b36SAndroid Build Coastguard Workerconst (
1071*333d2b36SAndroid Build Coastguard Worker	aidlIncludeDir   = "aidl"
1072*333d2b36SAndroid Build Coastguard Worker	javaDir          = "java"
1073*333d2b36SAndroid Build Coastguard Worker	jarFileSuffix    = ".jar"
1074*333d2b36SAndroid Build Coastguard Worker	testConfigSuffix = "-AndroidTest.xml"
1075*333d2b36SAndroid Build Coastguard Worker)
1076*333d2b36SAndroid Build Coastguard Worker
1077*333d2b36SAndroid Build Coastguard Worker// path to the jar file of a java library. Relative to <sdk_root>/<api_dir>
1078*333d2b36SAndroid Build Coastguard Workerfunc sdkSnapshotFilePathForJar(_ android.SdkMemberContext, osPrefix, name string) string {
1079*333d2b36SAndroid Build Coastguard Worker	return sdkSnapshotFilePathForMember(osPrefix, name, jarFileSuffix)
1080*333d2b36SAndroid Build Coastguard Worker}
1081*333d2b36SAndroid Build Coastguard Worker
1082*333d2b36SAndroid Build Coastguard Workerfunc sdkSnapshotFilePathForMember(osPrefix, name string, suffix string) string {
1083*333d2b36SAndroid Build Coastguard Worker	return filepath.Join(javaDir, osPrefix, name+suffix)
1084*333d2b36SAndroid Build Coastguard Worker}
1085*333d2b36SAndroid Build Coastguard Worker
1086*333d2b36SAndroid Build Coastguard Workertype librarySdkMemberType struct {
1087*333d2b36SAndroid Build Coastguard Worker	android.SdkMemberTypeBase
1088*333d2b36SAndroid Build Coastguard Worker
1089*333d2b36SAndroid Build Coastguard Worker	// Function to retrieve the appropriate output jar (implementation or header) from
1090*333d2b36SAndroid Build Coastguard Worker	// the library.
1091*333d2b36SAndroid Build Coastguard Worker	jarToExportGetter func(ctx android.SdkMemberContext, j *Library) android.Path
1092*333d2b36SAndroid Build Coastguard Worker
1093*333d2b36SAndroid Build Coastguard Worker	// Function to compute the snapshot relative path to which the named library's
1094*333d2b36SAndroid Build Coastguard Worker	// jar should be copied.
1095*333d2b36SAndroid Build Coastguard Worker	snapshotPathGetter func(ctx android.SdkMemberContext, osPrefix, name string) string
1096*333d2b36SAndroid Build Coastguard Worker
1097*333d2b36SAndroid Build Coastguard Worker	// True if only the jar should be copied to the snapshot, false if the jar plus any additional
1098*333d2b36SAndroid Build Coastguard Worker	// files like aidl files should also be copied.
1099*333d2b36SAndroid Build Coastguard Worker	onlyCopyJarToSnapshot bool
1100*333d2b36SAndroid Build Coastguard Worker}
1101*333d2b36SAndroid Build Coastguard Worker
1102*333d2b36SAndroid Build Coastguard Workerconst (
1103*333d2b36SAndroid Build Coastguard Worker	onlyCopyJarToSnapshot    = true
1104*333d2b36SAndroid Build Coastguard Worker	copyEverythingToSnapshot = false
1105*333d2b36SAndroid Build Coastguard Worker)
1106*333d2b36SAndroid Build Coastguard Worker
1107*333d2b36SAndroid Build Coastguard Workerfunc (mt *librarySdkMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) {
1108*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, dependencyTag, names...)
1109*333d2b36SAndroid Build Coastguard Worker}
1110*333d2b36SAndroid Build Coastguard Worker
1111*333d2b36SAndroid Build Coastguard Workerfunc (mt *librarySdkMemberType) IsInstance(module android.Module) bool {
1112*333d2b36SAndroid Build Coastguard Worker	_, ok := module.(*Library)
1113*333d2b36SAndroid Build Coastguard Worker	return ok
1114*333d2b36SAndroid Build Coastguard Worker}
1115*333d2b36SAndroid Build Coastguard Worker
1116*333d2b36SAndroid Build Coastguard Workerfunc (mt *librarySdkMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
1117*333d2b36SAndroid Build Coastguard Worker	return ctx.SnapshotBuilder().AddPrebuiltModule(member, "java_import")
1118*333d2b36SAndroid Build Coastguard Worker}
1119*333d2b36SAndroid Build Coastguard Worker
1120*333d2b36SAndroid Build Coastguard Workerfunc (mt *librarySdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
1121*333d2b36SAndroid Build Coastguard Worker	return &librarySdkMemberProperties{}
1122*333d2b36SAndroid Build Coastguard Worker}
1123*333d2b36SAndroid Build Coastguard Worker
1124*333d2b36SAndroid Build Coastguard Workertype librarySdkMemberProperties struct {
1125*333d2b36SAndroid Build Coastguard Worker	android.SdkMemberPropertiesBase
1126*333d2b36SAndroid Build Coastguard Worker
1127*333d2b36SAndroid Build Coastguard Worker	JarToExport     android.Path `android:"arch_variant"`
1128*333d2b36SAndroid Build Coastguard Worker	AidlIncludeDirs android.Paths
1129*333d2b36SAndroid Build Coastguard Worker
1130*333d2b36SAndroid Build Coastguard Worker	// The list of permitted packages that need to be passed to the prebuilts as they are used to
1131*333d2b36SAndroid Build Coastguard Worker	// create the updatable-bcp-packages.txt file.
1132*333d2b36SAndroid Build Coastguard Worker	PermittedPackages []string
1133*333d2b36SAndroid Build Coastguard Worker
1134*333d2b36SAndroid Build Coastguard Worker	// The value of the min_sdk_version property, translated into a number where possible.
1135*333d2b36SAndroid Build Coastguard Worker	MinSdkVersion *string `supported_build_releases:"Tiramisu+"`
1136*333d2b36SAndroid Build Coastguard Worker
1137*333d2b36SAndroid Build Coastguard Worker	DexPreoptProfileGuided *bool `supported_build_releases:"UpsideDownCake+"`
1138*333d2b36SAndroid Build Coastguard Worker}
1139*333d2b36SAndroid Build Coastguard Worker
1140*333d2b36SAndroid Build Coastguard Workerfunc (p *librarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
1141*333d2b36SAndroid Build Coastguard Worker	j := variant.(*Library)
1142*333d2b36SAndroid Build Coastguard Worker
1143*333d2b36SAndroid Build Coastguard Worker	p.JarToExport = ctx.MemberType().(*librarySdkMemberType).jarToExportGetter(ctx, j)
1144*333d2b36SAndroid Build Coastguard Worker
1145*333d2b36SAndroid Build Coastguard Worker	p.AidlIncludeDirs = j.AidlIncludeDirs()
1146*333d2b36SAndroid Build Coastguard Worker
1147*333d2b36SAndroid Build Coastguard Worker	p.PermittedPackages = j.PermittedPackagesForUpdatableBootJars()
1148*333d2b36SAndroid Build Coastguard Worker
1149*333d2b36SAndroid Build Coastguard Worker	// If the min_sdk_version was set then add the canonical representation of the API level to the
1150*333d2b36SAndroid Build Coastguard Worker	// snapshot.
1151*333d2b36SAndroid Build Coastguard Worker	if j.overridableProperties.Min_sdk_version != nil {
1152*333d2b36SAndroid Build Coastguard Worker		canonical, err := android.ReplaceFinalizedCodenames(ctx.SdkModuleContext().Config(), j.minSdkVersion.String())
1153*333d2b36SAndroid Build Coastguard Worker		if err != nil {
1154*333d2b36SAndroid Build Coastguard Worker			ctx.ModuleErrorf("%s", err)
1155*333d2b36SAndroid Build Coastguard Worker		}
1156*333d2b36SAndroid Build Coastguard Worker		p.MinSdkVersion = proptools.StringPtr(canonical)
1157*333d2b36SAndroid Build Coastguard Worker	}
1158*333d2b36SAndroid Build Coastguard Worker
1159*333d2b36SAndroid Build Coastguard Worker	if j.dexpreopter.dexpreoptProperties.Dex_preopt_result.Profile_guided {
1160*333d2b36SAndroid Build Coastguard Worker		p.DexPreoptProfileGuided = proptools.BoolPtr(true)
1161*333d2b36SAndroid Build Coastguard Worker	}
1162*333d2b36SAndroid Build Coastguard Worker}
1163*333d2b36SAndroid Build Coastguard Worker
1164*333d2b36SAndroid Build Coastguard Workerfunc (p *librarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
1165*333d2b36SAndroid Build Coastguard Worker	builder := ctx.SnapshotBuilder()
1166*333d2b36SAndroid Build Coastguard Worker
1167*333d2b36SAndroid Build Coastguard Worker	memberType := ctx.MemberType().(*librarySdkMemberType)
1168*333d2b36SAndroid Build Coastguard Worker
1169*333d2b36SAndroid Build Coastguard Worker	exportedJar := p.JarToExport
1170*333d2b36SAndroid Build Coastguard Worker	if exportedJar != nil {
1171*333d2b36SAndroid Build Coastguard Worker		// Delegate the creation of the snapshot relative path to the member type.
1172*333d2b36SAndroid Build Coastguard Worker		snapshotRelativeJavaLibPath := memberType.snapshotPathGetter(ctx, p.OsPrefix(), ctx.Name())
1173*333d2b36SAndroid Build Coastguard Worker
1174*333d2b36SAndroid Build Coastguard Worker		// Copy the exported jar to the snapshot.
1175*333d2b36SAndroid Build Coastguard Worker		builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath)
1176*333d2b36SAndroid Build Coastguard Worker
1177*333d2b36SAndroid Build Coastguard Worker		propertySet.AddProperty("jars", []string{snapshotRelativeJavaLibPath})
1178*333d2b36SAndroid Build Coastguard Worker	}
1179*333d2b36SAndroid Build Coastguard Worker
1180*333d2b36SAndroid Build Coastguard Worker	if p.MinSdkVersion != nil {
1181*333d2b36SAndroid Build Coastguard Worker		propertySet.AddProperty("min_sdk_version", *p.MinSdkVersion)
1182*333d2b36SAndroid Build Coastguard Worker	}
1183*333d2b36SAndroid Build Coastguard Worker
1184*333d2b36SAndroid Build Coastguard Worker	if len(p.PermittedPackages) > 0 {
1185*333d2b36SAndroid Build Coastguard Worker		propertySet.AddProperty("permitted_packages", p.PermittedPackages)
1186*333d2b36SAndroid Build Coastguard Worker	}
1187*333d2b36SAndroid Build Coastguard Worker
1188*333d2b36SAndroid Build Coastguard Worker	dexPreoptSet := propertySet.AddPropertySet("dex_preopt")
1189*333d2b36SAndroid Build Coastguard Worker	if p.DexPreoptProfileGuided != nil {
1190*333d2b36SAndroid Build Coastguard Worker		dexPreoptSet.AddProperty("profile_guided", proptools.Bool(p.DexPreoptProfileGuided))
1191*333d2b36SAndroid Build Coastguard Worker	}
1192*333d2b36SAndroid Build Coastguard Worker
1193*333d2b36SAndroid Build Coastguard Worker	// Do not copy anything else to the snapshot.
1194*333d2b36SAndroid Build Coastguard Worker	if memberType.onlyCopyJarToSnapshot {
1195*333d2b36SAndroid Build Coastguard Worker		return
1196*333d2b36SAndroid Build Coastguard Worker	}
1197*333d2b36SAndroid Build Coastguard Worker
1198*333d2b36SAndroid Build Coastguard Worker	aidlIncludeDirs := p.AidlIncludeDirs
1199*333d2b36SAndroid Build Coastguard Worker	if len(aidlIncludeDirs) != 0 {
1200*333d2b36SAndroid Build Coastguard Worker		sdkModuleContext := ctx.SdkModuleContext()
1201*333d2b36SAndroid Build Coastguard Worker		for _, dir := range aidlIncludeDirs {
1202*333d2b36SAndroid Build Coastguard Worker			// TODO(jiyong): copy parcelable declarations only
1203*333d2b36SAndroid Build Coastguard Worker			aidlFiles, _ := sdkModuleContext.GlobWithDeps(dir.String()+"/**/*.aidl", nil)
1204*333d2b36SAndroid Build Coastguard Worker			for _, file := range aidlFiles {
1205*333d2b36SAndroid Build Coastguard Worker				builder.CopyToSnapshot(android.PathForSource(sdkModuleContext, file), filepath.Join(aidlIncludeDir, file))
1206*333d2b36SAndroid Build Coastguard Worker			}
1207*333d2b36SAndroid Build Coastguard Worker		}
1208*333d2b36SAndroid Build Coastguard Worker
1209*333d2b36SAndroid Build Coastguard Worker		// TODO(b/151933053) - add aidl include dirs property
1210*333d2b36SAndroid Build Coastguard Worker	}
1211*333d2b36SAndroid Build Coastguard Worker}
1212*333d2b36SAndroid Build Coastguard Worker
1213*333d2b36SAndroid Build Coastguard Worker// java_library builds and links sources into a `.jar` file for the device, and possibly for the host as well.
1214*333d2b36SAndroid Build Coastguard Worker//
1215*333d2b36SAndroid Build Coastguard Worker// By default, a java_library has a single variant that produces a `.jar` file containing `.class` files that were
1216*333d2b36SAndroid Build Coastguard Worker// compiled against the device bootclasspath.  This jar is not suitable for installing on a device, but can be used
1217*333d2b36SAndroid Build Coastguard Worker// as a `static_libs` dependency of another module.
1218*333d2b36SAndroid Build Coastguard Worker//
1219*333d2b36SAndroid Build Coastguard Worker// Specifying `installable: true` will product a `.jar` file containing `classes.dex` files, suitable for installing on
1220*333d2b36SAndroid Build Coastguard Worker// a device.
1221*333d2b36SAndroid Build Coastguard Worker//
1222*333d2b36SAndroid Build Coastguard Worker// Specifying `host_supported: true` will produce two variants, one compiled against the device bootclasspath and one
1223*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath.
1224*333d2b36SAndroid Build Coastguard Workerfunc LibraryFactory() android.Module {
1225*333d2b36SAndroid Build Coastguard Worker	module := &Library{}
1226*333d2b36SAndroid Build Coastguard Worker
1227*333d2b36SAndroid Build Coastguard Worker	module.addHostAndDeviceProperties()
1228*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.sourceProperties)
1229*333d2b36SAndroid Build Coastguard Worker
1230*333d2b36SAndroid Build Coastguard Worker	module.initModuleAndImport(module)
1231*333d2b36SAndroid Build Coastguard Worker
1232*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(module)
1233*333d2b36SAndroid Build Coastguard Worker	InitJavaModule(module, android.HostAndDeviceSupported)
1234*333d2b36SAndroid Build Coastguard Worker	return module
1235*333d2b36SAndroid Build Coastguard Worker}
1236*333d2b36SAndroid Build Coastguard Worker
1237*333d2b36SAndroid Build Coastguard Worker// java_library_static is an obsolete alias for java_library.
1238*333d2b36SAndroid Build Coastguard Workerfunc LibraryStaticFactory() android.Module {
1239*333d2b36SAndroid Build Coastguard Worker	return LibraryFactory()
1240*333d2b36SAndroid Build Coastguard Worker}
1241*333d2b36SAndroid Build Coastguard Worker
1242*333d2b36SAndroid Build Coastguard Worker// java_library_host builds and links sources into a `.jar` file for the host.
1243*333d2b36SAndroid Build Coastguard Worker//
1244*333d2b36SAndroid Build Coastguard Worker// A java_library_host has a single variant that produces a `.jar` file containing `.class` files that were
1245*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath.
1246*333d2b36SAndroid Build Coastguard Workerfunc LibraryHostFactory() android.Module {
1247*333d2b36SAndroid Build Coastguard Worker	module := &Library{}
1248*333d2b36SAndroid Build Coastguard Worker
1249*333d2b36SAndroid Build Coastguard Worker	module.addHostProperties()
1250*333d2b36SAndroid Build Coastguard Worker
1251*333d2b36SAndroid Build Coastguard Worker	module.Module.properties.Installable = proptools.BoolPtr(true)
1252*333d2b36SAndroid Build Coastguard Worker
1253*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(module)
1254*333d2b36SAndroid Build Coastguard Worker	InitJavaModule(module, android.HostSupported)
1255*333d2b36SAndroid Build Coastguard Worker	return module
1256*333d2b36SAndroid Build Coastguard Worker}
1257*333d2b36SAndroid Build Coastguard Worker
1258*333d2b36SAndroid Build Coastguard Worker//
1259*333d2b36SAndroid Build Coastguard Worker// Java Tests
1260*333d2b36SAndroid Build Coastguard Worker//
1261*333d2b36SAndroid Build Coastguard Worker
1262*333d2b36SAndroid Build Coastguard Worker// Test option struct.
1263*333d2b36SAndroid Build Coastguard Workertype TestOptions struct {
1264*333d2b36SAndroid Build Coastguard Worker	android.CommonTestOptions
1265*333d2b36SAndroid Build Coastguard Worker
1266*333d2b36SAndroid Build Coastguard Worker	// a list of extra test configuration files that should be installed with the module.
1267*333d2b36SAndroid Build Coastguard Worker	Extra_test_configs []string `android:"path,arch_variant"`
1268*333d2b36SAndroid Build Coastguard Worker
1269*333d2b36SAndroid Build Coastguard Worker	// Extra <option> tags to add to the auto generated test xml file. The "key"
1270*333d2b36SAndroid Build Coastguard Worker	// is optional in each of these.
1271*333d2b36SAndroid Build Coastguard Worker	Tradefed_options []tradefed.Option
1272*333d2b36SAndroid Build Coastguard Worker
1273*333d2b36SAndroid Build Coastguard Worker	// Extra <option> tags to add to the auto generated test xml file under the test runner, e.g., AndroidJunitTest.
1274*333d2b36SAndroid Build Coastguard Worker	// The "key" is optional in each of these.
1275*333d2b36SAndroid Build Coastguard Worker	Test_runner_options []tradefed.Option
1276*333d2b36SAndroid Build Coastguard Worker}
1277*333d2b36SAndroid Build Coastguard Worker
1278*333d2b36SAndroid Build Coastguard Workertype testProperties struct {
1279*333d2b36SAndroid Build Coastguard Worker	// list of compatibility suites (for example "cts", "vts") that the module should be
1280*333d2b36SAndroid Build Coastguard Worker	// installed into.
1281*333d2b36SAndroid Build Coastguard Worker	Test_suites []string `android:"arch_variant"`
1282*333d2b36SAndroid Build Coastguard Worker
1283*333d2b36SAndroid Build Coastguard Worker	// the name of the test configuration (for example "AndroidTest.xml") that should be
1284*333d2b36SAndroid Build Coastguard Worker	// installed with the module.
1285*333d2b36SAndroid Build Coastguard Worker	Test_config *string `android:"path,arch_variant"`
1286*333d2b36SAndroid Build Coastguard Worker
1287*333d2b36SAndroid Build Coastguard Worker	// the name of the test configuration template (for example "AndroidTestTemplate.xml") that
1288*333d2b36SAndroid Build Coastguard Worker	// should be installed with the module.
1289*333d2b36SAndroid Build Coastguard Worker	Test_config_template *string `android:"path,arch_variant"`
1290*333d2b36SAndroid Build Coastguard Worker
1291*333d2b36SAndroid Build Coastguard Worker	// list of files or filegroup modules that provide data that should be installed alongside
1292*333d2b36SAndroid Build Coastguard Worker	// the test
1293*333d2b36SAndroid Build Coastguard Worker	Data []string `android:"path"`
1294*333d2b36SAndroid Build Coastguard Worker
1295*333d2b36SAndroid Build Coastguard Worker	// Same as data, but will add dependencies on modules using the device's os variation and
1296*333d2b36SAndroid Build Coastguard Worker	// the common arch variation. Useful for a host test that wants to embed a module built for
1297*333d2b36SAndroid Build Coastguard Worker	// device.
1298*333d2b36SAndroid Build Coastguard Worker	Device_common_data []string `android:"path_device_common"`
1299*333d2b36SAndroid Build Coastguard Worker
1300*333d2b36SAndroid Build Coastguard Worker	// same as data, but adds dependencies using the device's os variation and the device's first
1301*333d2b36SAndroid Build Coastguard Worker	// architecture's variation. Can be used to add a module built for device to the data of a
1302*333d2b36SAndroid Build Coastguard Worker	// host test.
1303*333d2b36SAndroid Build Coastguard Worker	Device_first_data []string `android:"path_device_first"`
1304*333d2b36SAndroid Build Coastguard Worker
1305*333d2b36SAndroid Build Coastguard Worker	// same as data, but adds dependencies using the device's os variation and the device's first
1306*333d2b36SAndroid Build Coastguard Worker	// 32-bit architecture's variation. If a 32-bit arch doesn't exist for this device, it will use
1307*333d2b36SAndroid Build Coastguard Worker	// a 64 bit arch instead. Can be used to add a module built for device to the data of a
1308*333d2b36SAndroid Build Coastguard Worker	// host test.
1309*333d2b36SAndroid Build Coastguard Worker	Device_first_prefer32_data []string `android:"path_device_first_prefer32"`
1310*333d2b36SAndroid Build Coastguard Worker
1311*333d2b36SAndroid Build Coastguard Worker	// Flag to indicate whether or not to create test config automatically. If AndroidTest.xml
1312*333d2b36SAndroid Build Coastguard Worker	// doesn't exist next to the Android.bp, this attribute doesn't need to be set to true
1313*333d2b36SAndroid Build Coastguard Worker	// explicitly.
1314*333d2b36SAndroid Build Coastguard Worker	Auto_gen_config *bool
1315*333d2b36SAndroid Build Coastguard Worker
1316*333d2b36SAndroid Build Coastguard Worker	// Add parameterized mainline modules to auto generated test config. The options will be
1317*333d2b36SAndroid Build Coastguard Worker	// handled by TradeFed to do downloading and installing the specified modules on the device.
1318*333d2b36SAndroid Build Coastguard Worker	Test_mainline_modules []string
1319*333d2b36SAndroid Build Coastguard Worker
1320*333d2b36SAndroid Build Coastguard Worker	// Test options.
1321*333d2b36SAndroid Build Coastguard Worker	Test_options TestOptions
1322*333d2b36SAndroid Build Coastguard Worker
1323*333d2b36SAndroid Build Coastguard Worker	// Names of modules containing JNI libraries that should be installed alongside the test.
1324*333d2b36SAndroid Build Coastguard Worker	Jni_libs proptools.Configurable[[]string]
1325*333d2b36SAndroid Build Coastguard Worker
1326*333d2b36SAndroid Build Coastguard Worker	// Install the test into a folder named for the module in all test suites.
1327*333d2b36SAndroid Build Coastguard Worker	Per_testcase_directory *bool
1328*333d2b36SAndroid Build Coastguard Worker}
1329*333d2b36SAndroid Build Coastguard Worker
1330*333d2b36SAndroid Build Coastguard Workertype hostTestProperties struct {
1331*333d2b36SAndroid Build Coastguard Worker	// list of native binary modules that should be installed alongside the test
1332*333d2b36SAndroid Build Coastguard Worker	Data_native_bins []string `android:"arch_variant"`
1333*333d2b36SAndroid Build Coastguard Worker
1334*333d2b36SAndroid Build Coastguard Worker	// list of device binary modules that should be installed alongside the test
1335*333d2b36SAndroid Build Coastguard Worker	// This property only adds the first variant of the dependency
1336*333d2b36SAndroid Build Coastguard Worker	Data_device_bins_first []string `android:"arch_variant"`
1337*333d2b36SAndroid Build Coastguard Worker
1338*333d2b36SAndroid Build Coastguard Worker	// list of device binary modules that should be installed alongside the test
1339*333d2b36SAndroid Build Coastguard Worker	// This property adds 64bit AND 32bit variants of the dependency
1340*333d2b36SAndroid Build Coastguard Worker	Data_device_bins_both []string `android:"arch_variant"`
1341*333d2b36SAndroid Build Coastguard Worker
1342*333d2b36SAndroid Build Coastguard Worker	// list of device binary modules that should be installed alongside the test
1343*333d2b36SAndroid Build Coastguard Worker	// This property only adds 64bit variants of the dependency
1344*333d2b36SAndroid Build Coastguard Worker	Data_device_bins_64 []string `android:"arch_variant"`
1345*333d2b36SAndroid Build Coastguard Worker
1346*333d2b36SAndroid Build Coastguard Worker	// list of device binary modules that should be installed alongside the test
1347*333d2b36SAndroid Build Coastguard Worker	// This property adds 32bit variants of the dependency if available, or else
1348*333d2b36SAndroid Build Coastguard Worker	// defaults to the 64bit variant
1349*333d2b36SAndroid Build Coastguard Worker	Data_device_bins_prefer32 []string `android:"arch_variant"`
1350*333d2b36SAndroid Build Coastguard Worker
1351*333d2b36SAndroid Build Coastguard Worker	// list of device binary modules that should be installed alongside the test
1352*333d2b36SAndroid Build Coastguard Worker	// This property only adds 32bit variants of the dependency
1353*333d2b36SAndroid Build Coastguard Worker	Data_device_bins_32 []string `android:"arch_variant"`
1354*333d2b36SAndroid Build Coastguard Worker}
1355*333d2b36SAndroid Build Coastguard Worker
1356*333d2b36SAndroid Build Coastguard Workertype testHelperLibraryProperties struct {
1357*333d2b36SAndroid Build Coastguard Worker	// list of compatibility suites (for example "cts", "vts") that the module should be
1358*333d2b36SAndroid Build Coastguard Worker	// installed into.
1359*333d2b36SAndroid Build Coastguard Worker	Test_suites []string `android:"arch_variant"`
1360*333d2b36SAndroid Build Coastguard Worker
1361*333d2b36SAndroid Build Coastguard Worker	// Install the test into a folder named for the module in all test suites.
1362*333d2b36SAndroid Build Coastguard Worker	Per_testcase_directory *bool
1363*333d2b36SAndroid Build Coastguard Worker}
1364*333d2b36SAndroid Build Coastguard Worker
1365*333d2b36SAndroid Build Coastguard Workertype prebuiltTestProperties struct {
1366*333d2b36SAndroid Build Coastguard Worker	// list of compatibility suites (for example "cts", "vts") that the module should be
1367*333d2b36SAndroid Build Coastguard Worker	// installed into.
1368*333d2b36SAndroid Build Coastguard Worker	Test_suites []string `android:"arch_variant"`
1369*333d2b36SAndroid Build Coastguard Worker
1370*333d2b36SAndroid Build Coastguard Worker	// the name of the test configuration (for example "AndroidTest.xml") that should be
1371*333d2b36SAndroid Build Coastguard Worker	// installed with the module.
1372*333d2b36SAndroid Build Coastguard Worker	Test_config *string `android:"path,arch_variant"`
1373*333d2b36SAndroid Build Coastguard Worker}
1374*333d2b36SAndroid Build Coastguard Worker
1375*333d2b36SAndroid Build Coastguard Workertype Test struct {
1376*333d2b36SAndroid Build Coastguard Worker	Library
1377*333d2b36SAndroid Build Coastguard Worker
1378*333d2b36SAndroid Build Coastguard Worker	testProperties testProperties
1379*333d2b36SAndroid Build Coastguard Worker
1380*333d2b36SAndroid Build Coastguard Worker	testConfig       android.Path
1381*333d2b36SAndroid Build Coastguard Worker	extraTestConfigs android.Paths
1382*333d2b36SAndroid Build Coastguard Worker	data             android.Paths
1383*333d2b36SAndroid Build Coastguard Worker}
1384*333d2b36SAndroid Build Coastguard Worker
1385*333d2b36SAndroid Build Coastguard Workertype TestHost struct {
1386*333d2b36SAndroid Build Coastguard Worker	Test
1387*333d2b36SAndroid Build Coastguard Worker
1388*333d2b36SAndroid Build Coastguard Worker	testHostProperties hostTestProperties
1389*333d2b36SAndroid Build Coastguard Worker}
1390*333d2b36SAndroid Build Coastguard Worker
1391*333d2b36SAndroid Build Coastguard Workertype TestHelperLibrary struct {
1392*333d2b36SAndroid Build Coastguard Worker	Library
1393*333d2b36SAndroid Build Coastguard Worker
1394*333d2b36SAndroid Build Coastguard Worker	testHelperLibraryProperties testHelperLibraryProperties
1395*333d2b36SAndroid Build Coastguard Worker}
1396*333d2b36SAndroid Build Coastguard Worker
1397*333d2b36SAndroid Build Coastguard Workertype JavaTestImport struct {
1398*333d2b36SAndroid Build Coastguard Worker	Import
1399*333d2b36SAndroid Build Coastguard Worker
1400*333d2b36SAndroid Build Coastguard Worker	prebuiltTestProperties prebuiltTestProperties
1401*333d2b36SAndroid Build Coastguard Worker
1402*333d2b36SAndroid Build Coastguard Worker	testConfig android.Path
1403*333d2b36SAndroid Build Coastguard Worker	dexJarFile android.Path
1404*333d2b36SAndroid Build Coastguard Worker}
1405*333d2b36SAndroid Build Coastguard Worker
1406*333d2b36SAndroid Build Coastguard Workerfunc (j *Test) InstallInTestcases() bool {
1407*333d2b36SAndroid Build Coastguard Worker	// Host java tests install into $(HOST_OUT_JAVA_LIBRARIES), and then are copied into
1408*333d2b36SAndroid Build Coastguard Worker	// testcases by base_rules.mk.
1409*333d2b36SAndroid Build Coastguard Worker	return !j.Host()
1410*333d2b36SAndroid Build Coastguard Worker}
1411*333d2b36SAndroid Build Coastguard Worker
1412*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHelperLibrary) InstallInTestcases() bool {
1413*333d2b36SAndroid Build Coastguard Worker	return true
1414*333d2b36SAndroid Build Coastguard Worker}
1415*333d2b36SAndroid Build Coastguard Worker
1416*333d2b36SAndroid Build Coastguard Workerfunc (j *JavaTestImport) InstallInTestcases() bool {
1417*333d2b36SAndroid Build Coastguard Worker	return true
1418*333d2b36SAndroid Build Coastguard Worker}
1419*333d2b36SAndroid Build Coastguard Worker
1420*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) IsNativeCoverageNeeded(ctx cc.IsNativeCoverageNeededContext) bool {
1421*333d2b36SAndroid Build Coastguard Worker	return ctx.DeviceConfig().NativeCoverageEnabled()
1422*333d2b36SAndroid Build Coastguard Worker}
1423*333d2b36SAndroid Build Coastguard Worker
1424*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) addDataDeviceBinsDeps(ctx android.BottomUpMutatorContext) {
1425*333d2b36SAndroid Build Coastguard Worker	if len(j.testHostProperties.Data_device_bins_first) > 0 {
1426*333d2b36SAndroid Build Coastguard Worker		deviceVariations := ctx.Config().AndroidFirstDeviceTarget.Variations()
1427*333d2b36SAndroid Build Coastguard Worker		ctx.AddFarVariationDependencies(deviceVariations, dataDeviceBinsTag, j.testHostProperties.Data_device_bins_first...)
1428*333d2b36SAndroid Build Coastguard Worker	}
1429*333d2b36SAndroid Build Coastguard Worker
1430*333d2b36SAndroid Build Coastguard Worker	var maybeAndroid32Target *android.Target
1431*333d2b36SAndroid Build Coastguard Worker	var maybeAndroid64Target *android.Target
1432*333d2b36SAndroid Build Coastguard Worker	android32TargetList := android.FirstTarget(ctx.Config().Targets[android.Android], "lib32")
1433*333d2b36SAndroid Build Coastguard Worker	android64TargetList := android.FirstTarget(ctx.Config().Targets[android.Android], "lib64")
1434*333d2b36SAndroid Build Coastguard Worker	if len(android32TargetList) > 0 {
1435*333d2b36SAndroid Build Coastguard Worker		maybeAndroid32Target = &android32TargetList[0]
1436*333d2b36SAndroid Build Coastguard Worker	}
1437*333d2b36SAndroid Build Coastguard Worker	if len(android64TargetList) > 0 {
1438*333d2b36SAndroid Build Coastguard Worker		maybeAndroid64Target = &android64TargetList[0]
1439*333d2b36SAndroid Build Coastguard Worker	}
1440*333d2b36SAndroid Build Coastguard Worker
1441*333d2b36SAndroid Build Coastguard Worker	if len(j.testHostProperties.Data_device_bins_both) > 0 {
1442*333d2b36SAndroid Build Coastguard Worker		if maybeAndroid32Target == nil && maybeAndroid64Target == nil {
1443*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("data_device_bins_both", "no device targets available. Targets: %q", ctx.Config().Targets)
1444*333d2b36SAndroid Build Coastguard Worker			return
1445*333d2b36SAndroid Build Coastguard Worker		}
1446*333d2b36SAndroid Build Coastguard Worker		if maybeAndroid32Target != nil {
1447*333d2b36SAndroid Build Coastguard Worker			ctx.AddFarVariationDependencies(
1448*333d2b36SAndroid Build Coastguard Worker				maybeAndroid32Target.Variations(),
1449*333d2b36SAndroid Build Coastguard Worker				dataDeviceBinsTag,
1450*333d2b36SAndroid Build Coastguard Worker				j.testHostProperties.Data_device_bins_both...,
1451*333d2b36SAndroid Build Coastguard Worker			)
1452*333d2b36SAndroid Build Coastguard Worker		}
1453*333d2b36SAndroid Build Coastguard Worker		if maybeAndroid64Target != nil {
1454*333d2b36SAndroid Build Coastguard Worker			ctx.AddFarVariationDependencies(
1455*333d2b36SAndroid Build Coastguard Worker				maybeAndroid64Target.Variations(),
1456*333d2b36SAndroid Build Coastguard Worker				dataDeviceBinsTag,
1457*333d2b36SAndroid Build Coastguard Worker				j.testHostProperties.Data_device_bins_both...,
1458*333d2b36SAndroid Build Coastguard Worker			)
1459*333d2b36SAndroid Build Coastguard Worker		}
1460*333d2b36SAndroid Build Coastguard Worker	}
1461*333d2b36SAndroid Build Coastguard Worker
1462*333d2b36SAndroid Build Coastguard Worker	if len(j.testHostProperties.Data_device_bins_prefer32) > 0 {
1463*333d2b36SAndroid Build Coastguard Worker		if maybeAndroid32Target != nil {
1464*333d2b36SAndroid Build Coastguard Worker			ctx.AddFarVariationDependencies(
1465*333d2b36SAndroid Build Coastguard Worker				maybeAndroid32Target.Variations(),
1466*333d2b36SAndroid Build Coastguard Worker				dataDeviceBinsTag,
1467*333d2b36SAndroid Build Coastguard Worker				j.testHostProperties.Data_device_bins_prefer32...,
1468*333d2b36SAndroid Build Coastguard Worker			)
1469*333d2b36SAndroid Build Coastguard Worker		} else {
1470*333d2b36SAndroid Build Coastguard Worker			if maybeAndroid64Target == nil {
1471*333d2b36SAndroid Build Coastguard Worker				ctx.PropertyErrorf("data_device_bins_prefer32", "no device targets available. Targets: %q", ctx.Config().Targets)
1472*333d2b36SAndroid Build Coastguard Worker				return
1473*333d2b36SAndroid Build Coastguard Worker			}
1474*333d2b36SAndroid Build Coastguard Worker			ctx.AddFarVariationDependencies(
1475*333d2b36SAndroid Build Coastguard Worker				maybeAndroid64Target.Variations(),
1476*333d2b36SAndroid Build Coastguard Worker				dataDeviceBinsTag,
1477*333d2b36SAndroid Build Coastguard Worker				j.testHostProperties.Data_device_bins_prefer32...,
1478*333d2b36SAndroid Build Coastguard Worker			)
1479*333d2b36SAndroid Build Coastguard Worker		}
1480*333d2b36SAndroid Build Coastguard Worker	}
1481*333d2b36SAndroid Build Coastguard Worker
1482*333d2b36SAndroid Build Coastguard Worker	if len(j.testHostProperties.Data_device_bins_32) > 0 {
1483*333d2b36SAndroid Build Coastguard Worker		if maybeAndroid32Target == nil {
1484*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("data_device_bins_32", "cannot find 32bit device target. Targets: %q", ctx.Config().Targets)
1485*333d2b36SAndroid Build Coastguard Worker			return
1486*333d2b36SAndroid Build Coastguard Worker		}
1487*333d2b36SAndroid Build Coastguard Worker		deviceVariations := maybeAndroid32Target.Variations()
1488*333d2b36SAndroid Build Coastguard Worker		ctx.AddFarVariationDependencies(deviceVariations, dataDeviceBinsTag, j.testHostProperties.Data_device_bins_32...)
1489*333d2b36SAndroid Build Coastguard Worker	}
1490*333d2b36SAndroid Build Coastguard Worker
1491*333d2b36SAndroid Build Coastguard Worker	if len(j.testHostProperties.Data_device_bins_64) > 0 {
1492*333d2b36SAndroid Build Coastguard Worker		if maybeAndroid64Target == nil {
1493*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("data_device_bins_64", "cannot find 64bit device target. Targets: %q", ctx.Config().Targets)
1494*333d2b36SAndroid Build Coastguard Worker			return
1495*333d2b36SAndroid Build Coastguard Worker		}
1496*333d2b36SAndroid Build Coastguard Worker		deviceVariations := maybeAndroid64Target.Variations()
1497*333d2b36SAndroid Build Coastguard Worker		ctx.AddFarVariationDependencies(deviceVariations, dataDeviceBinsTag, j.testHostProperties.Data_device_bins_64...)
1498*333d2b36SAndroid Build Coastguard Worker	}
1499*333d2b36SAndroid Build Coastguard Worker}
1500*333d2b36SAndroid Build Coastguard Worker
1501*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) DepsMutator(ctx android.BottomUpMutatorContext) {
1502*333d2b36SAndroid Build Coastguard Worker	if len(j.testHostProperties.Data_native_bins) > 0 {
1503*333d2b36SAndroid Build Coastguard Worker		for _, target := range ctx.MultiTargets() {
1504*333d2b36SAndroid Build Coastguard Worker			ctx.AddVariationDependencies(target.Variations(), dataNativeBinsTag, j.testHostProperties.Data_native_bins...)
1505*333d2b36SAndroid Build Coastguard Worker		}
1506*333d2b36SAndroid Build Coastguard Worker	}
1507*333d2b36SAndroid Build Coastguard Worker
1508*333d2b36SAndroid Build Coastguard Worker	jniLibs := j.testProperties.Jni_libs.GetOrDefault(ctx, nil)
1509*333d2b36SAndroid Build Coastguard Worker	if len(jniLibs) > 0 {
1510*333d2b36SAndroid Build Coastguard Worker		for _, target := range ctx.MultiTargets() {
1511*333d2b36SAndroid Build Coastguard Worker			sharedLibVariations := append(target.Variations(), blueprint.Variation{Mutator: "link", Variation: "shared"})
1512*333d2b36SAndroid Build Coastguard Worker			ctx.AddFarVariationDependencies(sharedLibVariations, jniLibTag, jniLibs...)
1513*333d2b36SAndroid Build Coastguard Worker		}
1514*333d2b36SAndroid Build Coastguard Worker	}
1515*333d2b36SAndroid Build Coastguard Worker
1516*333d2b36SAndroid Build Coastguard Worker	j.addDataDeviceBinsDeps(ctx)
1517*333d2b36SAndroid Build Coastguard Worker	j.deps(ctx)
1518*333d2b36SAndroid Build Coastguard Worker}
1519*333d2b36SAndroid Build Coastguard Worker
1520*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) AddExtraResource(p android.Path) {
1521*333d2b36SAndroid Build Coastguard Worker	j.extraResources = append(j.extraResources, p)
1522*333d2b36SAndroid Build Coastguard Worker}
1523*333d2b36SAndroid Build Coastguard Worker
1524*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) dataDeviceBins() []string {
1525*333d2b36SAndroid Build Coastguard Worker	ret := make([]string, 0,
1526*333d2b36SAndroid Build Coastguard Worker		len(j.testHostProperties.Data_device_bins_first)+
1527*333d2b36SAndroid Build Coastguard Worker			len(j.testHostProperties.Data_device_bins_both)+
1528*333d2b36SAndroid Build Coastguard Worker			len(j.testHostProperties.Data_device_bins_prefer32)+
1529*333d2b36SAndroid Build Coastguard Worker			len(j.testHostProperties.Data_device_bins_32)+
1530*333d2b36SAndroid Build Coastguard Worker			len(j.testHostProperties.Data_device_bins_64),
1531*333d2b36SAndroid Build Coastguard Worker	)
1532*333d2b36SAndroid Build Coastguard Worker
1533*333d2b36SAndroid Build Coastguard Worker	ret = append(ret, j.testHostProperties.Data_device_bins_first...)
1534*333d2b36SAndroid Build Coastguard Worker	ret = append(ret, j.testHostProperties.Data_device_bins_both...)
1535*333d2b36SAndroid Build Coastguard Worker	ret = append(ret, j.testHostProperties.Data_device_bins_prefer32...)
1536*333d2b36SAndroid Build Coastguard Worker	ret = append(ret, j.testHostProperties.Data_device_bins_32...)
1537*333d2b36SAndroid Build Coastguard Worker	ret = append(ret, j.testHostProperties.Data_device_bins_64...)
1538*333d2b36SAndroid Build Coastguard Worker
1539*333d2b36SAndroid Build Coastguard Worker	return ret
1540*333d2b36SAndroid Build Coastguard Worker}
1541*333d2b36SAndroid Build Coastguard Worker
1542*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1543*333d2b36SAndroid Build Coastguard Worker	var configs []tradefed.Config
1544*333d2b36SAndroid Build Coastguard Worker	dataDeviceBins := j.dataDeviceBins()
1545*333d2b36SAndroid Build Coastguard Worker	if len(dataDeviceBins) > 0 {
1546*333d2b36SAndroid Build Coastguard Worker		// add Tradefed configuration to push device bins to device for testing
1547*333d2b36SAndroid Build Coastguard Worker		remoteDir := filepath.Join("/data/local/tests/unrestricted/", j.Name())
1548*333d2b36SAndroid Build Coastguard Worker		options := []tradefed.Option{{Name: "cleanup", Value: "true"}}
1549*333d2b36SAndroid Build Coastguard Worker		for _, bin := range dataDeviceBins {
1550*333d2b36SAndroid Build Coastguard Worker			fullPath := filepath.Join(remoteDir, bin)
1551*333d2b36SAndroid Build Coastguard Worker			options = append(options, tradefed.Option{Name: "push-file", Key: bin, Value: fullPath})
1552*333d2b36SAndroid Build Coastguard Worker		}
1553*333d2b36SAndroid Build Coastguard Worker		configs = append(configs, tradefed.Object{
1554*333d2b36SAndroid Build Coastguard Worker			Type:    "target_preparer",
1555*333d2b36SAndroid Build Coastguard Worker			Class:   "com.android.tradefed.targetprep.PushFilePreparer",
1556*333d2b36SAndroid Build Coastguard Worker			Options: options,
1557*333d2b36SAndroid Build Coastguard Worker		})
1558*333d2b36SAndroid Build Coastguard Worker	}
1559*333d2b36SAndroid Build Coastguard Worker
1560*333d2b36SAndroid Build Coastguard Worker	j.Test.generateAndroidBuildActionsWithConfig(ctx, configs)
1561*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, tradefed.BaseTestProviderKey, tradefed.BaseTestProviderData{
1562*333d2b36SAndroid Build Coastguard Worker		TestcaseRelDataFiles: testcaseRel(j.data),
1563*333d2b36SAndroid Build Coastguard Worker		OutputFile:           j.outputFile,
1564*333d2b36SAndroid Build Coastguard Worker		TestConfig:           j.testConfig,
1565*333d2b36SAndroid Build Coastguard Worker		RequiredModuleNames:  j.RequiredModuleNames(ctx),
1566*333d2b36SAndroid Build Coastguard Worker		TestSuites:           j.testProperties.Test_suites,
1567*333d2b36SAndroid Build Coastguard Worker		IsHost:               true,
1568*333d2b36SAndroid Build Coastguard Worker		LocalSdkVersion:      j.sdkVersion.String(),
1569*333d2b36SAndroid Build Coastguard Worker		IsUnitTest:           Bool(j.testProperties.Test_options.Unit_test),
1570*333d2b36SAndroid Build Coastguard Worker		MkInclude:            "$(BUILD_SYSTEM)/soong_java_prebuilt.mk",
1571*333d2b36SAndroid Build Coastguard Worker		MkAppClass:           "JAVA_LIBRARIES",
1572*333d2b36SAndroid Build Coastguard Worker	})
1573*333d2b36SAndroid Build Coastguard Worker}
1574*333d2b36SAndroid Build Coastguard Worker
1575*333d2b36SAndroid Build Coastguard Workerfunc (j *Test) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1576*333d2b36SAndroid Build Coastguard Worker	checkMinSdkVersionMts(ctx, j.MinSdkVersion(ctx))
1577*333d2b36SAndroid Build Coastguard Worker	j.generateAndroidBuildActionsWithConfig(ctx, nil)
1578*333d2b36SAndroid Build Coastguard Worker}
1579*333d2b36SAndroid Build Coastguard Worker
1580*333d2b36SAndroid Build Coastguard Workerfunc (j *Test) generateAndroidBuildActionsWithConfig(ctx android.ModuleContext, configs []tradefed.Config) {
1581*333d2b36SAndroid Build Coastguard Worker	if j.testProperties.Test_options.Unit_test == nil && ctx.Host() {
1582*333d2b36SAndroid Build Coastguard Worker		// TODO(b/): Clean temporary heuristic to avoid unexpected onboarding.
1583*333d2b36SAndroid Build Coastguard Worker		defaultUnitTest := !inList("tradefed", j.properties.Libs) && !inList("cts", j.testProperties.Test_suites)
1584*333d2b36SAndroid Build Coastguard Worker		j.testProperties.Test_options.Unit_test = proptools.BoolPtr(defaultUnitTest)
1585*333d2b36SAndroid Build Coastguard Worker	}
1586*333d2b36SAndroid Build Coastguard Worker	j.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
1587*333d2b36SAndroid Build Coastguard Worker		TestConfigProp:          j.testProperties.Test_config,
1588*333d2b36SAndroid Build Coastguard Worker		TestConfigTemplateProp:  j.testProperties.Test_config_template,
1589*333d2b36SAndroid Build Coastguard Worker		TestSuites:              j.testProperties.Test_suites,
1590*333d2b36SAndroid Build Coastguard Worker		Config:                  configs,
1591*333d2b36SAndroid Build Coastguard Worker		OptionsForAutogenerated: j.testProperties.Test_options.Tradefed_options,
1592*333d2b36SAndroid Build Coastguard Worker		TestRunnerOptions:       j.testProperties.Test_options.Test_runner_options,
1593*333d2b36SAndroid Build Coastguard Worker		AutoGenConfig:           j.testProperties.Auto_gen_config,
1594*333d2b36SAndroid Build Coastguard Worker		UnitTest:                j.testProperties.Test_options.Unit_test,
1595*333d2b36SAndroid Build Coastguard Worker		DeviceTemplate:          "${JavaTestConfigTemplate}",
1596*333d2b36SAndroid Build Coastguard Worker		HostTemplate:            "${JavaHostTestConfigTemplate}",
1597*333d2b36SAndroid Build Coastguard Worker		HostUnitTestTemplate:    "${JavaHostUnitTestConfigTemplate}",
1598*333d2b36SAndroid Build Coastguard Worker	})
1599*333d2b36SAndroid Build Coastguard Worker
1600*333d2b36SAndroid Build Coastguard Worker	j.data = android.PathsForModuleSrc(ctx, j.testProperties.Data)
1601*333d2b36SAndroid Build Coastguard Worker	j.data = append(j.data, android.PathsForModuleSrc(ctx, j.testProperties.Device_common_data)...)
1602*333d2b36SAndroid Build Coastguard Worker	j.data = append(j.data, android.PathsForModuleSrc(ctx, j.testProperties.Device_first_data)...)
1603*333d2b36SAndroid Build Coastguard Worker	j.data = append(j.data, android.PathsForModuleSrc(ctx, j.testProperties.Device_first_prefer32_data)...)
1604*333d2b36SAndroid Build Coastguard Worker
1605*333d2b36SAndroid Build Coastguard Worker	j.extraTestConfigs = android.PathsForModuleSrc(ctx, j.testProperties.Test_options.Extra_test_configs)
1606*333d2b36SAndroid Build Coastguard Worker
1607*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDepsWithTag(dataNativeBinsTag, func(dep android.Module) {
1608*333d2b36SAndroid Build Coastguard Worker		j.data = append(j.data, android.OutputFileForModule(ctx, dep, ""))
1609*333d2b36SAndroid Build Coastguard Worker	})
1610*333d2b36SAndroid Build Coastguard Worker
1611*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDepsWithTag(dataDeviceBinsTag, func(dep android.Module) {
1612*333d2b36SAndroid Build Coastguard Worker		j.data = append(j.data, android.OutputFileForModule(ctx, dep, ""))
1613*333d2b36SAndroid Build Coastguard Worker	})
1614*333d2b36SAndroid Build Coastguard Worker
1615*333d2b36SAndroid Build Coastguard Worker	var directImplementationDeps android.Paths
1616*333d2b36SAndroid Build Coastguard Worker	var transitiveImplementationDeps []depset.DepSet[android.Path]
1617*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDepsWithTag(jniLibTag, func(dep android.Module) {
1618*333d2b36SAndroid Build Coastguard Worker		sharedLibInfo, _ := android.OtherModuleProvider(ctx, dep, cc.SharedLibraryInfoProvider)
1619*333d2b36SAndroid Build Coastguard Worker		if sharedLibInfo.SharedLibrary != nil {
1620*333d2b36SAndroid Build Coastguard Worker			// Copy to an intermediate output directory to append "lib[64]" to the path,
1621*333d2b36SAndroid Build Coastguard Worker			// so that it's compatible with the default rpath values.
1622*333d2b36SAndroid Build Coastguard Worker			var relPath string
1623*333d2b36SAndroid Build Coastguard Worker			if sharedLibInfo.Target.Arch.ArchType.Multilib == "lib64" {
1624*333d2b36SAndroid Build Coastguard Worker				relPath = filepath.Join("lib64", sharedLibInfo.SharedLibrary.Base())
1625*333d2b36SAndroid Build Coastguard Worker			} else {
1626*333d2b36SAndroid Build Coastguard Worker				relPath = filepath.Join("lib", sharedLibInfo.SharedLibrary.Base())
1627*333d2b36SAndroid Build Coastguard Worker			}
1628*333d2b36SAndroid Build Coastguard Worker			relocatedLib := android.PathForModuleOut(ctx, "relocated").Join(ctx, relPath)
1629*333d2b36SAndroid Build Coastguard Worker			ctx.Build(pctx, android.BuildParams{
1630*333d2b36SAndroid Build Coastguard Worker				Rule:   android.Cp,
1631*333d2b36SAndroid Build Coastguard Worker				Input:  sharedLibInfo.SharedLibrary,
1632*333d2b36SAndroid Build Coastguard Worker				Output: relocatedLib,
1633*333d2b36SAndroid Build Coastguard Worker			})
1634*333d2b36SAndroid Build Coastguard Worker			j.data = append(j.data, relocatedLib)
1635*333d2b36SAndroid Build Coastguard Worker
1636*333d2b36SAndroid Build Coastguard Worker			directImplementationDeps = append(directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
1637*333d2b36SAndroid Build Coastguard Worker			if info, ok := android.OtherModuleProvider(ctx, dep, cc.ImplementationDepInfoProvider); ok {
1638*333d2b36SAndroid Build Coastguard Worker				transitiveImplementationDeps = append(transitiveImplementationDeps, info.ImplementationDeps)
1639*333d2b36SAndroid Build Coastguard Worker			}
1640*333d2b36SAndroid Build Coastguard Worker		} else {
1641*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("jni_libs", "%q of type %q is not supported", dep.Name(), ctx.OtherModuleType(dep))
1642*333d2b36SAndroid Build Coastguard Worker		}
1643*333d2b36SAndroid Build Coastguard Worker	})
1644*333d2b36SAndroid Build Coastguard Worker
1645*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, cc.ImplementationDepInfoProvider, &cc.ImplementationDepInfo{
1646*333d2b36SAndroid Build Coastguard Worker		ImplementationDeps: depset.New(depset.PREORDER, directImplementationDeps, transitiveImplementationDeps),
1647*333d2b36SAndroid Build Coastguard Worker	})
1648*333d2b36SAndroid Build Coastguard Worker
1649*333d2b36SAndroid Build Coastguard Worker	j.Library.GenerateAndroidBuildActions(ctx)
1650*333d2b36SAndroid Build Coastguard Worker}
1651*333d2b36SAndroid Build Coastguard Worker
1652*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHelperLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1653*333d2b36SAndroid Build Coastguard Worker	j.Library.GenerateAndroidBuildActions(ctx)
1654*333d2b36SAndroid Build Coastguard Worker}
1655*333d2b36SAndroid Build Coastguard Worker
1656*333d2b36SAndroid Build Coastguard Workerfunc (j *JavaTestImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1657*333d2b36SAndroid Build Coastguard Worker	j.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
1658*333d2b36SAndroid Build Coastguard Worker		TestConfigProp:       j.prebuiltTestProperties.Test_config,
1659*333d2b36SAndroid Build Coastguard Worker		TestSuites:           j.prebuiltTestProperties.Test_suites,
1660*333d2b36SAndroid Build Coastguard Worker		DeviceTemplate:       "${JavaTestConfigTemplate}",
1661*333d2b36SAndroid Build Coastguard Worker		HostTemplate:         "${JavaHostTestConfigTemplate}",
1662*333d2b36SAndroid Build Coastguard Worker		HostUnitTestTemplate: "${JavaHostUnitTestConfigTemplate}",
1663*333d2b36SAndroid Build Coastguard Worker	})
1664*333d2b36SAndroid Build Coastguard Worker
1665*333d2b36SAndroid Build Coastguard Worker	j.Import.GenerateAndroidBuildActions(ctx)
1666*333d2b36SAndroid Build Coastguard Worker}
1667*333d2b36SAndroid Build Coastguard Worker
1668*333d2b36SAndroid Build Coastguard Workertype testSdkMemberType struct {
1669*333d2b36SAndroid Build Coastguard Worker	android.SdkMemberTypeBase
1670*333d2b36SAndroid Build Coastguard Worker}
1671*333d2b36SAndroid Build Coastguard Worker
1672*333d2b36SAndroid Build Coastguard Workerfunc (mt *testSdkMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) {
1673*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, dependencyTag, names...)
1674*333d2b36SAndroid Build Coastguard Worker}
1675*333d2b36SAndroid Build Coastguard Worker
1676*333d2b36SAndroid Build Coastguard Workerfunc (mt *testSdkMemberType) IsInstance(module android.Module) bool {
1677*333d2b36SAndroid Build Coastguard Worker	_, ok := module.(*Test)
1678*333d2b36SAndroid Build Coastguard Worker	return ok
1679*333d2b36SAndroid Build Coastguard Worker}
1680*333d2b36SAndroid Build Coastguard Worker
1681*333d2b36SAndroid Build Coastguard Workerfunc (mt *testSdkMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
1682*333d2b36SAndroid Build Coastguard Worker	return ctx.SnapshotBuilder().AddPrebuiltModule(member, "java_test_import")
1683*333d2b36SAndroid Build Coastguard Worker}
1684*333d2b36SAndroid Build Coastguard Worker
1685*333d2b36SAndroid Build Coastguard Workerfunc (mt *testSdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
1686*333d2b36SAndroid Build Coastguard Worker	return &testSdkMemberProperties{}
1687*333d2b36SAndroid Build Coastguard Worker}
1688*333d2b36SAndroid Build Coastguard Worker
1689*333d2b36SAndroid Build Coastguard Workertype testSdkMemberProperties struct {
1690*333d2b36SAndroid Build Coastguard Worker	android.SdkMemberPropertiesBase
1691*333d2b36SAndroid Build Coastguard Worker
1692*333d2b36SAndroid Build Coastguard Worker	JarToExport android.Path
1693*333d2b36SAndroid Build Coastguard Worker	TestConfig  android.Path
1694*333d2b36SAndroid Build Coastguard Worker}
1695*333d2b36SAndroid Build Coastguard Worker
1696*333d2b36SAndroid Build Coastguard Workerfunc (p *testSdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
1697*333d2b36SAndroid Build Coastguard Worker	test := variant.(*Test)
1698*333d2b36SAndroid Build Coastguard Worker
1699*333d2b36SAndroid Build Coastguard Worker	implementationJars := test.ImplementationJars()
1700*333d2b36SAndroid Build Coastguard Worker	if len(implementationJars) != 1 {
1701*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Errorf("there must be only one implementation jar from %q", test.Name()))
1702*333d2b36SAndroid Build Coastguard Worker	}
1703*333d2b36SAndroid Build Coastguard Worker
1704*333d2b36SAndroid Build Coastguard Worker	p.JarToExport = implementationJars[0]
1705*333d2b36SAndroid Build Coastguard Worker	p.TestConfig = test.testConfig
1706*333d2b36SAndroid Build Coastguard Worker}
1707*333d2b36SAndroid Build Coastguard Worker
1708*333d2b36SAndroid Build Coastguard Workerfunc (p *testSdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
1709*333d2b36SAndroid Build Coastguard Worker	builder := ctx.SnapshotBuilder()
1710*333d2b36SAndroid Build Coastguard Worker
1711*333d2b36SAndroid Build Coastguard Worker	exportedJar := p.JarToExport
1712*333d2b36SAndroid Build Coastguard Worker	if exportedJar != nil {
1713*333d2b36SAndroid Build Coastguard Worker		snapshotRelativeJavaLibPath := sdkSnapshotFilePathForJar(ctx, p.OsPrefix(), ctx.Name())
1714*333d2b36SAndroid Build Coastguard Worker		builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath)
1715*333d2b36SAndroid Build Coastguard Worker
1716*333d2b36SAndroid Build Coastguard Worker		propertySet.AddProperty("jars", []string{snapshotRelativeJavaLibPath})
1717*333d2b36SAndroid Build Coastguard Worker	}
1718*333d2b36SAndroid Build Coastguard Worker
1719*333d2b36SAndroid Build Coastguard Worker	testConfig := p.TestConfig
1720*333d2b36SAndroid Build Coastguard Worker	if testConfig != nil {
1721*333d2b36SAndroid Build Coastguard Worker		snapshotRelativeTestConfigPath := sdkSnapshotFilePathForMember(p.OsPrefix(), ctx.Name(), testConfigSuffix)
1722*333d2b36SAndroid Build Coastguard Worker		builder.CopyToSnapshot(testConfig, snapshotRelativeTestConfigPath)
1723*333d2b36SAndroid Build Coastguard Worker		propertySet.AddProperty("test_config", snapshotRelativeTestConfigPath)
1724*333d2b36SAndroid Build Coastguard Worker	}
1725*333d2b36SAndroid Build Coastguard Worker}
1726*333d2b36SAndroid Build Coastguard Worker
1727*333d2b36SAndroid Build Coastguard Worker// java_test builds a and links sources into a `.jar` file for the device, and possibly for the host as well, and
1728*333d2b36SAndroid Build Coastguard Worker// creates an `AndroidTest.xml` file to allow running the test with `atest` or a `TEST_MAPPING` file.
1729*333d2b36SAndroid Build Coastguard Worker//
1730*333d2b36SAndroid Build Coastguard Worker// By default, a java_test has a single variant that produces a `.jar` file containing `classes.dex` files that were
1731*333d2b36SAndroid Build Coastguard Worker// compiled against the device bootclasspath.
1732*333d2b36SAndroid Build Coastguard Worker//
1733*333d2b36SAndroid Build Coastguard Worker// Specifying `host_supported: true` will produce two variants, one compiled against the device bootclasspath and one
1734*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath.
1735*333d2b36SAndroid Build Coastguard Workerfunc TestFactory() android.Module {
1736*333d2b36SAndroid Build Coastguard Worker	module := &Test{}
1737*333d2b36SAndroid Build Coastguard Worker
1738*333d2b36SAndroid Build Coastguard Worker	module.addHostAndDeviceProperties()
1739*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.testProperties)
1740*333d2b36SAndroid Build Coastguard Worker
1741*333d2b36SAndroid Build Coastguard Worker	module.Module.properties.Installable = proptools.BoolPtr(true)
1742*333d2b36SAndroid Build Coastguard Worker	module.Module.dexpreopter.isTest = true
1743*333d2b36SAndroid Build Coastguard Worker	module.Module.linter.properties.Lint.Test = proptools.BoolPtr(true)
1744*333d2b36SAndroid Build Coastguard Worker	module.Module.sourceProperties.Test_only = proptools.BoolPtr(true)
1745*333d2b36SAndroid Build Coastguard Worker	module.Module.sourceProperties.Top_level_test_target = true
1746*333d2b36SAndroid Build Coastguard Worker
1747*333d2b36SAndroid Build Coastguard Worker	InitJavaModule(module, android.HostAndDeviceSupported)
1748*333d2b36SAndroid Build Coastguard Worker	return module
1749*333d2b36SAndroid Build Coastguard Worker}
1750*333d2b36SAndroid Build Coastguard Worker
1751*333d2b36SAndroid Build Coastguard Worker// java_test_helper_library creates a java library and makes sure that it is added to the appropriate test suite.
1752*333d2b36SAndroid Build Coastguard Workerfunc TestHelperLibraryFactory() android.Module {
1753*333d2b36SAndroid Build Coastguard Worker	module := &TestHelperLibrary{}
1754*333d2b36SAndroid Build Coastguard Worker
1755*333d2b36SAndroid Build Coastguard Worker	module.addHostAndDeviceProperties()
1756*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.testHelperLibraryProperties)
1757*333d2b36SAndroid Build Coastguard Worker
1758*333d2b36SAndroid Build Coastguard Worker	module.Module.properties.Installable = proptools.BoolPtr(true)
1759*333d2b36SAndroid Build Coastguard Worker	module.Module.dexpreopter.isTest = true
1760*333d2b36SAndroid Build Coastguard Worker	module.Module.linter.properties.Lint.Test = proptools.BoolPtr(true)
1761*333d2b36SAndroid Build Coastguard Worker	module.Module.sourceProperties.Test_only = proptools.BoolPtr(true)
1762*333d2b36SAndroid Build Coastguard Worker
1763*333d2b36SAndroid Build Coastguard Worker	InitJavaModule(module, android.HostAndDeviceSupported)
1764*333d2b36SAndroid Build Coastguard Worker	return module
1765*333d2b36SAndroid Build Coastguard Worker}
1766*333d2b36SAndroid Build Coastguard Worker
1767*333d2b36SAndroid Build Coastguard Worker// java_test_import imports one or more `.jar` files into the build graph as if they were built by a java_test module
1768*333d2b36SAndroid Build Coastguard Worker// and makes sure that it is added to the appropriate test suite.
1769*333d2b36SAndroid Build Coastguard Worker//
1770*333d2b36SAndroid Build Coastguard Worker// By default, a java_test_import has a single variant that expects a `.jar` file containing `.class` files that were
1771*333d2b36SAndroid Build Coastguard Worker// compiled against an Android classpath.
1772*333d2b36SAndroid Build Coastguard Worker//
1773*333d2b36SAndroid Build Coastguard Worker// Specifying `host_supported: true` will produce two variants, one for use as a dependency of device modules and one
1774*333d2b36SAndroid Build Coastguard Worker// for host modules.
1775*333d2b36SAndroid Build Coastguard Workerfunc JavaTestImportFactory() android.Module {
1776*333d2b36SAndroid Build Coastguard Worker	module := &JavaTestImport{}
1777*333d2b36SAndroid Build Coastguard Worker
1778*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(
1779*333d2b36SAndroid Build Coastguard Worker		&module.Import.properties,
1780*333d2b36SAndroid Build Coastguard Worker		&module.prebuiltTestProperties)
1781*333d2b36SAndroid Build Coastguard Worker
1782*333d2b36SAndroid Build Coastguard Worker	module.Import.properties.Installable = proptools.BoolPtr(true)
1783*333d2b36SAndroid Build Coastguard Worker
1784*333d2b36SAndroid Build Coastguard Worker	android.InitPrebuiltModule(module, &module.properties.Jars)
1785*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(module)
1786*333d2b36SAndroid Build Coastguard Worker	InitJavaModule(module, android.HostAndDeviceSupported)
1787*333d2b36SAndroid Build Coastguard Worker	return module
1788*333d2b36SAndroid Build Coastguard Worker}
1789*333d2b36SAndroid Build Coastguard Worker
1790*333d2b36SAndroid Build Coastguard Worker// java_test_host builds a and links sources into a `.jar` file for the host, and creates an `AndroidTest.xml` file to
1791*333d2b36SAndroid Build Coastguard Worker// allow running the test with `atest` or a `TEST_MAPPING` file.
1792*333d2b36SAndroid Build Coastguard Worker//
1793*333d2b36SAndroid Build Coastguard Worker// A java_test_host has a single variant that produces a `.jar` file containing `.class` files that were
1794*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath.
1795*333d2b36SAndroid Build Coastguard Workerfunc TestHostFactory() android.Module {
1796*333d2b36SAndroid Build Coastguard Worker	module := &TestHost{}
1797*333d2b36SAndroid Build Coastguard Worker
1798*333d2b36SAndroid Build Coastguard Worker	module.addHostProperties()
1799*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.testProperties)
1800*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.testHostProperties)
1801*333d2b36SAndroid Build Coastguard Worker
1802*333d2b36SAndroid Build Coastguard Worker	InitTestHost(
1803*333d2b36SAndroid Build Coastguard Worker		module,
1804*333d2b36SAndroid Build Coastguard Worker		proptools.BoolPtr(true),
1805*333d2b36SAndroid Build Coastguard Worker		nil,
1806*333d2b36SAndroid Build Coastguard Worker		nil)
1807*333d2b36SAndroid Build Coastguard Worker
1808*333d2b36SAndroid Build Coastguard Worker	InitJavaModuleMultiTargets(module, android.HostSupported)
1809*333d2b36SAndroid Build Coastguard Worker
1810*333d2b36SAndroid Build Coastguard Worker	return module
1811*333d2b36SAndroid Build Coastguard Worker}
1812*333d2b36SAndroid Build Coastguard Worker
1813*333d2b36SAndroid Build Coastguard Workerfunc InitTestHost(th *TestHost, installable *bool, testSuites []string, autoGenConfig *bool) {
1814*333d2b36SAndroid Build Coastguard Worker	th.properties.Installable = installable
1815*333d2b36SAndroid Build Coastguard Worker	th.testProperties.Auto_gen_config = autoGenConfig
1816*333d2b36SAndroid Build Coastguard Worker	th.testProperties.Test_suites = testSuites
1817*333d2b36SAndroid Build Coastguard Worker	th.sourceProperties.Test_only = proptools.BoolPtr(true)
1818*333d2b36SAndroid Build Coastguard Worker	th.sourceProperties.Top_level_test_target = true
1819*333d2b36SAndroid Build Coastguard Worker}
1820*333d2b36SAndroid Build Coastguard Worker
1821*333d2b36SAndroid Build Coastguard Worker//
1822*333d2b36SAndroid Build Coastguard Worker// Java Binaries (.jar file plus wrapper script)
1823*333d2b36SAndroid Build Coastguard Worker//
1824*333d2b36SAndroid Build Coastguard Worker
1825*333d2b36SAndroid Build Coastguard Workertype binaryProperties struct {
1826*333d2b36SAndroid Build Coastguard Worker	// installable script to execute the resulting jar
1827*333d2b36SAndroid Build Coastguard Worker	Wrapper *string `android:"path,arch_variant"`
1828*333d2b36SAndroid Build Coastguard Worker
1829*333d2b36SAndroid Build Coastguard Worker	// Name of the class containing main to be inserted into the manifest as Main-Class.
1830*333d2b36SAndroid Build Coastguard Worker	Main_class *string
1831*333d2b36SAndroid Build Coastguard Worker
1832*333d2b36SAndroid Build Coastguard Worker	// Names of modules containing JNI libraries that should be installed alongside the binary.
1833*333d2b36SAndroid Build Coastguard Worker	Jni_libs []string `android:"arch_variant"`
1834*333d2b36SAndroid Build Coastguard Worker}
1835*333d2b36SAndroid Build Coastguard Worker
1836*333d2b36SAndroid Build Coastguard Workertype Binary struct {
1837*333d2b36SAndroid Build Coastguard Worker	Library
1838*333d2b36SAndroid Build Coastguard Worker
1839*333d2b36SAndroid Build Coastguard Worker	binaryProperties binaryProperties
1840*333d2b36SAndroid Build Coastguard Worker
1841*333d2b36SAndroid Build Coastguard Worker	wrapperFile android.Path
1842*333d2b36SAndroid Build Coastguard Worker	binaryFile  android.InstallPath
1843*333d2b36SAndroid Build Coastguard Worker
1844*333d2b36SAndroid Build Coastguard Worker	androidMkNamesOfJniLibs []string
1845*333d2b36SAndroid Build Coastguard Worker}
1846*333d2b36SAndroid Build Coastguard Worker
1847*333d2b36SAndroid Build Coastguard Workerfunc (j *Binary) HostToolPath() android.OptionalPath {
1848*333d2b36SAndroid Build Coastguard Worker	return android.OptionalPathForPath(j.binaryFile)
1849*333d2b36SAndroid Build Coastguard Worker}
1850*333d2b36SAndroid Build Coastguard Worker
1851*333d2b36SAndroid Build Coastguard Workerfunc (j *Binary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1852*333d2b36SAndroid Build Coastguard Worker	j.stem = proptools.StringDefault(j.overridableProperties.Stem, ctx.ModuleName())
1853*333d2b36SAndroid Build Coastguard Worker
1854*333d2b36SAndroid Build Coastguard Worker	// Handle the binary wrapper. This comes before compiling the jar so that the wrapper
1855*333d2b36SAndroid Build Coastguard Worker	// is the first PackagingSpec
1856*333d2b36SAndroid Build Coastguard Worker	if j.binaryProperties.Wrapper != nil {
1857*333d2b36SAndroid Build Coastguard Worker		j.wrapperFile = android.PathForModuleSrc(ctx, *j.binaryProperties.Wrapper)
1858*333d2b36SAndroid Build Coastguard Worker	} else {
1859*333d2b36SAndroid Build Coastguard Worker		if ctx.Windows() {
1860*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("wrapper", "wrapper is required for Windows")
1861*333d2b36SAndroid Build Coastguard Worker		}
1862*333d2b36SAndroid Build Coastguard Worker
1863*333d2b36SAndroid Build Coastguard Worker		if ctx.Device() {
1864*333d2b36SAndroid Build Coastguard Worker			// device binary should have a main_class property if it does not
1865*333d2b36SAndroid Build Coastguard Worker			// have a specific wrapper, so that a default wrapper can
1866*333d2b36SAndroid Build Coastguard Worker			// be generated for it.
1867*333d2b36SAndroid Build Coastguard Worker			if j.binaryProperties.Main_class == nil {
1868*333d2b36SAndroid Build Coastguard Worker				ctx.PropertyErrorf("main_class", "main_class property "+
1869*333d2b36SAndroid Build Coastguard Worker					"is required for device binary if no default wrapper is assigned")
1870*333d2b36SAndroid Build Coastguard Worker			} else {
1871*333d2b36SAndroid Build Coastguard Worker				wrapper := android.PathForModuleOut(ctx, ctx.ModuleName()+".sh")
1872*333d2b36SAndroid Build Coastguard Worker				jarName := j.Stem() + ".jar"
1873*333d2b36SAndroid Build Coastguard Worker				partition := j.PartitionTag(ctx.DeviceConfig())
1874*333d2b36SAndroid Build Coastguard Worker				ctx.Build(pctx, android.BuildParams{
1875*333d2b36SAndroid Build Coastguard Worker					Rule:   deviceBinaryWrapper,
1876*333d2b36SAndroid Build Coastguard Worker					Output: wrapper,
1877*333d2b36SAndroid Build Coastguard Worker					Args: map[string]string{
1878*333d2b36SAndroid Build Coastguard Worker						"jar_name":   jarName,
1879*333d2b36SAndroid Build Coastguard Worker						"partition":  partition,
1880*333d2b36SAndroid Build Coastguard Worker						"main_class": String(j.binaryProperties.Main_class),
1881*333d2b36SAndroid Build Coastguard Worker					},
1882*333d2b36SAndroid Build Coastguard Worker				})
1883*333d2b36SAndroid Build Coastguard Worker				j.wrapperFile = wrapper
1884*333d2b36SAndroid Build Coastguard Worker			}
1885*333d2b36SAndroid Build Coastguard Worker		} else {
1886*333d2b36SAndroid Build Coastguard Worker			j.wrapperFile = android.PathForSource(ctx, "build/soong/scripts/jar-wrapper.sh")
1887*333d2b36SAndroid Build Coastguard Worker		}
1888*333d2b36SAndroid Build Coastguard Worker	}
1889*333d2b36SAndroid Build Coastguard Worker
1890*333d2b36SAndroid Build Coastguard Worker	ext := ""
1891*333d2b36SAndroid Build Coastguard Worker	if ctx.Windows() {
1892*333d2b36SAndroid Build Coastguard Worker		ext = ".bat"
1893*333d2b36SAndroid Build Coastguard Worker	}
1894*333d2b36SAndroid Build Coastguard Worker
1895*333d2b36SAndroid Build Coastguard Worker	// The host installation rules make the installed wrapper depend on all the dependencies
1896*333d2b36SAndroid Build Coastguard Worker	// of the wrapper variant, which will include the common variant's jar file and any JNI
1897*333d2b36SAndroid Build Coastguard Worker	// libraries.  This is verified by TestBinary. Also make it depend on the jar file so that
1898*333d2b36SAndroid Build Coastguard Worker	// the binary file timestamp will update when the jar file timestamp does. The jar file is
1899*333d2b36SAndroid Build Coastguard Worker	// built later on, in j.Library.GenerateAndroidBuildActions, so we have to create an identical
1900*333d2b36SAndroid Build Coastguard Worker	// installpath representing it here.
1901*333d2b36SAndroid Build Coastguard Worker	j.binaryFile = ctx.InstallExecutable(android.PathForModuleInstall(ctx, "bin"),
1902*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleName()+ext, j.wrapperFile, j.getJarInstallDir(ctx).Join(ctx, j.Stem()+".jar"))
1903*333d2b36SAndroid Build Coastguard Worker
1904*333d2b36SAndroid Build Coastguard Worker	// Set the jniLibs of this binary.
1905*333d2b36SAndroid Build Coastguard Worker	// These will be added to `LOCAL_REQUIRED_MODULES`, and the kati packaging system will
1906*333d2b36SAndroid Build Coastguard Worker	// install these alongside the java binary.
1907*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDepsWithTag(jniInstallTag, func(jni android.Module) {
1908*333d2b36SAndroid Build Coastguard Worker		// Use the BaseModuleName of the dependency (without any prebuilt_ prefix)
1909*333d2b36SAndroid Build Coastguard Worker		bmn, _ := jni.(interface{ BaseModuleName() string })
1910*333d2b36SAndroid Build Coastguard Worker		j.androidMkNamesOfJniLibs = append(j.androidMkNamesOfJniLibs, bmn.BaseModuleName()+":"+jni.Target().Arch.ArchType.Bitness())
1911*333d2b36SAndroid Build Coastguard Worker	})
1912*333d2b36SAndroid Build Coastguard Worker	// Check that native libraries are not listed in `required`. Prompt users to use `jni_libs` instead.
1913*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDepsWithTag(android.RequiredDepTag, func(dep android.Module) {
1914*333d2b36SAndroid Build Coastguard Worker		if _, hasSharedLibraryInfo := android.OtherModuleProvider(ctx, dep, cc.SharedLibraryInfoProvider); hasSharedLibraryInfo {
1915*333d2b36SAndroid Build Coastguard Worker			ctx.ModuleErrorf("cc_library %s is no longer supported in `required` of java_binary modules. Please use jni_libs instead.", dep.Name())
1916*333d2b36SAndroid Build Coastguard Worker		}
1917*333d2b36SAndroid Build Coastguard Worker	})
1918*333d2b36SAndroid Build Coastguard Worker
1919*333d2b36SAndroid Build Coastguard Worker	// Compile the jar
1920*333d2b36SAndroid Build Coastguard Worker	if j.binaryProperties.Main_class != nil {
1921*333d2b36SAndroid Build Coastguard Worker		if j.properties.Manifest != nil {
1922*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("main_class", "main_class cannot be used when manifest is set")
1923*333d2b36SAndroid Build Coastguard Worker		}
1924*333d2b36SAndroid Build Coastguard Worker		manifestFile := android.PathForModuleOut(ctx, "manifest.txt")
1925*333d2b36SAndroid Build Coastguard Worker		GenerateMainClassManifest(ctx, manifestFile, String(j.binaryProperties.Main_class))
1926*333d2b36SAndroid Build Coastguard Worker		j.overrideManifest = android.OptionalPathForPath(manifestFile)
1927*333d2b36SAndroid Build Coastguard Worker	}
1928*333d2b36SAndroid Build Coastguard Worker
1929*333d2b36SAndroid Build Coastguard Worker	j.Library.GenerateAndroidBuildActions(ctx)
1930*333d2b36SAndroid Build Coastguard Worker}
1931*333d2b36SAndroid Build Coastguard Worker
1932*333d2b36SAndroid Build Coastguard Workerfunc (j *Binary) DepsMutator(ctx android.BottomUpMutatorContext) {
1933*333d2b36SAndroid Build Coastguard Worker	j.deps(ctx)
1934*333d2b36SAndroid Build Coastguard Worker	// These dependencies ensure the installation rules will install the jar file when the
1935*333d2b36SAndroid Build Coastguard Worker	// wrapper is installed, and the jni libraries when the wrapper is installed.
1936*333d2b36SAndroid Build Coastguard Worker	if ctx.Os().Class == android.Host {
1937*333d2b36SAndroid Build Coastguard Worker		ctx.AddVariationDependencies(ctx.Config().BuildOSTarget.Variations(), jniInstallTag, j.binaryProperties.Jni_libs...)
1938*333d2b36SAndroid Build Coastguard Worker	} else if ctx.Os().Class == android.Device {
1939*333d2b36SAndroid Build Coastguard Worker		ctx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), jniInstallTag, j.binaryProperties.Jni_libs...)
1940*333d2b36SAndroid Build Coastguard Worker	} else {
1941*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf("Unknown os class")
1942*333d2b36SAndroid Build Coastguard Worker	}
1943*333d2b36SAndroid Build Coastguard Worker}
1944*333d2b36SAndroid Build Coastguard Worker
1945*333d2b36SAndroid Build Coastguard Worker// java_binary builds a `.jar` file and a shell script that executes it for the device, and possibly for the host
1946*333d2b36SAndroid Build Coastguard Worker// as well.
1947*333d2b36SAndroid Build Coastguard Worker//
1948*333d2b36SAndroid Build Coastguard Worker// By default, a java_binary has a single variant that produces a `.jar` file containing `classes.dex` files that were
1949*333d2b36SAndroid Build Coastguard Worker// compiled against the device bootclasspath.
1950*333d2b36SAndroid Build Coastguard Worker//
1951*333d2b36SAndroid Build Coastguard Worker// Specifying `host_supported: true` will produce two variants, one compiled against the device bootclasspath and one
1952*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath.
1953*333d2b36SAndroid Build Coastguard Workerfunc BinaryFactory() android.Module {
1954*333d2b36SAndroid Build Coastguard Worker	module := &Binary{}
1955*333d2b36SAndroid Build Coastguard Worker
1956*333d2b36SAndroid Build Coastguard Worker	module.addHostAndDeviceProperties()
1957*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.binaryProperties, &module.sourceProperties)
1958*333d2b36SAndroid Build Coastguard Worker
1959*333d2b36SAndroid Build Coastguard Worker	module.Module.properties.Installable = proptools.BoolPtr(true)
1960*333d2b36SAndroid Build Coastguard Worker
1961*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon)
1962*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultableModule(module)
1963*333d2b36SAndroid Build Coastguard Worker
1964*333d2b36SAndroid Build Coastguard Worker	return module
1965*333d2b36SAndroid Build Coastguard Worker}
1966*333d2b36SAndroid Build Coastguard Worker
1967*333d2b36SAndroid Build Coastguard Worker// java_binary_host builds a `.jar` file and a shell script that executes it for the host.
1968*333d2b36SAndroid Build Coastguard Worker//
1969*333d2b36SAndroid Build Coastguard Worker// A java_binary_host has a single variant that produces a `.jar` file containing `.class` files that were
1970*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath.
1971*333d2b36SAndroid Build Coastguard Workerfunc BinaryHostFactory() android.Module {
1972*333d2b36SAndroid Build Coastguard Worker	module := &Binary{}
1973*333d2b36SAndroid Build Coastguard Worker
1974*333d2b36SAndroid Build Coastguard Worker	module.addHostProperties()
1975*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.binaryProperties)
1976*333d2b36SAndroid Build Coastguard Worker
1977*333d2b36SAndroid Build Coastguard Worker	module.Module.properties.Installable = proptools.BoolPtr(true)
1978*333d2b36SAndroid Build Coastguard Worker
1979*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon)
1980*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultableModule(module)
1981*333d2b36SAndroid Build Coastguard Worker	return module
1982*333d2b36SAndroid Build Coastguard Worker}
1983*333d2b36SAndroid Build Coastguard Worker
1984*333d2b36SAndroid Build Coastguard Workertype JavaApiContribution struct {
1985*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
1986*333d2b36SAndroid Build Coastguard Worker	android.DefaultableModuleBase
1987*333d2b36SAndroid Build Coastguard Worker	embeddableInModuleAndImport
1988*333d2b36SAndroid Build Coastguard Worker
1989*333d2b36SAndroid Build Coastguard Worker	properties struct {
1990*333d2b36SAndroid Build Coastguard Worker		// name of the API surface
1991*333d2b36SAndroid Build Coastguard Worker		Api_surface *string
1992*333d2b36SAndroid Build Coastguard Worker
1993*333d2b36SAndroid Build Coastguard Worker		// relative path to the API signature text file
1994*333d2b36SAndroid Build Coastguard Worker		Api_file *string `android:"path"`
1995*333d2b36SAndroid Build Coastguard Worker	}
1996*333d2b36SAndroid Build Coastguard Worker}
1997*333d2b36SAndroid Build Coastguard Worker
1998*333d2b36SAndroid Build Coastguard Workerfunc ApiContributionFactory() android.Module {
1999*333d2b36SAndroid Build Coastguard Worker	module := &JavaApiContribution{}
2000*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidModule(module)
2001*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultableModule(module)
2002*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.properties)
2003*333d2b36SAndroid Build Coastguard Worker	module.initModuleAndImport(module)
2004*333d2b36SAndroid Build Coastguard Worker	return module
2005*333d2b36SAndroid Build Coastguard Worker}
2006*333d2b36SAndroid Build Coastguard Worker
2007*333d2b36SAndroid Build Coastguard Workertype JavaApiImportInfo struct {
2008*333d2b36SAndroid Build Coastguard Worker	ApiFile    android.Path
2009*333d2b36SAndroid Build Coastguard Worker	ApiSurface string
2010*333d2b36SAndroid Build Coastguard Worker}
2011*333d2b36SAndroid Build Coastguard Worker
2012*333d2b36SAndroid Build Coastguard Workervar JavaApiImportProvider = blueprint.NewProvider[JavaApiImportInfo]()
2013*333d2b36SAndroid Build Coastguard Worker
2014*333d2b36SAndroid Build Coastguard Workerfunc (ap *JavaApiContribution) GenerateAndroidBuildActions(ctx android.ModuleContext) {
2015*333d2b36SAndroid Build Coastguard Worker	var apiFile android.Path = nil
2016*333d2b36SAndroid Build Coastguard Worker	if apiFileString := ap.properties.Api_file; apiFileString != nil {
2017*333d2b36SAndroid Build Coastguard Worker		apiFile = android.PathForModuleSrc(ctx, String(apiFileString))
2018*333d2b36SAndroid Build Coastguard Worker	}
2019*333d2b36SAndroid Build Coastguard Worker
2020*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, JavaApiImportProvider, JavaApiImportInfo{
2021*333d2b36SAndroid Build Coastguard Worker		ApiFile:    apiFile,
2022*333d2b36SAndroid Build Coastguard Worker		ApiSurface: proptools.String(ap.properties.Api_surface),
2023*333d2b36SAndroid Build Coastguard Worker	})
2024*333d2b36SAndroid Build Coastguard Worker}
2025*333d2b36SAndroid Build Coastguard Worker
2026*333d2b36SAndroid Build Coastguard Workertype ApiLibrary struct {
2027*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
2028*333d2b36SAndroid Build Coastguard Worker	android.DefaultableModuleBase
2029*333d2b36SAndroid Build Coastguard Worker
2030*333d2b36SAndroid Build Coastguard Worker	hiddenAPI
2031*333d2b36SAndroid Build Coastguard Worker	dexer
2032*333d2b36SAndroid Build Coastguard Worker	embeddableInModuleAndImport
2033*333d2b36SAndroid Build Coastguard Worker
2034*333d2b36SAndroid Build Coastguard Worker	properties JavaApiLibraryProperties
2035*333d2b36SAndroid Build Coastguard Worker
2036*333d2b36SAndroid Build Coastguard Worker	stubsSrcJar               android.WritablePath
2037*333d2b36SAndroid Build Coastguard Worker	stubsJar                  android.WritablePath
2038*333d2b36SAndroid Build Coastguard Worker	stubsJarWithoutStaticLibs android.WritablePath
2039*333d2b36SAndroid Build Coastguard Worker	extractedSrcJar           android.WritablePath
2040*333d2b36SAndroid Build Coastguard Worker	// .dex of stubs, used for hiddenapi processing
2041*333d2b36SAndroid Build Coastguard Worker	dexJarFile OptionalDexJarPath
2042*333d2b36SAndroid Build Coastguard Worker
2043*333d2b36SAndroid Build Coastguard Worker	validationPaths android.Paths
2044*333d2b36SAndroid Build Coastguard Worker
2045*333d2b36SAndroid Build Coastguard Worker	stubsType StubsType
2046*333d2b36SAndroid Build Coastguard Worker
2047*333d2b36SAndroid Build Coastguard Worker	aconfigProtoFiles android.Paths
2048*333d2b36SAndroid Build Coastguard Worker}
2049*333d2b36SAndroid Build Coastguard Worker
2050*333d2b36SAndroid Build Coastguard Workertype JavaApiLibraryProperties struct {
2051*333d2b36SAndroid Build Coastguard Worker	// name of the API surface
2052*333d2b36SAndroid Build Coastguard Worker	Api_surface *string
2053*333d2b36SAndroid Build Coastguard Worker
2054*333d2b36SAndroid Build Coastguard Worker	// list of Java API contribution modules that consists this API surface
2055*333d2b36SAndroid Build Coastguard Worker	// This is a list of Soong modules
2056*333d2b36SAndroid Build Coastguard Worker	Api_contributions []string
2057*333d2b36SAndroid Build Coastguard Worker
2058*333d2b36SAndroid Build Coastguard Worker	// List of flags to be passed to the javac compiler to generate jar file
2059*333d2b36SAndroid Build Coastguard Worker	Javacflags []string
2060*333d2b36SAndroid Build Coastguard Worker
2061*333d2b36SAndroid Build Coastguard Worker	// List of shared java libs that this module has dependencies to and
2062*333d2b36SAndroid Build Coastguard Worker	// should be passed as classpath in javac invocation
2063*333d2b36SAndroid Build Coastguard Worker	Libs proptools.Configurable[[]string]
2064*333d2b36SAndroid Build Coastguard Worker
2065*333d2b36SAndroid Build Coastguard Worker	// List of java libs that this module has static dependencies to and will be
2066*333d2b36SAndroid Build Coastguard Worker	// merge zipped after metalava invocation
2067*333d2b36SAndroid Build Coastguard Worker	Static_libs proptools.Configurable[[]string]
2068*333d2b36SAndroid Build Coastguard Worker
2069*333d2b36SAndroid Build Coastguard Worker	// Version of previously released API file for compatibility check.
2070*333d2b36SAndroid Build Coastguard Worker	Previous_api *string `android:"path"`
2071*333d2b36SAndroid Build Coastguard Worker
2072*333d2b36SAndroid Build Coastguard Worker	// java_system_modules module providing the jar to be added to the
2073*333d2b36SAndroid Build Coastguard Worker	// bootclasspath when compiling the stubs.
2074*333d2b36SAndroid Build Coastguard Worker	// The jar will also be passed to metalava as a classpath to
2075*333d2b36SAndroid Build Coastguard Worker	// generate compilable stubs.
2076*333d2b36SAndroid Build Coastguard Worker	System_modules *string
2077*333d2b36SAndroid Build Coastguard Worker
2078*333d2b36SAndroid Build Coastguard Worker	// If true, the module runs validation on the API signature files provided
2079*333d2b36SAndroid Build Coastguard Worker	// by the modules passed via api_contributions by checking if the files are
2080*333d2b36SAndroid Build Coastguard Worker	// in sync with the source Java files. However, the environment variable
2081*333d2b36SAndroid Build Coastguard Worker	// DISABLE_STUB_VALIDATION has precedence over this property.
2082*333d2b36SAndroid Build Coastguard Worker	Enable_validation *bool
2083*333d2b36SAndroid Build Coastguard Worker
2084*333d2b36SAndroid Build Coastguard Worker	// Type of stubs the module should generate. Must be one of "everything", "runtime" or
2085*333d2b36SAndroid Build Coastguard Worker	// "exportable". Defaults to "everything".
2086*333d2b36SAndroid Build Coastguard Worker	// - "everything" stubs include all non-flagged apis and flagged apis, regardless of the state
2087*333d2b36SAndroid Build Coastguard Worker	// of the flag.
2088*333d2b36SAndroid Build Coastguard Worker	// - "runtime" stubs include all non-flagged apis and flagged apis that are ENABLED or
2089*333d2b36SAndroid Build Coastguard Worker	// READ_WRITE, and all other flagged apis are stripped.
2090*333d2b36SAndroid Build Coastguard Worker	// - "exportable" stubs include all non-flagged apis and flagged apis that are ENABLED and
2091*333d2b36SAndroid Build Coastguard Worker	// READ_ONLY, and all other flagged apis are stripped.
2092*333d2b36SAndroid Build Coastguard Worker	Stubs_type *string
2093*333d2b36SAndroid Build Coastguard Worker
2094*333d2b36SAndroid Build Coastguard Worker	// List of aconfig_declarations module names that the stubs generated in this module
2095*333d2b36SAndroid Build Coastguard Worker	// depend on.
2096*333d2b36SAndroid Build Coastguard Worker	Aconfig_declarations []string
2097*333d2b36SAndroid Build Coastguard Worker
2098*333d2b36SAndroid Build Coastguard Worker	// List of hard coded filegroups containing Metalava config files that are passed to every
2099*333d2b36SAndroid Build Coastguard Worker	// Metalava invocation that this module performs. See addMetalavaConfigFilesToCmd.
2100*333d2b36SAndroid Build Coastguard Worker	ConfigFiles []string `android:"path" blueprint:"mutated"`
2101*333d2b36SAndroid Build Coastguard Worker
2102*333d2b36SAndroid Build Coastguard Worker	// If not blank, set to the version of the sdk to compile against.
2103*333d2b36SAndroid Build Coastguard Worker	// Defaults to an empty string, which compiles the module against the private platform APIs.
2104*333d2b36SAndroid Build Coastguard Worker	// Values are of one of the following forms:
2105*333d2b36SAndroid Build Coastguard Worker	// 1) numerical API level, "current", "none", or "core_platform"
2106*333d2b36SAndroid Build Coastguard Worker	// 2) An SDK kind with an API level: "<sdk kind>_<API level>"
2107*333d2b36SAndroid Build Coastguard Worker	// See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds.
2108*333d2b36SAndroid Build Coastguard Worker	// If the SDK kind is empty, it will be set to public.
2109*333d2b36SAndroid Build Coastguard Worker	Sdk_version *string
2110*333d2b36SAndroid Build Coastguard Worker}
2111*333d2b36SAndroid Build Coastguard Worker
2112*333d2b36SAndroid Build Coastguard Workerfunc ApiLibraryFactory() android.Module {
2113*333d2b36SAndroid Build Coastguard Worker	module := &ApiLibrary{}
2114*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.properties)
2115*333d2b36SAndroid Build Coastguard Worker	module.properties.ConfigFiles = getMetalavaConfigFilegroupReference()
2116*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
2117*333d2b36SAndroid Build Coastguard Worker	module.initModuleAndImport(module)
2118*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultableModule(module)
2119*333d2b36SAndroid Build Coastguard Worker	return module
2120*333d2b36SAndroid Build Coastguard Worker}
2121*333d2b36SAndroid Build Coastguard Worker
2122*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) ApiSurface() *string {
2123*333d2b36SAndroid Build Coastguard Worker	return al.properties.Api_surface
2124*333d2b36SAndroid Build Coastguard Worker}
2125*333d2b36SAndroid Build Coastguard Worker
2126*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) StubsJar() android.Path {
2127*333d2b36SAndroid Build Coastguard Worker	return al.stubsJar
2128*333d2b36SAndroid Build Coastguard Worker}
2129*333d2b36SAndroid Build Coastguard Worker
2130*333d2b36SAndroid Build Coastguard Workerfunc metalavaStubCmd(ctx android.ModuleContext, rule *android.RuleBuilder,
2131*333d2b36SAndroid Build Coastguard Worker	srcs android.Paths, homeDir android.WritablePath,
2132*333d2b36SAndroid Build Coastguard Worker	classpath android.Paths, configFiles android.Paths) *android.RuleBuilderCommand {
2133*333d2b36SAndroid Build Coastguard Worker	rule.Command().Text("rm -rf").Flag(homeDir.String())
2134*333d2b36SAndroid Build Coastguard Worker	rule.Command().Text("mkdir -p").Flag(homeDir.String())
2135*333d2b36SAndroid Build Coastguard Worker
2136*333d2b36SAndroid Build Coastguard Worker	cmd := rule.Command()
2137*333d2b36SAndroid Build Coastguard Worker	cmd.FlagWithArg("ANDROID_PREFS_ROOT=", homeDir.String())
2138*333d2b36SAndroid Build Coastguard Worker
2139*333d2b36SAndroid Build Coastguard Worker	if metalavaUseRbe(ctx) {
2140*333d2b36SAndroid Build Coastguard Worker		rule.Remoteable(android.RemoteRuleSupports{RBE: true})
2141*333d2b36SAndroid Build Coastguard Worker		execStrategy := ctx.Config().GetenvWithDefault("RBE_METALAVA_EXEC_STRATEGY", remoteexec.LocalExecStrategy)
2142*333d2b36SAndroid Build Coastguard Worker		labels := map[string]string{"type": "tool", "name": "metalava"}
2143*333d2b36SAndroid Build Coastguard Worker
2144*333d2b36SAndroid Build Coastguard Worker		pool := ctx.Config().GetenvWithDefault("RBE_METALAVA_POOL", "java16")
2145*333d2b36SAndroid Build Coastguard Worker		rule.Rewrapper(&remoteexec.REParams{
2146*333d2b36SAndroid Build Coastguard Worker			Labels:          labels,
2147*333d2b36SAndroid Build Coastguard Worker			ExecStrategy:    execStrategy,
2148*333d2b36SAndroid Build Coastguard Worker			ToolchainInputs: []string{config.JavaCmd(ctx).String()},
2149*333d2b36SAndroid Build Coastguard Worker			Platform:        map[string]string{remoteexec.PoolKey: pool},
2150*333d2b36SAndroid Build Coastguard Worker		})
2151*333d2b36SAndroid Build Coastguard Worker	}
2152*333d2b36SAndroid Build Coastguard Worker
2153*333d2b36SAndroid Build Coastguard Worker	cmd.BuiltTool("metalava").ImplicitTool(ctx.Config().HostJavaToolPath(ctx, "metalava.jar")).
2154*333d2b36SAndroid Build Coastguard Worker		Flag(config.JavacVmFlags).
2155*333d2b36SAndroid Build Coastguard Worker		Flag("-J--add-opens=java.base/java.util=ALL-UNNAMED").
2156*333d2b36SAndroid Build Coastguard Worker		FlagWithInputList("--source-files ", srcs, " ")
2157*333d2b36SAndroid Build Coastguard Worker
2158*333d2b36SAndroid Build Coastguard Worker	cmd.Flag("--color").
2159*333d2b36SAndroid Build Coastguard Worker		Flag("--quiet").
2160*333d2b36SAndroid Build Coastguard Worker		Flag("--include-annotations").
2161*333d2b36SAndroid Build Coastguard Worker		// The flag makes nullability issues as warnings rather than errors by replacing
2162*333d2b36SAndroid Build Coastguard Worker		// @Nullable/@NonNull in the listed packages APIs with @RecentlyNullable/@RecentlyNonNull,
2163*333d2b36SAndroid Build Coastguard Worker		// and these packages are meant to have everything annotated
2164*333d2b36SAndroid Build Coastguard Worker		// @RecentlyNullable/@RecentlyNonNull.
2165*333d2b36SAndroid Build Coastguard Worker		FlagWithArg("--force-convert-to-warning-nullability-annotations ", "+*:-android.*:+android.icu.*:-dalvik.*").
2166*333d2b36SAndroid Build Coastguard Worker		FlagWithArg("--repeat-errors-max ", "10").
2167*333d2b36SAndroid Build Coastguard Worker		FlagWithArg("--hide ", "UnresolvedImport").
2168*333d2b36SAndroid Build Coastguard Worker		FlagWithArg("--hide ", "InvalidNullabilityOverride").
2169*333d2b36SAndroid Build Coastguard Worker		FlagWithArg("--hide ", "ChangedDefault")
2170*333d2b36SAndroid Build Coastguard Worker
2171*333d2b36SAndroid Build Coastguard Worker	addMetalavaConfigFilesToCmd(cmd, configFiles)
2172*333d2b36SAndroid Build Coastguard Worker
2173*333d2b36SAndroid Build Coastguard Worker	if len(classpath) == 0 {
2174*333d2b36SAndroid Build Coastguard Worker		// The main purpose of the `--api-class-resolution api` option is to force metalava to ignore
2175*333d2b36SAndroid Build Coastguard Worker		// classes on the classpath when an API file contains missing classes. However, as this command
2176*333d2b36SAndroid Build Coastguard Worker		// does not specify `--classpath` this is not needed for that. However, this is also used as a
2177*333d2b36SAndroid Build Coastguard Worker		// signal to the special metalava code for generating stubs from text files that it needs to add
2178*333d2b36SAndroid Build Coastguard Worker		// some additional items into the API (e.g. default constructors).
2179*333d2b36SAndroid Build Coastguard Worker		cmd.FlagWithArg("--api-class-resolution ", "api")
2180*333d2b36SAndroid Build Coastguard Worker	} else {
2181*333d2b36SAndroid Build Coastguard Worker		cmd.FlagWithArg("--api-class-resolution ", "api:classpath")
2182*333d2b36SAndroid Build Coastguard Worker		cmd.FlagWithInputList("--classpath ", classpath, ":")
2183*333d2b36SAndroid Build Coastguard Worker	}
2184*333d2b36SAndroid Build Coastguard Worker
2185*333d2b36SAndroid Build Coastguard Worker	return cmd
2186*333d2b36SAndroid Build Coastguard Worker}
2187*333d2b36SAndroid Build Coastguard Worker
2188*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) HeaderJars() android.Paths {
2189*333d2b36SAndroid Build Coastguard Worker	return android.Paths{al.stubsJar}
2190*333d2b36SAndroid Build Coastguard Worker}
2191*333d2b36SAndroid Build Coastguard Worker
2192*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) OutputDirAndDeps() (android.Path, android.Paths) {
2193*333d2b36SAndroid Build Coastguard Worker	return nil, nil
2194*333d2b36SAndroid Build Coastguard Worker}
2195*333d2b36SAndroid Build Coastguard Worker
2196*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) stubsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsDir android.OptionalPath) {
2197*333d2b36SAndroid Build Coastguard Worker	if stubsDir.Valid() {
2198*333d2b36SAndroid Build Coastguard Worker		cmd.FlagWithArg("--stubs ", stubsDir.String())
2199*333d2b36SAndroid Build Coastguard Worker	}
2200*333d2b36SAndroid Build Coastguard Worker}
2201*333d2b36SAndroid Build Coastguard Worker
2202*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) addValidation(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, validationPaths android.Paths) {
2203*333d2b36SAndroid Build Coastguard Worker	for _, validationPath := range validationPaths {
2204*333d2b36SAndroid Build Coastguard Worker		cmd.Validation(validationPath)
2205*333d2b36SAndroid Build Coastguard Worker	}
2206*333d2b36SAndroid Build Coastguard Worker}
2207*333d2b36SAndroid Build Coastguard Worker
2208*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
2209*333d2b36SAndroid Build Coastguard Worker	apiContributions := al.properties.Api_contributions
2210*333d2b36SAndroid Build Coastguard Worker	addValidations := !ctx.Config().IsEnvTrue("DISABLE_STUB_VALIDATION") &&
2211*333d2b36SAndroid Build Coastguard Worker		!ctx.Config().IsEnvTrue("WITHOUT_CHECK_API") &&
2212*333d2b36SAndroid Build Coastguard Worker		proptools.BoolDefault(al.properties.Enable_validation, true)
2213*333d2b36SAndroid Build Coastguard Worker	for _, apiContributionName := range apiContributions {
2214*333d2b36SAndroid Build Coastguard Worker		ctx.AddDependency(ctx.Module(), javaApiContributionTag, apiContributionName)
2215*333d2b36SAndroid Build Coastguard Worker
2216*333d2b36SAndroid Build Coastguard Worker		// Add the java_api_contribution module generating droidstubs module
2217*333d2b36SAndroid Build Coastguard Worker		// as dependency when validation adding conditions are met and
2218*333d2b36SAndroid Build Coastguard Worker		// the java_api_contribution module name has ".api.contribution" suffix.
2219*333d2b36SAndroid Build Coastguard Worker		// All droidstubs-generated modules possess the suffix in the name,
2220*333d2b36SAndroid Build Coastguard Worker		// but there is no such guarantee for tests.
2221*333d2b36SAndroid Build Coastguard Worker		if addValidations {
2222*333d2b36SAndroid Build Coastguard Worker			if strings.HasSuffix(apiContributionName, ".api.contribution") {
2223*333d2b36SAndroid Build Coastguard Worker				ctx.AddDependency(ctx.Module(), metalavaCurrentApiTimestampTag, strings.TrimSuffix(apiContributionName, ".api.contribution"))
2224*333d2b36SAndroid Build Coastguard Worker			} else {
2225*333d2b36SAndroid Build Coastguard Worker				ctx.ModuleErrorf("Validation is enabled for module %s but a "+
2226*333d2b36SAndroid Build Coastguard Worker					"current timestamp provider is not found for the api "+
2227*333d2b36SAndroid Build Coastguard Worker					"contribution %s",
2228*333d2b36SAndroid Build Coastguard Worker					ctx.ModuleName(),
2229*333d2b36SAndroid Build Coastguard Worker					apiContributionName,
2230*333d2b36SAndroid Build Coastguard Worker				)
2231*333d2b36SAndroid Build Coastguard Worker			}
2232*333d2b36SAndroid Build Coastguard Worker		}
2233*333d2b36SAndroid Build Coastguard Worker	}
2234*333d2b36SAndroid Build Coastguard Worker	if ctx.Device() {
2235*333d2b36SAndroid Build Coastguard Worker		sdkDep := decodeSdkDep(ctx, android.SdkContext(al))
2236*333d2b36SAndroid Build Coastguard Worker		if sdkDep.useModule {
2237*333d2b36SAndroid Build Coastguard Worker			ctx.AddVariationDependencies(nil, systemModulesTag, sdkDep.systemModules)
2238*333d2b36SAndroid Build Coastguard Worker			ctx.AddVariationDependencies(nil, libTag, sdkDep.classpath...)
2239*333d2b36SAndroid Build Coastguard Worker			ctx.AddVariationDependencies(nil, bootClasspathTag, sdkDep.bootclasspath...)
2240*333d2b36SAndroid Build Coastguard Worker
2241*333d2b36SAndroid Build Coastguard Worker		}
2242*333d2b36SAndroid Build Coastguard Worker	}
2243*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, libTag, al.properties.Libs.GetOrDefault(ctx, nil)...)
2244*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, staticLibTag, al.properties.Static_libs.GetOrDefault(ctx, nil)...)
2245*333d2b36SAndroid Build Coastguard Worker
2246*333d2b36SAndroid Build Coastguard Worker	for _, aconfigDeclarationsName := range al.properties.Aconfig_declarations {
2247*333d2b36SAndroid Build Coastguard Worker		ctx.AddDependency(ctx.Module(), aconfigDeclarationTag, aconfigDeclarationsName)
2248*333d2b36SAndroid Build Coastguard Worker	}
2249*333d2b36SAndroid Build Coastguard Worker}
2250*333d2b36SAndroid Build Coastguard Worker
2251*333d2b36SAndroid Build Coastguard Worker// Map where key is the api scope name and value is the int value
2252*333d2b36SAndroid Build Coastguard Worker// representing the order of the api scope, narrowest to the widest
2253*333d2b36SAndroid Build Coastguard Workervar scopeOrderMap = AllApiScopes.MapToIndex(
2254*333d2b36SAndroid Build Coastguard Worker	func(s *apiScope) string { return s.name })
2255*333d2b36SAndroid Build Coastguard Worker
2256*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) sortApiFilesByApiScope(ctx android.ModuleContext, srcFilesInfo []JavaApiImportInfo) []JavaApiImportInfo {
2257*333d2b36SAndroid Build Coastguard Worker	for _, srcFileInfo := range srcFilesInfo {
2258*333d2b36SAndroid Build Coastguard Worker		if srcFileInfo.ApiSurface == "" {
2259*333d2b36SAndroid Build Coastguard Worker			ctx.ModuleErrorf("Api surface not defined for the associated api file %s", srcFileInfo.ApiFile)
2260*333d2b36SAndroid Build Coastguard Worker		}
2261*333d2b36SAndroid Build Coastguard Worker	}
2262*333d2b36SAndroid Build Coastguard Worker	sort.Slice(srcFilesInfo, func(i, j int) bool {
2263*333d2b36SAndroid Build Coastguard Worker		return scopeOrderMap[srcFilesInfo[i].ApiSurface] < scopeOrderMap[srcFilesInfo[j].ApiSurface]
2264*333d2b36SAndroid Build Coastguard Worker	})
2265*333d2b36SAndroid Build Coastguard Worker
2266*333d2b36SAndroid Build Coastguard Worker	return srcFilesInfo
2267*333d2b36SAndroid Build Coastguard Worker}
2268*333d2b36SAndroid Build Coastguard Worker
2269*333d2b36SAndroid Build Coastguard Workervar validstubsType = []StubsType{Everything, Runtime, Exportable}
2270*333d2b36SAndroid Build Coastguard Worker
2271*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) validateProperties(ctx android.ModuleContext) {
2272*333d2b36SAndroid Build Coastguard Worker	if al.properties.Stubs_type == nil {
2273*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf("java_api_library module type must specify stubs_type property.")
2274*333d2b36SAndroid Build Coastguard Worker	} else {
2275*333d2b36SAndroid Build Coastguard Worker		al.stubsType = StringToStubsType(proptools.String(al.properties.Stubs_type))
2276*333d2b36SAndroid Build Coastguard Worker	}
2277*333d2b36SAndroid Build Coastguard Worker
2278*333d2b36SAndroid Build Coastguard Worker	if !android.InList(al.stubsType, validstubsType) {
2279*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("stubs_type", "%s is not a valid stubs_type property value. "+
2280*333d2b36SAndroid Build Coastguard Worker			"Must be one of %s.", proptools.String(al.properties.Stubs_type), validstubsType)
2281*333d2b36SAndroid Build Coastguard Worker	}
2282*333d2b36SAndroid Build Coastguard Worker}
2283*333d2b36SAndroid Build Coastguard Worker
2284*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
2285*333d2b36SAndroid Build Coastguard Worker	al.validateProperties(ctx)
2286*333d2b36SAndroid Build Coastguard Worker
2287*333d2b36SAndroid Build Coastguard Worker	rule := android.NewRuleBuilder(pctx, ctx)
2288*333d2b36SAndroid Build Coastguard Worker
2289*333d2b36SAndroid Build Coastguard Worker	rule.Sbox(android.PathForModuleOut(ctx, "metalava"),
2290*333d2b36SAndroid Build Coastguard Worker		android.PathForModuleOut(ctx, "metalava.sbox.textproto")).
2291*333d2b36SAndroid Build Coastguard Worker		SandboxInputs()
2292*333d2b36SAndroid Build Coastguard Worker
2293*333d2b36SAndroid Build Coastguard Worker	stubsDir := android.OptionalPathForPath(android.PathForModuleOut(ctx, "metalava", "stubsDir"))
2294*333d2b36SAndroid Build Coastguard Worker	rule.Command().Text("rm -rf").Text(stubsDir.String())
2295*333d2b36SAndroid Build Coastguard Worker	rule.Command().Text("mkdir -p").Text(stubsDir.String())
2296*333d2b36SAndroid Build Coastguard Worker
2297*333d2b36SAndroid Build Coastguard Worker	homeDir := android.PathForModuleOut(ctx, "metalava", "home")
2298*333d2b36SAndroid Build Coastguard Worker
2299*333d2b36SAndroid Build Coastguard Worker	var srcFilesInfo []JavaApiImportInfo
2300*333d2b36SAndroid Build Coastguard Worker	var classPaths android.Paths
2301*333d2b36SAndroid Build Coastguard Worker	var bootclassPaths android.Paths
2302*333d2b36SAndroid Build Coastguard Worker	var staticLibs android.Paths
2303*333d2b36SAndroid Build Coastguard Worker	var systemModulesPaths android.Paths
2304*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDeps(func(dep android.Module) {
2305*333d2b36SAndroid Build Coastguard Worker		tag := ctx.OtherModuleDependencyTag(dep)
2306*333d2b36SAndroid Build Coastguard Worker		switch tag {
2307*333d2b36SAndroid Build Coastguard Worker		case javaApiContributionTag:
2308*333d2b36SAndroid Build Coastguard Worker			provider, _ := android.OtherModuleProvider(ctx, dep, JavaApiImportProvider)
2309*333d2b36SAndroid Build Coastguard Worker			if provider.ApiFile == nil && !ctx.Config().AllowMissingDependencies() {
2310*333d2b36SAndroid Build Coastguard Worker				ctx.ModuleErrorf("Error: %s has an empty api file.", dep.Name())
2311*333d2b36SAndroid Build Coastguard Worker			}
2312*333d2b36SAndroid Build Coastguard Worker			srcFilesInfo = append(srcFilesInfo, provider)
2313*333d2b36SAndroid Build Coastguard Worker		case libTag:
2314*333d2b36SAndroid Build Coastguard Worker			if provider, ok := android.OtherModuleProvider(ctx, dep, JavaInfoProvider); ok {
2315*333d2b36SAndroid Build Coastguard Worker				classPaths = append(classPaths, provider.HeaderJars...)
2316*333d2b36SAndroid Build Coastguard Worker				al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.AconfigIntermediateCacheOutputPaths...)
2317*333d2b36SAndroid Build Coastguard Worker			}
2318*333d2b36SAndroid Build Coastguard Worker		case bootClasspathTag:
2319*333d2b36SAndroid Build Coastguard Worker			if provider, ok := android.OtherModuleProvider(ctx, dep, JavaInfoProvider); ok {
2320*333d2b36SAndroid Build Coastguard Worker				bootclassPaths = append(bootclassPaths, provider.HeaderJars...)
2321*333d2b36SAndroid Build Coastguard Worker				al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.AconfigIntermediateCacheOutputPaths...)
2322*333d2b36SAndroid Build Coastguard Worker			}
2323*333d2b36SAndroid Build Coastguard Worker		case staticLibTag:
2324*333d2b36SAndroid Build Coastguard Worker			if provider, ok := android.OtherModuleProvider(ctx, dep, JavaInfoProvider); ok {
2325*333d2b36SAndroid Build Coastguard Worker				staticLibs = append(staticLibs, provider.HeaderJars...)
2326*333d2b36SAndroid Build Coastguard Worker				al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.AconfigIntermediateCacheOutputPaths...)
2327*333d2b36SAndroid Build Coastguard Worker			}
2328*333d2b36SAndroid Build Coastguard Worker		case systemModulesTag:
2329*333d2b36SAndroid Build Coastguard Worker			if sm, ok := android.OtherModuleProvider(ctx, dep, SystemModulesProvider); ok {
2330*333d2b36SAndroid Build Coastguard Worker				systemModulesPaths = append(systemModulesPaths, sm.HeaderJars...)
2331*333d2b36SAndroid Build Coastguard Worker			}
2332*333d2b36SAndroid Build Coastguard Worker		case metalavaCurrentApiTimestampTag:
2333*333d2b36SAndroid Build Coastguard Worker			if currentApiTimestampProvider, ok := dep.(currentApiTimestampProvider); ok {
2334*333d2b36SAndroid Build Coastguard Worker				al.validationPaths = append(al.validationPaths, currentApiTimestampProvider.CurrentApiTimestamp())
2335*333d2b36SAndroid Build Coastguard Worker			}
2336*333d2b36SAndroid Build Coastguard Worker		case aconfigDeclarationTag:
2337*333d2b36SAndroid Build Coastguard Worker			if provider, ok := android.OtherModuleProvider(ctx, dep, android.AconfigDeclarationsProviderKey); ok {
2338*333d2b36SAndroid Build Coastguard Worker				al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.IntermediateCacheOutputPath)
2339*333d2b36SAndroid Build Coastguard Worker			} else if provider, ok := android.OtherModuleProvider(ctx, dep, android.CodegenInfoProvider); ok {
2340*333d2b36SAndroid Build Coastguard Worker				al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.IntermediateCacheOutputPaths...)
2341*333d2b36SAndroid Build Coastguard Worker			} else {
2342*333d2b36SAndroid Build Coastguard Worker				ctx.ModuleErrorf("Only aconfig_declarations and aconfig_declarations_group "+
2343*333d2b36SAndroid Build Coastguard Worker					"module type is allowed for flags_packages property, but %s is neither "+
2344*333d2b36SAndroid Build Coastguard Worker					"of these supported module types",
2345*333d2b36SAndroid Build Coastguard Worker					dep.Name(),
2346*333d2b36SAndroid Build Coastguard Worker				)
2347*333d2b36SAndroid Build Coastguard Worker			}
2348*333d2b36SAndroid Build Coastguard Worker		}
2349*333d2b36SAndroid Build Coastguard Worker	})
2350*333d2b36SAndroid Build Coastguard Worker
2351*333d2b36SAndroid Build Coastguard Worker	srcFilesInfo = al.sortApiFilesByApiScope(ctx, srcFilesInfo)
2352*333d2b36SAndroid Build Coastguard Worker	var srcFiles android.Paths
2353*333d2b36SAndroid Build Coastguard Worker	for _, srcFileInfo := range srcFilesInfo {
2354*333d2b36SAndroid Build Coastguard Worker		srcFiles = append(srcFiles, android.PathForSource(ctx, srcFileInfo.ApiFile.String()))
2355*333d2b36SAndroid Build Coastguard Worker	}
2356*333d2b36SAndroid Build Coastguard Worker
2357*333d2b36SAndroid Build Coastguard Worker	if srcFiles == nil && !ctx.Config().AllowMissingDependencies() {
2358*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf("Error: %s has an empty api file.", ctx.ModuleName())
2359*333d2b36SAndroid Build Coastguard Worker	}
2360*333d2b36SAndroid Build Coastguard Worker
2361*333d2b36SAndroid Build Coastguard Worker	configFiles := android.PathsForModuleSrc(ctx, al.properties.ConfigFiles)
2362*333d2b36SAndroid Build Coastguard Worker
2363*333d2b36SAndroid Build Coastguard Worker	combinedPaths := append(([]android.Path)(nil), systemModulesPaths...)
2364*333d2b36SAndroid Build Coastguard Worker	combinedPaths = append(combinedPaths, classPaths...)
2365*333d2b36SAndroid Build Coastguard Worker	combinedPaths = append(combinedPaths, bootclassPaths...)
2366*333d2b36SAndroid Build Coastguard Worker	cmd := metalavaStubCmd(ctx, rule, srcFiles, homeDir, combinedPaths, configFiles)
2367*333d2b36SAndroid Build Coastguard Worker
2368*333d2b36SAndroid Build Coastguard Worker	al.stubsFlags(ctx, cmd, stubsDir)
2369*333d2b36SAndroid Build Coastguard Worker
2370*333d2b36SAndroid Build Coastguard Worker	previousApi := String(al.properties.Previous_api)
2371*333d2b36SAndroid Build Coastguard Worker	if previousApi != "" {
2372*333d2b36SAndroid Build Coastguard Worker		previousApiFiles := android.PathsForModuleSrc(ctx, []string{previousApi})
2373*333d2b36SAndroid Build Coastguard Worker		cmd.FlagForEachInput("--migrate-nullness ", previousApiFiles)
2374*333d2b36SAndroid Build Coastguard Worker	}
2375*333d2b36SAndroid Build Coastguard Worker
2376*333d2b36SAndroid Build Coastguard Worker	al.addValidation(ctx, cmd, al.validationPaths)
2377*333d2b36SAndroid Build Coastguard Worker
2378*333d2b36SAndroid Build Coastguard Worker	generateRevertAnnotationArgs(ctx, cmd, al.stubsType, al.aconfigProtoFiles)
2379*333d2b36SAndroid Build Coastguard Worker
2380*333d2b36SAndroid Build Coastguard Worker	al.stubsSrcJar = android.PathForModuleOut(ctx, "metalava", ctx.ModuleName()+"-"+"stubs.srcjar")
2381*333d2b36SAndroid Build Coastguard Worker	al.stubsJarWithoutStaticLibs = android.PathForModuleOut(ctx, "metalava", "stubs.jar")
2382*333d2b36SAndroid Build Coastguard Worker	al.stubsJar = android.PathForModuleOut(ctx, ctx.ModuleName(), fmt.Sprintf("%s.jar", ctx.ModuleName()))
2383*333d2b36SAndroid Build Coastguard Worker
2384*333d2b36SAndroid Build Coastguard Worker	rule.Command().
2385*333d2b36SAndroid Build Coastguard Worker		BuiltTool("soong_zip").
2386*333d2b36SAndroid Build Coastguard Worker		Flag("-write_if_changed").
2387*333d2b36SAndroid Build Coastguard Worker		Flag("-jar").
2388*333d2b36SAndroid Build Coastguard Worker		FlagWithOutput("-o ", al.stubsSrcJar).
2389*333d2b36SAndroid Build Coastguard Worker		FlagWithArg("-C ", stubsDir.String()).
2390*333d2b36SAndroid Build Coastguard Worker		FlagWithArg("-D ", stubsDir.String())
2391*333d2b36SAndroid Build Coastguard Worker
2392*333d2b36SAndroid Build Coastguard Worker	rule.Build("metalava", "metalava merged text")
2393*333d2b36SAndroid Build Coastguard Worker
2394*333d2b36SAndroid Build Coastguard Worker	javacFlags := javaBuilderFlags{
2395*333d2b36SAndroid Build Coastguard Worker		javaVersion:   getStubsJavaVersion(),
2396*333d2b36SAndroid Build Coastguard Worker		javacFlags:    strings.Join(al.properties.Javacflags, " "),
2397*333d2b36SAndroid Build Coastguard Worker		classpath:     classpath(classPaths),
2398*333d2b36SAndroid Build Coastguard Worker		bootClasspath: classpath(append(systemModulesPaths, bootclassPaths...)),
2399*333d2b36SAndroid Build Coastguard Worker	}
2400*333d2b36SAndroid Build Coastguard Worker
2401*333d2b36SAndroid Build Coastguard Worker	annoSrcJar := android.PathForModuleOut(ctx, ctx.ModuleName(), "anno.srcjar")
2402*333d2b36SAndroid Build Coastguard Worker
2403*333d2b36SAndroid Build Coastguard Worker	TransformJavaToClasses(ctx, al.stubsJarWithoutStaticLibs, 0, android.Paths{},
2404*333d2b36SAndroid Build Coastguard Worker		android.Paths{al.stubsSrcJar}, annoSrcJar, javacFlags, android.Paths{})
2405*333d2b36SAndroid Build Coastguard Worker
2406*333d2b36SAndroid Build Coastguard Worker	builder := android.NewRuleBuilder(pctx, ctx)
2407*333d2b36SAndroid Build Coastguard Worker	builder.Command().
2408*333d2b36SAndroid Build Coastguard Worker		BuiltTool("merge_zips").
2409*333d2b36SAndroid Build Coastguard Worker		Output(al.stubsJar).
2410*333d2b36SAndroid Build Coastguard Worker		Inputs(android.Paths{al.stubsJarWithoutStaticLibs}).
2411*333d2b36SAndroid Build Coastguard Worker		Inputs(staticLibs)
2412*333d2b36SAndroid Build Coastguard Worker	builder.Build("merge_zips", "merge jar files")
2413*333d2b36SAndroid Build Coastguard Worker
2414*333d2b36SAndroid Build Coastguard Worker	// compile stubs to .dex for hiddenapi processing
2415*333d2b36SAndroid Build Coastguard Worker	dexParams := &compileDexParams{
2416*333d2b36SAndroid Build Coastguard Worker		flags:         javacFlags,
2417*333d2b36SAndroid Build Coastguard Worker		sdkVersion:    al.SdkVersion(ctx),
2418*333d2b36SAndroid Build Coastguard Worker		minSdkVersion: al.MinSdkVersion(ctx),
2419*333d2b36SAndroid Build Coastguard Worker		classesJar:    al.stubsJar,
2420*333d2b36SAndroid Build Coastguard Worker		jarName:       ctx.ModuleName() + ".jar",
2421*333d2b36SAndroid Build Coastguard Worker	}
2422*333d2b36SAndroid Build Coastguard Worker	dexOutputFile, _ := al.dexer.compileDex(ctx, dexParams)
2423*333d2b36SAndroid Build Coastguard Worker	uncompressed := true
2424*333d2b36SAndroid Build Coastguard Worker	al.initHiddenAPI(ctx, makeDexJarPathFromPath(dexOutputFile), al.stubsJar, &uncompressed)
2425*333d2b36SAndroid Build Coastguard Worker	dexOutputFile = al.hiddenAPIEncodeDex(ctx, dexOutputFile)
2426*333d2b36SAndroid Build Coastguard Worker	al.dexJarFile = makeDexJarPathFromPath(dexOutputFile)
2427*333d2b36SAndroid Build Coastguard Worker
2428*333d2b36SAndroid Build Coastguard Worker	ctx.Phony(ctx.ModuleName(), al.stubsJar)
2429*333d2b36SAndroid Build Coastguard Worker
2430*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, JavaInfoProvider, &JavaInfo{
2431*333d2b36SAndroid Build Coastguard Worker		HeaderJars:                             android.PathsIfNonNil(al.stubsJar),
2432*333d2b36SAndroid Build Coastguard Worker		LocalHeaderJars:                        android.PathsIfNonNil(al.stubsJar),
2433*333d2b36SAndroid Build Coastguard Worker		TransitiveStaticLibsHeaderJars:         depset.New(depset.PREORDER, android.PathsIfNonNil(al.stubsJar), nil),
2434*333d2b36SAndroid Build Coastguard Worker		TransitiveStaticLibsImplementationJars: depset.New(depset.PREORDER, android.PathsIfNonNil(al.stubsJar), nil),
2435*333d2b36SAndroid Build Coastguard Worker		ImplementationAndResourcesJars:         android.PathsIfNonNil(al.stubsJar),
2436*333d2b36SAndroid Build Coastguard Worker		ImplementationJars:                     android.PathsIfNonNil(al.stubsJar),
2437*333d2b36SAndroid Build Coastguard Worker		AidlIncludeDirs:                        android.Paths{},
2438*333d2b36SAndroid Build Coastguard Worker		StubsLinkType:                          Stubs,
2439*333d2b36SAndroid Build Coastguard Worker		// No aconfig libraries on api libraries
2440*333d2b36SAndroid Build Coastguard Worker	})
2441*333d2b36SAndroid Build Coastguard Worker}
2442*333d2b36SAndroid Build Coastguard Worker
2443*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath {
2444*333d2b36SAndroid Build Coastguard Worker	return al.dexJarFile
2445*333d2b36SAndroid Build Coastguard Worker}
2446*333d2b36SAndroid Build Coastguard Worker
2447*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) DexJarInstallPath() android.Path {
2448*333d2b36SAndroid Build Coastguard Worker	return al.dexJarFile.Path()
2449*333d2b36SAndroid Build Coastguard Worker}
2450*333d2b36SAndroid Build Coastguard Worker
2451*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap {
2452*333d2b36SAndroid Build Coastguard Worker	return nil
2453*333d2b36SAndroid Build Coastguard Worker}
2454*333d2b36SAndroid Build Coastguard Worker
2455*333d2b36SAndroid Build Coastguard Worker// Most java_api_library constitues the sdk, but there are some java_api_library that
2456*333d2b36SAndroid Build Coastguard Worker// does not contribute to the api surface. Such modules are allowed to set sdk_version
2457*333d2b36SAndroid Build Coastguard Worker// other than "none"
2458*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
2459*333d2b36SAndroid Build Coastguard Worker	return android.SdkSpecFrom(ctx, proptools.String(al.properties.Sdk_version))
2460*333d2b36SAndroid Build Coastguard Worker}
2461*333d2b36SAndroid Build Coastguard Worker
2462*333d2b36SAndroid Build Coastguard Worker// java_api_library is always at "current". Return FutureApiLevel
2463*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
2464*333d2b36SAndroid Build Coastguard Worker	return al.SdkVersion(ctx).ApiLevel
2465*333d2b36SAndroid Build Coastguard Worker}
2466*333d2b36SAndroid Build Coastguard Worker
2467*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
2468*333d2b36SAndroid Build Coastguard Worker	return al.SdkVersion(ctx).ApiLevel
2469*333d2b36SAndroid Build Coastguard Worker}
2470*333d2b36SAndroid Build Coastguard Worker
2471*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) SystemModules() string {
2472*333d2b36SAndroid Build Coastguard Worker	return proptools.String(al.properties.System_modules)
2473*333d2b36SAndroid Build Coastguard Worker}
2474*333d2b36SAndroid Build Coastguard Worker
2475*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
2476*333d2b36SAndroid Build Coastguard Worker	return al.SdkVersion(ctx).ApiLevel
2477*333d2b36SAndroid Build Coastguard Worker}
2478*333d2b36SAndroid Build Coastguard Worker
2479*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) IDEInfo(ctx android.BaseModuleContext, i *android.IdeInfo) {
2480*333d2b36SAndroid Build Coastguard Worker	i.Deps = append(i.Deps, al.ideDeps(ctx)...)
2481*333d2b36SAndroid Build Coastguard Worker	i.Libs = append(i.Libs, al.properties.Libs.GetOrDefault(ctx, nil)...)
2482*333d2b36SAndroid Build Coastguard Worker	i.Static_libs = append(i.Static_libs, al.properties.Static_libs.GetOrDefault(ctx, nil)...)
2483*333d2b36SAndroid Build Coastguard Worker	i.SrcJars = append(i.SrcJars, al.stubsSrcJar.String())
2484*333d2b36SAndroid Build Coastguard Worker}
2485*333d2b36SAndroid Build Coastguard Worker
2486*333d2b36SAndroid Build Coastguard Worker// deps of java_api_library for module_bp_java_deps.json
2487*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) ideDeps(ctx android.BaseModuleContext) []string {
2488*333d2b36SAndroid Build Coastguard Worker	ret := []string{}
2489*333d2b36SAndroid Build Coastguard Worker	ret = append(ret, al.properties.Libs.GetOrDefault(ctx, nil)...)
2490*333d2b36SAndroid Build Coastguard Worker	ret = append(ret, al.properties.Static_libs.GetOrDefault(ctx, nil)...)
2491*333d2b36SAndroid Build Coastguard Worker	if proptools.StringDefault(al.properties.System_modules, "none") != "none" {
2492*333d2b36SAndroid Build Coastguard Worker		ret = append(ret, proptools.String(al.properties.System_modules))
2493*333d2b36SAndroid Build Coastguard Worker	}
2494*333d2b36SAndroid Build Coastguard Worker	// Other non java_library dependencies like java_api_contribution are ignored for now.
2495*333d2b36SAndroid Build Coastguard Worker	return ret
2496*333d2b36SAndroid Build Coastguard Worker}
2497*333d2b36SAndroid Build Coastguard Worker
2498*333d2b36SAndroid Build Coastguard Worker// implement the following interfaces for hiddenapi processing
2499*333d2b36SAndroid Build Coastguard Workervar _ hiddenAPIModule = (*ApiLibrary)(nil)
2500*333d2b36SAndroid Build Coastguard Workervar _ UsesLibraryDependency = (*ApiLibrary)(nil)
2501*333d2b36SAndroid Build Coastguard Workervar _ android.SdkContext = (*ApiLibrary)(nil)
2502*333d2b36SAndroid Build Coastguard Worker
2503*333d2b36SAndroid Build Coastguard Worker// implement the following interface for IDE completion.
2504*333d2b36SAndroid Build Coastguard Workervar _ android.IDEInfo = (*ApiLibrary)(nil)
2505*333d2b36SAndroid Build Coastguard Worker
2506*333d2b36SAndroid Build Coastguard Worker//
2507*333d2b36SAndroid Build Coastguard Worker// Java prebuilts
2508*333d2b36SAndroid Build Coastguard Worker//
2509*333d2b36SAndroid Build Coastguard Worker
2510*333d2b36SAndroid Build Coastguard Workertype ImportProperties struct {
2511*333d2b36SAndroid Build Coastguard Worker	Jars []string `android:"path,arch_variant"`
2512*333d2b36SAndroid Build Coastguard Worker
2513*333d2b36SAndroid Build Coastguard Worker	// The version of the SDK that the source prebuilt file was built against. Defaults to the
2514*333d2b36SAndroid Build Coastguard Worker	// current version if not specified.
2515*333d2b36SAndroid Build Coastguard Worker	Sdk_version *string
2516*333d2b36SAndroid Build Coastguard Worker
2517*333d2b36SAndroid Build Coastguard Worker	// The minimum version of the SDK that this module supports. Defaults to sdk_version if not
2518*333d2b36SAndroid Build Coastguard Worker	// specified.
2519*333d2b36SAndroid Build Coastguard Worker	Min_sdk_version *string
2520*333d2b36SAndroid Build Coastguard Worker
2521*333d2b36SAndroid Build Coastguard Worker	// The max sdk version placeholder used to replace maxSdkVersion attributes on permission
2522*333d2b36SAndroid Build Coastguard Worker	// and uses-permission tags in manifest_fixer.
2523*333d2b36SAndroid Build Coastguard Worker	Replace_max_sdk_version_placeholder *string
2524*333d2b36SAndroid Build Coastguard Worker
2525*333d2b36SAndroid Build Coastguard Worker	Installable *bool
2526*333d2b36SAndroid Build Coastguard Worker
2527*333d2b36SAndroid Build Coastguard Worker	// If not empty, classes are restricted to the specified packages and their sub-packages.
2528*333d2b36SAndroid Build Coastguard Worker	Permitted_packages []string
2529*333d2b36SAndroid Build Coastguard Worker
2530*333d2b36SAndroid Build Coastguard Worker	// List of shared java libs that this module has dependencies to
2531*333d2b36SAndroid Build Coastguard Worker	Libs []string
2532*333d2b36SAndroid Build Coastguard Worker
2533*333d2b36SAndroid Build Coastguard Worker	// List of static java libs that this module has dependencies to
2534*333d2b36SAndroid Build Coastguard Worker	Static_libs proptools.Configurable[[]string]
2535*333d2b36SAndroid Build Coastguard Worker
2536*333d2b36SAndroid Build Coastguard Worker	// List of files to remove from the jar file(s)
2537*333d2b36SAndroid Build Coastguard Worker	Exclude_files []string
2538*333d2b36SAndroid Build Coastguard Worker
2539*333d2b36SAndroid Build Coastguard Worker	// List of directories to remove from the jar file(s)
2540*333d2b36SAndroid Build Coastguard Worker	Exclude_dirs []string
2541*333d2b36SAndroid Build Coastguard Worker
2542*333d2b36SAndroid Build Coastguard Worker	// if set to true, run Jetifier against .jar file. Defaults to false.
2543*333d2b36SAndroid Build Coastguard Worker	Jetifier *bool
2544*333d2b36SAndroid Build Coastguard Worker
2545*333d2b36SAndroid Build Coastguard Worker	// set the name of the output
2546*333d2b36SAndroid Build Coastguard Worker	Stem *string
2547*333d2b36SAndroid Build Coastguard Worker
2548*333d2b36SAndroid Build Coastguard Worker	Aidl struct {
2549*333d2b36SAndroid Build Coastguard Worker		// directories that should be added as include directories for any aidl sources of modules
2550*333d2b36SAndroid Build Coastguard Worker		// that depend on this module, as well as to aidl for this module.
2551*333d2b36SAndroid Build Coastguard Worker		Export_include_dirs []string
2552*333d2b36SAndroid Build Coastguard Worker	}
2553*333d2b36SAndroid Build Coastguard Worker
2554*333d2b36SAndroid Build Coastguard Worker	// Name of the source soong module that gets shadowed by this prebuilt
2555*333d2b36SAndroid Build Coastguard Worker	// If unspecified, follows the naming convention that the source module of
2556*333d2b36SAndroid Build Coastguard Worker	// the prebuilt is Name() without "prebuilt_" prefix
2557*333d2b36SAndroid Build Coastguard Worker	Source_module_name *string
2558*333d2b36SAndroid Build Coastguard Worker
2559*333d2b36SAndroid Build Coastguard Worker	// Non-nil if this java_import module was dynamically created by a java_sdk_library_import
2560*333d2b36SAndroid Build Coastguard Worker	// The name is the undecorated name of the java_sdk_library as it appears in the blueprint file
2561*333d2b36SAndroid Build Coastguard Worker	// (without any prebuilt_ prefix)
2562*333d2b36SAndroid Build Coastguard Worker	Created_by_java_sdk_library_name *string `blueprint:"mutated"`
2563*333d2b36SAndroid Build Coastguard Worker
2564*333d2b36SAndroid Build Coastguard Worker	// Property signifying whether the module provides stubs jar or not.
2565*333d2b36SAndroid Build Coastguard Worker	Is_stubs_module *bool
2566*333d2b36SAndroid Build Coastguard Worker}
2567*333d2b36SAndroid Build Coastguard Worker
2568*333d2b36SAndroid Build Coastguard Workertype Import struct {
2569*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
2570*333d2b36SAndroid Build Coastguard Worker	android.DefaultableModuleBase
2571*333d2b36SAndroid Build Coastguard Worker	android.ApexModuleBase
2572*333d2b36SAndroid Build Coastguard Worker	prebuilt android.Prebuilt
2573*333d2b36SAndroid Build Coastguard Worker
2574*333d2b36SAndroid Build Coastguard Worker	// Functionality common to Module and Import.
2575*333d2b36SAndroid Build Coastguard Worker	embeddableInModuleAndImport
2576*333d2b36SAndroid Build Coastguard Worker
2577*333d2b36SAndroid Build Coastguard Worker	hiddenAPI
2578*333d2b36SAndroid Build Coastguard Worker	dexer
2579*333d2b36SAndroid Build Coastguard Worker	dexpreopter
2580*333d2b36SAndroid Build Coastguard Worker
2581*333d2b36SAndroid Build Coastguard Worker	properties ImportProperties
2582*333d2b36SAndroid Build Coastguard Worker
2583*333d2b36SAndroid Build Coastguard Worker	// output file containing classes.dex and resources
2584*333d2b36SAndroid Build Coastguard Worker	dexJarFile        OptionalDexJarPath
2585*333d2b36SAndroid Build Coastguard Worker	dexJarFileErr     error
2586*333d2b36SAndroid Build Coastguard Worker	dexJarInstallFile android.Path
2587*333d2b36SAndroid Build Coastguard Worker
2588*333d2b36SAndroid Build Coastguard Worker	combinedImplementationFile android.Path
2589*333d2b36SAndroid Build Coastguard Worker	combinedHeaderFile         android.Path
2590*333d2b36SAndroid Build Coastguard Worker	classLoaderContexts        dexpreopt.ClassLoaderContextMap
2591*333d2b36SAndroid Build Coastguard Worker	exportAidlIncludeDirs      android.Paths
2592*333d2b36SAndroid Build Coastguard Worker
2593*333d2b36SAndroid Build Coastguard Worker	hideApexVariantFromMake bool
2594*333d2b36SAndroid Build Coastguard Worker
2595*333d2b36SAndroid Build Coastguard Worker	sdkVersion    android.SdkSpec
2596*333d2b36SAndroid Build Coastguard Worker	minSdkVersion android.ApiLevel
2597*333d2b36SAndroid Build Coastguard Worker
2598*333d2b36SAndroid Build Coastguard Worker	stubsLinkType StubsLinkType
2599*333d2b36SAndroid Build Coastguard Worker}
2600*333d2b36SAndroid Build Coastguard Worker
2601*333d2b36SAndroid Build Coastguard Workervar _ PermittedPackagesForUpdatableBootJars = (*Import)(nil)
2602*333d2b36SAndroid Build Coastguard Worker
2603*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) PermittedPackagesForUpdatableBootJars() []string {
2604*333d2b36SAndroid Build Coastguard Worker	return j.properties.Permitted_packages
2605*333d2b36SAndroid Build Coastguard Worker}
2606*333d2b36SAndroid Build Coastguard Worker
2607*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
2608*333d2b36SAndroid Build Coastguard Worker	return android.SdkSpecFrom(ctx, String(j.properties.Sdk_version))
2609*333d2b36SAndroid Build Coastguard Worker}
2610*333d2b36SAndroid Build Coastguard Worker
2611*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) SystemModules() string {
2612*333d2b36SAndroid Build Coastguard Worker	return "none"
2613*333d2b36SAndroid Build Coastguard Worker}
2614*333d2b36SAndroid Build Coastguard Worker
2615*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
2616*333d2b36SAndroid Build Coastguard Worker	if j.properties.Min_sdk_version != nil {
2617*333d2b36SAndroid Build Coastguard Worker		return android.ApiLevelFrom(ctx, *j.properties.Min_sdk_version)
2618*333d2b36SAndroid Build Coastguard Worker	}
2619*333d2b36SAndroid Build Coastguard Worker	return j.SdkVersion(ctx).ApiLevel
2620*333d2b36SAndroid Build Coastguard Worker}
2621*333d2b36SAndroid Build Coastguard Worker
2622*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel {
2623*333d2b36SAndroid Build Coastguard Worker	if j.properties.Replace_max_sdk_version_placeholder != nil {
2624*333d2b36SAndroid Build Coastguard Worker		return android.ApiLevelFrom(ctx, *j.properties.Replace_max_sdk_version_placeholder)
2625*333d2b36SAndroid Build Coastguard Worker	}
2626*333d2b36SAndroid Build Coastguard Worker	// Default is PrivateApiLevel
2627*333d2b36SAndroid Build Coastguard Worker	return android.SdkSpecPrivate.ApiLevel
2628*333d2b36SAndroid Build Coastguard Worker}
2629*333d2b36SAndroid Build Coastguard Worker
2630*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
2631*333d2b36SAndroid Build Coastguard Worker	return j.SdkVersion(ctx).ApiLevel
2632*333d2b36SAndroid Build Coastguard Worker}
2633*333d2b36SAndroid Build Coastguard Worker
2634*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) Prebuilt() *android.Prebuilt {
2635*333d2b36SAndroid Build Coastguard Worker	return &j.prebuilt
2636*333d2b36SAndroid Build Coastguard Worker}
2637*333d2b36SAndroid Build Coastguard Worker
2638*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) PrebuiltSrcs() []string {
2639*333d2b36SAndroid Build Coastguard Worker	return j.properties.Jars
2640*333d2b36SAndroid Build Coastguard Worker}
2641*333d2b36SAndroid Build Coastguard Worker
2642*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) BaseModuleName() string {
2643*333d2b36SAndroid Build Coastguard Worker	return proptools.StringDefault(j.properties.Source_module_name, j.ModuleBase.Name())
2644*333d2b36SAndroid Build Coastguard Worker}
2645*333d2b36SAndroid Build Coastguard Worker
2646*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) Name() string {
2647*333d2b36SAndroid Build Coastguard Worker	return j.prebuilt.Name(j.ModuleBase.Name())
2648*333d2b36SAndroid Build Coastguard Worker}
2649*333d2b36SAndroid Build Coastguard Worker
2650*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) Stem() string {
2651*333d2b36SAndroid Build Coastguard Worker	return proptools.StringDefault(j.properties.Stem, j.BaseModuleName())
2652*333d2b36SAndroid Build Coastguard Worker}
2653*333d2b36SAndroid Build Coastguard Worker
2654*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) CreatedByJavaSdkLibraryName() *string {
2655*333d2b36SAndroid Build Coastguard Worker	return j.properties.Created_by_java_sdk_library_name
2656*333d2b36SAndroid Build Coastguard Worker}
2657*333d2b36SAndroid Build Coastguard Worker
2658*333d2b36SAndroid Build Coastguard Workerfunc (a *Import) JacocoReportClassesFile() android.Path {
2659*333d2b36SAndroid Build Coastguard Worker	return nil
2660*333d2b36SAndroid Build Coastguard Worker}
2661*333d2b36SAndroid Build Coastguard Worker
2662*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) DepsMutator(ctx android.BottomUpMutatorContext) {
2663*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, libTag, j.properties.Libs...)
2664*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, staticLibTag, j.properties.Static_libs.GetOrDefault(ctx, nil)...)
2665*333d2b36SAndroid Build Coastguard Worker
2666*333d2b36SAndroid Build Coastguard Worker	if ctx.Device() && Bool(j.dexProperties.Compile_dex) {
2667*333d2b36SAndroid Build Coastguard Worker		sdkDeps(ctx, android.SdkContext(j), j.dexer)
2668*333d2b36SAndroid Build Coastguard Worker	}
2669*333d2b36SAndroid Build Coastguard Worker}
2670*333d2b36SAndroid Build Coastguard Worker
2671*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) commonBuildActions(ctx android.ModuleContext) {
2672*333d2b36SAndroid Build Coastguard Worker	j.sdkVersion = j.SdkVersion(ctx)
2673*333d2b36SAndroid Build Coastguard Worker	j.minSdkVersion = j.MinSdkVersion(ctx)
2674*333d2b36SAndroid Build Coastguard Worker
2675*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
2676*333d2b36SAndroid Build Coastguard Worker	if !apexInfo.IsForPlatform() {
2677*333d2b36SAndroid Build Coastguard Worker		j.hideApexVariantFromMake = true
2678*333d2b36SAndroid Build Coastguard Worker	}
2679*333d2b36SAndroid Build Coastguard Worker
2680*333d2b36SAndroid Build Coastguard Worker	if ctx.Windows() {
2681*333d2b36SAndroid Build Coastguard Worker		j.HideFromMake()
2682*333d2b36SAndroid Build Coastguard Worker	}
2683*333d2b36SAndroid Build Coastguard Worker
2684*333d2b36SAndroid Build Coastguard Worker	if proptools.Bool(j.properties.Is_stubs_module) {
2685*333d2b36SAndroid Build Coastguard Worker		j.stubsLinkType = Stubs
2686*333d2b36SAndroid Build Coastguard Worker	} else {
2687*333d2b36SAndroid Build Coastguard Worker		j.stubsLinkType = Implementation
2688*333d2b36SAndroid Build Coastguard Worker	}
2689*333d2b36SAndroid Build Coastguard Worker}
2690*333d2b36SAndroid Build Coastguard Worker
2691*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {
2692*333d2b36SAndroid Build Coastguard Worker	j.commonBuildActions(ctx)
2693*333d2b36SAndroid Build Coastguard Worker
2694*333d2b36SAndroid Build Coastguard Worker	j.classLoaderContexts = make(dexpreopt.ClassLoaderContextMap)
2695*333d2b36SAndroid Build Coastguard Worker
2696*333d2b36SAndroid Build Coastguard Worker	var flags javaBuilderFlags
2697*333d2b36SAndroid Build Coastguard Worker
2698*333d2b36SAndroid Build Coastguard Worker	var transitiveClasspathHeaderJars []depset.DepSet[android.Path]
2699*333d2b36SAndroid Build Coastguard Worker	var transitiveBootClasspathHeaderJars []depset.DepSet[android.Path]
2700*333d2b36SAndroid Build Coastguard Worker	var transitiveStaticLibsHeaderJars []depset.DepSet[android.Path]
2701*333d2b36SAndroid Build Coastguard Worker	var transitiveStaticLibsImplementationJars []depset.DepSet[android.Path]
2702*333d2b36SAndroid Build Coastguard Worker	var transitiveStaticLibsResourceJars []depset.DepSet[android.Path]
2703*333d2b36SAndroid Build Coastguard Worker
2704*333d2b36SAndroid Build Coastguard Worker	j.collectTransitiveHeaderJarsForR8(ctx)
2705*333d2b36SAndroid Build Coastguard Worker	var staticJars android.Paths
2706*333d2b36SAndroid Build Coastguard Worker	var staticResourceJars android.Paths
2707*333d2b36SAndroid Build Coastguard Worker	var staticHeaderJars android.Paths
2708*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDeps(func(module android.Module) {
2709*333d2b36SAndroid Build Coastguard Worker		tag := ctx.OtherModuleDependencyTag(module)
2710*333d2b36SAndroid Build Coastguard Worker		if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
2711*333d2b36SAndroid Build Coastguard Worker			switch tag {
2712*333d2b36SAndroid Build Coastguard Worker			case libTag, sdkLibTag:
2713*333d2b36SAndroid Build Coastguard Worker				flags.classpath = append(flags.classpath, dep.HeaderJars...)
2714*333d2b36SAndroid Build Coastguard Worker				flags.dexClasspath = append(flags.dexClasspath, dep.HeaderJars...)
2715*333d2b36SAndroid Build Coastguard Worker				transitiveClasspathHeaderJars = append(transitiveClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars)
2716*333d2b36SAndroid Build Coastguard Worker			case staticLibTag:
2717*333d2b36SAndroid Build Coastguard Worker				flags.classpath = append(flags.classpath, dep.HeaderJars...)
2718*333d2b36SAndroid Build Coastguard Worker				staticJars = append(staticJars, dep.ImplementationJars...)
2719*333d2b36SAndroid Build Coastguard Worker				staticResourceJars = append(staticResourceJars, dep.ResourceJars...)
2720*333d2b36SAndroid Build Coastguard Worker				staticHeaderJars = append(staticHeaderJars, dep.HeaderJars...)
2721*333d2b36SAndroid Build Coastguard Worker				transitiveClasspathHeaderJars = append(transitiveClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars)
2722*333d2b36SAndroid Build Coastguard Worker				transitiveStaticLibsHeaderJars = append(transitiveStaticLibsHeaderJars, dep.TransitiveStaticLibsHeaderJars)
2723*333d2b36SAndroid Build Coastguard Worker				transitiveStaticLibsImplementationJars = append(transitiveStaticLibsImplementationJars, dep.TransitiveStaticLibsImplementationJars)
2724*333d2b36SAndroid Build Coastguard Worker				transitiveStaticLibsResourceJars = append(transitiveStaticLibsResourceJars, dep.TransitiveStaticLibsResourceJars)
2725*333d2b36SAndroid Build Coastguard Worker			case bootClasspathTag:
2726*333d2b36SAndroid Build Coastguard Worker				flags.bootClasspath = append(flags.bootClasspath, dep.HeaderJars...)
2727*333d2b36SAndroid Build Coastguard Worker				transitiveBootClasspathHeaderJars = append(transitiveBootClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars)
2728*333d2b36SAndroid Build Coastguard Worker			}
2729*333d2b36SAndroid Build Coastguard Worker		} else if _, ok := android.OtherModuleProvider(ctx, module, SdkLibraryInfoProvider); ok {
2730*333d2b36SAndroid Build Coastguard Worker			switch tag {
2731*333d2b36SAndroid Build Coastguard Worker			case libTag, sdkLibTag:
2732*333d2b36SAndroid Build Coastguard Worker				sdkInfo, _ := android.OtherModuleProvider(ctx, module, SdkLibraryInfoProvider)
2733*333d2b36SAndroid Build Coastguard Worker				generatingLibsString := android.PrettyConcat(
2734*333d2b36SAndroid Build Coastguard Worker					getGeneratingLibs(ctx, j.SdkVersion(ctx), module.Name(), sdkInfo), true, "or")
2735*333d2b36SAndroid Build Coastguard Worker				ctx.ModuleErrorf("cannot depend directly on java_sdk_library %q; try depending on %s instead", module.Name(), generatingLibsString)
2736*333d2b36SAndroid Build Coastguard Worker			}
2737*333d2b36SAndroid Build Coastguard Worker		}
2738*333d2b36SAndroid Build Coastguard Worker
2739*333d2b36SAndroid Build Coastguard Worker		addCLCFromDep(ctx, module, j.classLoaderContexts)
2740*333d2b36SAndroid Build Coastguard Worker	})
2741*333d2b36SAndroid Build Coastguard Worker
2742*333d2b36SAndroid Build Coastguard Worker	localJars := android.PathsForModuleSrc(ctx, j.properties.Jars)
2743*333d2b36SAndroid Build Coastguard Worker	jarName := j.Stem() + ".jar"
2744*333d2b36SAndroid Build Coastguard Worker
2745*333d2b36SAndroid Build Coastguard Worker	// Combine only the local jars together for use in transitive classpaths.
2746*333d2b36SAndroid Build Coastguard Worker	// Always pass input jar through TransformJarsToJar to strip module-info.class from prebuilts.
2747*333d2b36SAndroid Build Coastguard Worker	localCombinedHeaderJar := android.PathForModuleOut(ctx, "local-combined", jarName)
2748*333d2b36SAndroid Build Coastguard Worker	TransformJarsToJar(ctx, localCombinedHeaderJar, "combine local prebuilt implementation jars", localJars, android.OptionalPath{},
2749*333d2b36SAndroid Build Coastguard Worker		false, j.properties.Exclude_files, j.properties.Exclude_dirs)
2750*333d2b36SAndroid Build Coastguard Worker	localStrippedJars := android.Paths{localCombinedHeaderJar}
2751*333d2b36SAndroid Build Coastguard Worker
2752*333d2b36SAndroid Build Coastguard Worker	completeStaticLibsHeaderJars := depset.New(depset.PREORDER, localStrippedJars, transitiveStaticLibsHeaderJars)
2753*333d2b36SAndroid Build Coastguard Worker	completeStaticLibsImplementationJars := depset.New(depset.PREORDER, localStrippedJars, transitiveStaticLibsImplementationJars)
2754*333d2b36SAndroid Build Coastguard Worker	completeStaticLibsResourceJars := depset.New(depset.PREORDER, nil, transitiveStaticLibsResourceJars)
2755*333d2b36SAndroid Build Coastguard Worker
2756*333d2b36SAndroid Build Coastguard Worker	// Always pass the input jars to TransformJarsToJar, even if there is only a single jar, we need the output
2757*333d2b36SAndroid Build Coastguard Worker	// file of the module to be named jarName.
2758*333d2b36SAndroid Build Coastguard Worker	var outputFile android.Path
2759*333d2b36SAndroid Build Coastguard Worker	combinedImplementationJar := android.PathForModuleOut(ctx, "combined", jarName)
2760*333d2b36SAndroid Build Coastguard Worker	var implementationJars android.Paths
2761*333d2b36SAndroid Build Coastguard Worker	if ctx.Config().UseTransitiveJarsInClasspath() {
2762*333d2b36SAndroid Build Coastguard Worker		implementationJars = completeStaticLibsImplementationJars.ToList()
2763*333d2b36SAndroid Build Coastguard Worker	} else {
2764*333d2b36SAndroid Build Coastguard Worker		implementationJars = append(slices.Clone(localJars), staticJars...)
2765*333d2b36SAndroid Build Coastguard Worker	}
2766*333d2b36SAndroid Build Coastguard Worker	TransformJarsToJar(ctx, combinedImplementationJar, "combine prebuilt implementation jars", implementationJars, android.OptionalPath{},
2767*333d2b36SAndroid Build Coastguard Worker		false, j.properties.Exclude_files, j.properties.Exclude_dirs)
2768*333d2b36SAndroid Build Coastguard Worker	outputFile = combinedImplementationJar
2769*333d2b36SAndroid Build Coastguard Worker
2770*333d2b36SAndroid Build Coastguard Worker	// If no dependencies have separate header jars then there is no need to create a separate
2771*333d2b36SAndroid Build Coastguard Worker	// header jar for this module.
2772*333d2b36SAndroid Build Coastguard Worker	reuseImplementationJarAsHeaderJar := slices.Equal(staticJars, staticHeaderJars)
2773*333d2b36SAndroid Build Coastguard Worker
2774*333d2b36SAndroid Build Coastguard Worker	var resourceJarFile android.Path
2775*333d2b36SAndroid Build Coastguard Worker	if len(staticResourceJars) > 1 {
2776*333d2b36SAndroid Build Coastguard Worker		combinedJar := android.PathForModuleOut(ctx, "res-combined", jarName)
2777*333d2b36SAndroid Build Coastguard Worker		TransformJarsToJar(ctx, combinedJar, "for resources", staticResourceJars, android.OptionalPath{},
2778*333d2b36SAndroid Build Coastguard Worker			false, nil, nil)
2779*333d2b36SAndroid Build Coastguard Worker		resourceJarFile = combinedJar
2780*333d2b36SAndroid Build Coastguard Worker	} else if len(staticResourceJars) == 1 {
2781*333d2b36SAndroid Build Coastguard Worker		resourceJarFile = staticResourceJars[0]
2782*333d2b36SAndroid Build Coastguard Worker	}
2783*333d2b36SAndroid Build Coastguard Worker
2784*333d2b36SAndroid Build Coastguard Worker	var headerJar android.Path
2785*333d2b36SAndroid Build Coastguard Worker	if reuseImplementationJarAsHeaderJar {
2786*333d2b36SAndroid Build Coastguard Worker		headerJar = outputFile
2787*333d2b36SAndroid Build Coastguard Worker	} else {
2788*333d2b36SAndroid Build Coastguard Worker		var headerJars android.Paths
2789*333d2b36SAndroid Build Coastguard Worker		if ctx.Config().UseTransitiveJarsInClasspath() {
2790*333d2b36SAndroid Build Coastguard Worker			headerJars = completeStaticLibsHeaderJars.ToList()
2791*333d2b36SAndroid Build Coastguard Worker		} else {
2792*333d2b36SAndroid Build Coastguard Worker			headerJars = append(slices.Clone(localJars), staticHeaderJars...)
2793*333d2b36SAndroid Build Coastguard Worker		}
2794*333d2b36SAndroid Build Coastguard Worker		headerOutputFile := android.PathForModuleOut(ctx, "turbine-combined", jarName)
2795*333d2b36SAndroid Build Coastguard Worker		TransformJarsToJar(ctx, headerOutputFile, "combine prebuilt header jars", headerJars, android.OptionalPath{},
2796*333d2b36SAndroid Build Coastguard Worker			false, j.properties.Exclude_files, j.properties.Exclude_dirs)
2797*333d2b36SAndroid Build Coastguard Worker		headerJar = headerOutputFile
2798*333d2b36SAndroid Build Coastguard Worker	}
2799*333d2b36SAndroid Build Coastguard Worker
2800*333d2b36SAndroid Build Coastguard Worker	if Bool(j.properties.Jetifier) {
2801*333d2b36SAndroid Build Coastguard Worker		jetifierOutputFile := android.PathForModuleOut(ctx, "jetifier", jarName)
2802*333d2b36SAndroid Build Coastguard Worker		TransformJetifier(ctx, jetifierOutputFile, outputFile)
2803*333d2b36SAndroid Build Coastguard Worker		outputFile = jetifierOutputFile
2804*333d2b36SAndroid Build Coastguard Worker
2805*333d2b36SAndroid Build Coastguard Worker		if !reuseImplementationJarAsHeaderJar {
2806*333d2b36SAndroid Build Coastguard Worker			jetifierHeaderJar := android.PathForModuleOut(ctx, "jetifier-headers", jarName)
2807*333d2b36SAndroid Build Coastguard Worker			TransformJetifier(ctx, jetifierHeaderJar, headerJar)
2808*333d2b36SAndroid Build Coastguard Worker			headerJar = jetifierHeaderJar
2809*333d2b36SAndroid Build Coastguard Worker		} else {
2810*333d2b36SAndroid Build Coastguard Worker			headerJar = outputFile
2811*333d2b36SAndroid Build Coastguard Worker		}
2812*333d2b36SAndroid Build Coastguard Worker
2813*333d2b36SAndroid Build Coastguard Worker		// Enabling jetifier requires modifying classes from transitive dependencies, disable transitive
2814*333d2b36SAndroid Build Coastguard Worker		// classpath and use the combined header jar instead.
2815*333d2b36SAndroid Build Coastguard Worker		completeStaticLibsHeaderJars = depset.New(depset.PREORDER, android.Paths{headerJar}, nil)
2816*333d2b36SAndroid Build Coastguard Worker		completeStaticLibsImplementationJars = depset.New(depset.PREORDER, android.Paths{outputFile}, nil)
2817*333d2b36SAndroid Build Coastguard Worker	}
2818*333d2b36SAndroid Build Coastguard Worker
2819*333d2b36SAndroid Build Coastguard Worker	implementationJarFile := outputFile
2820*333d2b36SAndroid Build Coastguard Worker
2821*333d2b36SAndroid Build Coastguard Worker	// merge implementation jar with resources if necessary
2822*333d2b36SAndroid Build Coastguard Worker	if resourceJarFile != nil {
2823*333d2b36SAndroid Build Coastguard Worker		jars := android.Paths{resourceJarFile, outputFile}
2824*333d2b36SAndroid Build Coastguard Worker		combinedJar := android.PathForModuleOut(ctx, "withres", jarName)
2825*333d2b36SAndroid Build Coastguard Worker		TransformJarsToJar(ctx, combinedJar, "for resources", jars, android.OptionalPath{},
2826*333d2b36SAndroid Build Coastguard Worker			false, nil, nil)
2827*333d2b36SAndroid Build Coastguard Worker		outputFile = combinedJar
2828*333d2b36SAndroid Build Coastguard Worker	}
2829*333d2b36SAndroid Build Coastguard Worker
2830*333d2b36SAndroid Build Coastguard Worker	// Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource.
2831*333d2b36SAndroid Build Coastguard Worker	// Also strip the relative path from the header output file so that the reuseImplementationJarAsHeaderJar check
2832*333d2b36SAndroid Build Coastguard Worker	// in a module that depends on this module considers them equal.
2833*333d2b36SAndroid Build Coastguard Worker	j.combinedHeaderFile = headerJar.WithoutRel()
2834*333d2b36SAndroid Build Coastguard Worker	j.combinedImplementationFile = outputFile.WithoutRel()
2835*333d2b36SAndroid Build Coastguard Worker
2836*333d2b36SAndroid Build Coastguard Worker	j.maybeInstall(ctx, jarName, outputFile)
2837*333d2b36SAndroid Build Coastguard Worker
2838*333d2b36SAndroid Build Coastguard Worker	j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.properties.Aidl.Export_include_dirs)
2839*333d2b36SAndroid Build Coastguard Worker
2840*333d2b36SAndroid Build Coastguard Worker	if ctx.Config().UseTransitiveJarsInClasspath() {
2841*333d2b36SAndroid Build Coastguard Worker		ctx.CheckbuildFile(localJars...)
2842*333d2b36SAndroid Build Coastguard Worker	} else {
2843*333d2b36SAndroid Build Coastguard Worker		ctx.CheckbuildFile(outputFile)
2844*333d2b36SAndroid Build Coastguard Worker	}
2845*333d2b36SAndroid Build Coastguard Worker
2846*333d2b36SAndroid Build Coastguard Worker	if ctx.Device() {
2847*333d2b36SAndroid Build Coastguard Worker		// Shared libraries deapexed from prebuilt apexes are no longer supported.
2848*333d2b36SAndroid Build Coastguard Worker		// Set the dexJarBuildPath to a fake path.
2849*333d2b36SAndroid Build Coastguard Worker		// This allows soong analysis pass, but will be an error during ninja execution if there are
2850*333d2b36SAndroid Build Coastguard Worker		// any rdeps.
2851*333d2b36SAndroid Build Coastguard Worker		ai, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
2852*333d2b36SAndroid Build Coastguard Worker		if ai.ForPrebuiltApex {
2853*333d2b36SAndroid Build Coastguard Worker			j.dexJarFile = makeDexJarPathFromPath(android.PathForModuleInstall(ctx, "intentionally_no_longer_supported"))
2854*333d2b36SAndroid Build Coastguard Worker			j.initHiddenAPI(ctx, j.dexJarFile, outputFile, j.dexProperties.Uncompress_dex)
2855*333d2b36SAndroid Build Coastguard Worker		} else if Bool(j.dexProperties.Compile_dex) {
2856*333d2b36SAndroid Build Coastguard Worker			sdkDep := decodeSdkDep(ctx, android.SdkContext(j))
2857*333d2b36SAndroid Build Coastguard Worker			if sdkDep.invalidVersion {
2858*333d2b36SAndroid Build Coastguard Worker				ctx.AddMissingDependencies(sdkDep.bootclasspath)
2859*333d2b36SAndroid Build Coastguard Worker				ctx.AddMissingDependencies(sdkDep.java9Classpath)
2860*333d2b36SAndroid Build Coastguard Worker			} else if sdkDep.useFiles {
2861*333d2b36SAndroid Build Coastguard Worker				// sdkDep.jar is actually equivalent to turbine header.jar.
2862*333d2b36SAndroid Build Coastguard Worker				flags.classpath = append(flags.classpath, sdkDep.jars...)
2863*333d2b36SAndroid Build Coastguard Worker			}
2864*333d2b36SAndroid Build Coastguard Worker
2865*333d2b36SAndroid Build Coastguard Worker			// Dex compilation
2866*333d2b36SAndroid Build Coastguard Worker
2867*333d2b36SAndroid Build Coastguard Worker			j.dexpreopter.installPath = j.dexpreopter.getInstallPath(
2868*333d2b36SAndroid Build Coastguard Worker				ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), android.PathForModuleInstall(ctx, "framework", jarName))
2869*333d2b36SAndroid Build Coastguard Worker			setUncompressDex(ctx, &j.dexpreopter, &j.dexer)
2870*333d2b36SAndroid Build Coastguard Worker			j.dexpreopter.uncompressedDex = *j.dexProperties.Uncompress_dex
2871*333d2b36SAndroid Build Coastguard Worker
2872*333d2b36SAndroid Build Coastguard Worker			var dexOutputFile android.Path
2873*333d2b36SAndroid Build Coastguard Worker			dexParams := &compileDexParams{
2874*333d2b36SAndroid Build Coastguard Worker				flags:         flags,
2875*333d2b36SAndroid Build Coastguard Worker				sdkVersion:    j.SdkVersion(ctx),
2876*333d2b36SAndroid Build Coastguard Worker				minSdkVersion: j.MinSdkVersion(ctx),
2877*333d2b36SAndroid Build Coastguard Worker				classesJar:    outputFile,
2878*333d2b36SAndroid Build Coastguard Worker				jarName:       jarName,
2879*333d2b36SAndroid Build Coastguard Worker			}
2880*333d2b36SAndroid Build Coastguard Worker
2881*333d2b36SAndroid Build Coastguard Worker			dexOutputFile, _ = j.dexer.compileDex(ctx, dexParams)
2882*333d2b36SAndroid Build Coastguard Worker			if ctx.Failed() {
2883*333d2b36SAndroid Build Coastguard Worker				return
2884*333d2b36SAndroid Build Coastguard Worker			}
2885*333d2b36SAndroid Build Coastguard Worker			ctx.CheckbuildFile(dexOutputFile)
2886*333d2b36SAndroid Build Coastguard Worker
2887*333d2b36SAndroid Build Coastguard Worker			// Initialize the hiddenapi structure.
2888*333d2b36SAndroid Build Coastguard Worker			j.initHiddenAPI(ctx, makeDexJarPathFromPath(dexOutputFile), outputFile, j.dexProperties.Uncompress_dex)
2889*333d2b36SAndroid Build Coastguard Worker
2890*333d2b36SAndroid Build Coastguard Worker			// Encode hidden API flags in dex file.
2891*333d2b36SAndroid Build Coastguard Worker			dexOutputFile = j.hiddenAPIEncodeDex(ctx, dexOutputFile)
2892*333d2b36SAndroid Build Coastguard Worker
2893*333d2b36SAndroid Build Coastguard Worker			j.dexJarFile = makeDexJarPathFromPath(dexOutputFile)
2894*333d2b36SAndroid Build Coastguard Worker			j.dexJarInstallFile = android.PathForModuleInstall(ctx, "framework", jarName)
2895*333d2b36SAndroid Build Coastguard Worker		}
2896*333d2b36SAndroid Build Coastguard Worker	}
2897*333d2b36SAndroid Build Coastguard Worker
2898*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, JavaInfoProvider, &JavaInfo{
2899*333d2b36SAndroid Build Coastguard Worker		HeaderJars:                             android.PathsIfNonNil(j.combinedHeaderFile),
2900*333d2b36SAndroid Build Coastguard Worker		LocalHeaderJars:                        android.PathsIfNonNil(j.combinedHeaderFile),
2901*333d2b36SAndroid Build Coastguard Worker		TransitiveLibsHeaderJarsForR8:          j.transitiveLibsHeaderJarsForR8,
2902*333d2b36SAndroid Build Coastguard Worker		TransitiveStaticLibsHeaderJarsForR8:    j.transitiveStaticLibsHeaderJarsForR8,
2903*333d2b36SAndroid Build Coastguard Worker		TransitiveStaticLibsHeaderJars:         completeStaticLibsHeaderJars,
2904*333d2b36SAndroid Build Coastguard Worker		TransitiveStaticLibsImplementationJars: completeStaticLibsImplementationJars,
2905*333d2b36SAndroid Build Coastguard Worker		TransitiveStaticLibsResourceJars:       completeStaticLibsResourceJars,
2906*333d2b36SAndroid Build Coastguard Worker		ImplementationAndResourcesJars:         android.PathsIfNonNil(j.combinedImplementationFile),
2907*333d2b36SAndroid Build Coastguard Worker		ImplementationJars:                     android.PathsIfNonNil(implementationJarFile.WithoutRel()),
2908*333d2b36SAndroid Build Coastguard Worker		ResourceJars:                           android.PathsIfNonNil(resourceJarFile),
2909*333d2b36SAndroid Build Coastguard Worker		AidlIncludeDirs:                        j.exportAidlIncludeDirs,
2910*333d2b36SAndroid Build Coastguard Worker		StubsLinkType:                          j.stubsLinkType,
2911*333d2b36SAndroid Build Coastguard Worker		// TODO(b/289117800): LOCAL_ACONFIG_FILES for prebuilts
2912*333d2b36SAndroid Build Coastguard Worker	})
2913*333d2b36SAndroid Build Coastguard Worker
2914*333d2b36SAndroid Build Coastguard Worker	ctx.SetOutputFiles(android.Paths{j.combinedImplementationFile}, "")
2915*333d2b36SAndroid Build Coastguard Worker	ctx.SetOutputFiles(android.Paths{j.combinedImplementationFile}, ".jar")
2916*333d2b36SAndroid Build Coastguard Worker}
2917*333d2b36SAndroid Build Coastguard Worker
2918*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) maybeInstall(ctx android.ModuleContext, jarName string, outputFile android.Path) {
2919*333d2b36SAndroid Build Coastguard Worker	if !Bool(j.properties.Installable) {
2920*333d2b36SAndroid Build Coastguard Worker		return
2921*333d2b36SAndroid Build Coastguard Worker	}
2922*333d2b36SAndroid Build Coastguard Worker
2923*333d2b36SAndroid Build Coastguard Worker	var installDir android.InstallPath
2924*333d2b36SAndroid Build Coastguard Worker	if ctx.InstallInTestcases() {
2925*333d2b36SAndroid Build Coastguard Worker		var archDir string
2926*333d2b36SAndroid Build Coastguard Worker		if !ctx.Host() {
2927*333d2b36SAndroid Build Coastguard Worker			archDir = ctx.DeviceConfig().DeviceArch()
2928*333d2b36SAndroid Build Coastguard Worker		}
2929*333d2b36SAndroid Build Coastguard Worker		installDir = android.PathForModuleInstall(ctx, ctx.ModuleName(), archDir)
2930*333d2b36SAndroid Build Coastguard Worker	} else {
2931*333d2b36SAndroid Build Coastguard Worker		installDir = android.PathForModuleInstall(ctx, "framework")
2932*333d2b36SAndroid Build Coastguard Worker	}
2933*333d2b36SAndroid Build Coastguard Worker	ctx.InstallFile(installDir, jarName, outputFile)
2934*333d2b36SAndroid Build Coastguard Worker}
2935*333d2b36SAndroid Build Coastguard Worker
2936*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) HeaderJars() android.Paths {
2937*333d2b36SAndroid Build Coastguard Worker	return android.PathsIfNonNil(j.combinedHeaderFile)
2938*333d2b36SAndroid Build Coastguard Worker}
2939*333d2b36SAndroid Build Coastguard Worker
2940*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) ImplementationAndResourcesJars() android.Paths {
2941*333d2b36SAndroid Build Coastguard Worker	return android.PathsIfNonNil(j.combinedImplementationFile)
2942*333d2b36SAndroid Build Coastguard Worker}
2943*333d2b36SAndroid Build Coastguard Worker
2944*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath {
2945*333d2b36SAndroid Build Coastguard Worker	if j.dexJarFileErr != nil {
2946*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf(j.dexJarFileErr.Error())
2947*333d2b36SAndroid Build Coastguard Worker	}
2948*333d2b36SAndroid Build Coastguard Worker	return j.dexJarFile
2949*333d2b36SAndroid Build Coastguard Worker}
2950*333d2b36SAndroid Build Coastguard Worker
2951*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) DexJarInstallPath() android.Path {
2952*333d2b36SAndroid Build Coastguard Worker	return j.dexJarInstallFile
2953*333d2b36SAndroid Build Coastguard Worker}
2954*333d2b36SAndroid Build Coastguard Worker
2955*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap {
2956*333d2b36SAndroid Build Coastguard Worker	return j.classLoaderContexts
2957*333d2b36SAndroid Build Coastguard Worker}
2958*333d2b36SAndroid Build Coastguard Worker
2959*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*Import)(nil)
2960*333d2b36SAndroid Build Coastguard Worker
2961*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule
2962*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
2963*333d2b36SAndroid Build Coastguard Worker	return j.depIsInSameApex(ctx, dep)
2964*333d2b36SAndroid Build Coastguard Worker}
2965*333d2b36SAndroid Build Coastguard Worker
2966*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule
2967*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
2968*333d2b36SAndroid Build Coastguard Worker	sdkVersion android.ApiLevel) error {
2969*333d2b36SAndroid Build Coastguard Worker	sdkVersionSpec := j.SdkVersion(ctx)
2970*333d2b36SAndroid Build Coastguard Worker	minSdkVersion := j.MinSdkVersion(ctx)
2971*333d2b36SAndroid Build Coastguard Worker	if !minSdkVersion.Specified() {
2972*333d2b36SAndroid Build Coastguard Worker		return fmt.Errorf("min_sdk_version is not specified")
2973*333d2b36SAndroid Build Coastguard Worker	}
2974*333d2b36SAndroid Build Coastguard Worker	// If the module is compiling against core (via sdk_version), skip comparison check.
2975*333d2b36SAndroid Build Coastguard Worker	if sdkVersionSpec.Kind == android.SdkCore {
2976*333d2b36SAndroid Build Coastguard Worker		return nil
2977*333d2b36SAndroid Build Coastguard Worker	}
2978*333d2b36SAndroid Build Coastguard Worker	if minSdkVersion.GreaterThan(sdkVersion) {
2979*333d2b36SAndroid Build Coastguard Worker		return fmt.Errorf("newer SDK(%v)", minSdkVersion)
2980*333d2b36SAndroid Build Coastguard Worker	}
2981*333d2b36SAndroid Build Coastguard Worker	return nil
2982*333d2b36SAndroid Build Coastguard Worker}
2983*333d2b36SAndroid Build Coastguard Worker
2984*333d2b36SAndroid Build Coastguard Worker// requiredFilesFromPrebuiltApexForImport returns information about the files that a java_import or
2985*333d2b36SAndroid Build Coastguard Worker// java_sdk_library_import with the specified base module name requires to be exported from a
2986*333d2b36SAndroid Build Coastguard Worker// prebuilt_apex/apex_set.
2987*333d2b36SAndroid Build Coastguard Workerfunc requiredFilesFromPrebuiltApexForImport(name string, d *dexpreopter) []string {
2988*333d2b36SAndroid Build Coastguard Worker	dexJarFileApexRootRelative := ApexRootRelativePathToJavaLib(name)
2989*333d2b36SAndroid Build Coastguard Worker	// Add the dex implementation jar to the set of exported files.
2990*333d2b36SAndroid Build Coastguard Worker	files := []string{
2991*333d2b36SAndroid Build Coastguard Worker		dexJarFileApexRootRelative,
2992*333d2b36SAndroid Build Coastguard Worker	}
2993*333d2b36SAndroid Build Coastguard Worker	if BoolDefault(d.importDexpreoptProperties.Dex_preopt.Profile_guided, false) {
2994*333d2b36SAndroid Build Coastguard Worker		files = append(files, dexJarFileApexRootRelative+".prof")
2995*333d2b36SAndroid Build Coastguard Worker	}
2996*333d2b36SAndroid Build Coastguard Worker	return files
2997*333d2b36SAndroid Build Coastguard Worker}
2998*333d2b36SAndroid Build Coastguard Worker
2999*333d2b36SAndroid Build Coastguard Worker// ApexRootRelativePathToJavaLib returns the path, relative to the root of the apex's contents, for
3000*333d2b36SAndroid Build Coastguard Worker// the java library with the specified name.
3001*333d2b36SAndroid Build Coastguard Workerfunc ApexRootRelativePathToJavaLib(name string) string {
3002*333d2b36SAndroid Build Coastguard Worker	return filepath.Join("javalib", name+".jar")
3003*333d2b36SAndroid Build Coastguard Worker}
3004*333d2b36SAndroid Build Coastguard Worker
3005*333d2b36SAndroid Build Coastguard Workervar _ android.RequiredFilesFromPrebuiltApex = (*Import)(nil)
3006*333d2b36SAndroid Build Coastguard Worker
3007*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) RequiredFilesFromPrebuiltApex(_ android.BaseModuleContext) []string {
3008*333d2b36SAndroid Build Coastguard Worker	name := j.BaseModuleName()
3009*333d2b36SAndroid Build Coastguard Worker	return requiredFilesFromPrebuiltApexForImport(name, &j.dexpreopter)
3010*333d2b36SAndroid Build Coastguard Worker}
3011*333d2b36SAndroid Build Coastguard Worker
3012*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) UseProfileGuidedDexpreopt() bool {
3013*333d2b36SAndroid Build Coastguard Worker	return proptools.Bool(j.importDexpreoptProperties.Dex_preopt.Profile_guided)
3014*333d2b36SAndroid Build Coastguard Worker}
3015*333d2b36SAndroid Build Coastguard Worker
3016*333d2b36SAndroid Build Coastguard Worker// Add compile time check for interface implementation
3017*333d2b36SAndroid Build Coastguard Workervar _ android.IDEInfo = (*Import)(nil)
3018*333d2b36SAndroid Build Coastguard Workervar _ android.IDECustomizedModuleName = (*Import)(nil)
3019*333d2b36SAndroid Build Coastguard Worker
3020*333d2b36SAndroid Build Coastguard Worker// Collect information for opening IDE project files in java/jdeps.go.
3021*333d2b36SAndroid Build Coastguard Worker
3022*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) IDEInfo(ctx android.BaseModuleContext, dpInfo *android.IdeInfo) {
3023*333d2b36SAndroid Build Coastguard Worker	dpInfo.Jars = append(dpInfo.Jars, j.combinedHeaderFile.String())
3024*333d2b36SAndroid Build Coastguard Worker}
3025*333d2b36SAndroid Build Coastguard Worker
3026*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) IDECustomizedModuleName() string {
3027*333d2b36SAndroid Build Coastguard Worker	// TODO(b/113562217): Extract the base module name from the Import name, often the Import name
3028*333d2b36SAndroid Build Coastguard Worker	// has a prefix "prebuilt_". Remove the prefix explicitly if needed until we find a better
3029*333d2b36SAndroid Build Coastguard Worker	// solution to get the Import name.
3030*333d2b36SAndroid Build Coastguard Worker	return android.RemoveOptionalPrebuiltPrefix(j.Name())
3031*333d2b36SAndroid Build Coastguard Worker}
3032*333d2b36SAndroid Build Coastguard Worker
3033*333d2b36SAndroid Build Coastguard Workervar _ android.PrebuiltInterface = (*Import)(nil)
3034*333d2b36SAndroid Build Coastguard Worker
3035*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) IsInstallable() bool {
3036*333d2b36SAndroid Build Coastguard Worker	return Bool(j.properties.Installable)
3037*333d2b36SAndroid Build Coastguard Worker}
3038*333d2b36SAndroid Build Coastguard Worker
3039*333d2b36SAndroid Build Coastguard Workervar _ DexpreopterInterface = (*Import)(nil)
3040*333d2b36SAndroid Build Coastguard Worker
3041*333d2b36SAndroid Build Coastguard Worker// java_import imports one or more `.jar` files into the build graph as if they were built by a java_library module.
3042*333d2b36SAndroid Build Coastguard Worker//
3043*333d2b36SAndroid Build Coastguard Worker// By default, a java_import has a single variant that expects a `.jar` file containing `.class` files that were
3044*333d2b36SAndroid Build Coastguard Worker// compiled against an Android classpath.
3045*333d2b36SAndroid Build Coastguard Worker//
3046*333d2b36SAndroid Build Coastguard Worker// Specifying `host_supported: true` will produce two variants, one for use as a dependency of device modules and one
3047*333d2b36SAndroid Build Coastguard Worker// for host modules.
3048*333d2b36SAndroid Build Coastguard Workerfunc ImportFactory() android.Module {
3049*333d2b36SAndroid Build Coastguard Worker	module := &Import{}
3050*333d2b36SAndroid Build Coastguard Worker
3051*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(
3052*333d2b36SAndroid Build Coastguard Worker		&module.properties,
3053*333d2b36SAndroid Build Coastguard Worker		&module.dexer.dexProperties,
3054*333d2b36SAndroid Build Coastguard Worker		&module.importDexpreoptProperties,
3055*333d2b36SAndroid Build Coastguard Worker	)
3056*333d2b36SAndroid Build Coastguard Worker
3057*333d2b36SAndroid Build Coastguard Worker	module.initModuleAndImport(module)
3058*333d2b36SAndroid Build Coastguard Worker
3059*333d2b36SAndroid Build Coastguard Worker	module.dexProperties.Optimize.EnabledByDefault = false
3060*333d2b36SAndroid Build Coastguard Worker
3061*333d2b36SAndroid Build Coastguard Worker	android.InitPrebuiltModule(module, &module.properties.Jars)
3062*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(module)
3063*333d2b36SAndroid Build Coastguard Worker	InitJavaModule(module, android.HostAndDeviceSupported)
3064*333d2b36SAndroid Build Coastguard Worker	return module
3065*333d2b36SAndroid Build Coastguard Worker}
3066*333d2b36SAndroid Build Coastguard Worker
3067*333d2b36SAndroid Build Coastguard Worker// java_import imports one or more `.jar` files into the build graph as if they were built by a java_library_host
3068*333d2b36SAndroid Build Coastguard Worker// module.
3069*333d2b36SAndroid Build Coastguard Worker//
3070*333d2b36SAndroid Build Coastguard Worker// A java_import_host has a single variant that expects a `.jar` file containing `.class` files that were
3071*333d2b36SAndroid Build Coastguard Worker// compiled against a host bootclasspath.
3072*333d2b36SAndroid Build Coastguard Workerfunc ImportFactoryHost() android.Module {
3073*333d2b36SAndroid Build Coastguard Worker	module := &Import{}
3074*333d2b36SAndroid Build Coastguard Worker
3075*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.properties)
3076*333d2b36SAndroid Build Coastguard Worker
3077*333d2b36SAndroid Build Coastguard Worker	android.InitPrebuiltModule(module, &module.properties.Jars)
3078*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(module)
3079*333d2b36SAndroid Build Coastguard Worker	InitJavaModule(module, android.HostSupported)
3080*333d2b36SAndroid Build Coastguard Worker	return module
3081*333d2b36SAndroid Build Coastguard Worker}
3082*333d2b36SAndroid Build Coastguard Worker
3083*333d2b36SAndroid Build Coastguard Worker// dex_import module
3084*333d2b36SAndroid Build Coastguard Worker
3085*333d2b36SAndroid Build Coastguard Workertype DexImportProperties struct {
3086*333d2b36SAndroid Build Coastguard Worker	Jars []string `android:"path"`
3087*333d2b36SAndroid Build Coastguard Worker
3088*333d2b36SAndroid Build Coastguard Worker	// set the name of the output
3089*333d2b36SAndroid Build Coastguard Worker	Stem *string
3090*333d2b36SAndroid Build Coastguard Worker}
3091*333d2b36SAndroid Build Coastguard Worker
3092*333d2b36SAndroid Build Coastguard Workertype DexImport struct {
3093*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
3094*333d2b36SAndroid Build Coastguard Worker	android.DefaultableModuleBase
3095*333d2b36SAndroid Build Coastguard Worker	android.ApexModuleBase
3096*333d2b36SAndroid Build Coastguard Worker	prebuilt android.Prebuilt
3097*333d2b36SAndroid Build Coastguard Worker
3098*333d2b36SAndroid Build Coastguard Worker	properties DexImportProperties
3099*333d2b36SAndroid Build Coastguard Worker
3100*333d2b36SAndroid Build Coastguard Worker	dexJarFile OptionalDexJarPath
3101*333d2b36SAndroid Build Coastguard Worker
3102*333d2b36SAndroid Build Coastguard Worker	dexpreopter
3103*333d2b36SAndroid Build Coastguard Worker
3104*333d2b36SAndroid Build Coastguard Worker	hideApexVariantFromMake bool
3105*333d2b36SAndroid Build Coastguard Worker}
3106*333d2b36SAndroid Build Coastguard Worker
3107*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) Prebuilt() *android.Prebuilt {
3108*333d2b36SAndroid Build Coastguard Worker	return &j.prebuilt
3109*333d2b36SAndroid Build Coastguard Worker}
3110*333d2b36SAndroid Build Coastguard Worker
3111*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) PrebuiltSrcs() []string {
3112*333d2b36SAndroid Build Coastguard Worker	return j.properties.Jars
3113*333d2b36SAndroid Build Coastguard Worker}
3114*333d2b36SAndroid Build Coastguard Worker
3115*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) Name() string {
3116*333d2b36SAndroid Build Coastguard Worker	return j.prebuilt.Name(j.ModuleBase.Name())
3117*333d2b36SAndroid Build Coastguard Worker}
3118*333d2b36SAndroid Build Coastguard Worker
3119*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) Stem() string {
3120*333d2b36SAndroid Build Coastguard Worker	return proptools.StringDefault(j.properties.Stem, j.ModuleBase.Name())
3121*333d2b36SAndroid Build Coastguard Worker}
3122*333d2b36SAndroid Build Coastguard Worker
3123*333d2b36SAndroid Build Coastguard Workerfunc (a *DexImport) JacocoReportClassesFile() android.Path {
3124*333d2b36SAndroid Build Coastguard Worker	return nil
3125*333d2b36SAndroid Build Coastguard Worker}
3126*333d2b36SAndroid Build Coastguard Worker
3127*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) IsInstallable() bool {
3128*333d2b36SAndroid Build Coastguard Worker	return true
3129*333d2b36SAndroid Build Coastguard Worker}
3130*333d2b36SAndroid Build Coastguard Worker
3131*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
3132*333d2b36SAndroid Build Coastguard Worker	if len(j.properties.Jars) != 1 {
3133*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("jars", "exactly one jar must be provided")
3134*333d2b36SAndroid Build Coastguard Worker	}
3135*333d2b36SAndroid Build Coastguard Worker
3136*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
3137*333d2b36SAndroid Build Coastguard Worker	if !apexInfo.IsForPlatform() {
3138*333d2b36SAndroid Build Coastguard Worker		j.hideApexVariantFromMake = true
3139*333d2b36SAndroid Build Coastguard Worker	}
3140*333d2b36SAndroid Build Coastguard Worker
3141*333d2b36SAndroid Build Coastguard Worker	j.dexpreopter.installPath = j.dexpreopter.getInstallPath(
3142*333d2b36SAndroid Build Coastguard Worker		ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), android.PathForModuleInstall(ctx, "framework", j.Stem()+".jar"))
3143*333d2b36SAndroid Build Coastguard Worker	j.dexpreopter.uncompressedDex = shouldUncompressDex(ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), &j.dexpreopter)
3144*333d2b36SAndroid Build Coastguard Worker
3145*333d2b36SAndroid Build Coastguard Worker	inputJar := ctx.ExpandSource(j.properties.Jars[0], "jars")
3146*333d2b36SAndroid Build Coastguard Worker	dexOutputFile := android.PathForModuleOut(ctx, ctx.ModuleName()+".jar")
3147*333d2b36SAndroid Build Coastguard Worker
3148*333d2b36SAndroid Build Coastguard Worker	if j.dexpreopter.uncompressedDex {
3149*333d2b36SAndroid Build Coastguard Worker		rule := android.NewRuleBuilder(pctx, ctx)
3150*333d2b36SAndroid Build Coastguard Worker
3151*333d2b36SAndroid Build Coastguard Worker		temporary := android.PathForModuleOut(ctx, ctx.ModuleName()+".jar.unaligned")
3152*333d2b36SAndroid Build Coastguard Worker		rule.Temporary(temporary)
3153*333d2b36SAndroid Build Coastguard Worker
3154*333d2b36SAndroid Build Coastguard Worker		// use zip2zip to uncompress classes*.dex files
3155*333d2b36SAndroid Build Coastguard Worker		rule.Command().
3156*333d2b36SAndroid Build Coastguard Worker			BuiltTool("zip2zip").
3157*333d2b36SAndroid Build Coastguard Worker			FlagWithInput("-i ", inputJar).
3158*333d2b36SAndroid Build Coastguard Worker			FlagWithOutput("-o ", temporary).
3159*333d2b36SAndroid Build Coastguard Worker			FlagWithArg("-0 ", "'classes*.dex'")
3160*333d2b36SAndroid Build Coastguard Worker
3161*333d2b36SAndroid Build Coastguard Worker		// use zipalign to align uncompressed classes*.dex files
3162*333d2b36SAndroid Build Coastguard Worker		rule.Command().
3163*333d2b36SAndroid Build Coastguard Worker			BuiltTool("zipalign").
3164*333d2b36SAndroid Build Coastguard Worker			Flag("-f").
3165*333d2b36SAndroid Build Coastguard Worker			Text("4").
3166*333d2b36SAndroid Build Coastguard Worker			Input(temporary).
3167*333d2b36SAndroid Build Coastguard Worker			Output(dexOutputFile)
3168*333d2b36SAndroid Build Coastguard Worker
3169*333d2b36SAndroid Build Coastguard Worker		rule.DeleteTemporaryFiles()
3170*333d2b36SAndroid Build Coastguard Worker
3171*333d2b36SAndroid Build Coastguard Worker		rule.Build("uncompress_dex", "uncompress dex")
3172*333d2b36SAndroid Build Coastguard Worker	} else {
3173*333d2b36SAndroid Build Coastguard Worker		ctx.Build(pctx, android.BuildParams{
3174*333d2b36SAndroid Build Coastguard Worker			Rule:   android.Cp,
3175*333d2b36SAndroid Build Coastguard Worker			Input:  inputJar,
3176*333d2b36SAndroid Build Coastguard Worker			Output: dexOutputFile,
3177*333d2b36SAndroid Build Coastguard Worker		})
3178*333d2b36SAndroid Build Coastguard Worker	}
3179*333d2b36SAndroid Build Coastguard Worker
3180*333d2b36SAndroid Build Coastguard Worker	j.dexJarFile = makeDexJarPathFromPath(dexOutputFile)
3181*333d2b36SAndroid Build Coastguard Worker
3182*333d2b36SAndroid Build Coastguard Worker	j.dexpreopt(ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), dexOutputFile)
3183*333d2b36SAndroid Build Coastguard Worker
3184*333d2b36SAndroid Build Coastguard Worker	if apexInfo.IsForPlatform() {
3185*333d2b36SAndroid Build Coastguard Worker		ctx.InstallFile(android.PathForModuleInstall(ctx, "framework"),
3186*333d2b36SAndroid Build Coastguard Worker			j.Stem()+".jar", dexOutputFile)
3187*333d2b36SAndroid Build Coastguard Worker	}
3188*333d2b36SAndroid Build Coastguard Worker}
3189*333d2b36SAndroid Build Coastguard Worker
3190*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath {
3191*333d2b36SAndroid Build Coastguard Worker	return j.dexJarFile
3192*333d2b36SAndroid Build Coastguard Worker}
3193*333d2b36SAndroid Build Coastguard Worker
3194*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*DexImport)(nil)
3195*333d2b36SAndroid Build Coastguard Worker
3196*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule
3197*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3198*333d2b36SAndroid Build Coastguard Worker	sdkVersion android.ApiLevel) error {
3199*333d2b36SAndroid Build Coastguard Worker	// we don't check prebuilt modules for sdk_version
3200*333d2b36SAndroid Build Coastguard Worker	return nil
3201*333d2b36SAndroid Build Coastguard Worker}
3202*333d2b36SAndroid Build Coastguard Worker
3203*333d2b36SAndroid Build Coastguard Worker// dex_import imports a `.jar` file containing classes.dex files.
3204*333d2b36SAndroid Build Coastguard Worker//
3205*333d2b36SAndroid Build Coastguard Worker// A dex_import module cannot be used as a dependency of a java_* or android_* module, it can only be installed
3206*333d2b36SAndroid Build Coastguard Worker// to the device.
3207*333d2b36SAndroid Build Coastguard Workerfunc DexImportFactory() android.Module {
3208*333d2b36SAndroid Build Coastguard Worker	module := &DexImport{}
3209*333d2b36SAndroid Build Coastguard Worker
3210*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.properties)
3211*333d2b36SAndroid Build Coastguard Worker
3212*333d2b36SAndroid Build Coastguard Worker	android.InitPrebuiltModule(module, &module.properties.Jars)
3213*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(module)
3214*333d2b36SAndroid Build Coastguard Worker	InitJavaModule(module, android.DeviceSupported)
3215*333d2b36SAndroid Build Coastguard Worker	return module
3216*333d2b36SAndroid Build Coastguard Worker}
3217*333d2b36SAndroid Build Coastguard Worker
3218*333d2b36SAndroid Build Coastguard Worker// Defaults
3219*333d2b36SAndroid Build Coastguard Workertype Defaults struct {
3220*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
3221*333d2b36SAndroid Build Coastguard Worker	android.DefaultsModuleBase
3222*333d2b36SAndroid Build Coastguard Worker	android.ApexModuleBase
3223*333d2b36SAndroid Build Coastguard Worker}
3224*333d2b36SAndroid Build Coastguard Worker
3225*333d2b36SAndroid Build Coastguard Worker// java_defaults provides a set of properties that can be inherited by other java or android modules.
3226*333d2b36SAndroid Build Coastguard Worker//
3227*333d2b36SAndroid Build Coastguard Worker// A module can use the properties from a java_defaults module using `defaults: ["defaults_module_name"]`.  Each
3228*333d2b36SAndroid Build Coastguard Worker// property in the defaults module that exists in the depending module will be prepended to the depending module's
3229*333d2b36SAndroid Build Coastguard Worker// value for that property.
3230*333d2b36SAndroid Build Coastguard Worker//
3231*333d2b36SAndroid Build Coastguard Worker// Example:
3232*333d2b36SAndroid Build Coastguard Worker//
3233*333d2b36SAndroid Build Coastguard Worker//	java_defaults {
3234*333d2b36SAndroid Build Coastguard Worker//	    name: "example_defaults",
3235*333d2b36SAndroid Build Coastguard Worker//	    srcs: ["common/**/*.java"],
3236*333d2b36SAndroid Build Coastguard Worker//	    javacflags: ["-Xlint:all"],
3237*333d2b36SAndroid Build Coastguard Worker//	    aaptflags: ["--auto-add-overlay"],
3238*333d2b36SAndroid Build Coastguard Worker//	}
3239*333d2b36SAndroid Build Coastguard Worker//
3240*333d2b36SAndroid Build Coastguard Worker//	java_library {
3241*333d2b36SAndroid Build Coastguard Worker//	    name: "example",
3242*333d2b36SAndroid Build Coastguard Worker//	    defaults: ["example_defaults"],
3243*333d2b36SAndroid Build Coastguard Worker//	    srcs: ["example/**/*.java"],
3244*333d2b36SAndroid Build Coastguard Worker//	}
3245*333d2b36SAndroid Build Coastguard Worker//
3246*333d2b36SAndroid Build Coastguard Worker// is functionally identical to:
3247*333d2b36SAndroid Build Coastguard Worker//
3248*333d2b36SAndroid Build Coastguard Worker//	java_library {
3249*333d2b36SAndroid Build Coastguard Worker//	    name: "example",
3250*333d2b36SAndroid Build Coastguard Worker//	    srcs: [
3251*333d2b36SAndroid Build Coastguard Worker//	        "common/**/*.java",
3252*333d2b36SAndroid Build Coastguard Worker//	        "example/**/*.java",
3253*333d2b36SAndroid Build Coastguard Worker//	    ],
3254*333d2b36SAndroid Build Coastguard Worker//	    javacflags: ["-Xlint:all"],
3255*333d2b36SAndroid Build Coastguard Worker//	}
3256*333d2b36SAndroid Build Coastguard Workerfunc DefaultsFactory() android.Module {
3257*333d2b36SAndroid Build Coastguard Worker	module := &Defaults{}
3258*333d2b36SAndroid Build Coastguard Worker
3259*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(
3260*333d2b36SAndroid Build Coastguard Worker		&CommonProperties{},
3261*333d2b36SAndroid Build Coastguard Worker		&DeviceProperties{},
3262*333d2b36SAndroid Build Coastguard Worker		&OverridableProperties{},
3263*333d2b36SAndroid Build Coastguard Worker		&DexProperties{},
3264*333d2b36SAndroid Build Coastguard Worker		&DexpreoptProperties{},
3265*333d2b36SAndroid Build Coastguard Worker		&android.ProtoProperties{},
3266*333d2b36SAndroid Build Coastguard Worker		&aaptProperties{},
3267*333d2b36SAndroid Build Coastguard Worker		&androidLibraryProperties{},
3268*333d2b36SAndroid Build Coastguard Worker		&appProperties{},
3269*333d2b36SAndroid Build Coastguard Worker		&appTestProperties{},
3270*333d2b36SAndroid Build Coastguard Worker		&overridableAppProperties{},
3271*333d2b36SAndroid Build Coastguard Worker		&hostTestProperties{},
3272*333d2b36SAndroid Build Coastguard Worker		&testProperties{},
3273*333d2b36SAndroid Build Coastguard Worker		&ImportProperties{},
3274*333d2b36SAndroid Build Coastguard Worker		&AARImportProperties{},
3275*333d2b36SAndroid Build Coastguard Worker		&sdkLibraryProperties{},
3276*333d2b36SAndroid Build Coastguard Worker		&commonToSdkLibraryAndImportProperties{},
3277*333d2b36SAndroid Build Coastguard Worker		&DexImportProperties{},
3278*333d2b36SAndroid Build Coastguard Worker		&android.ApexProperties{},
3279*333d2b36SAndroid Build Coastguard Worker		&RuntimeResourceOverlayProperties{},
3280*333d2b36SAndroid Build Coastguard Worker		&LintProperties{},
3281*333d2b36SAndroid Build Coastguard Worker		&appTestHelperAppProperties{},
3282*333d2b36SAndroid Build Coastguard Worker		&JavaApiLibraryProperties{},
3283*333d2b36SAndroid Build Coastguard Worker		&bootclasspathFragmentProperties{},
3284*333d2b36SAndroid Build Coastguard Worker		&SourceOnlyBootclasspathProperties{},
3285*333d2b36SAndroid Build Coastguard Worker		&ravenwoodTestProperties{},
3286*333d2b36SAndroid Build Coastguard Worker	)
3287*333d2b36SAndroid Build Coastguard Worker
3288*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultsModule(module)
3289*333d2b36SAndroid Build Coastguard Worker	return module
3290*333d2b36SAndroid Build Coastguard Worker}
3291*333d2b36SAndroid Build Coastguard Worker
3292*333d2b36SAndroid Build Coastguard Workerfunc kytheExtractJavaFactory() android.Singleton {
3293*333d2b36SAndroid Build Coastguard Worker	return &kytheExtractJavaSingleton{}
3294*333d2b36SAndroid Build Coastguard Worker}
3295*333d2b36SAndroid Build Coastguard Worker
3296*333d2b36SAndroid Build Coastguard Workertype kytheExtractJavaSingleton struct {
3297*333d2b36SAndroid Build Coastguard Worker}
3298*333d2b36SAndroid Build Coastguard Worker
3299*333d2b36SAndroid Build Coastguard Workerfunc (ks *kytheExtractJavaSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3300*333d2b36SAndroid Build Coastguard Worker	var xrefTargets android.Paths
3301*333d2b36SAndroid Build Coastguard Worker	var xrefKotlinTargets android.Paths
3302*333d2b36SAndroid Build Coastguard Worker	ctx.VisitAllModules(func(module android.Module) {
3303*333d2b36SAndroid Build Coastguard Worker		if javaModule, ok := module.(xref); ok {
3304*333d2b36SAndroid Build Coastguard Worker			xrefTargets = append(xrefTargets, javaModule.XrefJavaFiles()...)
3305*333d2b36SAndroid Build Coastguard Worker			xrefKotlinTargets = append(xrefKotlinTargets, javaModule.XrefKotlinFiles()...)
3306*333d2b36SAndroid Build Coastguard Worker		}
3307*333d2b36SAndroid Build Coastguard Worker	})
3308*333d2b36SAndroid Build Coastguard Worker	// TODO(asmundak): perhaps emit a rule to output a warning if there were no xrefTargets
3309*333d2b36SAndroid Build Coastguard Worker	if len(xrefTargets) > 0 {
3310*333d2b36SAndroid Build Coastguard Worker		ctx.Phony("xref_java", xrefTargets...)
3311*333d2b36SAndroid Build Coastguard Worker	}
3312*333d2b36SAndroid Build Coastguard Worker	if len(xrefKotlinTargets) > 0 {
3313*333d2b36SAndroid Build Coastguard Worker		ctx.Phony("xref_kotlin", xrefKotlinTargets...)
3314*333d2b36SAndroid Build Coastguard Worker	}
3315*333d2b36SAndroid Build Coastguard Worker}
3316*333d2b36SAndroid Build Coastguard Worker
3317*333d2b36SAndroid Build Coastguard Workervar Bool = proptools.Bool
3318*333d2b36SAndroid Build Coastguard Workervar BoolDefault = proptools.BoolDefault
3319*333d2b36SAndroid Build Coastguard Workervar String = proptools.String
3320*333d2b36SAndroid Build Coastguard Workervar inList = android.InList[string]
3321*333d2b36SAndroid Build Coastguard Worker
3322*333d2b36SAndroid Build Coastguard Worker// Add class loader context (CLC) of a given dependency to the current CLC.
3323*333d2b36SAndroid Build Coastguard Workerfunc addCLCFromDep(ctx android.ModuleContext, depModule android.Module,
3324*333d2b36SAndroid Build Coastguard Worker	clcMap dexpreopt.ClassLoaderContextMap) {
3325*333d2b36SAndroid Build Coastguard Worker
3326*333d2b36SAndroid Build Coastguard Worker	dep, ok := depModule.(UsesLibraryDependency)
3327*333d2b36SAndroid Build Coastguard Worker	if !ok {
3328*333d2b36SAndroid Build Coastguard Worker		return
3329*333d2b36SAndroid Build Coastguard Worker	}
3330*333d2b36SAndroid Build Coastguard Worker
3331*333d2b36SAndroid Build Coastguard Worker	depName := android.RemoveOptionalPrebuiltPrefix(ctx.OtherModuleName(depModule))
3332*333d2b36SAndroid Build Coastguard Worker
3333*333d2b36SAndroid Build Coastguard Worker	var sdkLib *string
3334*333d2b36SAndroid Build Coastguard Worker	if lib, ok := android.OtherModuleProvider(ctx, depModule, SdkLibraryInfoProvider); ok && lib.SharedLibrary {
3335*333d2b36SAndroid Build Coastguard Worker		// A shared SDK library. This should be added as a top-level CLC element.
3336*333d2b36SAndroid Build Coastguard Worker		sdkLib = &depName
3337*333d2b36SAndroid Build Coastguard Worker	} else if lib, ok := depModule.(SdkLibraryComponentDependency); ok && lib.OptionalSdkLibraryImplementation() != nil {
3338*333d2b36SAndroid Build Coastguard Worker		if depModule.Name() == proptools.String(lib.OptionalSdkLibraryImplementation())+".impl" {
3339*333d2b36SAndroid Build Coastguard Worker			sdkLib = lib.OptionalSdkLibraryImplementation()
3340*333d2b36SAndroid Build Coastguard Worker		}
3341*333d2b36SAndroid Build Coastguard Worker	} else if ulib, ok := depModule.(ProvidesUsesLib); ok {
3342*333d2b36SAndroid Build Coastguard Worker		// A non-SDK library disguised as an SDK library by the means of `provides_uses_lib`
3343*333d2b36SAndroid Build Coastguard Worker		// property. This should be handled in the same way as a shared SDK library.
3344*333d2b36SAndroid Build Coastguard Worker		sdkLib = ulib.ProvidesUsesLib()
3345*333d2b36SAndroid Build Coastguard Worker	}
3346*333d2b36SAndroid Build Coastguard Worker
3347*333d2b36SAndroid Build Coastguard Worker	depTag := ctx.OtherModuleDependencyTag(depModule)
3348*333d2b36SAndroid Build Coastguard Worker	if IsLibDepTag(depTag) {
3349*333d2b36SAndroid Build Coastguard Worker		// Ok, propagate <uses-library> through non-static library dependencies.
3350*333d2b36SAndroid Build Coastguard Worker	} else if tag, ok := depTag.(usesLibraryDependencyTag); ok && tag.sdkVersion == dexpreopt.AnySdkVersion {
3351*333d2b36SAndroid Build Coastguard Worker		// Ok, propagate <uses-library> through non-compatibility <uses-library> dependencies.
3352*333d2b36SAndroid Build Coastguard Worker	} else if depTag == staticLibTag {
3353*333d2b36SAndroid Build Coastguard Worker		// Propagate <uses-library> through static library dependencies, unless it is a component
3354*333d2b36SAndroid Build Coastguard Worker		// library (such as stubs). Component libraries have a dependency on their SDK library,
3355*333d2b36SAndroid Build Coastguard Worker		// which should not be pulled just because of a static component library.
3356*333d2b36SAndroid Build Coastguard Worker		if sdkLib != nil {
3357*333d2b36SAndroid Build Coastguard Worker			return
3358*333d2b36SAndroid Build Coastguard Worker		}
3359*333d2b36SAndroid Build Coastguard Worker	} else {
3360*333d2b36SAndroid Build Coastguard Worker		// Don't propagate <uses-library> for other dependency tags.
3361*333d2b36SAndroid Build Coastguard Worker		return
3362*333d2b36SAndroid Build Coastguard Worker	}
3363*333d2b36SAndroid Build Coastguard Worker
3364*333d2b36SAndroid Build Coastguard Worker	// If this is an SDK (or SDK-like) library, then it should be added as a node in the CLC tree,
3365*333d2b36SAndroid Build Coastguard Worker	// and its CLC should be added as subtree of that node. Otherwise the library is not a
3366*333d2b36SAndroid Build Coastguard Worker	// <uses_library> and should not be added to CLC, but the transitive <uses-library> dependencies
3367*333d2b36SAndroid Build Coastguard Worker	// from its CLC should be added to the current CLC.
3368*333d2b36SAndroid Build Coastguard Worker	if sdkLib != nil {
3369*333d2b36SAndroid Build Coastguard Worker		optional := false
3370*333d2b36SAndroid Build Coastguard Worker		if module, ok := ctx.Module().(ModuleWithUsesLibrary); ok {
3371*333d2b36SAndroid Build Coastguard Worker			if android.InList(*sdkLib, module.UsesLibrary().usesLibraryProperties.Optional_uses_libs.GetOrDefault(ctx, nil)) {
3372*333d2b36SAndroid Build Coastguard Worker				optional = true
3373*333d2b36SAndroid Build Coastguard Worker			}
3374*333d2b36SAndroid Build Coastguard Worker		}
3375*333d2b36SAndroid Build Coastguard Worker		clcMap.AddContext(ctx, dexpreopt.AnySdkVersion, *sdkLib, optional,
3376*333d2b36SAndroid Build Coastguard Worker			dep.DexJarBuildPath(ctx).PathOrNil(), dep.DexJarInstallPath(), dep.ClassLoaderContexts())
3377*333d2b36SAndroid Build Coastguard Worker	} else {
3378*333d2b36SAndroid Build Coastguard Worker		clcMap.AddContextMap(dep.ClassLoaderContexts(), depName)
3379*333d2b36SAndroid Build Coastguard Worker	}
3380*333d2b36SAndroid Build Coastguard Worker}
3381*333d2b36SAndroid Build Coastguard Worker
3382*333d2b36SAndroid Build Coastguard Workerfunc addMissingOptionalUsesLibsFromDep(ctx android.ModuleContext, depModule android.Module,
3383*333d2b36SAndroid Build Coastguard Worker	usesLibrary *usesLibrary) {
3384*333d2b36SAndroid Build Coastguard Worker
3385*333d2b36SAndroid Build Coastguard Worker	dep, ok := depModule.(ModuleWithUsesLibrary)
3386*333d2b36SAndroid Build Coastguard Worker	if !ok {
3387*333d2b36SAndroid Build Coastguard Worker		return
3388*333d2b36SAndroid Build Coastguard Worker	}
3389*333d2b36SAndroid Build Coastguard Worker
3390*333d2b36SAndroid Build Coastguard Worker	for _, lib := range dep.UsesLibrary().usesLibraryProperties.Missing_optional_uses_libs {
3391*333d2b36SAndroid Build Coastguard Worker		if !android.InList(lib, usesLibrary.usesLibraryProperties.Missing_optional_uses_libs) {
3392*333d2b36SAndroid Build Coastguard Worker			usesLibrary.usesLibraryProperties.Missing_optional_uses_libs =
3393*333d2b36SAndroid Build Coastguard Worker				append(usesLibrary.usesLibraryProperties.Missing_optional_uses_libs, lib)
3394*333d2b36SAndroid Build Coastguard Worker		}
3395*333d2b36SAndroid Build Coastguard Worker	}
3396*333d2b36SAndroid Build Coastguard Worker}
3397*333d2b36SAndroid Build Coastguard Worker
3398*333d2b36SAndroid Build Coastguard Workertype JavaApiContributionImport struct {
3399*333d2b36SAndroid Build Coastguard Worker	JavaApiContribution
3400*333d2b36SAndroid Build Coastguard Worker
3401*333d2b36SAndroid Build Coastguard Worker	prebuilt           android.Prebuilt
3402*333d2b36SAndroid Build Coastguard Worker	prebuiltProperties javaApiContributionImportProperties
3403*333d2b36SAndroid Build Coastguard Worker}
3404*333d2b36SAndroid Build Coastguard Worker
3405*333d2b36SAndroid Build Coastguard Workertype javaApiContributionImportProperties struct {
3406*333d2b36SAndroid Build Coastguard Worker	// Name of the source soong module that gets shadowed by this prebuilt
3407*333d2b36SAndroid Build Coastguard Worker	// If unspecified, follows the naming convention that the source module of
3408*333d2b36SAndroid Build Coastguard Worker	// the prebuilt is Name() without "prebuilt_" prefix
3409*333d2b36SAndroid Build Coastguard Worker	Source_module_name *string
3410*333d2b36SAndroid Build Coastguard Worker
3411*333d2b36SAndroid Build Coastguard Worker	// Non-nil if this java_import module was dynamically created by a java_sdk_library_import
3412*333d2b36SAndroid Build Coastguard Worker	// The name is the undecorated name of the java_sdk_library as it appears in the blueprint file
3413*333d2b36SAndroid Build Coastguard Worker	// (without any prebuilt_ prefix)
3414*333d2b36SAndroid Build Coastguard Worker	Created_by_java_sdk_library_name *string `blueprint:"mutated"`
3415*333d2b36SAndroid Build Coastguard Worker}
3416*333d2b36SAndroid Build Coastguard Worker
3417*333d2b36SAndroid Build Coastguard Workerfunc ApiContributionImportFactory() android.Module {
3418*333d2b36SAndroid Build Coastguard Worker	module := &JavaApiContributionImport{}
3419*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidModule(module)
3420*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultableModule(module)
3421*333d2b36SAndroid Build Coastguard Worker	android.InitPrebuiltModule(module, &[]string{""})
3422*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.properties, &module.prebuiltProperties)
3423*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.sdkLibraryComponentProperties)
3424*333d2b36SAndroid Build Coastguard Worker	return module
3425*333d2b36SAndroid Build Coastguard Worker}
3426*333d2b36SAndroid Build Coastguard Worker
3427*333d2b36SAndroid Build Coastguard Workerfunc (module *JavaApiContributionImport) Prebuilt() *android.Prebuilt {
3428*333d2b36SAndroid Build Coastguard Worker	return &module.prebuilt
3429*333d2b36SAndroid Build Coastguard Worker}
3430*333d2b36SAndroid Build Coastguard Worker
3431*333d2b36SAndroid Build Coastguard Workerfunc (module *JavaApiContributionImport) Name() string {
3432*333d2b36SAndroid Build Coastguard Worker	return module.prebuilt.Name(module.ModuleBase.Name())
3433*333d2b36SAndroid Build Coastguard Worker}
3434*333d2b36SAndroid Build Coastguard Worker
3435*333d2b36SAndroid Build Coastguard Workerfunc (j *JavaApiContributionImport) BaseModuleName() string {
3436*333d2b36SAndroid Build Coastguard Worker	return proptools.StringDefault(j.prebuiltProperties.Source_module_name, j.ModuleBase.Name())
3437*333d2b36SAndroid Build Coastguard Worker}
3438*333d2b36SAndroid Build Coastguard Worker
3439*333d2b36SAndroid Build Coastguard Workerfunc (j *JavaApiContributionImport) CreatedByJavaSdkLibraryName() *string {
3440*333d2b36SAndroid Build Coastguard Worker	return j.prebuiltProperties.Created_by_java_sdk_library_name
3441*333d2b36SAndroid Build Coastguard Worker}
3442*333d2b36SAndroid Build Coastguard Worker
3443*333d2b36SAndroid Build Coastguard Workerfunc (ap *JavaApiContributionImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
3444*333d2b36SAndroid Build Coastguard Worker	ap.JavaApiContribution.GenerateAndroidBuildActions(ctx)
3445*333d2b36SAndroid Build Coastguard Worker}
3446