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