xref: /aosp_15_r20/build/soong/java/systemserver_classpath_fragment.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 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/dexpreopt"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
22*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
23*333d2b36SAndroid Build Coastguard Worker)
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Workerfunc init() {
26*333d2b36SAndroid Build Coastguard Worker	registerSystemserverClasspathBuildComponents(android.InitRegistrationContext)
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Worker	android.RegisterSdkMemberType(SystemServerClasspathFragmentSdkMemberType)
29*333d2b36SAndroid Build Coastguard Worker}
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Workerfunc registerSystemserverClasspathBuildComponents(ctx android.RegistrationContext) {
32*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("platform_systemserverclasspath", platformSystemServerClasspathFactory)
33*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("systemserverclasspath_fragment", systemServerClasspathFactory)
34*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("prebuilt_systemserverclasspath_fragment", prebuiltSystemServerClasspathModuleFactory)
35*333d2b36SAndroid Build Coastguard Worker}
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Workervar SystemServerClasspathFragmentSdkMemberType = &systemServerClasspathFragmentMemberType{
38*333d2b36SAndroid Build Coastguard Worker	SdkMemberTypeBase: android.SdkMemberTypeBase{
39*333d2b36SAndroid Build Coastguard Worker		PropertyName: "systemserverclasspath_fragments",
40*333d2b36SAndroid Build Coastguard Worker		SupportsSdk:  true,
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker		// Support for adding systemserverclasspath_fragments to the sdk snapshot was only added in
43*333d2b36SAndroid Build Coastguard Worker		// Tiramisu.
44*333d2b36SAndroid Build Coastguard Worker		SupportedBuildReleaseSpecification: "Tiramisu+",
45*333d2b36SAndroid Build Coastguard Worker	},
46*333d2b36SAndroid Build Coastguard Worker}
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Workertype platformSystemServerClasspathModule struct {
49*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker	ClasspathFragmentBase
52*333d2b36SAndroid Build Coastguard Worker}
53*333d2b36SAndroid Build Coastguard Worker
54*333d2b36SAndroid Build Coastguard Workerfunc platformSystemServerClasspathFactory() android.Module {
55*333d2b36SAndroid Build Coastguard Worker	m := &platformSystemServerClasspathModule{}
56*333d2b36SAndroid Build Coastguard Worker	initClasspathFragment(m, SYSTEMSERVERCLASSPATH)
57*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
58*333d2b36SAndroid Build Coastguard Worker	return m
59*333d2b36SAndroid Build Coastguard Worker}
60*333d2b36SAndroid Build Coastguard Worker
61*333d2b36SAndroid Build Coastguard Workerfunc (p *platformSystemServerClasspathModule) AndroidMkEntries() (entries []android.AndroidMkEntries) {
62*333d2b36SAndroid Build Coastguard Worker	return p.classpathFragmentBase().androidMkEntries()
63*333d2b36SAndroid Build Coastguard Worker}
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Workerfunc (p *platformSystemServerClasspathModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
66*333d2b36SAndroid Build Coastguard Worker	configuredJars := p.configuredJars(ctx)
67*333d2b36SAndroid Build Coastguard Worker	classpathJars := configuredJarListToClasspathJars(ctx, configuredJars, p.classpathType)
68*333d2b36SAndroid Build Coastguard Worker	standaloneConfiguredJars := p.standaloneConfiguredJars(ctx)
69*333d2b36SAndroid Build Coastguard Worker	standaloneClasspathJars := configuredJarListToClasspathJars(ctx, standaloneConfiguredJars, STANDALONE_SYSTEMSERVER_JARS)
70*333d2b36SAndroid Build Coastguard Worker	configuredJars = configuredJars.AppendList(&standaloneConfiguredJars)
71*333d2b36SAndroid Build Coastguard Worker	classpathJars = append(classpathJars, standaloneClasspathJars...)
72*333d2b36SAndroid Build Coastguard Worker	p.classpathFragmentBase().generateClasspathProtoBuildActions(ctx, configuredJars, classpathJars)
73*333d2b36SAndroid Build Coastguard Worker	p.classpathFragmentBase().installClasspathProto(ctx)
74*333d2b36SAndroid Build Coastguard Worker}
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Workerfunc (p *platformSystemServerClasspathModule) configuredJars(ctx android.ModuleContext) android.ConfiguredJarList {
77*333d2b36SAndroid Build Coastguard Worker	// TODO(satayev): include any apex jars that don't populate their classpath proto config.
78*333d2b36SAndroid Build Coastguard Worker	return dexpreopt.GetGlobalConfig(ctx).SystemServerJars
79*333d2b36SAndroid Build Coastguard Worker}
80*333d2b36SAndroid Build Coastguard Worker
81*333d2b36SAndroid Build Coastguard Workerfunc (p *platformSystemServerClasspathModule) standaloneConfiguredJars(ctx android.ModuleContext) android.ConfiguredJarList {
82*333d2b36SAndroid Build Coastguard Worker	return dexpreopt.GetGlobalConfig(ctx).StandaloneSystemServerJars
83*333d2b36SAndroid Build Coastguard Worker}
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Workertype SystemServerClasspathModule struct {
86*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
87*333d2b36SAndroid Build Coastguard Worker	android.ApexModuleBase
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Worker	ClasspathFragmentBase
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker	properties systemServerClasspathFragmentProperties
92*333d2b36SAndroid Build Coastguard Worker}
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Workerfunc (s *SystemServerClasspathModule) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error {
95*333d2b36SAndroid Build Coastguard Worker	return nil
96*333d2b36SAndroid Build Coastguard Worker}
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Workertype systemServerClasspathFragmentProperties struct {
99*333d2b36SAndroid Build Coastguard Worker	// List of system_server classpath jars, could be either java_library, or java_sdk_library.
100*333d2b36SAndroid Build Coastguard Worker	//
101*333d2b36SAndroid Build Coastguard Worker	// The order of this list matters as it is the order that is used in the SYSTEMSERVERCLASSPATH.
102*333d2b36SAndroid Build Coastguard Worker	Contents proptools.Configurable[[]string] `android:"arch_variant"`
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Worker	// List of jars that system_server loads dynamically using separate classloaders.
105*333d2b36SAndroid Build Coastguard Worker	//
106*333d2b36SAndroid Build Coastguard Worker	// The order does not matter.
107*333d2b36SAndroid Build Coastguard Worker	Standalone_contents proptools.Configurable[[]string] `android:"arch_variant"`
108*333d2b36SAndroid Build Coastguard Worker}
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Workerfunc systemServerClasspathFactory() android.Module {
111*333d2b36SAndroid Build Coastguard Worker	m := &SystemServerClasspathModule{}
112*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
113*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(m)
114*333d2b36SAndroid Build Coastguard Worker	initClasspathFragment(m, SYSTEMSERVERCLASSPATH)
115*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
116*333d2b36SAndroid Build Coastguard Worker	return m
117*333d2b36SAndroid Build Coastguard Worker}
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Workerfunc (s *SystemServerClasspathModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
120*333d2b36SAndroid Build Coastguard Worker	if len(s.properties.Contents.GetOrDefault(ctx, nil)) == 0 && len(s.properties.Standalone_contents.GetOrDefault(ctx, nil)) == 0 {
121*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("contents", "Either contents or standalone_contents needs to be non-empty")
122*333d2b36SAndroid Build Coastguard Worker	}
123*333d2b36SAndroid Build Coastguard Worker
124*333d2b36SAndroid Build Coastguard Worker	configuredJars := s.configuredJars(ctx)
125*333d2b36SAndroid Build Coastguard Worker	classpathJars := configuredJarListToClasspathJars(ctx, configuredJars, s.classpathType)
126*333d2b36SAndroid Build Coastguard Worker	standaloneConfiguredJars := s.standaloneConfiguredJars(ctx)
127*333d2b36SAndroid Build Coastguard Worker	standaloneClasspathJars := configuredJarListToClasspathJars(ctx, standaloneConfiguredJars, STANDALONE_SYSTEMSERVER_JARS)
128*333d2b36SAndroid Build Coastguard Worker	configuredJars = configuredJars.AppendList(&standaloneConfiguredJars)
129*333d2b36SAndroid Build Coastguard Worker	classpathJars = append(classpathJars, standaloneClasspathJars...)
130*333d2b36SAndroid Build Coastguard Worker	s.classpathFragmentBase().generateClasspathProtoBuildActions(ctx, configuredJars, classpathJars)
131*333d2b36SAndroid Build Coastguard Worker	s.setPartitionInfoOfLibraries(ctx)
132*333d2b36SAndroid Build Coastguard Worker}
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker// Map of java library name to their install partition.
135*333d2b36SAndroid Build Coastguard Workertype LibraryNameToPartitionInfo struct {
136*333d2b36SAndroid Build Coastguard Worker	LibraryNameToPartition map[string]string
137*333d2b36SAndroid Build Coastguard Worker}
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker// LibraryNameToPartitionInfoProvider will be used by the top-level apex to enforce that dexpreopt files
140*333d2b36SAndroid Build Coastguard Worker// of apex system server jars are installed in the same partition as the top-level apex.
141*333d2b36SAndroid Build Coastguard Workervar LibraryNameToPartitionInfoProvider = blueprint.NewProvider[LibraryNameToPartitionInfo]()
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Workerfunc (s *SystemServerClasspathModule) setPartitionInfoOfLibraries(ctx android.ModuleContext) {
144*333d2b36SAndroid Build Coastguard Worker	libraryNameToPartition := map[string]string{}
145*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDepsWithTag(systemServerClasspathFragmentContentDepTag, func(m android.Module) {
146*333d2b36SAndroid Build Coastguard Worker		libraryNameToPartition[m.Name()] = m.PartitionTag(ctx.DeviceConfig())
147*333d2b36SAndroid Build Coastguard Worker	})
148*333d2b36SAndroid Build Coastguard Worker	android.SetProvider(ctx, LibraryNameToPartitionInfoProvider, LibraryNameToPartitionInfo{
149*333d2b36SAndroid Build Coastguard Worker		LibraryNameToPartition: libraryNameToPartition,
150*333d2b36SAndroid Build Coastguard Worker	})
151*333d2b36SAndroid Build Coastguard Worker}
152*333d2b36SAndroid Build Coastguard Worker
153*333d2b36SAndroid Build Coastguard Workerfunc (s *SystemServerClasspathModule) configuredJars(ctx android.ModuleContext) android.ConfiguredJarList {
154*333d2b36SAndroid Build Coastguard Worker	global := dexpreopt.GetGlobalConfig(ctx)
155*333d2b36SAndroid Build Coastguard Worker
156*333d2b36SAndroid Build Coastguard Worker	possibleUpdatableModules := gatherPossibleApexModuleNamesAndStems(ctx, s.properties.Contents.GetOrDefault(ctx, nil), systemServerClasspathFragmentContentDepTag)
157*333d2b36SAndroid Build Coastguard Worker	jars, unknown := global.ApexSystemServerJars.Filter(possibleUpdatableModules)
158*333d2b36SAndroid Build Coastguard Worker	// TODO(satayev): remove geotz ssc_fragment, since geotz is not part of SSCP anymore.
159*333d2b36SAndroid Build Coastguard Worker	_, unknown = android.RemoveFromList("geotz", unknown)
160*333d2b36SAndroid Build Coastguard Worker	// This module only exists in car products.
161*333d2b36SAndroid Build Coastguard Worker	// So ignore it even if it is not in PRODUCT_APEX_SYSTEM_SERVER_JARS.
162*333d2b36SAndroid Build Coastguard Worker	// TODO(b/203233647): Add better mechanism to make it optional.
163*333d2b36SAndroid Build Coastguard Worker	_, unknown = android.RemoveFromList("car-frameworks-service-module", unknown)
164*333d2b36SAndroid Build Coastguard Worker
165*333d2b36SAndroid Build Coastguard Worker	// This module is optional, so it is not present in all products.
166*333d2b36SAndroid Build Coastguard Worker	// (See PRODUCT_ISOLATED_COMPILATION_ENABLED.)
167*333d2b36SAndroid Build Coastguard Worker	// So ignore it even if it is not in PRODUCT_APEX_SYSTEM_SERVER_JARS.
168*333d2b36SAndroid Build Coastguard Worker	// TODO(b/203233647): Add better mechanism to make it optional.
169*333d2b36SAndroid Build Coastguard Worker	_, unknown = android.RemoveFromList("service-compos", unknown)
170*333d2b36SAndroid Build Coastguard Worker
171*333d2b36SAndroid Build Coastguard Worker	// TODO(satayev): for apex_test we want to include all contents unconditionally to classpaths
172*333d2b36SAndroid Build Coastguard Worker	// config. However, any test specific jars would not be present in ApexSystemServerJars. Instead,
173*333d2b36SAndroid Build Coastguard Worker	// we should check if we are creating a config for apex_test via ApexInfo and amend the values.
174*333d2b36SAndroid Build Coastguard Worker	// This is an exception to support end-to-end test for ApexdUnitTests, until such support exists.
175*333d2b36SAndroid Build Coastguard Worker	if android.InList("test_service-apexd", possibleUpdatableModules) {
176*333d2b36SAndroid Build Coastguard Worker		jars = jars.Append("com.android.apex.test_package", "test_service-apexd")
177*333d2b36SAndroid Build Coastguard Worker	} else if global.ApexSystemServerJars.Len() > 0 && len(unknown) > 0 {
178*333d2b36SAndroid Build Coastguard Worker		// For non test apexes, make sure that all contents are actually declared in make.
179*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf("%s in contents must also be declared in PRODUCT_APEX_SYSTEM_SERVER_JARS", unknown)
180*333d2b36SAndroid Build Coastguard Worker	}
181*333d2b36SAndroid Build Coastguard Worker
182*333d2b36SAndroid Build Coastguard Worker	return jars
183*333d2b36SAndroid Build Coastguard Worker}
184*333d2b36SAndroid Build Coastguard Worker
185*333d2b36SAndroid Build Coastguard Workerfunc (s *SystemServerClasspathModule) standaloneConfiguredJars(ctx android.ModuleContext) android.ConfiguredJarList {
186*333d2b36SAndroid Build Coastguard Worker	global := dexpreopt.GetGlobalConfig(ctx)
187*333d2b36SAndroid Build Coastguard Worker
188*333d2b36SAndroid Build Coastguard Worker	possibleUpdatableModules := gatherPossibleApexModuleNamesAndStems(ctx, s.properties.Standalone_contents.GetOrDefault(ctx, nil), systemServerClasspathFragmentContentDepTag)
189*333d2b36SAndroid Build Coastguard Worker	jars, _ := global.ApexStandaloneSystemServerJars.Filter(possibleUpdatableModules)
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Worker	// TODO(jiakaiz): add a check to ensure that the contents are declared in make.
192*333d2b36SAndroid Build Coastguard Worker
193*333d2b36SAndroid Build Coastguard Worker	return jars
194*333d2b36SAndroid Build Coastguard Worker}
195*333d2b36SAndroid Build Coastguard Worker
196*333d2b36SAndroid Build Coastguard Workertype systemServerClasspathFragmentContentDependencyTag struct {
197*333d2b36SAndroid Build Coastguard Worker	blueprint.BaseDependencyTag
198*333d2b36SAndroid Build Coastguard Worker}
199*333d2b36SAndroid Build Coastguard Worker
200*333d2b36SAndroid Build Coastguard Worker// The systemserverclasspath_fragment contents must never depend on prebuilts.
201*333d2b36SAndroid Build Coastguard Workerfunc (systemServerClasspathFragmentContentDependencyTag) ReplaceSourceWithPrebuilt() bool {
202*333d2b36SAndroid Build Coastguard Worker	return false
203*333d2b36SAndroid Build Coastguard Worker}
204*333d2b36SAndroid Build Coastguard Worker
205*333d2b36SAndroid Build Coastguard Worker// SdkMemberType causes dependencies added with this tag to be automatically added to the sdk as if
206*333d2b36SAndroid Build Coastguard Worker// they were specified using java_systemserver_libs or java_sdk_libs.
207*333d2b36SAndroid Build Coastguard Workerfunc (b systemServerClasspathFragmentContentDependencyTag) SdkMemberType(child android.Module) android.SdkMemberType {
208*333d2b36SAndroid Build Coastguard Worker	// If the module is a java_sdk_library then treat it as if it was specified in the java_sdk_libs
209*333d2b36SAndroid Build Coastguard Worker	// property, otherwise treat if it was specified in the java_systemserver_libs property.
210*333d2b36SAndroid Build Coastguard Worker	if javaSdkLibrarySdkMemberType.IsInstance(child) {
211*333d2b36SAndroid Build Coastguard Worker		return javaSdkLibrarySdkMemberType
212*333d2b36SAndroid Build Coastguard Worker	}
213*333d2b36SAndroid Build Coastguard Worker
214*333d2b36SAndroid Build Coastguard Worker	return JavaSystemserverLibsSdkMemberType
215*333d2b36SAndroid Build Coastguard Worker}
216*333d2b36SAndroid Build Coastguard Worker
217*333d2b36SAndroid Build Coastguard Workerfunc (b systemServerClasspathFragmentContentDependencyTag) ExportMember() bool {
218*333d2b36SAndroid Build Coastguard Worker	return true
219*333d2b36SAndroid Build Coastguard Worker}
220*333d2b36SAndroid Build Coastguard Worker
221*333d2b36SAndroid Build Coastguard Worker// Contents of system server fragments require files from prebuilt apex files.
222*333d2b36SAndroid Build Coastguard Workerfunc (systemServerClasspathFragmentContentDependencyTag) RequiresFilesFromPrebuiltApex() {}
223*333d2b36SAndroid Build Coastguard Worker
224*333d2b36SAndroid Build Coastguard Workervar _ android.ReplaceSourceWithPrebuilt = systemServerClasspathFragmentContentDepTag
225*333d2b36SAndroid Build Coastguard Workervar _ android.SdkMemberDependencyTag = systemServerClasspathFragmentContentDepTag
226*333d2b36SAndroid Build Coastguard Workervar _ android.RequiresFilesFromPrebuiltApexTag = systemServerClasspathFragmentContentDepTag
227*333d2b36SAndroid Build Coastguard Worker
228*333d2b36SAndroid Build Coastguard Worker// The tag used for the dependency between the systemserverclasspath_fragment module and its contents.
229*333d2b36SAndroid Build Coastguard Workervar systemServerClasspathFragmentContentDepTag = systemServerClasspathFragmentContentDependencyTag{}
230*333d2b36SAndroid Build Coastguard Worker
231*333d2b36SAndroid Build Coastguard Workerfunc IsSystemServerClasspathFragmentContentDepTag(tag blueprint.DependencyTag) bool {
232*333d2b36SAndroid Build Coastguard Worker	return tag == systemServerClasspathFragmentContentDepTag
233*333d2b36SAndroid Build Coastguard Worker}
234*333d2b36SAndroid Build Coastguard Worker
235*333d2b36SAndroid Build Coastguard Worker// The dexpreopt artifacts of apex system server jars are installed onto system image.
236*333d2b36SAndroid Build Coastguard Workerfunc (s systemServerClasspathFragmentContentDependencyTag) InstallDepNeeded() bool {
237*333d2b36SAndroid Build Coastguard Worker	return true
238*333d2b36SAndroid Build Coastguard Worker}
239*333d2b36SAndroid Build Coastguard Worker
240*333d2b36SAndroid Build Coastguard Workerfunc (s *SystemServerClasspathModule) ComponentDepsMutator(ctx android.BottomUpMutatorContext) {
241*333d2b36SAndroid Build Coastguard Worker	module := ctx.Module()
242*333d2b36SAndroid Build Coastguard Worker	_, isSourceModule := module.(*SystemServerClasspathModule)
243*333d2b36SAndroid Build Coastguard Worker	var deps []string
244*333d2b36SAndroid Build Coastguard Worker	deps = append(deps, s.properties.Contents.GetOrDefault(ctx, nil)...)
245*333d2b36SAndroid Build Coastguard Worker	deps = append(deps, s.properties.Standalone_contents.GetOrDefault(ctx, nil)...)
246*333d2b36SAndroid Build Coastguard Worker
247*333d2b36SAndroid Build Coastguard Worker	for _, name := range deps {
248*333d2b36SAndroid Build Coastguard Worker		// A systemserverclasspath_fragment must depend only on other source modules, while the
249*333d2b36SAndroid Build Coastguard Worker		// prebuilt_systemserverclasspath_fragment_fragment must only depend on other prebuilt modules.
250*333d2b36SAndroid Build Coastguard Worker		if !isSourceModule {
251*333d2b36SAndroid Build Coastguard Worker			name = android.PrebuiltNameFromSource(name)
252*333d2b36SAndroid Build Coastguard Worker		}
253*333d2b36SAndroid Build Coastguard Worker		ctx.AddDependency(module, systemServerClasspathFragmentContentDepTag, name)
254*333d2b36SAndroid Build Coastguard Worker	}
255*333d2b36SAndroid Build Coastguard Worker}
256*333d2b36SAndroid Build Coastguard Worker
257*333d2b36SAndroid Build Coastguard Worker// Collect information for opening IDE project files in java/jdeps.go.
258*333d2b36SAndroid Build Coastguard Workerfunc (s *SystemServerClasspathModule) IDEInfo(ctx android.BaseModuleContext, dpInfo *android.IdeInfo) {
259*333d2b36SAndroid Build Coastguard Worker	dpInfo.Deps = append(dpInfo.Deps, s.properties.Contents.GetOrDefault(ctx, nil)...)
260*333d2b36SAndroid Build Coastguard Worker	dpInfo.Deps = append(dpInfo.Deps, s.properties.Standalone_contents.GetOrDefault(ctx, nil)...)
261*333d2b36SAndroid Build Coastguard Worker}
262*333d2b36SAndroid Build Coastguard Worker
263*333d2b36SAndroid Build Coastguard Workertype systemServerClasspathFragmentMemberType struct {
264*333d2b36SAndroid Build Coastguard Worker	android.SdkMemberTypeBase
265*333d2b36SAndroid Build Coastguard Worker}
266*333d2b36SAndroid Build Coastguard Worker
267*333d2b36SAndroid Build Coastguard Workerfunc (s *systemServerClasspathFragmentMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) {
268*333d2b36SAndroid Build Coastguard Worker	ctx.AddVariationDependencies(nil, dependencyTag, names...)
269*333d2b36SAndroid Build Coastguard Worker}
270*333d2b36SAndroid Build Coastguard Worker
271*333d2b36SAndroid Build Coastguard Workerfunc (s *systemServerClasspathFragmentMemberType) IsInstance(module android.Module) bool {
272*333d2b36SAndroid Build Coastguard Worker	_, ok := module.(*SystemServerClasspathModule)
273*333d2b36SAndroid Build Coastguard Worker	return ok
274*333d2b36SAndroid Build Coastguard Worker}
275*333d2b36SAndroid Build Coastguard Worker
276*333d2b36SAndroid Build Coastguard Workerfunc (s *systemServerClasspathFragmentMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
277*333d2b36SAndroid Build Coastguard Worker	return ctx.SnapshotBuilder().AddPrebuiltModule(member, "prebuilt_systemserverclasspath_fragment")
278*333d2b36SAndroid Build Coastguard Worker}
279*333d2b36SAndroid Build Coastguard Worker
280*333d2b36SAndroid Build Coastguard Workerfunc (s *systemServerClasspathFragmentMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
281*333d2b36SAndroid Build Coastguard Worker	return &systemServerClasspathFragmentSdkMemberProperties{}
282*333d2b36SAndroid Build Coastguard Worker}
283*333d2b36SAndroid Build Coastguard Worker
284*333d2b36SAndroid Build Coastguard Workertype systemServerClasspathFragmentSdkMemberProperties struct {
285*333d2b36SAndroid Build Coastguard Worker	android.SdkMemberPropertiesBase
286*333d2b36SAndroid Build Coastguard Worker
287*333d2b36SAndroid Build Coastguard Worker	// List of system_server classpath jars, could be either java_library, or java_sdk_library.
288*333d2b36SAndroid Build Coastguard Worker	//
289*333d2b36SAndroid Build Coastguard Worker	// The order of this list matters as it is the order that is used in the SYSTEMSERVERCLASSPATH.
290*333d2b36SAndroid Build Coastguard Worker	Contents []string
291*333d2b36SAndroid Build Coastguard Worker
292*333d2b36SAndroid Build Coastguard Worker	// List of jars that system_server loads dynamically using separate classloaders.
293*333d2b36SAndroid Build Coastguard Worker	//
294*333d2b36SAndroid Build Coastguard Worker	// The order does not matter.
295*333d2b36SAndroid Build Coastguard Worker	Standalone_contents []string
296*333d2b36SAndroid Build Coastguard Worker}
297*333d2b36SAndroid Build Coastguard Worker
298*333d2b36SAndroid Build Coastguard Workerfunc (s *systemServerClasspathFragmentSdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
299*333d2b36SAndroid Build Coastguard Worker	module := variant.(*SystemServerClasspathModule)
300*333d2b36SAndroid Build Coastguard Worker
301*333d2b36SAndroid Build Coastguard Worker	s.Contents = module.properties.Contents.GetOrDefault(ctx.SdkModuleContext(), nil)
302*333d2b36SAndroid Build Coastguard Worker	s.Standalone_contents = module.properties.Standalone_contents.GetOrDefault(ctx.SdkModuleContext(), nil)
303*333d2b36SAndroid Build Coastguard Worker}
304*333d2b36SAndroid Build Coastguard Worker
305*333d2b36SAndroid Build Coastguard Workerfunc (s *systemServerClasspathFragmentSdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
306*333d2b36SAndroid Build Coastguard Worker	builder := ctx.SnapshotBuilder()
307*333d2b36SAndroid Build Coastguard Worker	requiredMemberDependency := builder.SdkMemberReferencePropertyTag(true)
308*333d2b36SAndroid Build Coastguard Worker
309*333d2b36SAndroid Build Coastguard Worker	if len(s.Contents) > 0 {
310*333d2b36SAndroid Build Coastguard Worker		propertySet.AddPropertyWithTag("contents", s.Contents, requiredMemberDependency)
311*333d2b36SAndroid Build Coastguard Worker	}
312*333d2b36SAndroid Build Coastguard Worker
313*333d2b36SAndroid Build Coastguard Worker	if len(s.Standalone_contents) > 0 {
314*333d2b36SAndroid Build Coastguard Worker		propertySet.AddPropertyWithTag("standalone_contents", s.Standalone_contents, requiredMemberDependency)
315*333d2b36SAndroid Build Coastguard Worker	}
316*333d2b36SAndroid Build Coastguard Worker}
317*333d2b36SAndroid Build Coastguard Worker
318*333d2b36SAndroid Build Coastguard Workervar _ android.SdkMemberType = (*systemServerClasspathFragmentMemberType)(nil)
319*333d2b36SAndroid Build Coastguard Worker
320*333d2b36SAndroid Build Coastguard Worker// A prebuilt version of the systemserverclasspath_fragment module.
321*333d2b36SAndroid Build Coastguard Workertype prebuiltSystemServerClasspathModule struct {
322*333d2b36SAndroid Build Coastguard Worker	SystemServerClasspathModule
323*333d2b36SAndroid Build Coastguard Worker	prebuilt android.Prebuilt
324*333d2b36SAndroid Build Coastguard Worker}
325*333d2b36SAndroid Build Coastguard Worker
326*333d2b36SAndroid Build Coastguard Workerfunc (module *prebuiltSystemServerClasspathModule) Prebuilt() *android.Prebuilt {
327*333d2b36SAndroid Build Coastguard Worker	return &module.prebuilt
328*333d2b36SAndroid Build Coastguard Worker}
329*333d2b36SAndroid Build Coastguard Worker
330*333d2b36SAndroid Build Coastguard Workerfunc (module *prebuiltSystemServerClasspathModule) Name() string {
331*333d2b36SAndroid Build Coastguard Worker	return module.prebuilt.Name(module.ModuleBase.Name())
332*333d2b36SAndroid Build Coastguard Worker}
333*333d2b36SAndroid Build Coastguard Worker
334*333d2b36SAndroid Build Coastguard Workerfunc (module *prebuiltSystemServerClasspathModule) RequiredFilesFromPrebuiltApex(ctx android.BaseModuleContext) []string {
335*333d2b36SAndroid Build Coastguard Worker	return nil
336*333d2b36SAndroid Build Coastguard Worker}
337*333d2b36SAndroid Build Coastguard Worker
338*333d2b36SAndroid Build Coastguard Workerfunc (module *prebuiltSystemServerClasspathModule) UseProfileGuidedDexpreopt() bool {
339*333d2b36SAndroid Build Coastguard Worker	return false
340*333d2b36SAndroid Build Coastguard Worker}
341*333d2b36SAndroid Build Coastguard Worker
342*333d2b36SAndroid Build Coastguard Workervar _ android.RequiredFilesFromPrebuiltApex = (*prebuiltSystemServerClasspathModule)(nil)
343*333d2b36SAndroid Build Coastguard Worker
344*333d2b36SAndroid Build Coastguard Workerfunc prebuiltSystemServerClasspathModuleFactory() android.Module {
345*333d2b36SAndroid Build Coastguard Worker	m := &prebuiltSystemServerClasspathModule{}
346*333d2b36SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
347*333d2b36SAndroid Build Coastguard Worker	// This doesn't actually have any prebuilt files of its own so pass a placeholder for the srcs
348*333d2b36SAndroid Build Coastguard Worker	// array.
349*333d2b36SAndroid Build Coastguard Worker	android.InitPrebuiltModule(m, &[]string{"placeholder"})
350*333d2b36SAndroid Build Coastguard Worker	android.InitApexModule(m)
351*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon)
352*333d2b36SAndroid Build Coastguard Worker	return m
353*333d2b36SAndroid Build Coastguard Worker}
354