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