xref: /aosp_15_r20/build/soong/java/sdk_library_internal.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2024 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 Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
19*333d2b36SAndroid Build Coastguard Worker	"android/soong/etc"
20*333d2b36SAndroid Build Coastguard Worker	"fmt"
21*333d2b36SAndroid Build Coastguard Worker	"path"
22*333d2b36SAndroid Build Coastguard Worker	"strings"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
25*333d2b36SAndroid Build Coastguard Worker)
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Worker// ---------------------------------------------------------------------------------------------
28*333d2b36SAndroid Build Coastguard Worker// Naming scheme of the submodules generated by java_sdk_library and java_sdk_library_import
29*333d2b36SAndroid Build Coastguard Worker// ---------------------------------------------------------------------------------------------
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Workerconst (
32*333d2b36SAndroid Build Coastguard Worker	sdkXmlFileSuffix = ".xml"
33*333d2b36SAndroid Build Coastguard Worker	implLibSuffix    = ".impl"
34*333d2b36SAndroid Build Coastguard Worker)
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Workerfunc implLibraryModuleName(sdkLibName string) string {
37*333d2b36SAndroid Build Coastguard Worker	return sdkLibName + implLibSuffix
38*333d2b36SAndroid Build Coastguard Worker}
39*333d2b36SAndroid Build Coastguard Worker
40*333d2b36SAndroid Build Coastguard Worker// Module name of the runtime implementation library
41*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) implLibraryModuleName() string {
42*333d2b36SAndroid Build Coastguard Worker	return implLibraryModuleName(c.module.RootLibraryName())
43*333d2b36SAndroid Build Coastguard Worker}
44*333d2b36SAndroid Build Coastguard Worker
45*333d2b36SAndroid Build Coastguard Worker// Module name of the XML file for the lib
46*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) xmlPermissionsModuleName() string {
47*333d2b36SAndroid Build Coastguard Worker	return c.module.RootLibraryName() + sdkXmlFileSuffix
48*333d2b36SAndroid Build Coastguard Worker}
49*333d2b36SAndroid Build Coastguard Worker
50*333d2b36SAndroid Build Coastguard Worker// Name of the java_library module that compiles the stubs source.
51*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) stubsLibraryModuleName(apiScope *apiScope) string {
52*333d2b36SAndroid Build Coastguard Worker	baseName := c.module.RootLibraryName()
53*333d2b36SAndroid Build Coastguard Worker	return apiScope.stubsLibraryModuleName(baseName)
54*333d2b36SAndroid Build Coastguard Worker}
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Worker// Name of the java_library module that compiles the exportable stubs source.
57*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) exportableStubsLibraryModuleName(apiScope *apiScope) string {
58*333d2b36SAndroid Build Coastguard Worker	baseName := c.module.RootLibraryName()
59*333d2b36SAndroid Build Coastguard Worker	return apiScope.exportableStubsLibraryModuleName(baseName)
60*333d2b36SAndroid Build Coastguard Worker}
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Worker// Name of the droidstubs module that generates the stubs source and may also
63*333d2b36SAndroid Build Coastguard Worker// generate/check the API.
64*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) droidstubsModuleName(apiScope *apiScope) string {
65*333d2b36SAndroid Build Coastguard Worker	baseName := c.module.RootLibraryName()
66*333d2b36SAndroid Build Coastguard Worker	return apiScope.stubsSourceModuleName(baseName)
67*333d2b36SAndroid Build Coastguard Worker}
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Worker// Name of the java_api_library module that generates the from-text stubs source
70*333d2b36SAndroid Build Coastguard Worker// and compiles to a jar file.
71*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) fromTextStubsLibraryModuleName(apiScope *apiScope) string {
72*333d2b36SAndroid Build Coastguard Worker	baseName := c.module.RootLibraryName()
73*333d2b36SAndroid Build Coastguard Worker	return apiScope.apiLibraryModuleName(baseName)
74*333d2b36SAndroid Build Coastguard Worker}
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker// Name of the java_library module that compiles the stubs
77*333d2b36SAndroid Build Coastguard Worker// generated from source Java files.
78*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) fromSourceStubsLibraryModuleName(apiScope *apiScope) string {
79*333d2b36SAndroid Build Coastguard Worker	baseName := c.module.RootLibraryName()
80*333d2b36SAndroid Build Coastguard Worker	return apiScope.sourceStubsLibraryModuleName(baseName)
81*333d2b36SAndroid Build Coastguard Worker}
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker// Name of the java_library module that compiles the exportable stubs
84*333d2b36SAndroid Build Coastguard Worker// generated from source Java files.
85*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) exportableFromSourceStubsLibraryModuleName(apiScope *apiScope) string {
86*333d2b36SAndroid Build Coastguard Worker	baseName := c.module.RootLibraryName()
87*333d2b36SAndroid Build Coastguard Worker	return apiScope.exportableSourceStubsLibraryModuleName(baseName)
88*333d2b36SAndroid Build Coastguard Worker}
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Worker// ---------------------------------------------------------------------------------------------
91*333d2b36SAndroid Build Coastguard Worker// Build rules of the submodules generated by java_sdk_library.
92*333d2b36SAndroid Build Coastguard Worker// java_sdk_library "framework-foo" generates the following submodules:
93*333d2b36SAndroid Build Coastguard Worker//
94*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.impl" (type: [Library]): the implementation library, which generates the
95*333d2b36SAndroid Build Coastguard Worker//		compilation outputs that include the implementation details and the private apis
96*333d2b36SAndroid Build Coastguard Worker//		(i.e. class/methods that are annotated @hide).
97*333d2b36SAndroid Build Coastguard Worker//
98*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.source.<[apiScope.name]>" (type: [Droidstubs]): droidstubs module that
99*333d2b36SAndroid Build Coastguard Worker//		generates the stubs and the api files for the given api scope.
100*333d2b36SAndroid Build Coastguard Worker//
101*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.<[apiScope.name]>" (type: [Library]): stub library module that
102*333d2b36SAndroid Build Coastguard Worker//		provides the compilation output of the stubs to the reverse dependencies. The module
103*333d2b36SAndroid Build Coastguard Worker//		itself does not perform any compilation actions; the module statically depends on one of
104*333d2b36SAndroid Build Coastguard Worker//		the from-source stub module or the from-text stub configuration based on the build
105*333d2b36SAndroid Build Coastguard Worker// 		configuration.
106*333d2b36SAndroid Build Coastguard Worker//
107*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.<[apiScope.name]>.from-source" (type: [Library]): stub library module
108*333d2b36SAndroid Build Coastguard Worker//		that compiles the stubs generated by the droidstubs submodule. This module is a static
109*333d2b36SAndroid Build Coastguard Worker//		dependency of the stub library module when
110*333d2b36SAndroid Build Coastguard Worker//		[android/soong/android/config.BuildFromTextStub()] is false.
111*333d2b36SAndroid Build Coastguard Worker//
112*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.<[apiScope.name]>.from-text" (type: [ApiLibrary]): api library module
113*333d2b36SAndroid Build Coastguard Worker//		that generates and compiles the stubs from the api files checked in the tree instead of
114*333d2b36SAndroid Build Coastguard Worker//		the source Java files (e.g. *-current.txt files). This module is a static dependency of
115*333d2b36SAndroid Build Coastguard Worker//		the stub library module when [android/soong/android/config.BuildFromTextStub()] is true.
116*333d2b36SAndroid Build Coastguard Worker//
117*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.exportable.<[apiScope.name]>" (type: [Library]): stub library module
118*333d2b36SAndroid Build Coastguard Worker//		that provides the "exportable" stubs. "exportable" stubs are the stubs that do not
119*333d2b36SAndroid Build Coastguard Worker//		include in-development flagged apis. This module is only used for SDK builds to generate
120*333d2b36SAndroid Build Coastguard Worker//		the SDK artifacts, and not purposed for consumption for other modules.
121*333d2b36SAndroid Build Coastguard Worker//
122*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.exportable.<[apiScope.name]>.from-source" (type: [Library]): stub
123*333d2b36SAndroid Build Coastguard Worker//		library module that compiles the "exportable" stubs generated by the droidstubs
124*333d2b36SAndroid Build Coastguard Worker//		submodule. This module is always a static dependency of the "exportable" stub library
125*333d2b36SAndroid Build Coastguard Worker//		module given that from-text stubs cannot be used for SDK builds as it does not contain
126*333d2b36SAndroid Build Coastguard Worker//		documentations.
127*333d2b36SAndroid Build Coastguard Worker//
128*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.xml" (type: [sdkLibraryXml]): xml library that generates the permission xml
129*333d2b36SAndroid Build Coastguard Worker//		file, which allows [SdkLibrary] to be used with <uses-permission> tag in the
130*333d2b36SAndroid Build Coastguard Worker//		AndroidManifest.xml files.
131*333d2b36SAndroid Build Coastguard Worker// ---------------------------------------------------------------------------------------------
132*333d2b36SAndroid Build Coastguard Worker
133*333d2b36SAndroid Build Coastguard Worker// Creates the implementation [Library] with ".impl" suffix.
134*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createImplLibrary(mctx android.DefaultableHookContext) {
135*333d2b36SAndroid Build Coastguard Worker	visibility := childModuleVisibility(module.sdkLibraryProperties.Impl_library_visibility)
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Worker	staticLibs := module.properties.Static_libs.Clone()
138*333d2b36SAndroid Build Coastguard Worker	staticLibs.AppendSimpleValue(module.sdkLibraryProperties.Impl_only_static_libs)
139*333d2b36SAndroid Build Coastguard Worker	props := struct {
140*333d2b36SAndroid Build Coastguard Worker		Name           *string
141*333d2b36SAndroid Build Coastguard Worker		Enabled        proptools.Configurable[bool]
142*333d2b36SAndroid Build Coastguard Worker		Visibility     []string
143*333d2b36SAndroid Build Coastguard Worker		Libs           []string
144*333d2b36SAndroid Build Coastguard Worker		Static_libs    proptools.Configurable[[]string]
145*333d2b36SAndroid Build Coastguard Worker		Apex_available []string
146*333d2b36SAndroid Build Coastguard Worker		Stem           *string
147*333d2b36SAndroid Build Coastguard Worker	}{
148*333d2b36SAndroid Build Coastguard Worker		Name:       proptools.StringPtr(module.implLibraryModuleName()),
149*333d2b36SAndroid Build Coastguard Worker		Enabled:    module.EnabledProperty(),
150*333d2b36SAndroid Build Coastguard Worker		Visibility: visibility,
151*333d2b36SAndroid Build Coastguard Worker
152*333d2b36SAndroid Build Coastguard Worker		Libs: append(module.properties.Libs, module.sdkLibraryProperties.Impl_only_libs...),
153*333d2b36SAndroid Build Coastguard Worker
154*333d2b36SAndroid Build Coastguard Worker		Static_libs: staticLibs,
155*333d2b36SAndroid Build Coastguard Worker		// Pass the apex_available settings down so that the impl library can be statically
156*333d2b36SAndroid Build Coastguard Worker		// embedded within a library that is added to an APEX. Needed for updatable-media.
157*333d2b36SAndroid Build Coastguard Worker		Apex_available: module.ApexAvailable(),
158*333d2b36SAndroid Build Coastguard Worker
159*333d2b36SAndroid Build Coastguard Worker		Stem: proptools.StringPtr(module.Name()),
160*333d2b36SAndroid Build Coastguard Worker	}
161*333d2b36SAndroid Build Coastguard Worker
162*333d2b36SAndroid Build Coastguard Worker	properties := []interface{}{
163*333d2b36SAndroid Build Coastguard Worker		&module.properties,
164*333d2b36SAndroid Build Coastguard Worker		&module.protoProperties,
165*333d2b36SAndroid Build Coastguard Worker		&module.deviceProperties,
166*333d2b36SAndroid Build Coastguard Worker		&module.dexProperties,
167*333d2b36SAndroid Build Coastguard Worker		&module.dexpreoptProperties,
168*333d2b36SAndroid Build Coastguard Worker		&module.linter.properties,
169*333d2b36SAndroid Build Coastguard Worker		&module.overridableProperties,
170*333d2b36SAndroid Build Coastguard Worker		&props,
171*333d2b36SAndroid Build Coastguard Worker		module.sdkComponentPropertiesForChildLibrary(),
172*333d2b36SAndroid Build Coastguard Worker	}
173*333d2b36SAndroid Build Coastguard Worker	mctx.CreateModule(LibraryFactory, properties...)
174*333d2b36SAndroid Build Coastguard Worker}
175*333d2b36SAndroid Build Coastguard Worker
176*333d2b36SAndroid Build Coastguard Worker// Creates the [Droidstubs] module with ".stubs.source.<[apiScope.name]>" that creates stubs
177*333d2b36SAndroid Build Coastguard Worker// source files from the given full source files and also updates and checks the API
178*333d2b36SAndroid Build Coastguard Worker// specification files (i.e. "*-current.txt", "*-removed.txt" files).
179*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createDroidstubs(mctx android.DefaultableHookContext, apiScope *apiScope, name string, scopeSpecificDroidstubsArgs []string) {
180*333d2b36SAndroid Build Coastguard Worker	props := struct {
181*333d2b36SAndroid Build Coastguard Worker		Name                             *string
182*333d2b36SAndroid Build Coastguard Worker		Enabled                          proptools.Configurable[bool]
183*333d2b36SAndroid Build Coastguard Worker		Visibility                       []string
184*333d2b36SAndroid Build Coastguard Worker		Srcs                             []string
185*333d2b36SAndroid Build Coastguard Worker		Installable                      *bool
186*333d2b36SAndroid Build Coastguard Worker		Sdk_version                      *string
187*333d2b36SAndroid Build Coastguard Worker		Api_surface                      *string
188*333d2b36SAndroid Build Coastguard Worker		System_modules                   *string
189*333d2b36SAndroid Build Coastguard Worker		Libs                             proptools.Configurable[[]string]
190*333d2b36SAndroid Build Coastguard Worker		Output_javadoc_comments          *bool
191*333d2b36SAndroid Build Coastguard Worker		Arg_files                        []string
192*333d2b36SAndroid Build Coastguard Worker		Args                             *string
193*333d2b36SAndroid Build Coastguard Worker		Java_version                     *string
194*333d2b36SAndroid Build Coastguard Worker		Annotations_enabled              *bool
195*333d2b36SAndroid Build Coastguard Worker		Merge_annotations_dirs           []string
196*333d2b36SAndroid Build Coastguard Worker		Merge_inclusion_annotations_dirs []string
197*333d2b36SAndroid Build Coastguard Worker		Generate_stubs                   *bool
198*333d2b36SAndroid Build Coastguard Worker		Previous_api                     *string
199*333d2b36SAndroid Build Coastguard Worker		Aconfig_declarations             []string
200*333d2b36SAndroid Build Coastguard Worker		Check_api                        struct {
201*333d2b36SAndroid Build Coastguard Worker			Current       ApiToCheck
202*333d2b36SAndroid Build Coastguard Worker			Last_released ApiToCheck
203*333d2b36SAndroid Build Coastguard Worker
204*333d2b36SAndroid Build Coastguard Worker			Api_lint struct {
205*333d2b36SAndroid Build Coastguard Worker				Enabled       *bool
206*333d2b36SAndroid Build Coastguard Worker				New_since     *string
207*333d2b36SAndroid Build Coastguard Worker				Baseline_file *string
208*333d2b36SAndroid Build Coastguard Worker			}
209*333d2b36SAndroid Build Coastguard Worker		}
210*333d2b36SAndroid Build Coastguard Worker		Aidl struct {
211*333d2b36SAndroid Build Coastguard Worker			Include_dirs       []string
212*333d2b36SAndroid Build Coastguard Worker			Local_include_dirs []string
213*333d2b36SAndroid Build Coastguard Worker		}
214*333d2b36SAndroid Build Coastguard Worker		Dists []android.Dist
215*333d2b36SAndroid Build Coastguard Worker	}{}
216*333d2b36SAndroid Build Coastguard Worker
217*333d2b36SAndroid Build Coastguard Worker	// The stubs source processing uses the same compile time classpath when extracting the
218*333d2b36SAndroid Build Coastguard Worker	// API from the implementation library as it does when compiling it. i.e. the same
219*333d2b36SAndroid Build Coastguard Worker	// * sdk version
220*333d2b36SAndroid Build Coastguard Worker	// * system_modules
221*333d2b36SAndroid Build Coastguard Worker	// * libs (static_libs/libs)
222*333d2b36SAndroid Build Coastguard Worker
223*333d2b36SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr(name)
224*333d2b36SAndroid Build Coastguard Worker	props.Enabled = module.EnabledProperty()
225*333d2b36SAndroid Build Coastguard Worker	props.Visibility = childModuleVisibility(module.sdkLibraryProperties.Stubs_source_visibility)
226*333d2b36SAndroid Build Coastguard Worker	props.Srcs = append(props.Srcs, module.properties.Srcs...)
227*333d2b36SAndroid Build Coastguard Worker	props.Srcs = append(props.Srcs, module.sdkLibraryProperties.Api_srcs...)
228*333d2b36SAndroid Build Coastguard Worker	props.Sdk_version = module.deviceProperties.Sdk_version
229*333d2b36SAndroid Build Coastguard Worker	props.Api_surface = &apiScope.name
230*333d2b36SAndroid Build Coastguard Worker	props.System_modules = module.deviceProperties.System_modules
231*333d2b36SAndroid Build Coastguard Worker	props.Installable = proptools.BoolPtr(false)
232*333d2b36SAndroid Build Coastguard Worker	// A droiddoc module has only one Libs property and doesn't distinguish between
233*333d2b36SAndroid Build Coastguard Worker	// shared libs and static libs. So we need to add both of these libs to Libs property.
234*333d2b36SAndroid Build Coastguard Worker	props.Libs = proptools.NewConfigurable[[]string](nil, nil)
235*333d2b36SAndroid Build Coastguard Worker	props.Libs.AppendSimpleValue(module.properties.Libs)
236*333d2b36SAndroid Build Coastguard Worker	props.Libs.Append(module.properties.Static_libs)
237*333d2b36SAndroid Build Coastguard Worker	props.Libs.AppendSimpleValue(module.sdkLibraryProperties.Stub_only_libs)
238*333d2b36SAndroid Build Coastguard Worker	props.Libs.AppendSimpleValue(module.scopeToProperties[apiScope].Libs)
239*333d2b36SAndroid Build Coastguard Worker	props.Aidl.Include_dirs = module.deviceProperties.Aidl.Include_dirs
240*333d2b36SAndroid Build Coastguard Worker	props.Aidl.Local_include_dirs = module.deviceProperties.Aidl.Local_include_dirs
241*333d2b36SAndroid Build Coastguard Worker	props.Java_version = module.properties.Java_version
242*333d2b36SAndroid Build Coastguard Worker
243*333d2b36SAndroid Build Coastguard Worker	props.Annotations_enabled = module.sdkLibraryProperties.Annotations_enabled
244*333d2b36SAndroid Build Coastguard Worker	props.Merge_annotations_dirs = module.sdkLibraryProperties.Merge_annotations_dirs
245*333d2b36SAndroid Build Coastguard Worker	props.Merge_inclusion_annotations_dirs = module.sdkLibraryProperties.Merge_inclusion_annotations_dirs
246*333d2b36SAndroid Build Coastguard Worker	props.Aconfig_declarations = module.sdkLibraryProperties.Aconfig_declarations
247*333d2b36SAndroid Build Coastguard Worker
248*333d2b36SAndroid Build Coastguard Worker	droidstubsArgs := []string{}
249*333d2b36SAndroid Build Coastguard Worker	if len(module.sdkLibraryProperties.Api_packages) != 0 {
250*333d2b36SAndroid Build Coastguard Worker		droidstubsArgs = append(droidstubsArgs, "--stub-packages "+strings.Join(module.sdkLibraryProperties.Api_packages, ":"))
251*333d2b36SAndroid Build Coastguard Worker	}
252*333d2b36SAndroid Build Coastguard Worker	droidstubsArgs = append(droidstubsArgs, module.sdkLibraryProperties.Droiddoc_options...)
253*333d2b36SAndroid Build Coastguard Worker	disabledWarnings := []string{"HiddenSuperclass"}
254*333d2b36SAndroid Build Coastguard Worker	if proptools.BoolDefault(module.sdkLibraryProperties.Api_lint.Legacy_errors_allowed, true) {
255*333d2b36SAndroid Build Coastguard Worker		disabledWarnings = append(disabledWarnings,
256*333d2b36SAndroid Build Coastguard Worker			"BroadcastBehavior",
257*333d2b36SAndroid Build Coastguard Worker			"DeprecationMismatch",
258*333d2b36SAndroid Build Coastguard Worker			"MissingPermission",
259*333d2b36SAndroid Build Coastguard Worker			"SdkConstant",
260*333d2b36SAndroid Build Coastguard Worker			"Todo",
261*333d2b36SAndroid Build Coastguard Worker		)
262*333d2b36SAndroid Build Coastguard Worker	}
263*333d2b36SAndroid Build Coastguard Worker	droidstubsArgs = append(droidstubsArgs, android.JoinWithPrefix(disabledWarnings, "--hide "))
264*333d2b36SAndroid Build Coastguard Worker
265*333d2b36SAndroid Build Coastguard Worker	// Output Javadoc comments for public scope.
266*333d2b36SAndroid Build Coastguard Worker	if apiScope == apiScopePublic {
267*333d2b36SAndroid Build Coastguard Worker		props.Output_javadoc_comments = proptools.BoolPtr(true)
268*333d2b36SAndroid Build Coastguard Worker	}
269*333d2b36SAndroid Build Coastguard Worker
270*333d2b36SAndroid Build Coastguard Worker	// Add in scope specific arguments.
271*333d2b36SAndroid Build Coastguard Worker	droidstubsArgs = append(droidstubsArgs, scopeSpecificDroidstubsArgs...)
272*333d2b36SAndroid Build Coastguard Worker	props.Arg_files = module.sdkLibraryProperties.Droiddoc_option_files
273*333d2b36SAndroid Build Coastguard Worker	props.Args = proptools.StringPtr(strings.Join(droidstubsArgs, " "))
274*333d2b36SAndroid Build Coastguard Worker
275*333d2b36SAndroid Build Coastguard Worker	// List of APIs identified from the provided source files are created. They are later
276*333d2b36SAndroid Build Coastguard Worker	// compared against to the not-yet-released (a.k.a current) list of APIs and to the
277*333d2b36SAndroid Build Coastguard Worker	// last-released (a.k.a numbered) list of API.
278*333d2b36SAndroid Build Coastguard Worker	currentApiFileName := apiScope.apiFilePrefix + "current.txt"
279*333d2b36SAndroid Build Coastguard Worker	removedApiFileName := apiScope.apiFilePrefix + "removed.txt"
280*333d2b36SAndroid Build Coastguard Worker	apiDir := module.getApiDir()
281*333d2b36SAndroid Build Coastguard Worker	currentApiFileName = path.Join(apiDir, currentApiFileName)
282*333d2b36SAndroid Build Coastguard Worker	removedApiFileName = path.Join(apiDir, removedApiFileName)
283*333d2b36SAndroid Build Coastguard Worker
284*333d2b36SAndroid Build Coastguard Worker	// check against the not-yet-release API
285*333d2b36SAndroid Build Coastguard Worker	props.Check_api.Current.Api_file = proptools.StringPtr(currentApiFileName)
286*333d2b36SAndroid Build Coastguard Worker	props.Check_api.Current.Removed_api_file = proptools.StringPtr(removedApiFileName)
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Worker	if module.compareAgainstLatestApi(apiScope) {
289*333d2b36SAndroid Build Coastguard Worker		// check against the latest released API
290*333d2b36SAndroid Build Coastguard Worker		latestApiFilegroupName := proptools.StringPtr(module.latestApiFilegroupName(apiScope))
291*333d2b36SAndroid Build Coastguard Worker		props.Previous_api = latestApiFilegroupName
292*333d2b36SAndroid Build Coastguard Worker		props.Check_api.Last_released.Api_file = latestApiFilegroupName
293*333d2b36SAndroid Build Coastguard Worker		props.Check_api.Last_released.Removed_api_file = proptools.StringPtr(
294*333d2b36SAndroid Build Coastguard Worker			module.latestRemovedApiFilegroupName(apiScope))
295*333d2b36SAndroid Build Coastguard Worker		props.Check_api.Last_released.Baseline_file = proptools.StringPtr(
296*333d2b36SAndroid Build Coastguard Worker			module.latestIncompatibilitiesFilegroupName(apiScope))
297*333d2b36SAndroid Build Coastguard Worker
298*333d2b36SAndroid Build Coastguard Worker		if proptools.Bool(module.sdkLibraryProperties.Api_lint.Enabled) {
299*333d2b36SAndroid Build Coastguard Worker			// Enable api lint.
300*333d2b36SAndroid Build Coastguard Worker			props.Check_api.Api_lint.Enabled = proptools.BoolPtr(true)
301*333d2b36SAndroid Build Coastguard Worker			props.Check_api.Api_lint.New_since = latestApiFilegroupName
302*333d2b36SAndroid Build Coastguard Worker
303*333d2b36SAndroid Build Coastguard Worker			// If it exists then pass a lint-baseline.txt through to droidstubs.
304*333d2b36SAndroid Build Coastguard Worker			baselinePath := path.Join(apiDir, apiScope.apiFilePrefix+"lint-baseline.txt")
305*333d2b36SAndroid Build Coastguard Worker			baselinePathRelativeToRoot := path.Join(mctx.ModuleDir(), baselinePath)
306*333d2b36SAndroid Build Coastguard Worker			paths, err := mctx.GlobWithDeps(baselinePathRelativeToRoot, nil)
307*333d2b36SAndroid Build Coastguard Worker			if err != nil {
308*333d2b36SAndroid Build Coastguard Worker				mctx.ModuleErrorf("error checking for presence of %s: %s", baselinePathRelativeToRoot, err)
309*333d2b36SAndroid Build Coastguard Worker			}
310*333d2b36SAndroid Build Coastguard Worker			if len(paths) == 1 {
311*333d2b36SAndroid Build Coastguard Worker				props.Check_api.Api_lint.Baseline_file = proptools.StringPtr(baselinePath)
312*333d2b36SAndroid Build Coastguard Worker			} else if len(paths) != 0 {
313*333d2b36SAndroid Build Coastguard Worker				mctx.ModuleErrorf("error checking for presence of %s: expected one path, found: %v", baselinePathRelativeToRoot, paths)
314*333d2b36SAndroid Build Coastguard Worker			}
315*333d2b36SAndroid Build Coastguard Worker		}
316*333d2b36SAndroid Build Coastguard Worker	}
317*333d2b36SAndroid Build Coastguard Worker
318*333d2b36SAndroid Build Coastguard Worker	if !Bool(module.sdkLibraryProperties.No_dist) {
319*333d2b36SAndroid Build Coastguard Worker		// Dist the api txt and removed api txt artifacts for sdk builds.
320*333d2b36SAndroid Build Coastguard Worker		distDir := proptools.StringPtr(path.Join(module.apiDistPath(apiScope), "api"))
321*333d2b36SAndroid Build Coastguard Worker		stubsTypeTagPrefix := ""
322*333d2b36SAndroid Build Coastguard Worker		if mctx.Config().ReleaseHiddenApiExportableStubs() {
323*333d2b36SAndroid Build Coastguard Worker			stubsTypeTagPrefix = ".exportable"
324*333d2b36SAndroid Build Coastguard Worker		}
325*333d2b36SAndroid Build Coastguard Worker		for _, p := range []struct {
326*333d2b36SAndroid Build Coastguard Worker			tag     string
327*333d2b36SAndroid Build Coastguard Worker			pattern string
328*333d2b36SAndroid Build Coastguard Worker		}{
329*333d2b36SAndroid Build Coastguard Worker			// "exportable" api files are copied to the dist directory instead of the
330*333d2b36SAndroid Build Coastguard Worker			// "everything" api files when "RELEASE_HIDDEN_API_EXPORTABLE_STUBS" build flag
331*333d2b36SAndroid Build Coastguard Worker			// is set. Otherwise, the "everything" api files are copied to the dist directory.
332*333d2b36SAndroid Build Coastguard Worker			{tag: "%s.api.txt", pattern: "%s.txt"},
333*333d2b36SAndroid Build Coastguard Worker			{tag: "%s.removed-api.txt", pattern: "%s-removed.txt"},
334*333d2b36SAndroid Build Coastguard Worker		} {
335*333d2b36SAndroid Build Coastguard Worker			props.Dists = append(props.Dists, android.Dist{
336*333d2b36SAndroid Build Coastguard Worker				Targets: []string{"sdk", "win_sdk"},
337*333d2b36SAndroid Build Coastguard Worker				Dir:     distDir,
338*333d2b36SAndroid Build Coastguard Worker				Dest:    proptools.StringPtr(fmt.Sprintf(p.pattern, module.distStem())),
339*333d2b36SAndroid Build Coastguard Worker				Tag:     proptools.StringPtr(fmt.Sprintf(p.tag, stubsTypeTagPrefix)),
340*333d2b36SAndroid Build Coastguard Worker			})
341*333d2b36SAndroid Build Coastguard Worker		}
342*333d2b36SAndroid Build Coastguard Worker	}
343*333d2b36SAndroid Build Coastguard Worker
344*333d2b36SAndroid Build Coastguard Worker	mctx.CreateModule(DroidstubsFactory, &props, module.sdkComponentPropertiesForChildLibrary()).(*Droidstubs).CallHookIfAvailable(mctx)
345*333d2b36SAndroid Build Coastguard Worker}
346*333d2b36SAndroid Build Coastguard Worker
347*333d2b36SAndroid Build Coastguard Workertype libraryProperties struct {
348*333d2b36SAndroid Build Coastguard Worker	Name           *string
349*333d2b36SAndroid Build Coastguard Worker	Enabled        proptools.Configurable[bool]
350*333d2b36SAndroid Build Coastguard Worker	Visibility     []string
351*333d2b36SAndroid Build Coastguard Worker	Srcs           []string
352*333d2b36SAndroid Build Coastguard Worker	Installable    *bool
353*333d2b36SAndroid Build Coastguard Worker	Sdk_version    *string
354*333d2b36SAndroid Build Coastguard Worker	System_modules *string
355*333d2b36SAndroid Build Coastguard Worker	Patch_module   *string
356*333d2b36SAndroid Build Coastguard Worker	Libs           []string
357*333d2b36SAndroid Build Coastguard Worker	Static_libs    []string
358*333d2b36SAndroid Build Coastguard Worker	Compile_dex    *bool
359*333d2b36SAndroid Build Coastguard Worker	Java_version   *string
360*333d2b36SAndroid Build Coastguard Worker	Openjdk9       struct {
361*333d2b36SAndroid Build Coastguard Worker		Srcs       []string
362*333d2b36SAndroid Build Coastguard Worker		Javacflags []string
363*333d2b36SAndroid Build Coastguard Worker	}
364*333d2b36SAndroid Build Coastguard Worker	Dist struct {
365*333d2b36SAndroid Build Coastguard Worker		Targets []string
366*333d2b36SAndroid Build Coastguard Worker		Dest    *string
367*333d2b36SAndroid Build Coastguard Worker		Dir     *string
368*333d2b36SAndroid Build Coastguard Worker		Tag     *string
369*333d2b36SAndroid Build Coastguard Worker	}
370*333d2b36SAndroid Build Coastguard Worker	Is_stubs_module       *bool
371*333d2b36SAndroid Build Coastguard Worker	Stub_contributing_api *string
372*333d2b36SAndroid Build Coastguard Worker}
373*333d2b36SAndroid Build Coastguard Worker
374*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) stubsLibraryProps(mctx android.DefaultableHookContext, apiScope *apiScope) libraryProperties {
375*333d2b36SAndroid Build Coastguard Worker	props := libraryProperties{}
376*333d2b36SAndroid Build Coastguard Worker	props.Enabled = module.EnabledProperty()
377*333d2b36SAndroid Build Coastguard Worker	props.Visibility = []string{"//visibility:override", "//visibility:private"}
378*333d2b36SAndroid Build Coastguard Worker	// sources are generated from the droiddoc
379*333d2b36SAndroid Build Coastguard Worker	sdkVersion := module.sdkVersionForStubsLibrary(mctx, apiScope)
380*333d2b36SAndroid Build Coastguard Worker	props.Sdk_version = proptools.StringPtr(sdkVersion)
381*333d2b36SAndroid Build Coastguard Worker	props.System_modules = module.deviceProperties.System_modules
382*333d2b36SAndroid Build Coastguard Worker	props.Patch_module = module.properties.Patch_module
383*333d2b36SAndroid Build Coastguard Worker	props.Installable = proptools.BoolPtr(false)
384*333d2b36SAndroid Build Coastguard Worker	props.Libs = module.sdkLibraryProperties.Stub_only_libs
385*333d2b36SAndroid Build Coastguard Worker	props.Libs = append(props.Libs, module.scopeToProperties[apiScope].Libs...)
386*333d2b36SAndroid Build Coastguard Worker	props.Static_libs = module.sdkLibraryProperties.Stub_only_static_libs
387*333d2b36SAndroid Build Coastguard Worker	// The stub-annotations library contains special versions of the annotations
388*333d2b36SAndroid Build Coastguard Worker	// with CLASS retention policy, so that they're kept.
389*333d2b36SAndroid Build Coastguard Worker	if proptools.Bool(module.sdkLibraryProperties.Annotations_enabled) {
390*333d2b36SAndroid Build Coastguard Worker		props.Libs = append(props.Libs, "stub-annotations")
391*333d2b36SAndroid Build Coastguard Worker	}
392*333d2b36SAndroid Build Coastguard Worker	props.Openjdk9.Srcs = module.properties.Openjdk9.Srcs
393*333d2b36SAndroid Build Coastguard Worker	props.Openjdk9.Javacflags = module.properties.Openjdk9.Javacflags
394*333d2b36SAndroid Build Coastguard Worker	// We compile the stubs for 1.8 in line with the main android.jar stubs, and potential
395*333d2b36SAndroid Build Coastguard Worker	// interop with older developer tools that don't support 1.9.
396*333d2b36SAndroid Build Coastguard Worker	props.Java_version = proptools.StringPtr("1.8")
397*333d2b36SAndroid Build Coastguard Worker	props.Is_stubs_module = proptools.BoolPtr(true)
398*333d2b36SAndroid Build Coastguard Worker	props.Stub_contributing_api = proptools.StringPtr(apiScope.kind.String())
399*333d2b36SAndroid Build Coastguard Worker
400*333d2b36SAndroid Build Coastguard Worker	return props
401*333d2b36SAndroid Build Coastguard Worker}
402*333d2b36SAndroid Build Coastguard Worker
403*333d2b36SAndroid Build Coastguard Worker// Creates the from-source stub [Library] with ".stubs.<[apiScope.name]>.from-source" suffix.
404*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createFromSourceStubsLibrary(mctx android.DefaultableHookContext, apiScope *apiScope) {
405*333d2b36SAndroid Build Coastguard Worker
406*333d2b36SAndroid Build Coastguard Worker	props := module.stubsLibraryProps(mctx, apiScope)
407*333d2b36SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr(module.fromSourceStubsLibraryModuleName(apiScope))
408*333d2b36SAndroid Build Coastguard Worker	props.Srcs = []string{":" + module.droidstubsModuleName(apiScope)}
409*333d2b36SAndroid Build Coastguard Worker
410*333d2b36SAndroid Build Coastguard Worker	mctx.CreateModule(LibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary())
411*333d2b36SAndroid Build Coastguard Worker}
412*333d2b36SAndroid Build Coastguard Worker
413*333d2b36SAndroid Build Coastguard Worker// Creates the "exportable" from-source stub [Library] with
414*333d2b36SAndroid Build Coastguard Worker// ".stubs.exportable.<[apiScope.name]>" suffix.
415*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createExportableFromSourceStubsLibrary(mctx android.DefaultableHookContext, apiScope *apiScope) {
416*333d2b36SAndroid Build Coastguard Worker	props := module.stubsLibraryProps(mctx, apiScope)
417*333d2b36SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr(module.exportableFromSourceStubsLibraryModuleName(apiScope))
418*333d2b36SAndroid Build Coastguard Worker	props.Srcs = []string{":" + module.droidstubsModuleName(apiScope) + "{.exportable}"}
419*333d2b36SAndroid Build Coastguard Worker
420*333d2b36SAndroid Build Coastguard Worker	mctx.CreateModule(LibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary())
421*333d2b36SAndroid Build Coastguard Worker}
422*333d2b36SAndroid Build Coastguard Worker
423*333d2b36SAndroid Build Coastguard Worker// Creates the from-text stub [ApiLibrary] with ".stubs.<[apiScope.name]>.from-text" suffix.
424*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createApiLibrary(mctx android.DefaultableHookContext, apiScope *apiScope) {
425*333d2b36SAndroid Build Coastguard Worker	props := struct {
426*333d2b36SAndroid Build Coastguard Worker		Name              *string
427*333d2b36SAndroid Build Coastguard Worker		Enabled           proptools.Configurable[bool]
428*333d2b36SAndroid Build Coastguard Worker		Visibility        []string
429*333d2b36SAndroid Build Coastguard Worker		Api_contributions []string
430*333d2b36SAndroid Build Coastguard Worker		Libs              proptools.Configurable[[]string]
431*333d2b36SAndroid Build Coastguard Worker		Static_libs       []string
432*333d2b36SAndroid Build Coastguard Worker		System_modules    *string
433*333d2b36SAndroid Build Coastguard Worker		Enable_validation *bool
434*333d2b36SAndroid Build Coastguard Worker		Stubs_type        *string
435*333d2b36SAndroid Build Coastguard Worker		Sdk_version       *string
436*333d2b36SAndroid Build Coastguard Worker		Previous_api      *string
437*333d2b36SAndroid Build Coastguard Worker	}{}
438*333d2b36SAndroid Build Coastguard Worker
439*333d2b36SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr(module.fromTextStubsLibraryModuleName(apiScope))
440*333d2b36SAndroid Build Coastguard Worker	props.Enabled = module.EnabledProperty()
441*333d2b36SAndroid Build Coastguard Worker	props.Visibility = []string{"//visibility:override", "//visibility:private"}
442*333d2b36SAndroid Build Coastguard Worker
443*333d2b36SAndroid Build Coastguard Worker	apiContributions := []string{}
444*333d2b36SAndroid Build Coastguard Worker
445*333d2b36SAndroid Build Coastguard Worker	// Api surfaces are not independent of each other, but have subset relationships,
446*333d2b36SAndroid Build Coastguard Worker	// and so does the api files. To generate from-text stubs for api surfaces other than public,
447*333d2b36SAndroid Build Coastguard Worker	// all subset api domains' api_contriubtions must be added as well.
448*333d2b36SAndroid Build Coastguard Worker	scope := apiScope
449*333d2b36SAndroid Build Coastguard Worker	for scope != nil {
450*333d2b36SAndroid Build Coastguard Worker		apiContributions = append(apiContributions, module.droidstubsModuleName(scope)+".api.contribution")
451*333d2b36SAndroid Build Coastguard Worker		scope = scope.extends
452*333d2b36SAndroid Build Coastguard Worker	}
453*333d2b36SAndroid Build Coastguard Worker	if apiScope == apiScopePublic {
454*333d2b36SAndroid Build Coastguard Worker		additionalApiContribution := module.apiLibraryAdditionalApiContribution()
455*333d2b36SAndroid Build Coastguard Worker		if additionalApiContribution != "" {
456*333d2b36SAndroid Build Coastguard Worker			apiContributions = append(apiContributions, additionalApiContribution)
457*333d2b36SAndroid Build Coastguard Worker		}
458*333d2b36SAndroid Build Coastguard Worker	}
459*333d2b36SAndroid Build Coastguard Worker
460*333d2b36SAndroid Build Coastguard Worker	props.Api_contributions = apiContributions
461*333d2b36SAndroid Build Coastguard Worker
462*333d2b36SAndroid Build Coastguard Worker	// Ensure that stub-annotations is added to the classpath before any other libs
463*333d2b36SAndroid Build Coastguard Worker	props.Libs = proptools.NewConfigurable[[]string](nil, nil)
464*333d2b36SAndroid Build Coastguard Worker	props.Libs.AppendSimpleValue([]string{"stub-annotations"})
465*333d2b36SAndroid Build Coastguard Worker	props.Libs.AppendSimpleValue(module.properties.Libs)
466*333d2b36SAndroid Build Coastguard Worker	props.Libs.Append(module.properties.Static_libs)
467*333d2b36SAndroid Build Coastguard Worker	props.Libs.AppendSimpleValue(module.sdkLibraryProperties.Stub_only_libs)
468*333d2b36SAndroid Build Coastguard Worker	props.Libs.AppendSimpleValue(module.scopeToProperties[apiScope].Libs)
469*333d2b36SAndroid Build Coastguard Worker	props.Static_libs = module.sdkLibraryProperties.Stub_only_static_libs
470*333d2b36SAndroid Build Coastguard Worker
471*333d2b36SAndroid Build Coastguard Worker	props.System_modules = module.deviceProperties.System_modules
472*333d2b36SAndroid Build Coastguard Worker	props.Enable_validation = proptools.BoolPtr(true)
473*333d2b36SAndroid Build Coastguard Worker	props.Stubs_type = proptools.StringPtr("everything")
474*333d2b36SAndroid Build Coastguard Worker
475*333d2b36SAndroid Build Coastguard Worker	if module.deviceProperties.Sdk_version != nil {
476*333d2b36SAndroid Build Coastguard Worker		props.Sdk_version = module.deviceProperties.Sdk_version
477*333d2b36SAndroid Build Coastguard Worker	}
478*333d2b36SAndroid Build Coastguard Worker
479*333d2b36SAndroid Build Coastguard Worker	if module.compareAgainstLatestApi(apiScope) {
480*333d2b36SAndroid Build Coastguard Worker		// check against the latest released API
481*333d2b36SAndroid Build Coastguard Worker		latestApiFilegroupName := proptools.StringPtr(module.latestApiFilegroupName(apiScope))
482*333d2b36SAndroid Build Coastguard Worker		props.Previous_api = latestApiFilegroupName
483*333d2b36SAndroid Build Coastguard Worker	}
484*333d2b36SAndroid Build Coastguard Worker
485*333d2b36SAndroid Build Coastguard Worker	mctx.CreateModule(ApiLibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary())
486*333d2b36SAndroid Build Coastguard Worker}
487*333d2b36SAndroid Build Coastguard Worker
488*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) topLevelStubsLibraryProps(mctx android.DefaultableHookContext, apiScope *apiScope, doDist bool) libraryProperties {
489*333d2b36SAndroid Build Coastguard Worker	props := libraryProperties{}
490*333d2b36SAndroid Build Coastguard Worker
491*333d2b36SAndroid Build Coastguard Worker	props.Enabled = module.EnabledProperty()
492*333d2b36SAndroid Build Coastguard Worker	props.Visibility = childModuleVisibility(module.sdkLibraryProperties.Stubs_library_visibility)
493*333d2b36SAndroid Build Coastguard Worker	sdkVersion := module.sdkVersionForStubsLibrary(mctx, apiScope)
494*333d2b36SAndroid Build Coastguard Worker	props.Sdk_version = proptools.StringPtr(sdkVersion)
495*333d2b36SAndroid Build Coastguard Worker
496*333d2b36SAndroid Build Coastguard Worker	props.System_modules = module.deviceProperties.System_modules
497*333d2b36SAndroid Build Coastguard Worker
498*333d2b36SAndroid Build Coastguard Worker	// The imports need to be compiled to dex if the java_sdk_library requests it.
499*333d2b36SAndroid Build Coastguard Worker	compileDex := module.dexProperties.Compile_dex
500*333d2b36SAndroid Build Coastguard Worker	if module.stubLibrariesCompiledForDex() {
501*333d2b36SAndroid Build Coastguard Worker		compileDex = proptools.BoolPtr(true)
502*333d2b36SAndroid Build Coastguard Worker	}
503*333d2b36SAndroid Build Coastguard Worker	props.Compile_dex = compileDex
504*333d2b36SAndroid Build Coastguard Worker
505*333d2b36SAndroid Build Coastguard Worker	props.Stub_contributing_api = proptools.StringPtr(apiScope.kind.String())
506*333d2b36SAndroid Build Coastguard Worker
507*333d2b36SAndroid Build Coastguard Worker	if !Bool(module.sdkLibraryProperties.No_dist) && doDist {
508*333d2b36SAndroid Build Coastguard Worker		props.Dist.Targets = []string{"sdk", "win_sdk"}
509*333d2b36SAndroid Build Coastguard Worker		props.Dist.Dest = proptools.StringPtr(fmt.Sprintf("%v.jar", module.distStem()))
510*333d2b36SAndroid Build Coastguard Worker		props.Dist.Dir = proptools.StringPtr(module.apiDistPath(apiScope))
511*333d2b36SAndroid Build Coastguard Worker		props.Dist.Tag = proptools.StringPtr(".jar")
512*333d2b36SAndroid Build Coastguard Worker	}
513*333d2b36SAndroid Build Coastguard Worker	props.Is_stubs_module = proptools.BoolPtr(true)
514*333d2b36SAndroid Build Coastguard Worker
515*333d2b36SAndroid Build Coastguard Worker	return props
516*333d2b36SAndroid Build Coastguard Worker}
517*333d2b36SAndroid Build Coastguard Worker
518*333d2b36SAndroid Build Coastguard Worker// Creates the stub [Library] with ".stubs.<[apiScope.name]>" suffix.
519*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createTopLevelStubsLibrary(
520*333d2b36SAndroid Build Coastguard Worker	mctx android.DefaultableHookContext, apiScope *apiScope) {
521*333d2b36SAndroid Build Coastguard Worker
522*333d2b36SAndroid Build Coastguard Worker	// Dist the "everything" stubs when the RELEASE_HIDDEN_API_EXPORTABLE_STUBS build flag is false
523*333d2b36SAndroid Build Coastguard Worker	doDist := !mctx.Config().ReleaseHiddenApiExportableStubs()
524*333d2b36SAndroid Build Coastguard Worker	props := module.topLevelStubsLibraryProps(mctx, apiScope, doDist)
525*333d2b36SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr(module.stubsLibraryModuleName(apiScope))
526*333d2b36SAndroid Build Coastguard Worker
527*333d2b36SAndroid Build Coastguard Worker	// Add the stub compiling java_library/java_api_library as static lib based on build config
528*333d2b36SAndroid Build Coastguard Worker	staticLib := module.fromSourceStubsLibraryModuleName(apiScope)
529*333d2b36SAndroid Build Coastguard Worker	if mctx.Config().BuildFromTextStub() && module.ModuleBuildFromTextStubs() {
530*333d2b36SAndroid Build Coastguard Worker		staticLib = module.fromTextStubsLibraryModuleName(apiScope)
531*333d2b36SAndroid Build Coastguard Worker	}
532*333d2b36SAndroid Build Coastguard Worker	props.Static_libs = append(props.Static_libs, staticLib)
533*333d2b36SAndroid Build Coastguard Worker
534*333d2b36SAndroid Build Coastguard Worker	mctx.CreateModule(LibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary())
535*333d2b36SAndroid Build Coastguard Worker}
536*333d2b36SAndroid Build Coastguard Worker
537*333d2b36SAndroid Build Coastguard Worker// Creates the "exportable" stub [Library] with ".stubs.exportable.<[apiScope.name]>" suffix.
538*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createTopLevelExportableStubsLibrary(
539*333d2b36SAndroid Build Coastguard Worker	mctx android.DefaultableHookContext, apiScope *apiScope) {
540*333d2b36SAndroid Build Coastguard Worker
541*333d2b36SAndroid Build Coastguard Worker	// Dist the "exportable" stubs when the RELEASE_HIDDEN_API_EXPORTABLE_STUBS build flag is true
542*333d2b36SAndroid Build Coastguard Worker	doDist := mctx.Config().ReleaseHiddenApiExportableStubs()
543*333d2b36SAndroid Build Coastguard Worker	props := module.topLevelStubsLibraryProps(mctx, apiScope, doDist)
544*333d2b36SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr(module.exportableStubsLibraryModuleName(apiScope))
545*333d2b36SAndroid Build Coastguard Worker
546*333d2b36SAndroid Build Coastguard Worker	staticLib := module.exportableFromSourceStubsLibraryModuleName(apiScope)
547*333d2b36SAndroid Build Coastguard Worker	props.Static_libs = append(props.Static_libs, staticLib)
548*333d2b36SAndroid Build Coastguard Worker
549*333d2b36SAndroid Build Coastguard Worker	mctx.CreateModule(LibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary())
550*333d2b36SAndroid Build Coastguard Worker}
551*333d2b36SAndroid Build Coastguard Worker
552*333d2b36SAndroid Build Coastguard Worker// Creates the [sdkLibraryXml] with ".xml" suffix.
553*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createXmlFile(mctx android.DefaultableHookContext) {
554*333d2b36SAndroid Build Coastguard Worker	moduleMinApiLevel := module.Library.MinSdkVersion(mctx)
555*333d2b36SAndroid Build Coastguard Worker	var moduleMinApiLevelStr = moduleMinApiLevel.String()
556*333d2b36SAndroid Build Coastguard Worker	if moduleMinApiLevel == android.NoneApiLevel {
557*333d2b36SAndroid Build Coastguard Worker		moduleMinApiLevelStr = "current"
558*333d2b36SAndroid Build Coastguard Worker	}
559*333d2b36SAndroid Build Coastguard Worker	props := struct {
560*333d2b36SAndroid Build Coastguard Worker		Name                      *string
561*333d2b36SAndroid Build Coastguard Worker		Enabled                   proptools.Configurable[bool]
562*333d2b36SAndroid Build Coastguard Worker		Lib_name                  *string
563*333d2b36SAndroid Build Coastguard Worker		Apex_available            []string
564*333d2b36SAndroid Build Coastguard Worker		On_bootclasspath_since    *string
565*333d2b36SAndroid Build Coastguard Worker		On_bootclasspath_before   *string
566*333d2b36SAndroid Build Coastguard Worker		Min_device_sdk            *string
567*333d2b36SAndroid Build Coastguard Worker		Max_device_sdk            *string
568*333d2b36SAndroid Build Coastguard Worker		Sdk_library_min_api_level *string
569*333d2b36SAndroid Build Coastguard Worker		Uses_libs_dependencies    proptools.Configurable[[]string]
570*333d2b36SAndroid Build Coastguard Worker	}{
571*333d2b36SAndroid Build Coastguard Worker		Name:                      proptools.StringPtr(module.xmlPermissionsModuleName()),
572*333d2b36SAndroid Build Coastguard Worker		Enabled:                   module.EnabledProperty(),
573*333d2b36SAndroid Build Coastguard Worker		Lib_name:                  proptools.StringPtr(module.BaseModuleName()),
574*333d2b36SAndroid Build Coastguard Worker		Apex_available:            module.ApexProperties.Apex_available,
575*333d2b36SAndroid Build Coastguard Worker		On_bootclasspath_since:    module.commonSdkLibraryProperties.On_bootclasspath_since,
576*333d2b36SAndroid Build Coastguard Worker		On_bootclasspath_before:   module.commonSdkLibraryProperties.On_bootclasspath_before,
577*333d2b36SAndroid Build Coastguard Worker		Min_device_sdk:            module.commonSdkLibraryProperties.Min_device_sdk,
578*333d2b36SAndroid Build Coastguard Worker		Max_device_sdk:            module.commonSdkLibraryProperties.Max_device_sdk,
579*333d2b36SAndroid Build Coastguard Worker		Sdk_library_min_api_level: &moduleMinApiLevelStr,
580*333d2b36SAndroid Build Coastguard Worker		Uses_libs_dependencies:    module.usesLibraryProperties.Uses_libs.Clone(),
581*333d2b36SAndroid Build Coastguard Worker	}
582*333d2b36SAndroid Build Coastguard Worker
583*333d2b36SAndroid Build Coastguard Worker	mctx.CreateModule(sdkLibraryXmlFactory, &props)
584*333d2b36SAndroid Build Coastguard Worker}
585*333d2b36SAndroid Build Coastguard Worker
586*333d2b36SAndroid Build Coastguard Worker// ---------------------------------------------------------------------------------------------
587*333d2b36SAndroid Build Coastguard Worker// Build rules of the submodules generated by java_sdk_library_import.
588*333d2b36SAndroid Build Coastguard Worker// Note that the java_sdk_library_import module does not generate the implementation library.
589*333d2b36SAndroid Build Coastguard Worker// Instead, it will create a dependency to the source implemenetation library if one exists.
590*333d2b36SAndroid Build Coastguard Worker// java_sdk_library_import "framework-foo" generates the following submodules:
591*333d2b36SAndroid Build Coastguard Worker//
592*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.<[apiScope.name]>" (type: [Import]): prebuilt stub library module that
593*333d2b36SAndroid Build Coastguard Worker//		provides the stub jar file checked in the tree.
594*333d2b36SAndroid Build Coastguard Worker//
595*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.source.<[apiScope.name]>" (type: [PrebuiltStubsSources]): prebuilt
596*333d2b36SAndroid Build Coastguard Worker//		droidstubs module that provides the stub source jar file checked in the tree.
597*333d2b36SAndroid Build Coastguard Worker//
598*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.source.<[apiScope.name]>.api.contribution"
599*333d2b36SAndroid Build Coastguard Worker//		(type [JavaApiContributionImport]): prebuilt java_api_contribution module that provides
600*333d2b36SAndroid Build Coastguard Worker//		the prebuilt api file for previously released from-text stub generation.
601*333d2b36SAndroid Build Coastguard Worker// ---------------------------------------------------------------------------------------------
602*333d2b36SAndroid Build Coastguard Worker
603*333d2b36SAndroid Build Coastguard Worker// Creates the prebuilt stub [Import] with ".stubs.<[apiScope.name]>" suffix.
604*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibraryImport) createJavaImportForStubs(mctx android.DefaultableHookContext, apiScope *apiScope, scopeProperties *sdkLibraryScopeProperties) {
605*333d2b36SAndroid Build Coastguard Worker	// Creates a java import for the jar with ".stubs" suffix
606*333d2b36SAndroid Build Coastguard Worker	props := struct {
607*333d2b36SAndroid Build Coastguard Worker		Name                             *string
608*333d2b36SAndroid Build Coastguard Worker		Source_module_name               *string
609*333d2b36SAndroid Build Coastguard Worker		Created_by_java_sdk_library_name *string
610*333d2b36SAndroid Build Coastguard Worker		Sdk_version                      *string
611*333d2b36SAndroid Build Coastguard Worker		Libs                             []string
612*333d2b36SAndroid Build Coastguard Worker		Jars                             []string
613*333d2b36SAndroid Build Coastguard Worker		Compile_dex                      *bool
614*333d2b36SAndroid Build Coastguard Worker		Is_stubs_module                  *bool
615*333d2b36SAndroid Build Coastguard Worker
616*333d2b36SAndroid Build Coastguard Worker		android.UserSuppliedPrebuiltProperties
617*333d2b36SAndroid Build Coastguard Worker	}{}
618*333d2b36SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr(module.stubsLibraryModuleName(apiScope))
619*333d2b36SAndroid Build Coastguard Worker	props.Source_module_name = proptools.StringPtr(apiScope.stubsLibraryModuleName(module.BaseModuleName()))
620*333d2b36SAndroid Build Coastguard Worker	props.Created_by_java_sdk_library_name = proptools.StringPtr(module.RootLibraryName())
621*333d2b36SAndroid Build Coastguard Worker	props.Sdk_version = scopeProperties.Sdk_version
622*333d2b36SAndroid Build Coastguard Worker	// Prepend any of the libs from the legacy public properties to the libs for each of the
623*333d2b36SAndroid Build Coastguard Worker	// scopes to avoid having to duplicate them in each scope.
624*333d2b36SAndroid Build Coastguard Worker	props.Libs = append(module.properties.Libs, scopeProperties.Libs...)
625*333d2b36SAndroid Build Coastguard Worker	props.Jars = scopeProperties.Jars
626*333d2b36SAndroid Build Coastguard Worker
627*333d2b36SAndroid Build Coastguard Worker	// The imports are preferred if the java_sdk_library_import is preferred.
628*333d2b36SAndroid Build Coastguard Worker	props.CopyUserSuppliedPropertiesFromPrebuilt(&module.prebuilt)
629*333d2b36SAndroid Build Coastguard Worker
630*333d2b36SAndroid Build Coastguard Worker	// The imports need to be compiled to dex if the java_sdk_library_import requests it.
631*333d2b36SAndroid Build Coastguard Worker	compileDex := module.properties.Compile_dex
632*333d2b36SAndroid Build Coastguard Worker	if module.stubLibrariesCompiledForDex() {
633*333d2b36SAndroid Build Coastguard Worker		compileDex = proptools.BoolPtr(true)
634*333d2b36SAndroid Build Coastguard Worker	}
635*333d2b36SAndroid Build Coastguard Worker	props.Compile_dex = compileDex
636*333d2b36SAndroid Build Coastguard Worker	props.Is_stubs_module = proptools.BoolPtr(true)
637*333d2b36SAndroid Build Coastguard Worker
638*333d2b36SAndroid Build Coastguard Worker	mctx.CreateModule(ImportFactory, &props, module.sdkComponentPropertiesForChildLibrary())
639*333d2b36SAndroid Build Coastguard Worker}
640*333d2b36SAndroid Build Coastguard Worker
641*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibraryImport) createPrebuiltStubsSources(mctx android.DefaultableHookContext, apiScope *apiScope, scopeProperties *sdkLibraryScopeProperties) {
642*333d2b36SAndroid Build Coastguard Worker	props := struct {
643*333d2b36SAndroid Build Coastguard Worker		Name                             *string
644*333d2b36SAndroid Build Coastguard Worker		Source_module_name               *string
645*333d2b36SAndroid Build Coastguard Worker		Created_by_java_sdk_library_name *string
646*333d2b36SAndroid Build Coastguard Worker		Srcs                             []string
647*333d2b36SAndroid Build Coastguard Worker
648*333d2b36SAndroid Build Coastguard Worker		android.UserSuppliedPrebuiltProperties
649*333d2b36SAndroid Build Coastguard Worker	}{}
650*333d2b36SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr(module.droidstubsModuleName(apiScope))
651*333d2b36SAndroid Build Coastguard Worker	props.Source_module_name = proptools.StringPtr(apiScope.stubsSourceModuleName(module.BaseModuleName()))
652*333d2b36SAndroid Build Coastguard Worker	props.Created_by_java_sdk_library_name = proptools.StringPtr(module.RootLibraryName())
653*333d2b36SAndroid Build Coastguard Worker	props.Srcs = scopeProperties.Stub_srcs
654*333d2b36SAndroid Build Coastguard Worker
655*333d2b36SAndroid Build Coastguard Worker	// The stubs source is preferred if the java_sdk_library_import is preferred.
656*333d2b36SAndroid Build Coastguard Worker	props.CopyUserSuppliedPropertiesFromPrebuilt(&module.prebuilt)
657*333d2b36SAndroid Build Coastguard Worker
658*333d2b36SAndroid Build Coastguard Worker	mctx.CreateModule(PrebuiltStubsSourcesFactory, &props, module.sdkComponentPropertiesForChildLibrary())
659*333d2b36SAndroid Build Coastguard Worker}
660*333d2b36SAndroid Build Coastguard Worker
661*333d2b36SAndroid Build Coastguard Worker// Creates the prebuilt api contribution [JavaApiContributionImport] with
662*333d2b36SAndroid Build Coastguard Worker// ".stubs.source.<[apiScope.name]>.api.contribution" suffix.
663*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibraryImport) createPrebuiltApiContribution(mctx android.DefaultableHookContext, apiScope *apiScope, scopeProperties *sdkLibraryScopeProperties) {
664*333d2b36SAndroid Build Coastguard Worker	api_file := scopeProperties.Current_api
665*333d2b36SAndroid Build Coastguard Worker	api_surface := &apiScope.name
666*333d2b36SAndroid Build Coastguard Worker
667*333d2b36SAndroid Build Coastguard Worker	props := struct {
668*333d2b36SAndroid Build Coastguard Worker		Name                             *string
669*333d2b36SAndroid Build Coastguard Worker		Source_module_name               *string
670*333d2b36SAndroid Build Coastguard Worker		Created_by_java_sdk_library_name *string
671*333d2b36SAndroid Build Coastguard Worker		Api_surface                      *string
672*333d2b36SAndroid Build Coastguard Worker		Api_file                         *string
673*333d2b36SAndroid Build Coastguard Worker		Visibility                       []string
674*333d2b36SAndroid Build Coastguard Worker	}{}
675*333d2b36SAndroid Build Coastguard Worker
676*333d2b36SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr(module.droidstubsModuleName(apiScope) + ".api.contribution")
677*333d2b36SAndroid Build Coastguard Worker	props.Source_module_name = proptools.StringPtr(apiScope.stubsSourceModuleName(module.BaseModuleName()) + ".api.contribution")
678*333d2b36SAndroid Build Coastguard Worker	props.Created_by_java_sdk_library_name = proptools.StringPtr(module.RootLibraryName())
679*333d2b36SAndroid Build Coastguard Worker	props.Api_surface = api_surface
680*333d2b36SAndroid Build Coastguard Worker	props.Api_file = api_file
681*333d2b36SAndroid Build Coastguard Worker	props.Visibility = []string{"//visibility:override", "//visibility:public"}
682*333d2b36SAndroid Build Coastguard Worker
683*333d2b36SAndroid Build Coastguard Worker	mctx.CreateModule(ApiContributionImportFactory, &props, module.sdkComponentPropertiesForChildLibrary())
684*333d2b36SAndroid Build Coastguard Worker}
685*333d2b36SAndroid Build Coastguard Worker
686*333d2b36SAndroid Build Coastguard Worker// ---------------------------------------------------------------------------------------------
687*333d2b36SAndroid Build Coastguard Worker// End of the build rules of the submodules generated by java_sdk_library_import.
688*333d2b36SAndroid Build Coastguard Worker// ---------------------------------------------------------------------------------------------
689*333d2b36SAndroid Build Coastguard Worker
690*333d2b36SAndroid Build Coastguard Worker// Definition of the [sdkLibraryXml] module. The module generates the permissions xml file,
691*333d2b36SAndroid Build Coastguard Worker// so that the apps can specify the java_sdk_library using <uses-permission> tag in the
692*333d2b36SAndroid Build Coastguard Worker// AndroidManifest.xml file.
693*333d2b36SAndroid Build Coastguard Workertype sdkLibraryXml struct {
694*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
695*333d2b36SAndroid Build Coastguard Worker	android.DefaultableModuleBase
696*333d2b36SAndroid Build Coastguard Worker	android.ApexModuleBase
697*333d2b36SAndroid Build Coastguard Worker
698*333d2b36SAndroid Build Coastguard Worker	properties sdkLibraryXmlProperties
699*333d2b36SAndroid Build Coastguard Worker
700*333d2b36SAndroid Build Coastguard Worker	outputFilePath android.OutputPath
701*333d2b36SAndroid Build Coastguard Worker	installDirPath android.InstallPath
702*333d2b36SAndroid Build Coastguard Worker
703*333d2b36SAndroid Build Coastguard Worker	hideApexVariantFromMake bool
704*333d2b36SAndroid Build Coastguard Worker}
705*333d2b36SAndroid Build Coastguard Worker
706*333d2b36SAndroid Build Coastguard Workertype sdkLibraryXmlProperties struct {
707*333d2b36SAndroid Build Coastguard Worker	// canonical name of the lib
708*333d2b36SAndroid Build Coastguard Worker	Lib_name *string
709*333d2b36SAndroid Build Coastguard Worker
710*333d2b36SAndroid Build Coastguard Worker	// Signals that this shared library is part of the bootclasspath starting
711*333d2b36SAndroid Build Coastguard Worker	// on the version indicated in this attribute.
712*333d2b36SAndroid Build Coastguard Worker	//
713*333d2b36SAndroid Build Coastguard Worker	// This will make platforms at this level and above to ignore
714*333d2b36SAndroid Build Coastguard Worker	// <uses-library> tags with this library name because the library is already
715*333d2b36SAndroid Build Coastguard Worker	// available
716*333d2b36SAndroid Build Coastguard Worker	On_bootclasspath_since *string
717*333d2b36SAndroid Build Coastguard Worker
718*333d2b36SAndroid Build Coastguard Worker	// Signals that this shared library was part of the bootclasspath before
719*333d2b36SAndroid Build Coastguard Worker	// (but not including) the version indicated in this attribute.
720*333d2b36SAndroid Build Coastguard Worker	//
721*333d2b36SAndroid Build Coastguard Worker	// The system will automatically add a <uses-library> tag with this library to
722*333d2b36SAndroid Build Coastguard Worker	// apps that target any SDK less than the version indicated in this attribute.
723*333d2b36SAndroid Build Coastguard Worker	On_bootclasspath_before *string
724*333d2b36SAndroid Build Coastguard Worker
725*333d2b36SAndroid Build Coastguard Worker	// Indicates that PackageManager should ignore this shared library if the
726*333d2b36SAndroid Build Coastguard Worker	// platform is below the version indicated in this attribute.
727*333d2b36SAndroid Build Coastguard Worker	//
728*333d2b36SAndroid Build Coastguard Worker	// This means that the device won't recognise this library as installed.
729*333d2b36SAndroid Build Coastguard Worker	Min_device_sdk *string
730*333d2b36SAndroid Build Coastguard Worker
731*333d2b36SAndroid Build Coastguard Worker	// Indicates that PackageManager should ignore this shared library if the
732*333d2b36SAndroid Build Coastguard Worker	// platform is above the version indicated in this attribute.
733*333d2b36SAndroid Build Coastguard Worker	//
734*333d2b36SAndroid Build Coastguard Worker	// This means that the device won't recognise this library as installed.
735*333d2b36SAndroid Build Coastguard Worker	Max_device_sdk *string
736*333d2b36SAndroid Build Coastguard Worker
737*333d2b36SAndroid Build Coastguard Worker	// The SdkLibrary's min api level as a string
738*333d2b36SAndroid Build Coastguard Worker	//
739*333d2b36SAndroid Build Coastguard Worker	// This value comes from the ApiLevel of the MinSdkVersion property.
740*333d2b36SAndroid Build Coastguard Worker	Sdk_library_min_api_level *string
741*333d2b36SAndroid Build Coastguard Worker
742*333d2b36SAndroid Build Coastguard Worker	// Uses-libs dependencies that the shared library requires to work correctly.
743*333d2b36SAndroid Build Coastguard Worker	//
744*333d2b36SAndroid Build Coastguard Worker	// This will add dependency="foo:bar" to the <library> section.
745*333d2b36SAndroid Build Coastguard Worker	Uses_libs_dependencies proptools.Configurable[[]string]
746*333d2b36SAndroid Build Coastguard Worker}
747*333d2b36SAndroid Build Coastguard Worker
748*333d2b36SAndroid Build Coastguard Worker// java_sdk_library_xml builds the permission xml file for a java_sdk_library.
749*333d2b36SAndroid Build Coastguard Worker// Not to be used directly by users. java_sdk_library internally uses this.
750*333d2b36SAndroid Build Coastguard Workerfunc sdkLibraryXmlFactory() android.Module {
751*333d2b36SAndroid Build Coastguard Worker	module := &sdkLibraryXml{}
752*333d2b36SAndroid Build Coastguard Worker
753*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.properties)
754*333d2b36SAndroid Build Coastguard Worker
755*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(module)
756*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
757*333d2b36SAndroid Build Coastguard Worker
758*333d2b36SAndroid Build Coastguard Worker	return module
759*333d2b36SAndroid Build Coastguard Worker}
760*333d2b36SAndroid Build Coastguard Worker
761*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) UniqueApexVariations() bool {
762*333d2b36SAndroid Build Coastguard Worker	// sdkLibraryXml needs a unique variation per APEX because the generated XML file contains the path to the
763*333d2b36SAndroid Build Coastguard Worker	// mounted APEX, which contains the name of the APEX.
764*333d2b36SAndroid Build Coastguard Worker	return true
765*333d2b36SAndroid Build Coastguard Worker}
766*333d2b36SAndroid Build Coastguard Worker
767*333d2b36SAndroid Build Coastguard Worker// from android.PrebuiltEtcModule
768*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) BaseDir() string {
769*333d2b36SAndroid Build Coastguard Worker	return "etc"
770*333d2b36SAndroid Build Coastguard Worker}
771*333d2b36SAndroid Build Coastguard Worker
772*333d2b36SAndroid Build Coastguard Worker// from android.PrebuiltEtcModule
773*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) SubDir() string {
774*333d2b36SAndroid Build Coastguard Worker	return "permissions"
775*333d2b36SAndroid Build Coastguard Worker}
776*333d2b36SAndroid Build Coastguard Worker
777*333d2b36SAndroid Build Coastguard Workervar _ etc.PrebuiltEtcModule = (*sdkLibraryXml)(nil)
778*333d2b36SAndroid Build Coastguard Worker
779*333d2b36SAndroid Build Coastguard Worker// from android.ApexModule
780*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) AvailableFor(what string) bool {
781*333d2b36SAndroid Build Coastguard Worker	return true
782*333d2b36SAndroid Build Coastguard Worker}
783*333d2b36SAndroid Build Coastguard Worker
784*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) DepsMutator(ctx android.BottomUpMutatorContext) {
785*333d2b36SAndroid Build Coastguard Worker	// do nothing
786*333d2b36SAndroid Build Coastguard Worker}
787*333d2b36SAndroid Build Coastguard Worker
788*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*sdkLibraryXml)(nil)
789*333d2b36SAndroid Build Coastguard Worker
790*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule
791*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
792*333d2b36SAndroid Build Coastguard Worker	sdkVersion android.ApiLevel) error {
793*333d2b36SAndroid Build Coastguard Worker	// sdkLibraryXml doesn't need to be checked separately because java_sdk_library is checked
794*333d2b36SAndroid Build Coastguard Worker	return nil
795*333d2b36SAndroid Build Coastguard Worker}
796*333d2b36SAndroid Build Coastguard Worker
797*333d2b36SAndroid Build Coastguard Worker// File path to the runtime implementation library
798*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) implPath(ctx android.ModuleContext) string {
799*333d2b36SAndroid Build Coastguard Worker	implName := proptools.String(module.properties.Lib_name)
800*333d2b36SAndroid Build Coastguard Worker	if apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider); !apexInfo.IsForPlatform() {
801*333d2b36SAndroid Build Coastguard Worker		// TODO(b/146468504): ApexVariationName() is only a soong module name, not apex name.
802*333d2b36SAndroid Build Coastguard Worker		// In most cases, this works fine. But when apex_name is set or override_apex is used
803*333d2b36SAndroid Build Coastguard Worker		// this can be wrong.
804*333d2b36SAndroid Build Coastguard Worker		return fmt.Sprintf("/apex/%s/javalib/%s.jar", apexInfo.BaseApexName, implName)
805*333d2b36SAndroid Build Coastguard Worker	}
806*333d2b36SAndroid Build Coastguard Worker	partition := "system"
807*333d2b36SAndroid Build Coastguard Worker	if module.SocSpecific() {
808*333d2b36SAndroid Build Coastguard Worker		partition = "vendor"
809*333d2b36SAndroid Build Coastguard Worker	} else if module.DeviceSpecific() {
810*333d2b36SAndroid Build Coastguard Worker		partition = "odm"
811*333d2b36SAndroid Build Coastguard Worker	} else if module.ProductSpecific() {
812*333d2b36SAndroid Build Coastguard Worker		partition = "product"
813*333d2b36SAndroid Build Coastguard Worker	} else if module.SystemExtSpecific() {
814*333d2b36SAndroid Build Coastguard Worker		partition = "system_ext"
815*333d2b36SAndroid Build Coastguard Worker	}
816*333d2b36SAndroid Build Coastguard Worker	return "/" + partition + "/framework/" + implName + ".jar"
817*333d2b36SAndroid Build Coastguard Worker}
818*333d2b36SAndroid Build Coastguard Worker
819*333d2b36SAndroid Build Coastguard Workerfunc formattedOptionalSdkLevelAttribute(ctx android.ModuleContext, attrName string, value *string) string {
820*333d2b36SAndroid Build Coastguard Worker	if value == nil {
821*333d2b36SAndroid Build Coastguard Worker		return ""
822*333d2b36SAndroid Build Coastguard Worker	}
823*333d2b36SAndroid Build Coastguard Worker	apiLevel, err := android.ApiLevelFromUser(ctx, *value)
824*333d2b36SAndroid Build Coastguard Worker	if err != nil {
825*333d2b36SAndroid Build Coastguard Worker		// attributes in bp files have underscores but in the xml have dashes.
826*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf(strings.ReplaceAll(attrName, "-", "_"), err.Error())
827*333d2b36SAndroid Build Coastguard Worker		return ""
828*333d2b36SAndroid Build Coastguard Worker	}
829*333d2b36SAndroid Build Coastguard Worker	if apiLevel.IsCurrent() {
830*333d2b36SAndroid Build Coastguard Worker		// passing "current" would always mean a future release, never the current (or the current in
831*333d2b36SAndroid Build Coastguard Worker		// progress) which means some conditions would never be triggered.
832*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf(strings.ReplaceAll(attrName, "-", "_"),
833*333d2b36SAndroid Build Coastguard Worker			`"current" is not an allowed value for this attribute`)
834*333d2b36SAndroid Build Coastguard Worker		return ""
835*333d2b36SAndroid Build Coastguard Worker	}
836*333d2b36SAndroid Build Coastguard Worker	// "safeValue" is safe because it translates finalized codenames to a string
837*333d2b36SAndroid Build Coastguard Worker	// with their SDK int.
838*333d2b36SAndroid Build Coastguard Worker	safeValue := apiLevel.String()
839*333d2b36SAndroid Build Coastguard Worker	return formattedOptionalAttribute(attrName, &safeValue)
840*333d2b36SAndroid Build Coastguard Worker}
841*333d2b36SAndroid Build Coastguard Worker
842*333d2b36SAndroid Build Coastguard Worker// formats an attribute for the xml permissions file if the value is not null
843*333d2b36SAndroid Build Coastguard Worker// returns empty string otherwise
844*333d2b36SAndroid Build Coastguard Workerfunc formattedOptionalAttribute(attrName string, value *string) string {
845*333d2b36SAndroid Build Coastguard Worker	if value == nil {
846*333d2b36SAndroid Build Coastguard Worker		return ""
847*333d2b36SAndroid Build Coastguard Worker	}
848*333d2b36SAndroid Build Coastguard Worker	return fmt.Sprintf("        %s=\"%s\"\n", attrName, *value)
849*333d2b36SAndroid Build Coastguard Worker}
850*333d2b36SAndroid Build Coastguard Worker
851*333d2b36SAndroid Build Coastguard Workerfunc formattedDependenciesAttribute(dependencies []string) string {
852*333d2b36SAndroid Build Coastguard Worker	if dependencies == nil {
853*333d2b36SAndroid Build Coastguard Worker		return ""
854*333d2b36SAndroid Build Coastguard Worker	}
855*333d2b36SAndroid Build Coastguard Worker	return fmt.Sprintf("        dependency=\"%s\"\n", strings.Join(dependencies, ":"))
856*333d2b36SAndroid Build Coastguard Worker}
857*333d2b36SAndroid Build Coastguard Worker
858*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) permissionsContents(ctx android.ModuleContext) string {
859*333d2b36SAndroid Build Coastguard Worker	libName := proptools.String(module.properties.Lib_name)
860*333d2b36SAndroid Build Coastguard Worker	libNameAttr := formattedOptionalAttribute("name", &libName)
861*333d2b36SAndroid Build Coastguard Worker	filePath := module.implPath(ctx)
862*333d2b36SAndroid Build Coastguard Worker	filePathAttr := formattedOptionalAttribute("file", &filePath)
863*333d2b36SAndroid Build Coastguard Worker	implicitFromAttr := formattedOptionalSdkLevelAttribute(ctx, "on-bootclasspath-since", module.properties.On_bootclasspath_since)
864*333d2b36SAndroid Build Coastguard Worker	implicitUntilAttr := formattedOptionalSdkLevelAttribute(ctx, "on-bootclasspath-before", module.properties.On_bootclasspath_before)
865*333d2b36SAndroid Build Coastguard Worker	minSdkAttr := formattedOptionalSdkLevelAttribute(ctx, "min-device-sdk", module.properties.Min_device_sdk)
866*333d2b36SAndroid Build Coastguard Worker	maxSdkAttr := formattedOptionalSdkLevelAttribute(ctx, "max-device-sdk", module.properties.Max_device_sdk)
867*333d2b36SAndroid Build Coastguard Worker	dependenciesAttr := formattedDependenciesAttribute(module.properties.Uses_libs_dependencies.GetOrDefault(ctx, nil))
868*333d2b36SAndroid Build Coastguard Worker	// <library> is understood in all android versions whereas <apex-library> is only understood from API T (and ignored before that).
869*333d2b36SAndroid Build Coastguard Worker	// similarly, min_device_sdk is only understood from T. So if a library is using that, we need to use the apex-library to make sure this library is not loaded before T
870*333d2b36SAndroid Build Coastguard Worker	var libraryTag string
871*333d2b36SAndroid Build Coastguard Worker	if module.properties.Min_device_sdk != nil {
872*333d2b36SAndroid Build Coastguard Worker		libraryTag = "    <apex-library\n"
873*333d2b36SAndroid Build Coastguard Worker	} else {
874*333d2b36SAndroid Build Coastguard Worker		libraryTag = "    <library\n"
875*333d2b36SAndroid Build Coastguard Worker	}
876*333d2b36SAndroid Build Coastguard Worker
877*333d2b36SAndroid Build Coastguard Worker	return strings.Join([]string{
878*333d2b36SAndroid Build Coastguard Worker		"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n",
879*333d2b36SAndroid Build Coastguard Worker		"<!-- Copyright (C) 2018 The Android Open Source Project\n",
880*333d2b36SAndroid Build Coastguard Worker		"\n",
881*333d2b36SAndroid Build Coastguard Worker		"    Licensed under the Apache License, Version 2.0 (the \"License\");\n",
882*333d2b36SAndroid Build Coastguard Worker		"    you may not use this file except in compliance with the License.\n",
883*333d2b36SAndroid Build Coastguard Worker		"    You may obtain a copy of the License at\n",
884*333d2b36SAndroid Build Coastguard Worker		"\n",
885*333d2b36SAndroid Build Coastguard Worker		"        http://www.apache.org/licenses/LICENSE-2.0\n",
886*333d2b36SAndroid Build Coastguard Worker		"\n",
887*333d2b36SAndroid Build Coastguard Worker		"    Unless required by applicable law or agreed to in writing, software\n",
888*333d2b36SAndroid Build Coastguard Worker		"    distributed under the License is distributed on an \"AS IS\" BASIS,\n",
889*333d2b36SAndroid Build Coastguard Worker		"    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
890*333d2b36SAndroid Build Coastguard Worker		"    See the License for the specific language governing permissions and\n",
891*333d2b36SAndroid Build Coastguard Worker		"    limitations under the License.\n",
892*333d2b36SAndroid Build Coastguard Worker		"-->\n",
893*333d2b36SAndroid Build Coastguard Worker		"<permissions>\n",
894*333d2b36SAndroid Build Coastguard Worker		libraryTag,
895*333d2b36SAndroid Build Coastguard Worker		libNameAttr,
896*333d2b36SAndroid Build Coastguard Worker		filePathAttr,
897*333d2b36SAndroid Build Coastguard Worker		implicitFromAttr,
898*333d2b36SAndroid Build Coastguard Worker		implicitUntilAttr,
899*333d2b36SAndroid Build Coastguard Worker		minSdkAttr,
900*333d2b36SAndroid Build Coastguard Worker		maxSdkAttr,
901*333d2b36SAndroid Build Coastguard Worker		dependenciesAttr,
902*333d2b36SAndroid Build Coastguard Worker		"    />\n",
903*333d2b36SAndroid Build Coastguard Worker		"</permissions>\n",
904*333d2b36SAndroid Build Coastguard Worker	}, "")
905*333d2b36SAndroid Build Coastguard Worker}
906*333d2b36SAndroid Build Coastguard Worker
907*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) GenerateAndroidBuildActions(ctx android.ModuleContext) {
908*333d2b36SAndroid Build Coastguard Worker	apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
909*333d2b36SAndroid Build Coastguard Worker	module.hideApexVariantFromMake = !apexInfo.IsForPlatform()
910*333d2b36SAndroid Build Coastguard Worker
911*333d2b36SAndroid Build Coastguard Worker	libName := proptools.String(module.properties.Lib_name)
912*333d2b36SAndroid Build Coastguard Worker	module.selfValidate(ctx)
913*333d2b36SAndroid Build Coastguard Worker	xmlContent := module.permissionsContents(ctx)
914*333d2b36SAndroid Build Coastguard Worker
915*333d2b36SAndroid Build Coastguard Worker	module.outputFilePath = android.PathForModuleOut(ctx, libName+".xml").OutputPath
916*333d2b36SAndroid Build Coastguard Worker	android.WriteFileRuleVerbatim(ctx, module.outputFilePath, xmlContent)
917*333d2b36SAndroid Build Coastguard Worker
918*333d2b36SAndroid Build Coastguard Worker	module.installDirPath = android.PathForModuleInstall(ctx, "etc", module.SubDir())
919*333d2b36SAndroid Build Coastguard Worker	ctx.PackageFile(module.installDirPath, libName+".xml", module.outputFilePath)
920*333d2b36SAndroid Build Coastguard Worker
921*333d2b36SAndroid Build Coastguard Worker	ctx.SetOutputFiles(android.OutputPaths{module.outputFilePath}.Paths(), "")
922*333d2b36SAndroid Build Coastguard Worker}
923*333d2b36SAndroid Build Coastguard Worker
924*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) AndroidMkEntries() []android.AndroidMkEntries {
925*333d2b36SAndroid Build Coastguard Worker	if module.hideApexVariantFromMake {
926*333d2b36SAndroid Build Coastguard Worker		return []android.AndroidMkEntries{{
927*333d2b36SAndroid Build Coastguard Worker			Disabled: true,
928*333d2b36SAndroid Build Coastguard Worker		}}
929*333d2b36SAndroid Build Coastguard Worker	}
930*333d2b36SAndroid Build Coastguard Worker
931*333d2b36SAndroid Build Coastguard Worker	return []android.AndroidMkEntries{{
932*333d2b36SAndroid Build Coastguard Worker		Class:      "ETC",
933*333d2b36SAndroid Build Coastguard Worker		OutputFile: android.OptionalPathForPath(module.outputFilePath),
934*333d2b36SAndroid Build Coastguard Worker		ExtraEntries: []android.AndroidMkExtraEntriesFunc{
935*333d2b36SAndroid Build Coastguard Worker			func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
936*333d2b36SAndroid Build Coastguard Worker				entries.SetString("LOCAL_MODULE_TAGS", "optional")
937*333d2b36SAndroid Build Coastguard Worker				entries.SetString("LOCAL_MODULE_PATH", module.installDirPath.String())
938*333d2b36SAndroid Build Coastguard Worker				entries.SetString("LOCAL_INSTALLED_MODULE_STEM", module.outputFilePath.Base())
939*333d2b36SAndroid Build Coastguard Worker			},
940*333d2b36SAndroid Build Coastguard Worker		},
941*333d2b36SAndroid Build Coastguard Worker	}}
942*333d2b36SAndroid Build Coastguard Worker}
943*333d2b36SAndroid Build Coastguard Worker
944*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) selfValidate(ctx android.ModuleContext) {
945*333d2b36SAndroid Build Coastguard Worker	module.validateAtLeastTAttributes(ctx)
946*333d2b36SAndroid Build Coastguard Worker	module.validateMinAndMaxDeviceSdk(ctx)
947*333d2b36SAndroid Build Coastguard Worker	module.validateMinMaxDeviceSdkAndModuleMinSdk(ctx)
948*333d2b36SAndroid Build Coastguard Worker	module.validateOnBootclasspathBeforeRequirements(ctx)
949*333d2b36SAndroid Build Coastguard Worker}
950*333d2b36SAndroid Build Coastguard Worker
951*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) validateAtLeastTAttributes(ctx android.ModuleContext) {
952*333d2b36SAndroid Build Coastguard Worker	t := android.ApiLevelOrPanic(ctx, "Tiramisu")
953*333d2b36SAndroid Build Coastguard Worker	module.attrAtLeastT(ctx, t, module.properties.Min_device_sdk, "min_device_sdk")
954*333d2b36SAndroid Build Coastguard Worker	module.attrAtLeastT(ctx, t, module.properties.Max_device_sdk, "max_device_sdk")
955*333d2b36SAndroid Build Coastguard Worker	module.attrAtLeastT(ctx, t, module.properties.On_bootclasspath_before, "on_bootclasspath_before")
956*333d2b36SAndroid Build Coastguard Worker	module.attrAtLeastT(ctx, t, module.properties.On_bootclasspath_since, "on_bootclasspath_since")
957*333d2b36SAndroid Build Coastguard Worker}
958*333d2b36SAndroid Build Coastguard Worker
959*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) attrAtLeastT(ctx android.ModuleContext, t android.ApiLevel, attr *string, attrName string) {
960*333d2b36SAndroid Build Coastguard Worker	if attr != nil {
961*333d2b36SAndroid Build Coastguard Worker		if level, err := android.ApiLevelFromUser(ctx, *attr); err == nil {
962*333d2b36SAndroid Build Coastguard Worker			// we will inform the user of invalid inputs when we try to write the
963*333d2b36SAndroid Build Coastguard Worker			// permissions xml file so we don't need to do it here
964*333d2b36SAndroid Build Coastguard Worker			if t.GreaterThan(level) {
965*333d2b36SAndroid Build Coastguard Worker				ctx.PropertyErrorf(attrName, "Attribute value needs to be at least T")
966*333d2b36SAndroid Build Coastguard Worker			}
967*333d2b36SAndroid Build Coastguard Worker		}
968*333d2b36SAndroid Build Coastguard Worker	}
969*333d2b36SAndroid Build Coastguard Worker}
970*333d2b36SAndroid Build Coastguard Worker
971*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) validateMinAndMaxDeviceSdk(ctx android.ModuleContext) {
972*333d2b36SAndroid Build Coastguard Worker	if module.properties.Min_device_sdk != nil && module.properties.Max_device_sdk != nil {
973*333d2b36SAndroid Build Coastguard Worker		min, minErr := android.ApiLevelFromUser(ctx, *module.properties.Min_device_sdk)
974*333d2b36SAndroid Build Coastguard Worker		max, maxErr := android.ApiLevelFromUser(ctx, *module.properties.Max_device_sdk)
975*333d2b36SAndroid Build Coastguard Worker		if minErr == nil && maxErr == nil {
976*333d2b36SAndroid Build Coastguard Worker			// we will inform the user of invalid inputs when we try to write the
977*333d2b36SAndroid Build Coastguard Worker			// permissions xml file so we don't need to do it here
978*333d2b36SAndroid Build Coastguard Worker			if min.GreaterThan(max) {
979*333d2b36SAndroid Build Coastguard Worker				ctx.ModuleErrorf("min_device_sdk can't be greater than max_device_sdk")
980*333d2b36SAndroid Build Coastguard Worker			}
981*333d2b36SAndroid Build Coastguard Worker		}
982*333d2b36SAndroid Build Coastguard Worker	}
983*333d2b36SAndroid Build Coastguard Worker}
984*333d2b36SAndroid Build Coastguard Worker
985*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) validateMinMaxDeviceSdkAndModuleMinSdk(ctx android.ModuleContext) {
986*333d2b36SAndroid Build Coastguard Worker	moduleMinApi := android.ApiLevelOrPanic(ctx, *module.properties.Sdk_library_min_api_level)
987*333d2b36SAndroid Build Coastguard Worker	if module.properties.Min_device_sdk != nil {
988*333d2b36SAndroid Build Coastguard Worker		api, err := android.ApiLevelFromUser(ctx, *module.properties.Min_device_sdk)
989*333d2b36SAndroid Build Coastguard Worker		if err == nil {
990*333d2b36SAndroid Build Coastguard Worker			if moduleMinApi.GreaterThan(api) {
991*333d2b36SAndroid Build Coastguard Worker				ctx.PropertyErrorf("min_device_sdk", "Can't be less than module's min sdk (%s)", moduleMinApi)
992*333d2b36SAndroid Build Coastguard Worker			}
993*333d2b36SAndroid Build Coastguard Worker		}
994*333d2b36SAndroid Build Coastguard Worker	}
995*333d2b36SAndroid Build Coastguard Worker	if module.properties.Max_device_sdk != nil {
996*333d2b36SAndroid Build Coastguard Worker		api, err := android.ApiLevelFromUser(ctx, *module.properties.Max_device_sdk)
997*333d2b36SAndroid Build Coastguard Worker		if err == nil {
998*333d2b36SAndroid Build Coastguard Worker			if moduleMinApi.GreaterThan(api) {
999*333d2b36SAndroid Build Coastguard Worker				ctx.PropertyErrorf("max_device_sdk", "Can't be less than module's min sdk (%s)", moduleMinApi)
1000*333d2b36SAndroid Build Coastguard Worker			}
1001*333d2b36SAndroid Build Coastguard Worker		}
1002*333d2b36SAndroid Build Coastguard Worker	}
1003*333d2b36SAndroid Build Coastguard Worker}
1004*333d2b36SAndroid Build Coastguard Worker
1005*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) validateOnBootclasspathBeforeRequirements(ctx android.ModuleContext) {
1006*333d2b36SAndroid Build Coastguard Worker	moduleMinApi := android.ApiLevelOrPanic(ctx, *module.properties.Sdk_library_min_api_level)
1007*333d2b36SAndroid Build Coastguard Worker	if module.properties.On_bootclasspath_before != nil {
1008*333d2b36SAndroid Build Coastguard Worker		t := android.ApiLevelOrPanic(ctx, "Tiramisu")
1009*333d2b36SAndroid Build Coastguard Worker		// if we use the attribute, then we need to do this validation
1010*333d2b36SAndroid Build Coastguard Worker		if moduleMinApi.LessThan(t) {
1011*333d2b36SAndroid Build Coastguard Worker			// if minAPi is < T, then we need to have min_device_sdk (which only accepts T+)
1012*333d2b36SAndroid Build Coastguard Worker			if module.properties.Min_device_sdk == nil {
1013*333d2b36SAndroid Build Coastguard Worker				ctx.PropertyErrorf("on_bootclasspath_before", "Using this property requires that the module's min_sdk_version or the shared library's min_device_sdk is at least T")
1014*333d2b36SAndroid Build Coastguard Worker			}
1015*333d2b36SAndroid Build Coastguard Worker		}
1016*333d2b36SAndroid Build Coastguard Worker	}
1017*333d2b36SAndroid Build Coastguard Worker}
1018