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 22*333d2b36SAndroid Build Coastguard Workerfunc init() { 23*333d2b36SAndroid Build Coastguard Worker registerPlatformBootclasspathBuildComponents(android.InitRegistrationContext) 24*333d2b36SAndroid Build Coastguard Worker} 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workerfunc registerPlatformBootclasspathBuildComponents(ctx android.RegistrationContext) { 27*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("platform_bootclasspath", platformBootclasspathFactory) 28*333d2b36SAndroid Build Coastguard Worker} 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Worker// The tags used for the dependencies between the platform bootclasspath and any configured boot 31*333d2b36SAndroid Build Coastguard Worker// jars. 32*333d2b36SAndroid Build Coastguard Workervar ( 33*333d2b36SAndroid Build Coastguard Worker platformBootclasspathArtBootJarDepTag = bootclasspathDependencyTag{name: "art-boot-jar"} 34*333d2b36SAndroid Build Coastguard Worker platformBootclasspathBootJarDepTag = bootclasspathDependencyTag{name: "platform-boot-jar"} 35*333d2b36SAndroid Build Coastguard Worker platformBootclasspathApexBootJarDepTag = bootclasspathDependencyTag{name: "apex-boot-jar"} 36*333d2b36SAndroid Build Coastguard Worker platformBootclasspathImplLibDepTag = dependencyTag{name: "impl-lib-tag"} 37*333d2b36SAndroid Build Coastguard Worker) 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Workertype platformBootclasspathModule struct { 40*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 41*333d2b36SAndroid Build Coastguard Worker ClasspathFragmentBase 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker properties platformBootclasspathProperties 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker // The apex:module pairs obtained from the configured modules. 46*333d2b36SAndroid Build Coastguard Worker configuredModules []android.Module 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Worker // The apex:module pairs obtained from the fragments. 49*333d2b36SAndroid Build Coastguard Worker fragments []android.Module 50*333d2b36SAndroid Build Coastguard Worker 51*333d2b36SAndroid Build Coastguard Worker // Path to the monolithic hiddenapi-flags.csv file. 52*333d2b36SAndroid Build Coastguard Worker hiddenAPIFlagsCSV android.OutputPath 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Worker // Path to the monolithic hiddenapi-index.csv file. 55*333d2b36SAndroid Build Coastguard Worker hiddenAPIIndexCSV android.OutputPath 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Worker // Path to the monolithic hiddenapi-unsupported.csv file. 58*333d2b36SAndroid Build Coastguard Worker hiddenAPIMetadataCSV android.OutputPath 59*333d2b36SAndroid Build Coastguard Worker} 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Workertype platformBootclasspathProperties struct { 62*333d2b36SAndroid Build Coastguard Worker BootclasspathFragmentsDepsProperties 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Worker HiddenAPIFlagFileProperties 65*333d2b36SAndroid Build Coastguard Worker} 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Workerfunc platformBootclasspathFactory() android.Module { 68*333d2b36SAndroid Build Coastguard Worker m := &platformBootclasspathModule{} 69*333d2b36SAndroid Build Coastguard Worker m.AddProperties(&m.properties) 70*333d2b36SAndroid Build Coastguard Worker initClasspathFragment(m, BOOTCLASSPATH) 71*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon) 72*333d2b36SAndroid Build Coastguard Worker return m 73*333d2b36SAndroid Build Coastguard Worker} 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) AndroidMkEntries() (entries []android.AndroidMkEntries) { 76*333d2b36SAndroid Build Coastguard Worker entries = append(entries, android.AndroidMkEntries{ 77*333d2b36SAndroid Build Coastguard Worker Class: "FAKE", 78*333d2b36SAndroid Build Coastguard Worker // Need at least one output file in order for this to take effect. 79*333d2b36SAndroid Build Coastguard Worker OutputFile: android.OptionalPathForPath(b.hiddenAPIFlagsCSV), 80*333d2b36SAndroid Build Coastguard Worker Include: "$(BUILD_PHONY_PACKAGE)", 81*333d2b36SAndroid Build Coastguard Worker }) 82*333d2b36SAndroid Build Coastguard Worker entries = append(entries, b.classpathFragmentBase().androidMkEntries()...) 83*333d2b36SAndroid Build Coastguard Worker return 84*333d2b36SAndroid Build Coastguard Worker} 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) DepsMutator(ctx android.BottomUpMutatorContext) { 87*333d2b36SAndroid Build Coastguard Worker // Create a dependency on all_apex_contributions to determine the selected mainline module 88*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), apexContributionsMetadataDepTag, "all_apex_contributions") 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Worker b.hiddenAPIDepsMutator(ctx) 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Worker if !dexpreopt.IsDex2oatNeeded(ctx) { 93*333d2b36SAndroid Build Coastguard Worker return 94*333d2b36SAndroid Build Coastguard Worker } 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Worker // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The 97*333d2b36SAndroid Build Coastguard Worker // path is retrieved from the dependency by GetGlobalSoongConfig(ctx). 98*333d2b36SAndroid Build Coastguard Worker dexpreopt.RegisterToolDeps(ctx) 99*333d2b36SAndroid Build Coastguard Worker} 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) hiddenAPIDepsMutator(ctx android.BottomUpMutatorContext) { 102*333d2b36SAndroid Build Coastguard Worker if ctx.Config().DisableHiddenApiChecks() { 103*333d2b36SAndroid Build Coastguard Worker return 104*333d2b36SAndroid Build Coastguard Worker } 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Worker // Add dependencies onto the stub lib modules. 107*333d2b36SAndroid Build Coastguard Worker apiLevelToStubLibModules := hiddenAPIComputeMonolithicStubLibModules(ctx.Config()) 108*333d2b36SAndroid Build Coastguard Worker hiddenAPIAddStubLibDependencies(ctx, apiLevelToStubLibModules) 109*333d2b36SAndroid Build Coastguard Worker} 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) BootclasspathDepsMutator(ctx android.BottomUpMutatorContext) { 112*333d2b36SAndroid Build Coastguard Worker // Add dependencies on all the ART jars. 113*333d2b36SAndroid Build Coastguard Worker global := dexpreopt.GetGlobalConfig(ctx) 114*333d2b36SAndroid Build Coastguard Worker addDependenciesOntoSelectedBootImageApexes(ctx, "com.android.art") 115*333d2b36SAndroid Build Coastguard Worker 116*333d2b36SAndroid Build Coastguard Worker var bootImageModuleNames []string 117*333d2b36SAndroid Build Coastguard Worker 118*333d2b36SAndroid Build Coastguard Worker // TODO: b/308174306 - Remove the mechanism of depending on the java_sdk_library(_import) directly 119*333d2b36SAndroid Build Coastguard Worker addDependenciesOntoBootImageModules(ctx, global.ArtApexJars, platformBootclasspathArtBootJarDepTag) 120*333d2b36SAndroid Build Coastguard Worker bootImageModuleNames = append(bootImageModuleNames, global.ArtApexJars.CopyOfJars()...) 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Worker // Add dependencies on all the non-updatable jars, which are on the platform or in non-updatable 123*333d2b36SAndroid Build Coastguard Worker // APEXes. 124*333d2b36SAndroid Build Coastguard Worker platformJars := b.platformJars(ctx) 125*333d2b36SAndroid Build Coastguard Worker addDependenciesOntoBootImageModules(ctx, platformJars, platformBootclasspathBootJarDepTag) 126*333d2b36SAndroid Build Coastguard Worker bootImageModuleNames = append(bootImageModuleNames, platformJars.CopyOfJars()...) 127*333d2b36SAndroid Build Coastguard Worker 128*333d2b36SAndroid Build Coastguard Worker // Add dependencies on all the updatable jars, except the ART jars. 129*333d2b36SAndroid Build Coastguard Worker apexJars := dexpreopt.GetGlobalConfig(ctx).ApexBootJars 130*333d2b36SAndroid Build Coastguard Worker apexes := []string{} 131*333d2b36SAndroid Build Coastguard Worker for i := 0; i < apexJars.Len(); i++ { 132*333d2b36SAndroid Build Coastguard Worker apexes = append(apexes, apexJars.Apex(i)) 133*333d2b36SAndroid Build Coastguard Worker } 134*333d2b36SAndroid Build Coastguard Worker addDependenciesOntoSelectedBootImageApexes(ctx, android.FirstUniqueStrings(apexes)...) 135*333d2b36SAndroid Build Coastguard Worker // TODO: b/308174306 - Remove the mechanism of depending on the java_sdk_library(_import) directly 136*333d2b36SAndroid Build Coastguard Worker addDependenciesOntoBootImageModules(ctx, apexJars, platformBootclasspathApexBootJarDepTag) 137*333d2b36SAndroid Build Coastguard Worker bootImageModuleNames = append(bootImageModuleNames, apexJars.CopyOfJars()...) 138*333d2b36SAndroid Build Coastguard Worker 139*333d2b36SAndroid Build Coastguard Worker // Add dependencies on all the fragments. 140*333d2b36SAndroid Build Coastguard Worker b.properties.BootclasspathFragmentsDepsProperties.addDependenciesOntoFragments(ctx) 141*333d2b36SAndroid Build Coastguard Worker 142*333d2b36SAndroid Build Coastguard Worker for _, bootImageModuleName := range bootImageModuleNames { 143*333d2b36SAndroid Build Coastguard Worker implLibName := implLibraryModuleName(bootImageModuleName) 144*333d2b36SAndroid Build Coastguard Worker if ctx.OtherModuleExists(implLibName) { 145*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies(nil, platformBootclasspathImplLibDepTag, implLibName) 146*333d2b36SAndroid Build Coastguard Worker } 147*333d2b36SAndroid Build Coastguard Worker } 148*333d2b36SAndroid Build Coastguard Worker} 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Workerfunc addDependenciesOntoBootImageModules(ctx android.BottomUpMutatorContext, modules android.ConfiguredJarList, tag bootclasspathDependencyTag) { 151*333d2b36SAndroid Build Coastguard Worker for i := 0; i < modules.Len(); i++ { 152*333d2b36SAndroid Build Coastguard Worker apex := modules.Apex(i) 153*333d2b36SAndroid Build Coastguard Worker name := modules.Jar(i) 154*333d2b36SAndroid Build Coastguard Worker 155*333d2b36SAndroid Build Coastguard Worker addDependencyOntoApexModulePair(ctx, apex, name, tag) 156*333d2b36SAndroid Build Coastguard Worker } 157*333d2b36SAndroid Build Coastguard Worker} 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { 160*333d2b36SAndroid Build Coastguard Worker // Gather all the dependencies from the art, platform, and apex boot jars. 161*333d2b36SAndroid Build Coastguard Worker artModules := gatherApexModulePairDepsWithTag(ctx, platformBootclasspathArtBootJarDepTag) 162*333d2b36SAndroid Build Coastguard Worker platformModules := gatherApexModulePairDepsWithTag(ctx, platformBootclasspathBootJarDepTag) 163*333d2b36SAndroid Build Coastguard Worker apexModules := gatherApexModulePairDepsWithTag(ctx, platformBootclasspathApexBootJarDepTag) 164*333d2b36SAndroid Build Coastguard Worker 165*333d2b36SAndroid Build Coastguard Worker // Concatenate them all, in order as they would appear on the bootclasspath. 166*333d2b36SAndroid Build Coastguard Worker var allModules []android.Module 167*333d2b36SAndroid Build Coastguard Worker allModules = append(allModules, artModules...) 168*333d2b36SAndroid Build Coastguard Worker allModules = append(allModules, platformModules...) 169*333d2b36SAndroid Build Coastguard Worker allModules = append(allModules, apexModules...) 170*333d2b36SAndroid Build Coastguard Worker b.configuredModules = allModules 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Worker // Do not add implLibModule to allModules as the impl lib is only used to collect the 173*333d2b36SAndroid Build Coastguard Worker // transitive source files 174*333d2b36SAndroid Build Coastguard Worker var implLibModule []android.Module 175*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDepsWithTag(implLibraryTag, func(m android.Module) { 176*333d2b36SAndroid Build Coastguard Worker implLibModule = append(implLibModule, m) 177*333d2b36SAndroid Build Coastguard Worker }) 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Worker var transitiveSrcFiles android.Paths 180*333d2b36SAndroid Build Coastguard Worker for _, module := range append(allModules, implLibModule...) { 181*333d2b36SAndroid Build Coastguard Worker if depInfo, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { 182*333d2b36SAndroid Build Coastguard Worker transitiveSrcFiles = append(transitiveSrcFiles, depInfo.TransitiveSrcFiles.ToList()...) 183*333d2b36SAndroid Build Coastguard Worker } 184*333d2b36SAndroid Build Coastguard Worker } 185*333d2b36SAndroid Build Coastguard Worker jarArgs := resourcePathsToJarArgs(transitiveSrcFiles) 186*333d2b36SAndroid Build Coastguard Worker jarArgs = append(jarArgs, "-srcjar") // Move srcfiles to the right package 187*333d2b36SAndroid Build Coastguard Worker srcjar := android.PathForModuleOut(ctx, ctx.ModuleName()+"-transitive.srcjar") 188*333d2b36SAndroid Build Coastguard Worker TransformResourcesToJar(ctx, srcjar, jarArgs, transitiveSrcFiles) 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Worker // Gather all the fragments dependencies. 191*333d2b36SAndroid Build Coastguard Worker b.fragments = gatherApexModulePairDepsWithTag(ctx, bootclasspathFragmentDepTag) 192*333d2b36SAndroid Build Coastguard Worker 193*333d2b36SAndroid Build Coastguard Worker // Check the configuration of the boot modules. 194*333d2b36SAndroid Build Coastguard Worker // ART modules are checked by the art-bootclasspath-fragment. 195*333d2b36SAndroid Build Coastguard Worker b.checkPlatformModules(ctx, platformModules) 196*333d2b36SAndroid Build Coastguard Worker b.checkApexModules(ctx, apexModules) 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Worker b.generateClasspathProtoBuildActions(ctx) 199*333d2b36SAndroid Build Coastguard Worker 200*333d2b36SAndroid Build Coastguard Worker bootDexJarByModule := b.generateHiddenAPIBuildActions(ctx, b.configuredModules, b.fragments) 201*333d2b36SAndroid Build Coastguard Worker buildRuleForBootJarsPackageCheck(ctx, bootDexJarByModule) 202*333d2b36SAndroid Build Coastguard Worker 203*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{b.hiddenAPIFlagsCSV}, "hiddenapi-flags.csv") 204*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{b.hiddenAPIIndexCSV}, "hiddenapi-index.csv") 205*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{b.hiddenAPIMetadataCSV}, "hiddenapi-metadata.csv") 206*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{srcjar}, ".srcjar") 207*333d2b36SAndroid Build Coastguard Worker} 208*333d2b36SAndroid Build Coastguard Worker 209*333d2b36SAndroid Build Coastguard Worker// Generate classpaths.proto config 210*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) generateClasspathProtoBuildActions(ctx android.ModuleContext) { 211*333d2b36SAndroid Build Coastguard Worker configuredJars := b.configuredJars(ctx) 212*333d2b36SAndroid Build Coastguard Worker // ART and platform boot jars must have a corresponding entry in DEX2OATBOOTCLASSPATH 213*333d2b36SAndroid Build Coastguard Worker classpathJars := configuredJarListToClasspathJars(ctx, configuredJars, BOOTCLASSPATH, DEX2OATBOOTCLASSPATH) 214*333d2b36SAndroid Build Coastguard Worker b.classpathFragmentBase().generateClasspathProtoBuildActions(ctx, configuredJars, classpathJars) 215*333d2b36SAndroid Build Coastguard Worker b.classpathFragmentBase().installClasspathProto(ctx) 216*333d2b36SAndroid Build Coastguard Worker} 217*333d2b36SAndroid Build Coastguard Worker 218*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) configuredJars(ctx android.ModuleContext) android.ConfiguredJarList { 219*333d2b36SAndroid Build Coastguard Worker // Include all non APEX jars 220*333d2b36SAndroid Build Coastguard Worker jars := b.platformJars(ctx) 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Worker // Include jars from APEXes that don't populate their classpath proto config. 223*333d2b36SAndroid Build Coastguard Worker remainingJars := dexpreopt.GetGlobalConfig(ctx).ApexBootJars 224*333d2b36SAndroid Build Coastguard Worker for _, fragment := range b.fragments { 225*333d2b36SAndroid Build Coastguard Worker info, _ := android.OtherModuleProvider(ctx, fragment, ClasspathFragmentProtoContentInfoProvider) 226*333d2b36SAndroid Build Coastguard Worker if info.ClasspathFragmentProtoGenerated { 227*333d2b36SAndroid Build Coastguard Worker remainingJars = remainingJars.RemoveList(info.ClasspathFragmentProtoContents) 228*333d2b36SAndroid Build Coastguard Worker } 229*333d2b36SAndroid Build Coastguard Worker } 230*333d2b36SAndroid Build Coastguard Worker for i := 0; i < remainingJars.Len(); i++ { 231*333d2b36SAndroid Build Coastguard Worker jars = jars.Append(remainingJars.Apex(i), remainingJars.Jar(i)) 232*333d2b36SAndroid Build Coastguard Worker } 233*333d2b36SAndroid Build Coastguard Worker 234*333d2b36SAndroid Build Coastguard Worker return jars 235*333d2b36SAndroid Build Coastguard Worker} 236*333d2b36SAndroid Build Coastguard Worker 237*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) platformJars(ctx android.PathContext) android.ConfiguredJarList { 238*333d2b36SAndroid Build Coastguard Worker global := dexpreopt.GetGlobalConfig(ctx) 239*333d2b36SAndroid Build Coastguard Worker return global.BootJars.RemoveList(global.ArtApexJars) 240*333d2b36SAndroid Build Coastguard Worker} 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Worker// checkPlatformModules ensures that the non-updatable modules supplied are not part of an 243*333d2b36SAndroid Build Coastguard Worker// apex module. 244*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) checkPlatformModules(ctx android.ModuleContext, modules []android.Module) { 245*333d2b36SAndroid Build Coastguard Worker // TODO(satayev): change this check to only allow core-icu4j, all apex jars should not be here. 246*333d2b36SAndroid Build Coastguard Worker for _, m := range modules { 247*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.OtherModuleProvider(ctx, m, android.ApexInfoProvider) 248*333d2b36SAndroid Build Coastguard Worker fromUpdatableApex := apexInfo.Updatable 249*333d2b36SAndroid Build Coastguard Worker if fromUpdatableApex { 250*333d2b36SAndroid Build Coastguard Worker // error: this jar is part of an updatable apex 251*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("module %q from updatable apexes %q is not allowed in the platform bootclasspath", ctx.OtherModuleName(m), apexInfo.InApexVariants) 252*333d2b36SAndroid Build Coastguard Worker } else { 253*333d2b36SAndroid Build Coastguard Worker // ok: this jar is part of the platform or a non-updatable apex 254*333d2b36SAndroid Build Coastguard Worker } 255*333d2b36SAndroid Build Coastguard Worker } 256*333d2b36SAndroid Build Coastguard Worker} 257*333d2b36SAndroid Build Coastguard Worker 258*333d2b36SAndroid Build Coastguard Worker// checkApexModules ensures that the apex modules supplied are not from the platform. 259*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) checkApexModules(ctx android.ModuleContext, modules []android.Module) { 260*333d2b36SAndroid Build Coastguard Worker for _, m := range modules { 261*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.OtherModuleProvider(ctx, m, android.ApexInfoProvider) 262*333d2b36SAndroid Build Coastguard Worker fromUpdatableApex := apexInfo.Updatable 263*333d2b36SAndroid Build Coastguard Worker if fromUpdatableApex { 264*333d2b36SAndroid Build Coastguard Worker // ok: this jar is part of an updatable apex 265*333d2b36SAndroid Build Coastguard Worker } else { 266*333d2b36SAndroid Build Coastguard Worker name := ctx.OtherModuleName(m) 267*333d2b36SAndroid Build Coastguard Worker if apexInfo.IsForPlatform() { 268*333d2b36SAndroid Build Coastguard Worker // If AlwaysUsePrebuiltSdks() returns true then it is possible that the updatable list will 269*333d2b36SAndroid Build Coastguard Worker // include platform variants of a prebuilt module due to workarounds elsewhere. In that case 270*333d2b36SAndroid Build Coastguard Worker // do not treat this as an error. 271*333d2b36SAndroid Build Coastguard Worker // TODO(b/179354495): Always treat this as an error when migration to bootclasspath_fragment 272*333d2b36SAndroid Build Coastguard Worker // modules is complete. 273*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().AlwaysUsePrebuiltSdks() { 274*333d2b36SAndroid Build Coastguard Worker // error: this jar is part of the platform 275*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("module %q from platform is not allowed in the apex boot jars list", name) 276*333d2b36SAndroid Build Coastguard Worker } 277*333d2b36SAndroid Build Coastguard Worker } else { 278*333d2b36SAndroid Build Coastguard Worker // TODO(b/177892522): Treat this as an error. 279*333d2b36SAndroid Build Coastguard Worker // Cannot do that at the moment because framework-wifi and framework-tethering are in the 280*333d2b36SAndroid Build Coastguard Worker // PRODUCT_APEX_BOOT_JARS but not marked as updatable in AOSP. 281*333d2b36SAndroid Build Coastguard Worker } 282*333d2b36SAndroid Build Coastguard Worker } 283*333d2b36SAndroid Build Coastguard Worker } 284*333d2b36SAndroid Build Coastguard Worker} 285*333d2b36SAndroid Build Coastguard Worker 286*333d2b36SAndroid Build Coastguard Worker// generateHiddenAPIBuildActions generates all the hidden API related build rules. 287*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android.ModuleContext, modules []android.Module, fragments []android.Module) bootDexJarByModule { 288*333d2b36SAndroid Build Coastguard Worker createEmptyHiddenApiFiles := func() { 289*333d2b36SAndroid Build Coastguard Worker paths := android.OutputPaths{b.hiddenAPIFlagsCSV, b.hiddenAPIIndexCSV, b.hiddenAPIMetadataCSV} 290*333d2b36SAndroid Build Coastguard Worker for _, path := range paths { 291*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 292*333d2b36SAndroid Build Coastguard Worker Rule: android.Touch, 293*333d2b36SAndroid Build Coastguard Worker Output: path, 294*333d2b36SAndroid Build Coastguard Worker }) 295*333d2b36SAndroid Build Coastguard Worker } 296*333d2b36SAndroid Build Coastguard Worker } 297*333d2b36SAndroid Build Coastguard Worker 298*333d2b36SAndroid Build Coastguard Worker // Save the paths to the monolithic files for retrieval via OutputFiles(). 299*333d2b36SAndroid Build Coastguard Worker b.hiddenAPIFlagsCSV = hiddenAPISingletonPaths(ctx).flags 300*333d2b36SAndroid Build Coastguard Worker b.hiddenAPIIndexCSV = hiddenAPISingletonPaths(ctx).index 301*333d2b36SAndroid Build Coastguard Worker b.hiddenAPIMetadataCSV = hiddenAPISingletonPaths(ctx).metadata 302*333d2b36SAndroid Build Coastguard Worker 303*333d2b36SAndroid Build Coastguard Worker bootDexJarByModule := extractBootDexJarsFromModules(ctx, modules) 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Worker // Don't run any hiddenapi rules if hidden api checks are disabled. This is a performance 306*333d2b36SAndroid Build Coastguard Worker // optimization that can be used to reduce the incremental build time but as its name suggests it 307*333d2b36SAndroid Build Coastguard Worker // can be unsafe to use, e.g. when the changes affect anything that goes on the bootclasspath. 308*333d2b36SAndroid Build Coastguard Worker if ctx.Config().DisableHiddenApiChecks() { 309*333d2b36SAndroid Build Coastguard Worker createEmptyHiddenApiFiles() 310*333d2b36SAndroid Build Coastguard Worker return bootDexJarByModule 311*333d2b36SAndroid Build Coastguard Worker } 312*333d2b36SAndroid Build Coastguard Worker 313*333d2b36SAndroid Build Coastguard Worker // Construct a list of ClasspathElement objects from the modules and fragments. 314*333d2b36SAndroid Build Coastguard Worker classpathElements := CreateClasspathElements(ctx, modules, fragments) 315*333d2b36SAndroid Build Coastguard Worker 316*333d2b36SAndroid Build Coastguard Worker monolithicInfo := b.createAndProvideMonolithicHiddenAPIInfo(ctx, classpathElements) 317*333d2b36SAndroid Build Coastguard Worker 318*333d2b36SAndroid Build Coastguard Worker // Extract the classes jars only from those libraries that do not have corresponding fragments as 319*333d2b36SAndroid Build Coastguard Worker // the fragments will have already provided the flags that are needed. 320*333d2b36SAndroid Build Coastguard Worker classesJars := monolithicInfo.ClassesJars 321*333d2b36SAndroid Build Coastguard Worker 322*333d2b36SAndroid Build Coastguard Worker if len(classesJars) == 0 { 323*333d2b36SAndroid Build Coastguard Worker // This product does not include any monolithic jars. Monolithic hiddenapi flag generation is not required. 324*333d2b36SAndroid Build Coastguard Worker // However, generate an empty file so that the dist tags in f/b/boot/Android.bp can be resolved, and `m dist` works. 325*333d2b36SAndroid Build Coastguard Worker createEmptyHiddenApiFiles() 326*333d2b36SAndroid Build Coastguard Worker return bootDexJarByModule 327*333d2b36SAndroid Build Coastguard Worker } 328*333d2b36SAndroid Build Coastguard Worker 329*333d2b36SAndroid Build Coastguard Worker // Create the input to pass to buildRuleToGenerateHiddenAPIStubFlagsFile 330*333d2b36SAndroid Build Coastguard Worker input := newHiddenAPIFlagInput() 331*333d2b36SAndroid Build Coastguard Worker 332*333d2b36SAndroid Build Coastguard Worker // Gather stub library information from the dependencies on modules provided by 333*333d2b36SAndroid Build Coastguard Worker // hiddenAPIComputeMonolithicStubLibModules. 334*333d2b36SAndroid Build Coastguard Worker input.gatherStubLibInfo(ctx, nil) 335*333d2b36SAndroid Build Coastguard Worker 336*333d2b36SAndroid Build Coastguard Worker // Use the flag files from this module and all the fragments. 337*333d2b36SAndroid Build Coastguard Worker input.FlagFilesByCategory = monolithicInfo.FlagsFilesByCategory 338*333d2b36SAndroid Build Coastguard Worker 339*333d2b36SAndroid Build Coastguard Worker // Generate the monolithic stub-flags.csv file. 340*333d2b36SAndroid Build Coastguard Worker stubFlags := hiddenAPISingletonPaths(ctx).stubFlags 341*333d2b36SAndroid Build Coastguard Worker buildRuleToGenerateHiddenAPIStubFlagsFile(ctx, "platform-bootclasspath-monolithic-hiddenapi-stub-flags", "monolithic hidden API stub flags", stubFlags, bootDexJarByModule.bootDexJars(), input, monolithicInfo.StubFlagSubsets) 342*333d2b36SAndroid Build Coastguard Worker 343*333d2b36SAndroid Build Coastguard Worker // Generate the annotation-flags.csv file from all the module annotations. 344*333d2b36SAndroid Build Coastguard Worker annotationFlags := android.PathForModuleOut(ctx, "hiddenapi-monolithic", "annotation-flags-from-classes.csv") 345*333d2b36SAndroid Build Coastguard Worker buildRuleToGenerateAnnotationFlags(ctx, "intermediate hidden API flags", classesJars, stubFlags, annotationFlags) 346*333d2b36SAndroid Build Coastguard Worker 347*333d2b36SAndroid Build Coastguard Worker // Generate the monolithic hiddenapi-flags.csv file. 348*333d2b36SAndroid Build Coastguard Worker // 349*333d2b36SAndroid Build Coastguard Worker // Use annotation flags generated directly from the classes jars as well as annotation flag files 350*333d2b36SAndroid Build Coastguard Worker // provided by prebuilts. 351*333d2b36SAndroid Build Coastguard Worker allAnnotationFlagFiles := android.Paths{annotationFlags} 352*333d2b36SAndroid Build Coastguard Worker allAnnotationFlagFiles = append(allAnnotationFlagFiles, monolithicInfo.AnnotationFlagsPaths...) 353*333d2b36SAndroid Build Coastguard Worker allFlags := hiddenAPISingletonPaths(ctx).flags 354*333d2b36SAndroid Build Coastguard Worker buildRuleToGenerateHiddenApiFlags(ctx, "hiddenAPIFlagsFile", "monolithic hidden API flags", allFlags, stubFlags, allAnnotationFlagFiles, monolithicInfo.FlagsFilesByCategory, monolithicInfo.FlagSubsets, android.OptionalPath{}) 355*333d2b36SAndroid Build Coastguard Worker 356*333d2b36SAndroid Build Coastguard Worker // Generate an intermediate monolithic hiddenapi-metadata.csv file directly from the annotations 357*333d2b36SAndroid Build Coastguard Worker // in the source code. 358*333d2b36SAndroid Build Coastguard Worker intermediateMetadataCSV := android.PathForModuleOut(ctx, "hiddenapi-monolithic", "metadata-from-classes.csv") 359*333d2b36SAndroid Build Coastguard Worker buildRuleToGenerateMetadata(ctx, "intermediate hidden API metadata", classesJars, stubFlags, intermediateMetadataCSV) 360*333d2b36SAndroid Build Coastguard Worker 361*333d2b36SAndroid Build Coastguard Worker // Generate the monolithic hiddenapi-metadata.csv file. 362*333d2b36SAndroid Build Coastguard Worker // 363*333d2b36SAndroid Build Coastguard Worker // Use metadata files generated directly from the classes jars as well as metadata files provided 364*333d2b36SAndroid Build Coastguard Worker // by prebuilts. 365*333d2b36SAndroid Build Coastguard Worker // 366*333d2b36SAndroid Build Coastguard Worker // This has the side effect of ensuring that the output file uses | quotes just in case that is 367*333d2b36SAndroid Build Coastguard Worker // important for the tools that consume the metadata file. 368*333d2b36SAndroid Build Coastguard Worker allMetadataFlagFiles := android.Paths{intermediateMetadataCSV} 369*333d2b36SAndroid Build Coastguard Worker allMetadataFlagFiles = append(allMetadataFlagFiles, monolithicInfo.MetadataPaths...) 370*333d2b36SAndroid Build Coastguard Worker metadataCSV := hiddenAPISingletonPaths(ctx).metadata 371*333d2b36SAndroid Build Coastguard Worker b.buildRuleMergeCSV(ctx, "monolithic hidden API metadata", allMetadataFlagFiles, metadataCSV) 372*333d2b36SAndroid Build Coastguard Worker 373*333d2b36SAndroid Build Coastguard Worker // Generate an intermediate monolithic hiddenapi-index.csv file directly from the CSV files in the 374*333d2b36SAndroid Build Coastguard Worker // classes jars. 375*333d2b36SAndroid Build Coastguard Worker intermediateIndexCSV := android.PathForModuleOut(ctx, "hiddenapi-monolithic", "index-from-classes.csv") 376*333d2b36SAndroid Build Coastguard Worker buildRuleToGenerateIndex(ctx, "intermediate hidden API index", classesJars, intermediateIndexCSV) 377*333d2b36SAndroid Build Coastguard Worker 378*333d2b36SAndroid Build Coastguard Worker // Generate the monolithic hiddenapi-index.csv file. 379*333d2b36SAndroid Build Coastguard Worker // 380*333d2b36SAndroid Build Coastguard Worker // Use index files generated directly from the classes jars as well as index files provided 381*333d2b36SAndroid Build Coastguard Worker // by prebuilts. 382*333d2b36SAndroid Build Coastguard Worker allIndexFlagFiles := android.Paths{intermediateIndexCSV} 383*333d2b36SAndroid Build Coastguard Worker allIndexFlagFiles = append(allIndexFlagFiles, monolithicInfo.IndexPaths...) 384*333d2b36SAndroid Build Coastguard Worker indexCSV := hiddenAPISingletonPaths(ctx).index 385*333d2b36SAndroid Build Coastguard Worker b.buildRuleMergeCSV(ctx, "monolithic hidden API index", allIndexFlagFiles, indexCSV) 386*333d2b36SAndroid Build Coastguard Worker 387*333d2b36SAndroid Build Coastguard Worker return bootDexJarByModule 388*333d2b36SAndroid Build Coastguard Worker} 389*333d2b36SAndroid Build Coastguard Worker 390*333d2b36SAndroid Build Coastguard Worker// createAndProvideMonolithicHiddenAPIInfo creates a MonolithicHiddenAPIInfo and provides it for 391*333d2b36SAndroid Build Coastguard Worker// testing. 392*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) createAndProvideMonolithicHiddenAPIInfo(ctx android.ModuleContext, classpathElements ClasspathElements) MonolithicHiddenAPIInfo { 393*333d2b36SAndroid Build Coastguard Worker // Create a temporary input structure in which to collate information provided directly by this 394*333d2b36SAndroid Build Coastguard Worker // module, either through properties or direct dependencies. 395*333d2b36SAndroid Build Coastguard Worker temporaryInput := newHiddenAPIFlagInput() 396*333d2b36SAndroid Build Coastguard Worker 397*333d2b36SAndroid Build Coastguard Worker // Create paths to the flag files specified in the properties. 398*333d2b36SAndroid Build Coastguard Worker temporaryInput.extractFlagFilesFromProperties(ctx, &b.properties.HiddenAPIFlagFileProperties) 399*333d2b36SAndroid Build Coastguard Worker 400*333d2b36SAndroid Build Coastguard Worker // Create the monolithic info, by starting with the flag files specified on this and then merging 401*333d2b36SAndroid Build Coastguard Worker // in information from all the fragment dependencies of this. 402*333d2b36SAndroid Build Coastguard Worker monolithicInfo := newMonolithicHiddenAPIInfo(ctx, temporaryInput.FlagFilesByCategory, classpathElements) 403*333d2b36SAndroid Build Coastguard Worker 404*333d2b36SAndroid Build Coastguard Worker // Store the information for testing. 405*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, MonolithicHiddenAPIInfoProvider, monolithicInfo) 406*333d2b36SAndroid Build Coastguard Worker return monolithicInfo 407*333d2b36SAndroid Build Coastguard Worker} 408*333d2b36SAndroid Build Coastguard Worker 409*333d2b36SAndroid Build Coastguard Workerfunc (b *platformBootclasspathModule) buildRuleMergeCSV(ctx android.ModuleContext, desc string, inputPaths android.Paths, outputPath android.WritablePath) { 410*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 411*333d2b36SAndroid Build Coastguard Worker rule.Command(). 412*333d2b36SAndroid Build Coastguard Worker BuiltTool("merge_csv"). 413*333d2b36SAndroid Build Coastguard Worker Flag("--key_field signature"). 414*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("--output=", outputPath). 415*333d2b36SAndroid Build Coastguard Worker Inputs(inputPaths) 416*333d2b36SAndroid Build Coastguard Worker 417*333d2b36SAndroid Build Coastguard Worker rule.Build(desc, desc) 418*333d2b36SAndroid Build Coastguard Worker} 419