xref: /aosp_15_r20/frameworks/base/api/api.go (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker// Copyright (C) 2021 The Android Open Source Project
2*d57664e9SAndroid Build Coastguard Worker//
3*d57664e9SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*d57664e9SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*d57664e9SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*d57664e9SAndroid Build Coastguard Worker//
7*d57664e9SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*d57664e9SAndroid Build Coastguard Worker//
9*d57664e9SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*d57664e9SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*d57664e9SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*d57664e9SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*d57664e9SAndroid Build Coastguard Worker// limitations under the License.
14*d57664e9SAndroid Build Coastguard Worker
15*d57664e9SAndroid Build Coastguard Workerpackage api
16*d57664e9SAndroid Build Coastguard Worker
17*d57664e9SAndroid Build Coastguard Workerimport (
18*d57664e9SAndroid Build Coastguard Worker	"slices"
19*d57664e9SAndroid Build Coastguard Worker
20*d57664e9SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
21*d57664e9SAndroid Build Coastguard Worker
22*d57664e9SAndroid Build Coastguard Worker	"android/soong/android"
23*d57664e9SAndroid Build Coastguard Worker	"android/soong/java"
24*d57664e9SAndroid Build Coastguard Worker)
25*d57664e9SAndroid Build Coastguard Worker
26*d57664e9SAndroid Build Coastguard Workerconst art = "art.module.public.api"
27*d57664e9SAndroid Build Coastguard Workerconst conscrypt = "conscrypt.module.public.api"
28*d57664e9SAndroid Build Coastguard Workerconst i18n = "i18n.module.public.api"
29*d57664e9SAndroid Build Coastguard Workerconst virtualization = "framework-virtualization"
30*d57664e9SAndroid Build Coastguard Workerconst location = "framework-location"
31*d57664e9SAndroid Build Coastguard Workerconst platformCrashrecovery = "framework-platformcrashrecovery"
32*d57664e9SAndroid Build Coastguard Workerconst ondeviceintelligence = "framework-ondeviceintelligence-platform"
33*d57664e9SAndroid Build Coastguard Worker
34*d57664e9SAndroid Build Coastguard Workervar core_libraries_modules = []string{art, conscrypt, i18n}
35*d57664e9SAndroid Build Coastguard Worker
36*d57664e9SAndroid Build Coastguard Worker// List of modules that are not yet updatable, and hence they can still compile
37*d57664e9SAndroid Build Coastguard Worker// against hidden APIs. These modules are filtered out when building the
38*d57664e9SAndroid Build Coastguard Worker// updatable-framework-module-impl (because updatable-framework-module-impl is
39*d57664e9SAndroid Build Coastguard Worker// built against module_current SDK). Instead they are directly statically
40*d57664e9SAndroid Build Coastguard Worker// linked into the all-framework-module-lib, which is building against hidden
41*d57664e9SAndroid Build Coastguard Worker// APIs.
42*d57664e9SAndroid Build Coastguard Worker// In addition, the modules in this list are allowed to contribute to test APIs
43*d57664e9SAndroid Build Coastguard Worker// stubs.
44*d57664e9SAndroid Build Coastguard Workervar non_updatable_modules = []string{virtualization, location, platformCrashrecovery, ondeviceintelligence}
45*d57664e9SAndroid Build Coastguard Worker
46*d57664e9SAndroid Build Coastguard Worker// The intention behind this soong plugin is to generate a number of "merged"
47*d57664e9SAndroid Build Coastguard Worker// API-related modules that would otherwise require a large amount of very
48*d57664e9SAndroid Build Coastguard Worker// similar Android.bp boilerplate to define. For example, the merged current.txt
49*d57664e9SAndroid Build Coastguard Worker// API definitions (created by merging the non-updatable current.txt with all
50*d57664e9SAndroid Build Coastguard Worker// the module current.txts). This simplifies the addition of new android
51*d57664e9SAndroid Build Coastguard Worker// modules, by reducing the number of genrules etc a new module must be added to.
52*d57664e9SAndroid Build Coastguard Worker
53*d57664e9SAndroid Build Coastguard Worker// The properties of the combined_apis module type.
54*d57664e9SAndroid Build Coastguard Workertype CombinedApisProperties struct {
55*d57664e9SAndroid Build Coastguard Worker	// Module libraries in the bootclasspath
56*d57664e9SAndroid Build Coastguard Worker	Bootclasspath proptools.Configurable[[]string]
57*d57664e9SAndroid Build Coastguard Worker	// Module libraries on the bootclasspath if include_nonpublic_framework_api is true.
58*d57664e9SAndroid Build Coastguard Worker	Conditional_bootclasspath []string
59*d57664e9SAndroid Build Coastguard Worker	// Module libraries in system server
60*d57664e9SAndroid Build Coastguard Worker	System_server_classpath proptools.Configurable[[]string]
61*d57664e9SAndroid Build Coastguard Worker}
62*d57664e9SAndroid Build Coastguard Worker
63*d57664e9SAndroid Build Coastguard Workertype CombinedApis struct {
64*d57664e9SAndroid Build Coastguard Worker	android.ModuleBase
65*d57664e9SAndroid Build Coastguard Worker
66*d57664e9SAndroid Build Coastguard Worker	properties CombinedApisProperties
67*d57664e9SAndroid Build Coastguard Worker}
68*d57664e9SAndroid Build Coastguard Worker
69*d57664e9SAndroid Build Coastguard Workerfunc init() {
70*d57664e9SAndroid Build Coastguard Worker	registerBuildComponents(android.InitRegistrationContext)
71*d57664e9SAndroid Build Coastguard Worker}
72*d57664e9SAndroid Build Coastguard Worker
73*d57664e9SAndroid Build Coastguard Workerfunc registerBuildComponents(ctx android.RegistrationContext) {
74*d57664e9SAndroid Build Coastguard Worker	ctx.RegisterModuleType("combined_apis", combinedApisModuleFactory)
75*d57664e9SAndroid Build Coastguard Worker}
76*d57664e9SAndroid Build Coastguard Worker
77*d57664e9SAndroid Build Coastguard Workervar PrepareForCombinedApisTest = android.FixtureRegisterWithContext(registerBuildComponents)
78*d57664e9SAndroid Build Coastguard Worker
79*d57664e9SAndroid Build Coastguard Workerfunc (a *CombinedApis) apiFingerprintStubDeps(ctx android.BottomUpMutatorContext) []string {
80*d57664e9SAndroid Build Coastguard Worker	bootClasspath := a.properties.Bootclasspath.GetOrDefault(ctx, nil)
81*d57664e9SAndroid Build Coastguard Worker	systemServerClasspath := a.properties.System_server_classpath.GetOrDefault(ctx, nil)
82*d57664e9SAndroid Build Coastguard Worker	var ret []string
83*d57664e9SAndroid Build Coastguard Worker	ret = append(
84*d57664e9SAndroid Build Coastguard Worker		ret,
85*d57664e9SAndroid Build Coastguard Worker		transformArray(bootClasspath, "", ".stubs")...,
86*d57664e9SAndroid Build Coastguard Worker	)
87*d57664e9SAndroid Build Coastguard Worker	ret = append(
88*d57664e9SAndroid Build Coastguard Worker		ret,
89*d57664e9SAndroid Build Coastguard Worker		transformArray(bootClasspath, "", ".stubs.system")...,
90*d57664e9SAndroid Build Coastguard Worker	)
91*d57664e9SAndroid Build Coastguard Worker	ret = append(
92*d57664e9SAndroid Build Coastguard Worker		ret,
93*d57664e9SAndroid Build Coastguard Worker		transformArray(bootClasspath, "", ".stubs.module_lib")...,
94*d57664e9SAndroid Build Coastguard Worker	)
95*d57664e9SAndroid Build Coastguard Worker	ret = append(
96*d57664e9SAndroid Build Coastguard Worker		ret,
97*d57664e9SAndroid Build Coastguard Worker		transformArray(systemServerClasspath, "", ".stubs.system_server")...,
98*d57664e9SAndroid Build Coastguard Worker	)
99*d57664e9SAndroid Build Coastguard Worker	return ret
100*d57664e9SAndroid Build Coastguard Worker}
101*d57664e9SAndroid Build Coastguard Worker
102*d57664e9SAndroid Build Coastguard Workerfunc (a *CombinedApis) DepsMutator(ctx android.BottomUpMutatorContext) {
103*d57664e9SAndroid Build Coastguard Worker	ctx.AddDependency(ctx.Module(), nil, a.apiFingerprintStubDeps(ctx)...)
104*d57664e9SAndroid Build Coastguard Worker}
105*d57664e9SAndroid Build Coastguard Worker
106*d57664e9SAndroid Build Coastguard Workerfunc (a *CombinedApis) GenerateAndroidBuildActions(ctx android.ModuleContext) {
107*d57664e9SAndroid Build Coastguard Worker	ctx.WalkDeps(func(child, parent android.Module) bool {
108*d57664e9SAndroid Build Coastguard Worker		if _, ok := child.(java.AndroidLibraryDependency); ok && child.Name() != "framework-res" {
109*d57664e9SAndroid Build Coastguard Worker			// Stubs of BCP and SSCP libraries should not have any dependencies on apps
110*d57664e9SAndroid Build Coastguard Worker			// This check ensures that we do not run into circular dependencies when UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT=true
111*d57664e9SAndroid Build Coastguard Worker			ctx.ModuleErrorf(
112*d57664e9SAndroid Build Coastguard Worker				"Module %s is not a valid dependency of the stub library %s\n."+
113*d57664e9SAndroid Build Coastguard Worker					"If this dependency has been added via `libs` of java_sdk_library, please move it to `impl_only_libs`\n",
114*d57664e9SAndroid Build Coastguard Worker				child.Name(), parent.Name())
115*d57664e9SAndroid Build Coastguard Worker			return false // error detected
116*d57664e9SAndroid Build Coastguard Worker		}
117*d57664e9SAndroid Build Coastguard Worker		return true
118*d57664e9SAndroid Build Coastguard Worker	})
119*d57664e9SAndroid Build Coastguard Worker
120*d57664e9SAndroid Build Coastguard Worker}
121*d57664e9SAndroid Build Coastguard Worker
122*d57664e9SAndroid Build Coastguard Workertype genruleProps struct {
123*d57664e9SAndroid Build Coastguard Worker	Name       *string
124*d57664e9SAndroid Build Coastguard Worker	Cmd        *string
125*d57664e9SAndroid Build Coastguard Worker	Dists      []android.Dist
126*d57664e9SAndroid Build Coastguard Worker	Out        []string
127*d57664e9SAndroid Build Coastguard Worker	Srcs       proptools.Configurable[[]string]
128*d57664e9SAndroid Build Coastguard Worker	Tools      []string
129*d57664e9SAndroid Build Coastguard Worker	Visibility []string
130*d57664e9SAndroid Build Coastguard Worker}
131*d57664e9SAndroid Build Coastguard Worker
132*d57664e9SAndroid Build Coastguard Workertype libraryProps struct {
133*d57664e9SAndroid Build Coastguard Worker	Name            *string
134*d57664e9SAndroid Build Coastguard Worker	Sdk_version     *string
135*d57664e9SAndroid Build Coastguard Worker	Static_libs     proptools.Configurable[[]string]
136*d57664e9SAndroid Build Coastguard Worker	Visibility      []string
137*d57664e9SAndroid Build Coastguard Worker	Defaults        []string
138*d57664e9SAndroid Build Coastguard Worker	Is_stubs_module *bool
139*d57664e9SAndroid Build Coastguard Worker}
140*d57664e9SAndroid Build Coastguard Worker
141*d57664e9SAndroid Build Coastguard Workertype fgProps struct {
142*d57664e9SAndroid Build Coastguard Worker	Name               *string
143*d57664e9SAndroid Build Coastguard Worker	Srcs               proptools.Configurable[[]string]
144*d57664e9SAndroid Build Coastguard Worker	Device_common_srcs proptools.Configurable[[]string]
145*d57664e9SAndroid Build Coastguard Worker	Visibility         []string
146*d57664e9SAndroid Build Coastguard Worker}
147*d57664e9SAndroid Build Coastguard Worker
148*d57664e9SAndroid Build Coastguard Workertype defaultsProps struct {
149*d57664e9SAndroid Build Coastguard Worker	Name                *string
150*d57664e9SAndroid Build Coastguard Worker	Api_surface         *string
151*d57664e9SAndroid Build Coastguard Worker	Api_contributions   []string
152*d57664e9SAndroid Build Coastguard Worker	Defaults_visibility []string
153*d57664e9SAndroid Build Coastguard Worker	Previous_api        *string
154*d57664e9SAndroid Build Coastguard Worker}
155*d57664e9SAndroid Build Coastguard Worker
156*d57664e9SAndroid Build Coastguard Worker// Struct to pass parameters for the various merged [current|removed].txt file modules we create.
157*d57664e9SAndroid Build Coastguard Workertype MergedTxtDefinition struct {
158*d57664e9SAndroid Build Coastguard Worker	// "current.txt" or "removed.txt"
159*d57664e9SAndroid Build Coastguard Worker	TxtFilename string
160*d57664e9SAndroid Build Coastguard Worker	// Filename in the new dist dir. "android.txt" or "android-removed.txt"
161*d57664e9SAndroid Build Coastguard Worker	DistFilename string
162*d57664e9SAndroid Build Coastguard Worker	// The module for the non-updatable / non-module part of the api.
163*d57664e9SAndroid Build Coastguard Worker	BaseTxt string
164*d57664e9SAndroid Build Coastguard Worker	// The list of modules that are relevant for this merged txt.
165*d57664e9SAndroid Build Coastguard Worker	Modules proptools.Configurable[[]string]
166*d57664e9SAndroid Build Coastguard Worker	// The output tag for each module to use.e.g. {.public.api.txt} for current.txt
167*d57664e9SAndroid Build Coastguard Worker	ModuleTag string
168*d57664e9SAndroid Build Coastguard Worker	// public, system, module-lib or system-server
169*d57664e9SAndroid Build Coastguard Worker	Scope string
170*d57664e9SAndroid Build Coastguard Worker}
171*d57664e9SAndroid Build Coastguard Worker
172*d57664e9SAndroid Build Coastguard Workerfunc createMergedTxt(ctx android.LoadHookContext, txt MergedTxtDefinition, stubsTypeSuffix string, doDist bool) {
173*d57664e9SAndroid Build Coastguard Worker	metalavaCmd := "$(location metalava)"
174*d57664e9SAndroid Build Coastguard Worker	// Silence reflection warnings. See b/168689341
175*d57664e9SAndroid Build Coastguard Worker	metalavaCmd += " -J--add-opens=java.base/java.util=ALL-UNNAMED "
176*d57664e9SAndroid Build Coastguard Worker	metalavaCmd += " --quiet merge-signatures --format=v2 "
177*d57664e9SAndroid Build Coastguard Worker
178*d57664e9SAndroid Build Coastguard Worker	filename := txt.TxtFilename
179*d57664e9SAndroid Build Coastguard Worker	if txt.Scope != "public" {
180*d57664e9SAndroid Build Coastguard Worker		filename = txt.Scope + "-" + filename
181*d57664e9SAndroid Build Coastguard Worker	}
182*d57664e9SAndroid Build Coastguard Worker	moduleName := ctx.ModuleName() + stubsTypeSuffix + filename
183*d57664e9SAndroid Build Coastguard Worker
184*d57664e9SAndroid Build Coastguard Worker	props := genruleProps{}
185*d57664e9SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr(moduleName)
186*d57664e9SAndroid Build Coastguard Worker	props.Tools = []string{"metalava"}
187*d57664e9SAndroid Build Coastguard Worker	props.Out = []string{filename}
188*d57664e9SAndroid Build Coastguard Worker	props.Cmd = proptools.StringPtr(metalavaCmd + "$(in) --out $(out)")
189*d57664e9SAndroid Build Coastguard Worker	props.Srcs = proptools.NewSimpleConfigurable([]string{txt.BaseTxt})
190*d57664e9SAndroid Build Coastguard Worker	props.Srcs.Append(createSrcs(txt.Modules, txt.ModuleTag))
191*d57664e9SAndroid Build Coastguard Worker	if doDist {
192*d57664e9SAndroid Build Coastguard Worker		props.Dists = []android.Dist{
193*d57664e9SAndroid Build Coastguard Worker			{
194*d57664e9SAndroid Build Coastguard Worker				Targets: []string{"droidcore"},
195*d57664e9SAndroid Build Coastguard Worker				Dir:     proptools.StringPtr("api"),
196*d57664e9SAndroid Build Coastguard Worker				Dest:    proptools.StringPtr(filename),
197*d57664e9SAndroid Build Coastguard Worker			},
198*d57664e9SAndroid Build Coastguard Worker			{
199*d57664e9SAndroid Build Coastguard Worker				Targets: []string{"api_txt", "sdk"},
200*d57664e9SAndroid Build Coastguard Worker				Dir:     proptools.StringPtr("apistubs/android/" + txt.Scope + "/api"),
201*d57664e9SAndroid Build Coastguard Worker				Dest:    proptools.StringPtr(txt.DistFilename),
202*d57664e9SAndroid Build Coastguard Worker			},
203*d57664e9SAndroid Build Coastguard Worker		}
204*d57664e9SAndroid Build Coastguard Worker	}
205*d57664e9SAndroid Build Coastguard Worker	props.Visibility = []string{"//visibility:public"}
206*d57664e9SAndroid Build Coastguard Worker	ctx.CreateModule(java.GenRuleFactory, &props)
207*d57664e9SAndroid Build Coastguard Worker}
208*d57664e9SAndroid Build Coastguard Worker
209*d57664e9SAndroid Build Coastguard Workerfunc createMergedAnnotationsFilegroups(ctx android.LoadHookContext, modules, system_server_modules proptools.Configurable[[]string]) {
210*d57664e9SAndroid Build Coastguard Worker	for _, i := range []struct {
211*d57664e9SAndroid Build Coastguard Worker		name    string
212*d57664e9SAndroid Build Coastguard Worker		tag     string
213*d57664e9SAndroid Build Coastguard Worker		modules proptools.Configurable[[]string]
214*d57664e9SAndroid Build Coastguard Worker	}{
215*d57664e9SAndroid Build Coastguard Worker		{
216*d57664e9SAndroid Build Coastguard Worker			name:    "all-modules-public-annotations",
217*d57664e9SAndroid Build Coastguard Worker			tag:     "{.public.annotations.zip}",
218*d57664e9SAndroid Build Coastguard Worker			modules: modules,
219*d57664e9SAndroid Build Coastguard Worker		}, {
220*d57664e9SAndroid Build Coastguard Worker			name:    "all-modules-system-annotations",
221*d57664e9SAndroid Build Coastguard Worker			tag:     "{.system.annotations.zip}",
222*d57664e9SAndroid Build Coastguard Worker			modules: modules,
223*d57664e9SAndroid Build Coastguard Worker		}, {
224*d57664e9SAndroid Build Coastguard Worker			name:    "all-modules-module-lib-annotations",
225*d57664e9SAndroid Build Coastguard Worker			tag:     "{.module-lib.annotations.zip}",
226*d57664e9SAndroid Build Coastguard Worker			modules: modules,
227*d57664e9SAndroid Build Coastguard Worker		}, {
228*d57664e9SAndroid Build Coastguard Worker			name:    "all-modules-system-server-annotations",
229*d57664e9SAndroid Build Coastguard Worker			tag:     "{.system-server.annotations.zip}",
230*d57664e9SAndroid Build Coastguard Worker			modules: system_server_modules,
231*d57664e9SAndroid Build Coastguard Worker		},
232*d57664e9SAndroid Build Coastguard Worker	} {
233*d57664e9SAndroid Build Coastguard Worker		props := fgProps{}
234*d57664e9SAndroid Build Coastguard Worker		props.Name = proptools.StringPtr(i.name)
235*d57664e9SAndroid Build Coastguard Worker		props.Device_common_srcs = createSrcs(i.modules, i.tag)
236*d57664e9SAndroid Build Coastguard Worker		ctx.CreateModule(android.FileGroupFactory, &props)
237*d57664e9SAndroid Build Coastguard Worker	}
238*d57664e9SAndroid Build Coastguard Worker}
239*d57664e9SAndroid Build Coastguard Worker
240*d57664e9SAndroid Build Coastguard Workerfunc createMergedPublicStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) {
241*d57664e9SAndroid Build Coastguard Worker	modules = modules.Clone()
242*d57664e9SAndroid Build Coastguard Worker	transformConfigurableArray(modules, "", ".stubs")
243*d57664e9SAndroid Build Coastguard Worker	props := libraryProps{}
244*d57664e9SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr("all-modules-public-stubs")
245*d57664e9SAndroid Build Coastguard Worker	props.Static_libs = modules
246*d57664e9SAndroid Build Coastguard Worker	props.Sdk_version = proptools.StringPtr("module_current")
247*d57664e9SAndroid Build Coastguard Worker	props.Visibility = []string{"//frameworks/base"}
248*d57664e9SAndroid Build Coastguard Worker	props.Is_stubs_module = proptools.BoolPtr(true)
249*d57664e9SAndroid Build Coastguard Worker	ctx.CreateModule(java.LibraryFactory, &props)
250*d57664e9SAndroid Build Coastguard Worker}
251*d57664e9SAndroid Build Coastguard Worker
252*d57664e9SAndroid Build Coastguard Workerfunc createMergedPublicExportableStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) {
253*d57664e9SAndroid Build Coastguard Worker	modules = modules.Clone()
254*d57664e9SAndroid Build Coastguard Worker	transformConfigurableArray(modules, "", ".stubs.exportable")
255*d57664e9SAndroid Build Coastguard Worker	props := libraryProps{}
256*d57664e9SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr("all-modules-public-stubs-exportable")
257*d57664e9SAndroid Build Coastguard Worker	props.Static_libs = modules
258*d57664e9SAndroid Build Coastguard Worker	props.Sdk_version = proptools.StringPtr("module_current")
259*d57664e9SAndroid Build Coastguard Worker	props.Visibility = []string{"//frameworks/base"}
260*d57664e9SAndroid Build Coastguard Worker	props.Is_stubs_module = proptools.BoolPtr(true)
261*d57664e9SAndroid Build Coastguard Worker	ctx.CreateModule(java.LibraryFactory, &props)
262*d57664e9SAndroid Build Coastguard Worker}
263*d57664e9SAndroid Build Coastguard Worker
264*d57664e9SAndroid Build Coastguard Workerfunc createMergedSystemStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) {
265*d57664e9SAndroid Build Coastguard Worker	// First create the all-updatable-modules-system-stubs
266*d57664e9SAndroid Build Coastguard Worker	{
267*d57664e9SAndroid Build Coastguard Worker		updatable_modules := modules.Clone()
268*d57664e9SAndroid Build Coastguard Worker		removeAll(updatable_modules, non_updatable_modules)
269*d57664e9SAndroid Build Coastguard Worker		transformConfigurableArray(updatable_modules, "", ".stubs.system")
270*d57664e9SAndroid Build Coastguard Worker		props := libraryProps{}
271*d57664e9SAndroid Build Coastguard Worker		props.Name = proptools.StringPtr("all-updatable-modules-system-stubs")
272*d57664e9SAndroid Build Coastguard Worker		props.Static_libs = updatable_modules
273*d57664e9SAndroid Build Coastguard Worker		props.Sdk_version = proptools.StringPtr("module_current")
274*d57664e9SAndroid Build Coastguard Worker		props.Visibility = []string{"//frameworks/base"}
275*d57664e9SAndroid Build Coastguard Worker		props.Is_stubs_module = proptools.BoolPtr(true)
276*d57664e9SAndroid Build Coastguard Worker		ctx.CreateModule(java.LibraryFactory, &props)
277*d57664e9SAndroid Build Coastguard Worker	}
278*d57664e9SAndroid Build Coastguard Worker	// Now merge all-updatable-modules-system-stubs and stubs from non-updatable modules
279*d57664e9SAndroid Build Coastguard Worker	// into all-modules-system-stubs.
280*d57664e9SAndroid Build Coastguard Worker	{
281*d57664e9SAndroid Build Coastguard Worker		static_libs := transformArray(non_updatable_modules, "", ".stubs.system")
282*d57664e9SAndroid Build Coastguard Worker		static_libs = append(static_libs, "all-updatable-modules-system-stubs")
283*d57664e9SAndroid Build Coastguard Worker		props := libraryProps{}
284*d57664e9SAndroid Build Coastguard Worker		props.Name = proptools.StringPtr("all-modules-system-stubs")
285*d57664e9SAndroid Build Coastguard Worker		props.Static_libs = proptools.NewSimpleConfigurable(static_libs)
286*d57664e9SAndroid Build Coastguard Worker		props.Sdk_version = proptools.StringPtr("module_current")
287*d57664e9SAndroid Build Coastguard Worker		props.Visibility = []string{"//frameworks/base"}
288*d57664e9SAndroid Build Coastguard Worker		props.Is_stubs_module = proptools.BoolPtr(true)
289*d57664e9SAndroid Build Coastguard Worker		ctx.CreateModule(java.LibraryFactory, &props)
290*d57664e9SAndroid Build Coastguard Worker	}
291*d57664e9SAndroid Build Coastguard Worker}
292*d57664e9SAndroid Build Coastguard Worker
293*d57664e9SAndroid Build Coastguard Workerfunc createMergedSystemExportableStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) {
294*d57664e9SAndroid Build Coastguard Worker	// First create the all-updatable-modules-system-stubs
295*d57664e9SAndroid Build Coastguard Worker	{
296*d57664e9SAndroid Build Coastguard Worker		updatable_modules := modules.Clone()
297*d57664e9SAndroid Build Coastguard Worker		removeAll(updatable_modules, non_updatable_modules)
298*d57664e9SAndroid Build Coastguard Worker		transformConfigurableArray(updatable_modules, "", ".stubs.exportable.system")
299*d57664e9SAndroid Build Coastguard Worker		props := libraryProps{}
300*d57664e9SAndroid Build Coastguard Worker		props.Name = proptools.StringPtr("all-updatable-modules-system-stubs-exportable")
301*d57664e9SAndroid Build Coastguard Worker		props.Static_libs = updatable_modules
302*d57664e9SAndroid Build Coastguard Worker		props.Sdk_version = proptools.StringPtr("module_current")
303*d57664e9SAndroid Build Coastguard Worker		props.Visibility = []string{"//frameworks/base"}
304*d57664e9SAndroid Build Coastguard Worker		props.Is_stubs_module = proptools.BoolPtr(true)
305*d57664e9SAndroid Build Coastguard Worker		ctx.CreateModule(java.LibraryFactory, &props)
306*d57664e9SAndroid Build Coastguard Worker	}
307*d57664e9SAndroid Build Coastguard Worker	// Now merge all-updatable-modules-system-stubs and stubs from non-updatable modules
308*d57664e9SAndroid Build Coastguard Worker	// into all-modules-system-stubs.
309*d57664e9SAndroid Build Coastguard Worker	{
310*d57664e9SAndroid Build Coastguard Worker		static_libs := transformArray(non_updatable_modules, "", ".stubs.exportable.system")
311*d57664e9SAndroid Build Coastguard Worker		static_libs = append(static_libs, "all-updatable-modules-system-stubs-exportable")
312*d57664e9SAndroid Build Coastguard Worker		props := libraryProps{}
313*d57664e9SAndroid Build Coastguard Worker		props.Name = proptools.StringPtr("all-modules-system-stubs-exportable")
314*d57664e9SAndroid Build Coastguard Worker		props.Static_libs = proptools.NewSimpleConfigurable(static_libs)
315*d57664e9SAndroid Build Coastguard Worker		props.Sdk_version = proptools.StringPtr("module_current")
316*d57664e9SAndroid Build Coastguard Worker		props.Visibility = []string{"//frameworks/base"}
317*d57664e9SAndroid Build Coastguard Worker		props.Is_stubs_module = proptools.BoolPtr(true)
318*d57664e9SAndroid Build Coastguard Worker		ctx.CreateModule(java.LibraryFactory, &props)
319*d57664e9SAndroid Build Coastguard Worker	}
320*d57664e9SAndroid Build Coastguard Worker}
321*d57664e9SAndroid Build Coastguard Worker
322*d57664e9SAndroid Build Coastguard Workerfunc createMergedTestStubsForNonUpdatableModules(ctx android.LoadHookContext) {
323*d57664e9SAndroid Build Coastguard Worker	props := libraryProps{}
324*d57664e9SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr("all-non-updatable-modules-test-stubs")
325*d57664e9SAndroid Build Coastguard Worker	props.Static_libs = proptools.NewSimpleConfigurable(transformArray(non_updatable_modules, "", ".stubs.test"))
326*d57664e9SAndroid Build Coastguard Worker	props.Sdk_version = proptools.StringPtr("module_current")
327*d57664e9SAndroid Build Coastguard Worker	props.Visibility = []string{"//frameworks/base"}
328*d57664e9SAndroid Build Coastguard Worker	props.Is_stubs_module = proptools.BoolPtr(true)
329*d57664e9SAndroid Build Coastguard Worker	ctx.CreateModule(java.LibraryFactory, &props)
330*d57664e9SAndroid Build Coastguard Worker}
331*d57664e9SAndroid Build Coastguard Worker
332*d57664e9SAndroid Build Coastguard Workerfunc createMergedTestExportableStubsForNonUpdatableModules(ctx android.LoadHookContext) {
333*d57664e9SAndroid Build Coastguard Worker	props := libraryProps{}
334*d57664e9SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr("all-non-updatable-modules-test-stubs-exportable")
335*d57664e9SAndroid Build Coastguard Worker	props.Static_libs = proptools.NewSimpleConfigurable(transformArray(non_updatable_modules, "", ".stubs.exportable.test"))
336*d57664e9SAndroid Build Coastguard Worker	props.Sdk_version = proptools.StringPtr("module_current")
337*d57664e9SAndroid Build Coastguard Worker	props.Visibility = []string{"//frameworks/base"}
338*d57664e9SAndroid Build Coastguard Worker	props.Is_stubs_module = proptools.BoolPtr(true)
339*d57664e9SAndroid Build Coastguard Worker	ctx.CreateModule(java.LibraryFactory, &props)
340*d57664e9SAndroid Build Coastguard Worker}
341*d57664e9SAndroid Build Coastguard Worker
342*d57664e9SAndroid Build Coastguard Workerfunc createMergedFrameworkImpl(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) {
343*d57664e9SAndroid Build Coastguard Worker	modules = modules.Clone()
344*d57664e9SAndroid Build Coastguard Worker	// This module is for the "framework-all" module, which should not include the core libraries.
345*d57664e9SAndroid Build Coastguard Worker	removeAll(modules, core_libraries_modules)
346*d57664e9SAndroid Build Coastguard Worker	// Remove the modules that belong to non-updatable APEXes since those are allowed to compile
347*d57664e9SAndroid Build Coastguard Worker	// against unstable APIs.
348*d57664e9SAndroid Build Coastguard Worker	removeAll(modules, non_updatable_modules)
349*d57664e9SAndroid Build Coastguard Worker	// First create updatable-framework-module-impl, which contains all updatable modules.
350*d57664e9SAndroid Build Coastguard Worker	// This module compiles against module_lib SDK.
351*d57664e9SAndroid Build Coastguard Worker	{
352*d57664e9SAndroid Build Coastguard Worker		transformConfigurableArray(modules, "", ".impl")
353*d57664e9SAndroid Build Coastguard Worker		props := libraryProps{}
354*d57664e9SAndroid Build Coastguard Worker		props.Name = proptools.StringPtr("updatable-framework-module-impl")
355*d57664e9SAndroid Build Coastguard Worker		props.Static_libs = modules
356*d57664e9SAndroid Build Coastguard Worker		props.Sdk_version = proptools.StringPtr("module_current")
357*d57664e9SAndroid Build Coastguard Worker		props.Visibility = []string{"//frameworks/base"}
358*d57664e9SAndroid Build Coastguard Worker		ctx.CreateModule(java.LibraryFactory, &props)
359*d57664e9SAndroid Build Coastguard Worker	}
360*d57664e9SAndroid Build Coastguard Worker
361*d57664e9SAndroid Build Coastguard Worker	// Now create all-framework-module-impl, which contains updatable-framework-module-impl
362*d57664e9SAndroid Build Coastguard Worker	// and all non-updatable modules. This module compiles against hidden APIs.
363*d57664e9SAndroid Build Coastguard Worker	{
364*d57664e9SAndroid Build Coastguard Worker		static_libs := transformArray(non_updatable_modules, "", ".impl")
365*d57664e9SAndroid Build Coastguard Worker		static_libs = append(static_libs, "updatable-framework-module-impl")
366*d57664e9SAndroid Build Coastguard Worker		props := libraryProps{}
367*d57664e9SAndroid Build Coastguard Worker		props.Name = proptools.StringPtr("all-framework-module-impl")
368*d57664e9SAndroid Build Coastguard Worker		props.Static_libs = proptools.NewSimpleConfigurable(static_libs)
369*d57664e9SAndroid Build Coastguard Worker		props.Sdk_version = proptools.StringPtr("core_platform")
370*d57664e9SAndroid Build Coastguard Worker		props.Visibility = []string{"//frameworks/base"}
371*d57664e9SAndroid Build Coastguard Worker		ctx.CreateModule(java.LibraryFactory, &props)
372*d57664e9SAndroid Build Coastguard Worker	}
373*d57664e9SAndroid Build Coastguard Worker}
374*d57664e9SAndroid Build Coastguard Worker
375*d57664e9SAndroid Build Coastguard Workerfunc createMergedFrameworkModuleLibExportableStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) {
376*d57664e9SAndroid Build Coastguard Worker	modules = modules.Clone()
377*d57664e9SAndroid Build Coastguard Worker	// The user of this module compiles against the "core" SDK and against non-updatable modules,
378*d57664e9SAndroid Build Coastguard Worker	// so remove to avoid dupes.
379*d57664e9SAndroid Build Coastguard Worker	removeAll(modules, core_libraries_modules)
380*d57664e9SAndroid Build Coastguard Worker	removeAll(modules, non_updatable_modules)
381*d57664e9SAndroid Build Coastguard Worker	transformConfigurableArray(modules, "", ".stubs.exportable.module_lib")
382*d57664e9SAndroid Build Coastguard Worker	props := libraryProps{}
383*d57664e9SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr("framework-updatable-stubs-module_libs_api-exportable")
384*d57664e9SAndroid Build Coastguard Worker	props.Static_libs = modules
385*d57664e9SAndroid Build Coastguard Worker	props.Sdk_version = proptools.StringPtr("module_current")
386*d57664e9SAndroid Build Coastguard Worker	props.Visibility = []string{"//frameworks/base"}
387*d57664e9SAndroid Build Coastguard Worker	props.Is_stubs_module = proptools.BoolPtr(true)
388*d57664e9SAndroid Build Coastguard Worker	ctx.CreateModule(java.LibraryFactory, &props)
389*d57664e9SAndroid Build Coastguard Worker}
390*d57664e9SAndroid Build Coastguard Worker
391*d57664e9SAndroid Build Coastguard Workerfunc createMergedFrameworkModuleLibStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) {
392*d57664e9SAndroid Build Coastguard Worker	modules = modules.Clone()
393*d57664e9SAndroid Build Coastguard Worker	// The user of this module compiles against the "core" SDK and against non-updatable modules,
394*d57664e9SAndroid Build Coastguard Worker	// so remove to avoid dupes.
395*d57664e9SAndroid Build Coastguard Worker	removeAll(modules, core_libraries_modules)
396*d57664e9SAndroid Build Coastguard Worker	removeAll(modules, non_updatable_modules)
397*d57664e9SAndroid Build Coastguard Worker	transformConfigurableArray(modules, "", ".stubs.module_lib")
398*d57664e9SAndroid Build Coastguard Worker	props := libraryProps{}
399*d57664e9SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr("framework-updatable-stubs-module_libs_api")
400*d57664e9SAndroid Build Coastguard Worker	props.Static_libs = modules
401*d57664e9SAndroid Build Coastguard Worker	props.Sdk_version = proptools.StringPtr("module_current")
402*d57664e9SAndroid Build Coastguard Worker	props.Visibility = []string{"//frameworks/base"}
403*d57664e9SAndroid Build Coastguard Worker	props.Is_stubs_module = proptools.BoolPtr(true)
404*d57664e9SAndroid Build Coastguard Worker	ctx.CreateModule(java.LibraryFactory, &props)
405*d57664e9SAndroid Build Coastguard Worker}
406*d57664e9SAndroid Build Coastguard Worker
407*d57664e9SAndroid Build Coastguard Workerfunc createMergedFrameworkSystemServerExportableStubs(ctx android.LoadHookContext, bootclasspath, system_server_classpath proptools.Configurable[[]string]) {
408*d57664e9SAndroid Build Coastguard Worker	// The user of this module compiles against the "core" SDK and against non-updatable bootclasspathModules,
409*d57664e9SAndroid Build Coastguard Worker	// so remove to avoid dupes.
410*d57664e9SAndroid Build Coastguard Worker	bootclasspathModules := bootclasspath.Clone()
411*d57664e9SAndroid Build Coastguard Worker	removeAll(bootclasspathModules, core_libraries_modules)
412*d57664e9SAndroid Build Coastguard Worker	removeAll(bootclasspathModules, non_updatable_modules)
413*d57664e9SAndroid Build Coastguard Worker	transformConfigurableArray(bootclasspathModules, "", ".stubs.exportable.module_lib")
414*d57664e9SAndroid Build Coastguard Worker
415*d57664e9SAndroid Build Coastguard Worker	system_server_classpath = system_server_classpath.Clone()
416*d57664e9SAndroid Build Coastguard Worker	transformConfigurableArray(system_server_classpath, "", ".stubs.exportable.system_server")
417*d57664e9SAndroid Build Coastguard Worker
418*d57664e9SAndroid Build Coastguard Worker	// Include all the module-lib APIs from the bootclasspath libraries.
419*d57664e9SAndroid Build Coastguard Worker	// Then add all the system-server APIs from the service-* libraries.
420*d57664e9SAndroid Build Coastguard Worker	bootclasspathModules.Append(system_server_classpath)
421*d57664e9SAndroid Build Coastguard Worker
422*d57664e9SAndroid Build Coastguard Worker	props := libraryProps{}
423*d57664e9SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr("framework-updatable-stubs-system_server_api-exportable")
424*d57664e9SAndroid Build Coastguard Worker	props.Static_libs = bootclasspathModules
425*d57664e9SAndroid Build Coastguard Worker	props.Sdk_version = proptools.StringPtr("system_server_current")
426*d57664e9SAndroid Build Coastguard Worker	props.Visibility = []string{"//frameworks/base"}
427*d57664e9SAndroid Build Coastguard Worker	props.Is_stubs_module = proptools.BoolPtr(true)
428*d57664e9SAndroid Build Coastguard Worker	ctx.CreateModule(java.LibraryFactory, &props)
429*d57664e9SAndroid Build Coastguard Worker}
430*d57664e9SAndroid Build Coastguard Worker
431*d57664e9SAndroid Build Coastguard Workerfunc createPublicStubsSourceFilegroup(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) {
432*d57664e9SAndroid Build Coastguard Worker	props := fgProps{}
433*d57664e9SAndroid Build Coastguard Worker	props.Name = proptools.StringPtr("all-modules-public-stubs-source-exportable")
434*d57664e9SAndroid Build Coastguard Worker	transformConfigurableArray(modules, "", ".stubs.source")
435*d57664e9SAndroid Build Coastguard Worker	props.Device_common_srcs = createSrcs(modules, "{.exportable}")
436*d57664e9SAndroid Build Coastguard Worker	props.Visibility = []string{"//frameworks/base"}
437*d57664e9SAndroid Build Coastguard Worker	ctx.CreateModule(android.FileGroupFactory, &props)
438*d57664e9SAndroid Build Coastguard Worker}
439*d57664e9SAndroid Build Coastguard Worker
440*d57664e9SAndroid Build Coastguard Workerfunc createMergedTxts(
441*d57664e9SAndroid Build Coastguard Worker	ctx android.LoadHookContext,
442*d57664e9SAndroid Build Coastguard Worker	bootclasspath proptools.Configurable[[]string],
443*d57664e9SAndroid Build Coastguard Worker	system_server_classpath proptools.Configurable[[]string],
444*d57664e9SAndroid Build Coastguard Worker	baseTxtModulePrefix string,
445*d57664e9SAndroid Build Coastguard Worker	stubsTypeSuffix string,
446*d57664e9SAndroid Build Coastguard Worker	doDist bool,
447*d57664e9SAndroid Build Coastguard Worker) {
448*d57664e9SAndroid Build Coastguard Worker	var textFiles []MergedTxtDefinition
449*d57664e9SAndroid Build Coastguard Worker
450*d57664e9SAndroid Build Coastguard Worker	tagSuffix := []string{".api.txt}", ".removed-api.txt}"}
451*d57664e9SAndroid Build Coastguard Worker	distFilename := []string{"android.txt", "android-removed.txt"}
452*d57664e9SAndroid Build Coastguard Worker	for i, f := range []string{"current.txt", "removed.txt"} {
453*d57664e9SAndroid Build Coastguard Worker		textFiles = append(textFiles, MergedTxtDefinition{
454*d57664e9SAndroid Build Coastguard Worker			TxtFilename:  f,
455*d57664e9SAndroid Build Coastguard Worker			DistFilename: distFilename[i],
456*d57664e9SAndroid Build Coastguard Worker			BaseTxt:      ":" + baseTxtModulePrefix + f,
457*d57664e9SAndroid Build Coastguard Worker			Modules:      bootclasspath,
458*d57664e9SAndroid Build Coastguard Worker			ModuleTag:    "{.public" + tagSuffix[i],
459*d57664e9SAndroid Build Coastguard Worker			Scope:        "public",
460*d57664e9SAndroid Build Coastguard Worker		})
461*d57664e9SAndroid Build Coastguard Worker		textFiles = append(textFiles, MergedTxtDefinition{
462*d57664e9SAndroid Build Coastguard Worker			TxtFilename:  f,
463*d57664e9SAndroid Build Coastguard Worker			DistFilename: distFilename[i],
464*d57664e9SAndroid Build Coastguard Worker			BaseTxt:      ":" + baseTxtModulePrefix + "system-" + f,
465*d57664e9SAndroid Build Coastguard Worker			Modules:      bootclasspath,
466*d57664e9SAndroid Build Coastguard Worker			ModuleTag:    "{.system" + tagSuffix[i],
467*d57664e9SAndroid Build Coastguard Worker			Scope:        "system",
468*d57664e9SAndroid Build Coastguard Worker		})
469*d57664e9SAndroid Build Coastguard Worker		textFiles = append(textFiles, MergedTxtDefinition{
470*d57664e9SAndroid Build Coastguard Worker			TxtFilename:  f,
471*d57664e9SAndroid Build Coastguard Worker			DistFilename: distFilename[i],
472*d57664e9SAndroid Build Coastguard Worker			BaseTxt:      ":" + baseTxtModulePrefix + "module-lib-" + f,
473*d57664e9SAndroid Build Coastguard Worker			Modules:      bootclasspath,
474*d57664e9SAndroid Build Coastguard Worker			ModuleTag:    "{.module-lib" + tagSuffix[i],
475*d57664e9SAndroid Build Coastguard Worker			Scope:        "module-lib",
476*d57664e9SAndroid Build Coastguard Worker		})
477*d57664e9SAndroid Build Coastguard Worker		textFiles = append(textFiles, MergedTxtDefinition{
478*d57664e9SAndroid Build Coastguard Worker			TxtFilename:  f,
479*d57664e9SAndroid Build Coastguard Worker			DistFilename: distFilename[i],
480*d57664e9SAndroid Build Coastguard Worker			BaseTxt:      ":" + baseTxtModulePrefix + "system-server-" + f,
481*d57664e9SAndroid Build Coastguard Worker			Modules:      system_server_classpath,
482*d57664e9SAndroid Build Coastguard Worker			ModuleTag:    "{.system-server" + tagSuffix[i],
483*d57664e9SAndroid Build Coastguard Worker			Scope:        "system-server",
484*d57664e9SAndroid Build Coastguard Worker		})
485*d57664e9SAndroid Build Coastguard Worker	}
486*d57664e9SAndroid Build Coastguard Worker	for _, txt := range textFiles {
487*d57664e9SAndroid Build Coastguard Worker		createMergedTxt(ctx, txt, stubsTypeSuffix, doDist)
488*d57664e9SAndroid Build Coastguard Worker	}
489*d57664e9SAndroid Build Coastguard Worker}
490*d57664e9SAndroid Build Coastguard Worker
491*d57664e9SAndroid Build Coastguard Workerfunc (a *CombinedApis) createInternalModules(ctx android.LoadHookContext) {
492*d57664e9SAndroid Build Coastguard Worker	bootclasspath := a.properties.Bootclasspath.Clone()
493*d57664e9SAndroid Build Coastguard Worker	system_server_classpath := a.properties.System_server_classpath.Clone()
494*d57664e9SAndroid Build Coastguard Worker	if ctx.Config().VendorConfig("ANDROID").Bool("include_nonpublic_framework_api") {
495*d57664e9SAndroid Build Coastguard Worker		bootclasspath.AppendSimpleValue(a.properties.Conditional_bootclasspath)
496*d57664e9SAndroid Build Coastguard Worker	}
497*d57664e9SAndroid Build Coastguard Worker	createMergedTxts(ctx, bootclasspath, system_server_classpath, "non-updatable-", "-", false)
498*d57664e9SAndroid Build Coastguard Worker	createMergedTxts(ctx, bootclasspath, system_server_classpath, "non-updatable-exportable-", "-exportable-", true)
499*d57664e9SAndroid Build Coastguard Worker
500*d57664e9SAndroid Build Coastguard Worker	createMergedPublicStubs(ctx, bootclasspath)
501*d57664e9SAndroid Build Coastguard Worker	createMergedSystemStubs(ctx, bootclasspath)
502*d57664e9SAndroid Build Coastguard Worker	createMergedTestStubsForNonUpdatableModules(ctx)
503*d57664e9SAndroid Build Coastguard Worker	createMergedFrameworkModuleLibStubs(ctx, bootclasspath)
504*d57664e9SAndroid Build Coastguard Worker	createMergedFrameworkImpl(ctx, bootclasspath)
505*d57664e9SAndroid Build Coastguard Worker
506*d57664e9SAndroid Build Coastguard Worker	createMergedPublicExportableStubs(ctx, bootclasspath)
507*d57664e9SAndroid Build Coastguard Worker	createMergedSystemExportableStubs(ctx, bootclasspath)
508*d57664e9SAndroid Build Coastguard Worker	createMergedTestExportableStubsForNonUpdatableModules(ctx)
509*d57664e9SAndroid Build Coastguard Worker	createMergedFrameworkModuleLibExportableStubs(ctx, bootclasspath)
510*d57664e9SAndroid Build Coastguard Worker	createMergedFrameworkSystemServerExportableStubs(ctx, bootclasspath, system_server_classpath)
511*d57664e9SAndroid Build Coastguard Worker
512*d57664e9SAndroid Build Coastguard Worker	createMergedAnnotationsFilegroups(ctx, bootclasspath, system_server_classpath)
513*d57664e9SAndroid Build Coastguard Worker
514*d57664e9SAndroid Build Coastguard Worker	createPublicStubsSourceFilegroup(ctx, bootclasspath)
515*d57664e9SAndroid Build Coastguard Worker}
516*d57664e9SAndroid Build Coastguard Worker
517*d57664e9SAndroid Build Coastguard Workerfunc combinedApisModuleFactory() android.Module {
518*d57664e9SAndroid Build Coastguard Worker	module := &CombinedApis{}
519*d57664e9SAndroid Build Coastguard Worker	module.AddProperties(&module.properties)
520*d57664e9SAndroid Build Coastguard Worker	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon)
521*d57664e9SAndroid Build Coastguard Worker	android.AddLoadHook(module, func(ctx android.LoadHookContext) { module.createInternalModules(ctx) })
522*d57664e9SAndroid Build Coastguard Worker	return module
523*d57664e9SAndroid Build Coastguard Worker}
524*d57664e9SAndroid Build Coastguard Worker
525*d57664e9SAndroid Build Coastguard Worker// Various utility methods below.
526*d57664e9SAndroid Build Coastguard Worker
527*d57664e9SAndroid Build Coastguard Worker// Creates an array of ":<m><tag>" for each m in <modules>.
528*d57664e9SAndroid Build Coastguard Workerfunc createSrcs(modules proptools.Configurable[[]string], tag string) proptools.Configurable[[]string] {
529*d57664e9SAndroid Build Coastguard Worker	result := modules.Clone()
530*d57664e9SAndroid Build Coastguard Worker	transformConfigurableArray(result, ":", tag)
531*d57664e9SAndroid Build Coastguard Worker	return result
532*d57664e9SAndroid Build Coastguard Worker}
533*d57664e9SAndroid Build Coastguard Worker
534*d57664e9SAndroid Build Coastguard Worker// Creates an array of "<prefix><m><suffix>", for each m in <modules>.
535*d57664e9SAndroid Build Coastguard Workerfunc transformArray(modules []string, prefix, suffix string) []string {
536*d57664e9SAndroid Build Coastguard Worker	a := make([]string, 0, len(modules))
537*d57664e9SAndroid Build Coastguard Worker	for _, module := range modules {
538*d57664e9SAndroid Build Coastguard Worker		a = append(a, prefix+module+suffix)
539*d57664e9SAndroid Build Coastguard Worker	}
540*d57664e9SAndroid Build Coastguard Worker	return a
541*d57664e9SAndroid Build Coastguard Worker}
542*d57664e9SAndroid Build Coastguard Worker
543*d57664e9SAndroid Build Coastguard Worker// Creates an array of "<prefix><m><suffix>", for each m in <modules>.
544*d57664e9SAndroid Build Coastguard Workerfunc transformConfigurableArray(modules proptools.Configurable[[]string], prefix, suffix string) {
545*d57664e9SAndroid Build Coastguard Worker	modules.AddPostProcessor(func(s []string) []string {
546*d57664e9SAndroid Build Coastguard Worker		return transformArray(s, prefix, suffix)
547*d57664e9SAndroid Build Coastguard Worker	})
548*d57664e9SAndroid Build Coastguard Worker}
549*d57664e9SAndroid Build Coastguard Worker
550*d57664e9SAndroid Build Coastguard Workerfunc removeAll(s proptools.Configurable[[]string], vs []string) {
551*d57664e9SAndroid Build Coastguard Worker	s.AddPostProcessor(func(s []string) []string {
552*d57664e9SAndroid Build Coastguard Worker		a := make([]string, 0, len(s))
553*d57664e9SAndroid Build Coastguard Worker		for _, module := range s {
554*d57664e9SAndroid Build Coastguard Worker			if !slices.Contains(vs, module) {
555*d57664e9SAndroid Build Coastguard Worker				a = append(a, module)
556*d57664e9SAndroid Build Coastguard Worker			}
557*d57664e9SAndroid Build Coastguard Worker		}
558*d57664e9SAndroid Build Coastguard Worker		return a
559*d57664e9SAndroid Build Coastguard Worker	})
560*d57664e9SAndroid Build Coastguard Worker}
561*d57664e9SAndroid Build Coastguard Worker
562*d57664e9SAndroid Build Coastguard Workerfunc remove(s []string, v string) []string {
563*d57664e9SAndroid Build Coastguard Worker	s2 := make([]string, 0, len(s))
564*d57664e9SAndroid Build Coastguard Worker	for _, sv := range s {
565*d57664e9SAndroid Build Coastguard Worker		if sv != v {
566*d57664e9SAndroid Build Coastguard Worker			s2 = append(s2, sv)
567*d57664e9SAndroid Build Coastguard Worker		}
568*d57664e9SAndroid Build Coastguard Worker	}
569*d57664e9SAndroid Build Coastguard Worker	return s2
570*d57664e9SAndroid Build Coastguard Worker}
571